-
/*
* 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>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
+#include <errno.h>
-#if defined(BIND) && !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)
-
-extern int errno;
-
-#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);
}
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) {
bp = buffer;
for (;;) {
- char c;
+ unsigned char c;
if (read_tcp_socket (ftp_fd, &c, 1) < 1) {
if (expecteof)