- 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);
- 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) {
- perror (host);
- return NOTOK;
- }
- if (join_tcp_server (ftp_fd, &in_socket) == NOTOK) {
- perror (host);
- close_tcp_socket (ftp_fd), ftp_fd = NOTOK;
- return NOTOK;
- }
- getreply (1, 0);
+ 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;
+ }
+
+ if ((ftp_fd = start_tcp_client(res)) == NOTOK) {
+ perror(host);
+ freeaddrinfo(res);
+ return 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) {
+ fprintf(stdout, "Connected to %s\n", host);
+ fflush(stdout);
+ }