Commit db70cd28 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

adjusted the IPv6 stuff to compile and build on Linux as well

parent f6e2bfd4
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -711,6 +711,7 @@ CURLcode _ftp(struct connectdata *conn)
    int sslen;
    char hbuf[NI_MAXHOST];
    char *localaddr;
    struct sockaddr *sa=(struct sockaddr *)&ss;
#ifdef NI_WITHSCOPEID
    const int niflags = NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID;
#else
@@ -737,7 +738,10 @@ CURLcode _ftp(struct connectdata *conn)
      return CURLE_FTP_PORT_FAILED;

    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_flags = AI_PASSIVE;
    if (getaddrinfo(hbuf, "0", &hints, &res))
@@ -770,7 +774,7 @@ CURLcode _ftp(struct connectdata *conn)
    }

    sslen = sizeof(ss);
    if (getsockname(portsock, (struct sockaddr *)&ss, &sslen) < 0) {
    if (getsockname(portsock, sa, &sslen) < 0) {
      failf(data, strerror(errno));
      freeaddrinfo(res);
      return CURLE_FTP_PORT_FAILED;
@@ -779,7 +783,7 @@ CURLcode _ftp(struct connectdata *conn)
    for (modep = mode; modep && *modep; modep++) {
      int lprtaf, eprtaf;

      switch (ss.ss_family) {
      switch (sa->sa_family) {
      case AF_INET:
	ap = (char *)&((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))
	  continue;
	/* 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, '%');
	  if (q)
	    *q = '\0';
@@ -821,7 +825,7 @@ CURLcode _ftp(struct connectdata *conn)

        if (strcmp(*modep, "LPRT") == 0 && lprtaf < 0)
	  continue;
        if (strcmp(*modep, "PORT") == 0 && ss.ss_family != AF_INET)
        if (strcmp(*modep, "PORT") == 0 && sa->sa_family != AF_INET)
	  continue;

	portmsgbuf[0] = '\0';
+26 −0
Original line number Diff line number Diff line
@@ -66,3 +66,29 @@ int Curl_strnequal(const char *first, const char *second, size_t max)
#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