mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
adjusted the IPv6 stuff to compile and build on Linux as well
This commit is contained in:
parent
f6e2bfd464
commit
db70cd28b3
14
lib/ftp.c
14
lib/ftp.c
@ -711,6 +711,7 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
int sslen;
|
int sslen;
|
||||||
char hbuf[NI_MAXHOST];
|
char hbuf[NI_MAXHOST];
|
||||||
char *localaddr;
|
char *localaddr;
|
||||||
|
struct sockaddr *sa=(struct sockaddr *)&ss;
|
||||||
#ifdef NI_WITHSCOPEID
|
#ifdef NI_WITHSCOPEID
|
||||||
const int niflags = NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID;
|
const int niflags = NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID;
|
||||||
#else
|
#else
|
||||||
@ -737,7 +738,10 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
|
|
||||||
memset(&hints, 0, sizeof(hints));
|
memset(&hints, 0, sizeof(hints));
|
||||||
hints.ai_family = ss.ss_family;
|
hints.ai_family = sa->sa_family;
|
||||||
|
/*hints.ai_family = ss.ss_family;
|
||||||
|
this way can be used if sockaddr_storage is properly defined, as glibc
|
||||||
|
2.1.X doesn't do*/
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
hints.ai_flags = AI_PASSIVE;
|
hints.ai_flags = AI_PASSIVE;
|
||||||
if (getaddrinfo(hbuf, "0", &hints, &res))
|
if (getaddrinfo(hbuf, "0", &hints, &res))
|
||||||
@ -770,7 +774,7 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sslen = sizeof(ss);
|
sslen = sizeof(ss);
|
||||||
if (getsockname(portsock, (struct sockaddr *)&ss, &sslen) < 0) {
|
if (getsockname(portsock, sa, &sslen) < 0) {
|
||||||
failf(data, strerror(errno));
|
failf(data, strerror(errno));
|
||||||
freeaddrinfo(res);
|
freeaddrinfo(res);
|
||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
@ -779,7 +783,7 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
for (modep = mode; modep && *modep; modep++) {
|
for (modep = mode; modep && *modep; modep++) {
|
||||||
int lprtaf, eprtaf;
|
int lprtaf, eprtaf;
|
||||||
|
|
||||||
switch (ss.ss_family) {
|
switch (sa->sa_family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
ap = (char *)&((struct sockaddr_in *)&ss)->sin_addr;
|
ap = (char *)&((struct sockaddr_in *)&ss)->sin_addr;
|
||||||
alen = sizeof(((struct sockaddr_in *)&ss)->sin_addr);
|
alen = sizeof(((struct sockaddr_in *)&ss)->sin_addr);
|
||||||
@ -809,7 +813,7 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
portmsgbuf, sizeof(portmsgbuf), tmp, sizeof(tmp), niflags))
|
portmsgbuf, sizeof(portmsgbuf), tmp, sizeof(tmp), niflags))
|
||||||
continue;
|
continue;
|
||||||
/* do not transmit IPv6 scope identifier to the wire */
|
/* do not transmit IPv6 scope identifier to the wire */
|
||||||
if (ss.ss_family == AF_INET6) {
|
if (sa->sa_family == AF_INET6) {
|
||||||
char *q = strchr(portmsgbuf, '%');
|
char *q = strchr(portmsgbuf, '%');
|
||||||
if (q)
|
if (q)
|
||||||
*q = '\0';
|
*q = '\0';
|
||||||
@ -821,7 +825,7 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
|
|
||||||
if (strcmp(*modep, "LPRT") == 0 && lprtaf < 0)
|
if (strcmp(*modep, "LPRT") == 0 && lprtaf < 0)
|
||||||
continue;
|
continue;
|
||||||
if (strcmp(*modep, "PORT") == 0 && ss.ss_family != AF_INET)
|
if (strcmp(*modep, "PORT") == 0 && sa->sa_family != AF_INET)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
portmsgbuf[0] = '\0';
|
portmsgbuf[0] = '\0';
|
||||||
|
@ -66,3 +66,29 @@ int Curl_strnequal(const char *first, const char *second, size_t max)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef HAVE_STRLCAT
|
||||||
|
/*
|
||||||
|
* The strlcat() function appends the NUL-terminated string src to the end
|
||||||
|
* of dst. It will append at most size - strlen(dst) - 1 bytes, NUL-termi-
|
||||||
|
* nating the result.
|
||||||
|
*
|
||||||
|
* The strlcpy() and strlcat() functions return the total length of the
|
||||||
|
* string they tried to create. For strlcpy() that means the length of src.
|
||||||
|
* For strlcat() that means the initial length of dst plus the length of
|
||||||
|
* src. While this may seem somewhat confusing it was done to make trunca-
|
||||||
|
* tion detection simple.
|
||||||
|
*/
|
||||||
|
size_t strlcat(char *dst, const char *src, size_t size)
|
||||||
|
{
|
||||||
|
size_t len = strlen(dst);
|
||||||
|
size_t orglen = len;
|
||||||
|
int index=0;
|
||||||
|
|
||||||
|
while(src[index] && (len < (size-1)) ) {
|
||||||
|
dst[len++] = src[index++];
|
||||||
|
}
|
||||||
|
dst[len]=0;
|
||||||
|
|
||||||
|
return orglen + strlen(src);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user