mirror of
https://github.com/moparisthebest/curl
synced 2024-12-22 08:08:50 -05:00
- Eric Wong introduced curlx_nonblock() that the curl tool now (re-)uses for
setting a file descriptor non-blocking. Used by the functionality Eric himself brough on June 15th.
This commit is contained in:
parent
444bb03fab
commit
d709cb2ae3
5
CHANGES
5
CHANGES
@ -6,6 +6,11 @@
|
|||||||
|
|
||||||
Changelog
|
Changelog
|
||||||
|
|
||||||
|
Daniel Stenberg (9 Jul 2009)
|
||||||
|
- Eric Wong introduced curlx_nonblock() that the curl tool now (re-)uses for
|
||||||
|
setting a file descriptor non-blocking. Used by the functionality Eric
|
||||||
|
himself brough on June 15th.
|
||||||
|
|
||||||
Daniel Stenberg (8 Jul 2009)
|
Daniel Stenberg (8 Jul 2009)
|
||||||
- Constantine Sapuntzakis posted bug report #2813123
|
- Constantine Sapuntzakis posted bug report #2813123
|
||||||
(http://curl.haxx.se/bug/view.cgi?id=2813123) and an a patch that fixes the
|
(http://curl.haxx.se/bug/view.cgi?id=2813123) and an a patch that fixes the
|
||||||
|
@ -10,7 +10,7 @@ CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
|
|||||||
hostares.c hostasyn.c hostip4.c hostip6.c hostsyn.c hostthre.c \
|
hostares.c hostasyn.c hostip4.c hostip6.c hostsyn.c hostthre.c \
|
||||||
inet_ntop.c parsedate.c select.c gtls.c sslgen.c tftp.c splay.c \
|
inet_ntop.c parsedate.c select.c gtls.c sslgen.c tftp.c splay.c \
|
||||||
strdup.c socks.c ssh.c nss.c qssl.c rawstr.c curl_addrinfo.c \
|
strdup.c socks.c ssh.c nss.c qssl.c rawstr.c curl_addrinfo.c \
|
||||||
socks_gssapi.c socks_sspi.c curl_sspi.c slist.c
|
socks_gssapi.c socks_sspi.c curl_sspi.c slist.c nonblock.c
|
||||||
|
|
||||||
HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h \
|
HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h \
|
||||||
progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h \
|
progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h \
|
||||||
@ -21,4 +21,4 @@ HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h \
|
|||||||
strtoofft.h strerror.h inet_ntop.h curlx.h curl_memory.h setup.h \
|
strtoofft.h strerror.h inet_ntop.h curlx.h curl_memory.h setup.h \
|
||||||
transfer.h select.h easyif.h multiif.h parsedate.h sslgen.h gtls.h \
|
transfer.h select.h easyif.h multiif.h parsedate.h sslgen.h gtls.h \
|
||||||
tftp.h sockaddr.h splay.h strdup.h setup_once.h socks.h ssh.h nssg.h \
|
tftp.h sockaddr.h splay.h strdup.h setup_once.h socks.h ssh.h nssg.h \
|
||||||
curl_base64.h rawstr.h curl_addrinfo.h curl_sspi.h slist.h
|
curl_base64.h rawstr.h curl_addrinfo.h curl_sspi.h slist.h nonblock.h
|
||||||
|
@ -177,59 +177,6 @@ long Curl_timeleft(struct connectdata *conn,
|
|||||||
return timeout_ms;
|
return timeout_ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Curl_nonblock() set the given socket to either blocking or non-blocking
|
|
||||||
* mode based on the 'nonblock' boolean argument. This function is highly
|
|
||||||
* portable.
|
|
||||||
*/
|
|
||||||
int Curl_nonblock(curl_socket_t sockfd, /* operate on this */
|
|
||||||
int nonblock /* TRUE or FALSE */)
|
|
||||||
{
|
|
||||||
#if defined(USE_BLOCKING_SOCKETS)
|
|
||||||
|
|
||||||
return 0; /* returns success */
|
|
||||||
|
|
||||||
#elif defined(HAVE_FCNTL_O_NONBLOCK)
|
|
||||||
|
|
||||||
/* most recent unix versions */
|
|
||||||
int flags;
|
|
||||||
flags = fcntl(sockfd, F_GETFL, 0);
|
|
||||||
if(FALSE != nonblock)
|
|
||||||
return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
|
|
||||||
else
|
|
||||||
return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
|
|
||||||
|
|
||||||
#elif defined(HAVE_IOCTL_FIONBIO)
|
|
||||||
|
|
||||||
/* older unix versions */
|
|
||||||
int flags;
|
|
||||||
flags = nonblock;
|
|
||||||
return ioctl(sockfd, FIONBIO, &flags);
|
|
||||||
|
|
||||||
#elif defined(HAVE_IOCTLSOCKET_FIONBIO)
|
|
||||||
|
|
||||||
/* Windows */
|
|
||||||
unsigned long flags;
|
|
||||||
flags = nonblock;
|
|
||||||
return ioctlsocket(sockfd, FIONBIO, &flags);
|
|
||||||
|
|
||||||
#elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO)
|
|
||||||
|
|
||||||
/* Amiga */
|
|
||||||
return IoctlSocket(sockfd, FIONBIO, (long)nonblock);
|
|
||||||
|
|
||||||
#elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK)
|
|
||||||
|
|
||||||
/* BeOS */
|
|
||||||
long b = nonblock ? 1 : 0;
|
|
||||||
return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
|
|
||||||
|
|
||||||
#else
|
|
||||||
# error "no non-blocking method was found/used/set"
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* waitconnect() waits for a TCP connect on the given socket for the specified
|
* waitconnect() waits for a TCP connect on the given socket for the specified
|
||||||
* number if milliseconds. It returns:
|
* number if milliseconds. It returns:
|
||||||
@ -846,7 +793,7 @@ singleipconnect(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* set socket non-blocking */
|
/* set socket non-blocking */
|
||||||
Curl_nonblock(sockfd, TRUE);
|
curlx_nonblock(sockfd, TRUE);
|
||||||
|
|
||||||
/* Connect TCP sockets, bind UDP */
|
/* Connect TCP sockets, bind UDP */
|
||||||
if(conn->socktype == SOCK_STREAM)
|
if(conn->socktype == SOCK_STREAM)
|
||||||
|
@ -23,8 +23,7 @@
|
|||||||
* $Id$
|
* $Id$
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
int Curl_nonblock(curl_socket_t sockfd, /* operate on this */
|
#include "nonblock.h" /* for curlx_nonblock(), formerly Curl_nonblock() */
|
||||||
int nonblock /* TRUE or FALSE */);
|
|
||||||
|
|
||||||
CURLcode Curl_is_connected(struct connectdata *conn,
|
CURLcode Curl_is_connected(struct connectdata *conn,
|
||||||
int sockindex,
|
int sockindex,
|
||||||
|
@ -53,6 +53,9 @@
|
|||||||
curlx_tvdiff_secs()
|
curlx_tvdiff_secs()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "nonblock.h"
|
||||||
|
/* "nonblock.h" provides curlx_nonblock() */
|
||||||
|
|
||||||
/* Now setup curlx_ * names for the functions that are to become curlx_ and
|
/* Now setup curlx_ * names for the functions that are to become curlx_ and
|
||||||
be removed from a future libcurl official API:
|
be removed from a future libcurl official API:
|
||||||
curlx_getenv
|
curlx_getenv
|
||||||
|
@ -351,7 +351,7 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
|
|||||||
infof(data, "Connection accepted from server\n");
|
infof(data, "Connection accepted from server\n");
|
||||||
|
|
||||||
conn->sock[SECONDARYSOCKET] = s;
|
conn->sock[SECONDARYSOCKET] = s;
|
||||||
Curl_nonblock(s, TRUE); /* enable non-blocking */
|
curlx_nonblock(s, TRUE); /* enable non-blocking */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
14
lib/socks.c
14
lib/socks.c
@ -144,7 +144,7 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
|
|||||||
return CURLE_OPERATION_TIMEDOUT;
|
return CURLE_OPERATION_TIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
Curl_nonblock(sock, FALSE);
|
curlx_nonblock(sock, FALSE);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compose socks4 request
|
* Compose socks4 request
|
||||||
@ -344,7 +344,7 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Curl_nonblock(sock, TRUE);
|
curlx_nonblock(sock, TRUE);
|
||||||
|
|
||||||
return CURLE_OK; /* Proxy was successful! */
|
return CURLE_OK; /* Proxy was successful! */
|
||||||
}
|
}
|
||||||
@ -406,7 +406,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
|
|||||||
return CURLE_OPERATION_TIMEDOUT;
|
return CURLE_OPERATION_TIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
Curl_nonblock(sock, TRUE);
|
curlx_nonblock(sock, TRUE);
|
||||||
|
|
||||||
/* wait until socket gets connected */
|
/* wait until socket gets connected */
|
||||||
result = Curl_socket_ready(CURL_SOCKET_BAD, sock, (int)timeout);
|
result = Curl_socket_ready(CURL_SOCKET_BAD, sock, (int)timeout);
|
||||||
@ -437,7 +437,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
|
|||||||
socksreq[3] = 2; /* username/password */
|
socksreq[3] = 2; /* username/password */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Curl_nonblock(sock, FALSE);
|
curlx_nonblock(sock, FALSE);
|
||||||
|
|
||||||
code = Curl_write_plain(conn, sock, (char *)socksreq, (2 + (int)socksreq[1]),
|
code = Curl_write_plain(conn, sock, (char *)socksreq, (2 + (int)socksreq[1]),
|
||||||
&written);
|
&written);
|
||||||
@ -446,7 +446,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
|
|||||||
return CURLE_COULDNT_CONNECT;
|
return CURLE_COULDNT_CONNECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
Curl_nonblock(sock, TRUE);
|
curlx_nonblock(sock, TRUE);
|
||||||
|
|
||||||
result = Curl_socket_ready(sock, CURL_SOCKET_BAD, (int)timeout);
|
result = Curl_socket_ready(sock, CURL_SOCKET_BAD, (int)timeout);
|
||||||
|
|
||||||
@ -464,7 +464,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
|
|||||||
return CURLE_RECV_ERROR;
|
return CURLE_RECV_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Curl_nonblock(sock, FALSE);
|
curlx_nonblock(sock, FALSE);
|
||||||
|
|
||||||
result=Curl_blockread_all(conn, sock, (char *)socksreq, 2, &actualread,
|
result=Curl_blockread_all(conn, sock, (char *)socksreq, 2, &actualread,
|
||||||
timeout);
|
timeout);
|
||||||
@ -719,7 +719,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Curl_nonblock(sock, TRUE);
|
curlx_nonblock(sock, TRUE);
|
||||||
return CURLE_OK; /* Proxy was successful! */
|
return CURLE_OK; /* Proxy was successful! */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
# the official API, but we re-use the code here to avoid duplication.
|
# the official API, but we re-use the code here to avoid duplication.
|
||||||
CURLX_ONES = $(top_srcdir)/lib/strtoofft.c \
|
CURLX_ONES = $(top_srcdir)/lib/strtoofft.c \
|
||||||
$(top_srcdir)/lib/strdup.c \
|
$(top_srcdir)/lib/strdup.c \
|
||||||
$(top_srcdir)/lib/rawstr.c
|
$(top_srcdir)/lib/rawstr.c \
|
||||||
|
$(top_srcdir)/lib/nonblock.c
|
||||||
|
|
||||||
CURL_SOURCES = main.c hugehelp.c urlglob.c writeout.c writeenv.c \
|
CURL_SOURCES = main.c hugehelp.c urlglob.c writeout.c writeenv.c \
|
||||||
getpass.c homedir.c curlutil.c os-specific.c
|
getpass.c homedir.c curlutil.c os-specific.c
|
||||||
|
19
src/main.c
19
src/main.c
@ -3231,22 +3231,6 @@ static void go_sleep(long ms)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* maybe we could just use Curl_nonblock() instead ... */
|
|
||||||
static void set_nonblocking(struct Configurable *config, int fd)
|
|
||||||
{
|
|
||||||
#if defined(HAVE_FCNTL_O_NONBLOCK)
|
|
||||||
int flags = fcntl(fd, F_GETFL, 0);
|
|
||||||
|
|
||||||
if (flags >= 0)
|
|
||||||
flags = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
|
|
||||||
else
|
|
||||||
warnf(config, "fcntl failed on fd=%d: %s\n", fd, strerror(errno));
|
|
||||||
#else
|
|
||||||
(void) config;
|
|
||||||
(void) fd;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t my_fwrite(void *buffer, size_t sz, size_t nmemb, void *stream)
|
static size_t my_fwrite(void *buffer, size_t sz, size_t nmemb, void *stream)
|
||||||
{
|
{
|
||||||
size_t rc;
|
size_t rc;
|
||||||
@ -4523,7 +4507,8 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
|
|||||||
else if(uploadfile && curlx_strequal(uploadfile, "-")) {
|
else if(uploadfile && curlx_strequal(uploadfile, "-")) {
|
||||||
SET_BINMODE(stdin);
|
SET_BINMODE(stdin);
|
||||||
infd = STDIN_FILENO;
|
infd = STDIN_FILENO;
|
||||||
set_nonblocking(config, infd);
|
if (curlx_nonblock((curl_socket_t)infd, TRUE) < 0)
|
||||||
|
warnf(config, "fcntl failed on fd=%d: %s\n", infd, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(uploadfile && config->resume_from_current)
|
if(uploadfile && config->resume_from_current)
|
||||||
|
Loading…
Reference in New Issue
Block a user