* uip/mhlistsbr.c, uip/mhlsbr.c, uip/picksbr.c: cast
[mmh] / uip / ftpsbr.c
index 525554e..2fc3fb7 100644 (file)
@@ -1,8 +1,11 @@
-
 /*
  * 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 <h/mh.h>
@@ -29,23 +32,15 @@ extern int v_verbose;
 #include <netdb.h>
 #include <errno.h>
 
-#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);
 
@@ -153,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) {
@@ -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)