cf-socket: optimize curlx_nonblock() and check its return error

Reviewed-by: Stefan Eissing
Closes #13942
This commit is contained in:
Andy Pan 2024-06-13 21:28:01 +08:00 committed by Daniel Stenberg
parent 36e9222c42
commit bd8e45c6c5
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
2 changed files with 29 additions and 7 deletions

View file

@ -1234,12 +1234,25 @@ static CURLcode cf_socket_open(struct Curl_cfilter *cf,
#endif
#ifndef SOCK_NONBLOCK
/* set socket non-blocking */
(void)curlx_nonblock(ctx->sock, TRUE);
/* Set socket non-blocking, must be a non-blocking socket for
* a non-blocking connect. */
error = curlx_nonblock(ctx->sock, TRUE);
if(error < 0) {
result = CURLE_UNSUPPORTED_PROTOCOL;
ctx->error = SOCKERRNO;
goto out;
}
#else
if(data->set.fopensocket)
/* set socket non-blocking */
(void)curlx_nonblock(ctx->sock, TRUE);
if(data->set.fopensocket) {
/* Set socket non-blocking, must be a non-blocking socket for
* a non-blocking connect. */
error = curlx_nonblock(ctx->sock, TRUE);
if(error < 0) {
result = CURLE_UNSUPPORTED_PROTOCOL;
ctx->error = SOCKERRNO;
goto out;
}
}
#endif
ctx->sock_connected = (ctx->addr.socktype != SOCK_DGRAM);
out:

View file

@ -50,9 +50,18 @@ int curlx_nonblock(curl_socket_t sockfd, /* operate on this */
/* most recent unix versions */
int flags;
flags = sfcntl(sockfd, F_GETFL, 0);
if(flags < 0)
return -1;
/* Check if the current file status flags have already satisfied
* the request, if so, it's no need to call fcntl() to replicate it.
*/
if(!!(flags & O_NONBLOCK) == !!nonblock)
return 0;
if(nonblock)
return sfcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
return sfcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
flags |= O_NONBLOCK;
else
flags &= ~O_NONBLOCK;
return sfcntl(sockfd, F_SETFL, flags);
#elif defined(HAVE_IOCTL_FIONBIO)