mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
FTP: call opensocket callback properly
When the new socket is created for an active connection, it is now done using the open socket callback. Test case 596 was modified to run fine, although it hides the fact that the close callback is still called too many times, as it also gets called for closing sockets that were created with accept().
This commit is contained in:
parent
9109cdec11
commit
088ba97a24
@ -294,10 +294,9 @@ argument in the sockopt callback set with \fICURLOPT_SOCKOPTFUNCTION\fP.
|
|||||||
Function pointer that should match the \fIcurl_opensocket_callback\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
|
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
|
instead of the \fIsocket(2)\fP call. The callback's \fIpurpose\fP argument
|
||||||
identifies the exact purpose for this particular socket, and currently only
|
identifies the exact purpose for this particular socket:
|
||||||
one value is supported: \fICURLSOCKTYPE_IPCXN\fP for the primary connection
|
\fICURLSOCKTYPE_IPCXN\fP is for IP based connections. Future versions of
|
||||||
(meaning the control connection in the FTP case). Future versions of libcurl
|
libcurl may support more purposes. It passes the resolved peer address as a
|
||||||
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
|
\fIaddress\fP argument so the callback can modify the address or refuse to
|
||||||
connect at all. The callback function should return the socket or
|
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
|
\fICURL_SOCKET_BAD\fP in case no connection should be established or any error
|
||||||
|
@ -1119,8 +1119,10 @@ int Curl_closesocket(struct connectdata *conn,
|
|||||||
/*
|
/*
|
||||||
* Create a socket based on info from 'conn' and 'ai'.
|
* Create a socket based on info from 'conn' and 'ai'.
|
||||||
*
|
*
|
||||||
* Fill in 'addr' and 'sockfd' accordingly if OK is returned. If the open
|
* 'addr' should be a pointer to the correct struct to get data back, or NULL.
|
||||||
* socket callback is set, used that!
|
* 'sockfd' must be a pointer to a socket descriptor.
|
||||||
|
*
|
||||||
|
* If the open socket callback is set, used that!
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
CURLcode Curl_socket(struct connectdata *conn,
|
CURLcode Curl_socket(struct connectdata *conn,
|
||||||
@ -1129,9 +1131,11 @@ CURLcode Curl_socket(struct connectdata *conn,
|
|||||||
curl_socket_t *sockfd)
|
curl_socket_t *sockfd)
|
||||||
{
|
{
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
#if defined(ENABLE_IPV6) && defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID)
|
struct Curl_sockaddr_ex dummy;
|
||||||
struct sockaddr_in6 * const sa6 = (void *)&addr->sa_addr;
|
|
||||||
#endif
|
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
|
* 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;
|
return CURLE_FAILED_INIT;
|
||||||
|
|
||||||
#if defined(ENABLE_IPV6) && defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID)
|
#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;
|
sa6->sin6_scope_id = conn->scope;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
|
10
lib/ftp.c
10
lib/ftp.c
@ -901,14 +901,8 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
|||||||
portsock = CURL_SOCKET_BAD;
|
portsock = CURL_SOCKET_BAD;
|
||||||
error = 0;
|
error = 0;
|
||||||
for(ai = res; ai; ai = ai->ai_next) {
|
for(ai = res; ai; ai = ai->ai_next) {
|
||||||
/*
|
result = Curl_socket(conn, ai, NULL, &portsock);
|
||||||
* Workaround for AIX5 getaddrinfo() problem (it doesn't set ai_socktype):
|
if(result) {
|
||||||
*/
|
|
||||||
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) {
|
|
||||||
error = SOCKERRNO;
|
error = SOCKERRNO;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -16,9 +16,10 @@ moo
|
|||||||
<datacheck>
|
<datacheck>
|
||||||
[OPEN] counter: 1
|
[OPEN] counter: 1
|
||||||
[OPEN] counter: 2
|
[OPEN] counter: 2
|
||||||
moo
|
|
||||||
[CLOSE] counter: 2
|
[CLOSE] counter: 2
|
||||||
|
moo
|
||||||
[CLOSE] counter: 1
|
[CLOSE] counter: 1
|
||||||
|
[CLOSE] counter: 0
|
||||||
</datacheck>
|
</datacheck>
|
||||||
</reply>
|
</reply>
|
||||||
|
|
||||||
@ -43,11 +44,14 @@ ftp://%HOSTIP:%FTPPORT/596 log/ip596 activeftp
|
|||||||
#
|
#
|
||||||
# Verify data after the test has been "shot"
|
# Verify data after the test has been "shot"
|
||||||
<verify>
|
<verify>
|
||||||
|
<strippart>
|
||||||
|
s/^(EPRT \|1\|)(.*)/$1/
|
||||||
|
</strippart>
|
||||||
<protocol>
|
<protocol>
|
||||||
USER anonymous
|
USER anonymous
|
||||||
PASS ftp@example.com
|
PASS ftp@example.com
|
||||||
PWD
|
PWD
|
||||||
EPSV
|
EPRT |1|
|
||||||
TYPE I
|
TYPE I
|
||||||
SIZE 596
|
SIZE 596
|
||||||
RETR 596
|
RETR 596
|
||||||
|
Loading…
Reference in New Issue
Block a user