X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fftpsbr.c;h=1d6727fa22e5859fe25891a9398830378d9f4e5f;hp=5b079ba2bf5833b59297d3e3ea58deff84d080a0;hb=8cf1d92e52d3feac4ed32ec733e2c0ed7f384e86;hpb=13f84dd50ca5754391dbd3296a5c7425f9363600 diff --git a/uip/ftpsbr.c b/uip/ftpsbr.c index 5b079ba..1d6727f 100644 --- a/uip/ftpsbr.c +++ b/uip/ftpsbr.c @@ -1,4 +1,3 @@ - /* * ftpsbr.c -- simple FTP client library * @@ -33,23 +32,15 @@ extern int v_verbose; #include #include -#if !defined(h_addr) -# define h_addr h_addr_list[0] -#endif - -#define inaddr_copy(hp,sin) \ - memcpy((char *) &((sin)->sin_addr), (hp)->h_addr, (hp)->h_length) +#define start_tcp_client(res) \ + socket (res->ai_family, res->ai_socktype, res->ai_protocol) -#define start_tcp_client(sock,priv) \ - socket (AF_INET, SOCK_STREAM, 0) - -#define join_tcp_server(fd, sock) \ - connect ((fd), (struct sockaddr *) (sock), sizeof *(sock)) +#define join_tcp_server(fd, sock, len) \ + connect ((fd), (struct sockaddr *) (sock), len) /* * prototypes */ -struct hostent *gethostbystring (); int ftp_get (char *, char *, char *, char *, char *, char *, int, int); int ftp_trans (char *, char *, char *, char *, char *, char *, char *, int, int); @@ -157,32 +148,34 @@ ftp_trans (char *host, char *user, char *password, char *cwd, char *remote, } if (ftp_fd == NOTOK) { - struct sockaddr_in in_socket; - register struct hostent *hp; - register struct servent *sp; + struct addrinfo hints, *res; - if ((sp = getservbyname ("ftp", "tcp")) == NULL) { - fprintf (stderr, "tcp/ftp: unknown service"); - return NOTOK; - } - if ((hp = gethostbystring (host)) == NULL) { - fprintf (stderr, "%s: unknown host\n", host); + memset(&hints, 0, sizeof(hints)); +#ifdef AI_ADDRCONFIG + hints.ai_flags = AI_ADDRCONFIG; +#endif + hints.ai_family = PF_INET; + hints.ai_socktype = SOCK_STREAM; + + result = getaddrinfo(host, "ftp", &hints, &res); + + if (result) { + fprintf(stderr, "%s/ftp: %s\n", host, gai_strerror(result)); return NOTOK; } - in_socket.sin_family = hp->h_addrtype; - inaddr_copy (hp, &in_socket); - in_socket.sin_port = sp->s_port; - if ((ftp_fd = start_tcp_client ((struct sockaddr_in *) NULL, 0)) - == NOTOK) { + if ((ftp_fd = start_tcp_client (res)) == NOTOK) { perror (host); + freeaddrinfo(res); return NOTOK; } - if (join_tcp_server (ftp_fd, &in_socket) == NOTOK) { + if (join_tcp_server (ftp_fd, res->ai_addr, res->ai_addrlen) == NOTOK) { perror (host); + freeaddrinfo(res); close_tcp_socket (ftp_fd), ftp_fd = NOTOK; return NOTOK; } + freeaddrinfo(res); getreply (1, 0); if (v_verbose) {