diff options
-rw-r--r-- | docs/libcurl/curl_easy_setopt.3 | 7 | ||||
-rw-r--r-- | lib/connect.c | 18 | ||||
-rw-r--r-- | lib/ftp.c | 10 | ||||
-rw-r--r-- | tests/data/test596 | 8 |
4 files changed, 23 insertions, 20 deletions
diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3 index 29151802f..2f7e40e26 100644 --- a/docs/libcurl/curl_easy_setopt.3 +++ b/docs/libcurl/curl_easy_setopt.3 @@ -294,10 +294,9 @@ argument in the sockopt callback set with \fICURLOPT_SOCKOPTFUNCTION\fP. Function pointer that should match the \fIcurl_opensocket_callback\fP prototype found in \fI<curl/curl.h>\fP. This function gets called by libcurl instead of the \fIsocket(2)\fP call. The callback's \fIpurpose\fP argument -identifies the exact purpose for this particular socket, and currently only -one value is supported: \fICURLSOCKTYPE_IPCXN\fP for the primary connection -(meaning the control connection in the FTP case). Future versions of libcurl -may support more purposes. It passes the resolved peer address as a +identifies the exact purpose for this particular socket: +\fICURLSOCKTYPE_IPCXN\fP is for IP based connections. Future versions of +libcurl may support more purposes. It passes the resolved peer address as a \fIaddress\fP argument so the callback can modify the address or refuse to connect at all. The callback function should return the socket or \fICURL_SOCKET_BAD\fP in case no connection should be established or any error diff --git a/lib/connect.c b/lib/connect.c index 2eef242d4..445261754 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -1119,8 +1119,10 @@ int Curl_closesocket(struct connectdata *conn, /* * Create a socket based on info from 'conn' and 'ai'. * - * Fill in 'addr' and 'sockfd' accordingly if OK is returned. If the open - * socket callback is set, used that! + * 'addr' should be a pointer to the correct struct to get data back, or NULL. + * 'sockfd' must be a pointer to a socket descriptor. + * + * If the open socket callback is set, used that! * */ CURLcode Curl_socket(struct connectdata *conn, @@ -1129,9 +1131,11 @@ CURLcode Curl_socket(struct connectdata *conn, curl_socket_t *sockfd) { struct SessionHandle *data = conn->data; -#if defined(ENABLE_IPV6) && defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID) - struct sockaddr_in6 * const sa6 = (void *)&addr->sa_addr; -#endif + struct Curl_sockaddr_ex dummy; + + if(!addr) + /* if the caller doesn't want info back, use a local temp copy */ + addr = &dummy; /* * The Curl_sockaddr_ex structure is basically libcurl's external API @@ -1172,8 +1176,10 @@ CURLcode Curl_socket(struct connectdata *conn, return CURLE_FAILED_INIT; #if defined(ENABLE_IPV6) && defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID) - if(conn->scope && (addr->family == AF_INET6)) + if(conn->scope && (addr->family == AF_INET6)) { + struct sockaddr_in6 * const sa6 = (void *)&addr->sa_addr; sa6->sin6_scope_id = conn->scope; + } #endif return CURLE_OK; @@ -901,14 +901,8 @@ static CURLcode ftp_state_use_port(struct connectdata *conn, portsock = CURL_SOCKET_BAD; error = 0; for(ai = res; ai; ai = ai->ai_next) { - /* - * Workaround for AIX5 getaddrinfo() problem (it doesn't set ai_socktype): - */ - if(ai->ai_socktype == 0) - ai->ai_socktype = conn->socktype; - - portsock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); - if(portsock == CURL_SOCKET_BAD) { + result = Curl_socket(conn, ai, NULL, &portsock); + if(result) { error = SOCKERRNO; continue; } diff --git a/tests/data/test596 b/tests/data/test596 index 9703f0471..73e8a78d5 100644 --- a/tests/data/test596 +++ b/tests/data/test596 @@ -16,9 +16,10 @@ moo <datacheck> [OPEN] counter: 1 [OPEN] counter: 2 -moo [CLOSE] counter: 2 +moo [CLOSE] counter: 1 +[CLOSE] counter: 0 </datacheck> </reply> @@ -43,11 +44,14 @@ ftp://%HOSTIP:%FTPPORT/596 log/ip596 activeftp # # Verify data after the test has been "shot" <verify> +<strippart> +s/^(EPRT \|1\|)(.*)/$1/ +</strippart> <protocol> USER anonymous
PASS ftp@example.com
PWD
-EPSV
+EPRT |1| TYPE I
SIZE 596
RETR 596
|