X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fftpsbr.c;h=2fc3fb7d57089a320b89eb6c49b675a08358ebc5;hp=9c118a5cfa83818d71fefc8751a3abc0769b7376;hb=d8916ff5d389de5ab225cd6f40aeda1b285d0f28;hpb=6c42153ad9362cc676ea66563bf400d7511b3b68 diff --git a/uip/ftpsbr.c b/uip/ftpsbr.c index 9c118a5..2fc3fb7 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(sock,priv) \ - socket (AF_INET, SOCK_STREAM, 0) +#define start_tcp_client(res) \ + socket (res->ai_family, res->ai_socktype, res->ai_protocol) -#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,32 @@ 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)); + hints.ai_flags = AI_ADDRCONFIG; + 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) { @@ -475,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)