X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fftpsbr.c;h=57f25ba6578b48b2913d122fe075febae070b43c;hp=525554e77ae304fd8c5d30e70df6ef9bc6079880;hb=5dd6771b28c257af405d7248639ed0e3bcdce38b;hpb=3d251965606d6a6e47897504594f84d12e3e292a diff --git a/uip/ftpsbr.c b/uip/ftpsbr.c index 525554e..57f25ba 100644 --- a/uip/ftpsbr.c +++ b/uip/ftpsbr.c @@ -1,8 +1,9 @@ - /* * ftpsbr.c -- simple FTP client library * - * $Id$ + * This code is Copyright (c) 2002, by the authors of nmh. See the + * COPYRIGHT file in the root directory of the nmh distribution for + * complete copyright information. */ #include @@ -29,23 +30,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); @@ -153,32 +146,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) { @@ -471,7 +466,7 @@ getreply (int complete, int expecteof) bp = buffer; for (;;) { - char c; + unsigned char c; if (read_tcp_socket (ftp_fd, &c, 1) < 1) { if (expecteof)