On Fri, Dec 14, 2001 at 07:38:03PM -0600, Mike Coleman wrote: > [EMAIL PROTECTED] (Debian Bug Tracking System) writes: > > Anyhow, it's irrelevant. Since busybox wget doens't support this > > argument, the user's request to use this argument is hereby denied. > > :) > > > > Bug submitter, if busybox wget is not using ftp in the right way, > > please file a bug on busybox, not on the boot-floppies. Thanks. > > Turns out that busybox wget *does* use passive ftp by default, which it > should, but that there's a bug in the way it's doing name lookups. > (The problem is that it does a second DNS lookup for the PASV connection, > which won't necessarily return the same IP for a round-robin DNS situation > like ftp.us.debian.org, so the download fails.)
Indeed. Thanks for figuring this out. I've built fixed packages[1], if you can use them, and appended the patch. Matt 1. http://www.lafn.org/~kraai/busybox/busybox_0.60.2-2.2_powerpc.changes --- busybox-0.60.2/wget.c Thu Jul 19 15:28:01 2001 +++ busybox/wget.c Sat Dec 15 09:36:34 2001 @@ -53,7 +53,8 @@ }; static void parse_url(char *url, struct host_info *h); -static FILE *open_socket(char *host, int port); +static struct sockaddr_in *lookup_host(char *host); +static FILE *open_socket(struct sockaddr_in *s_in, int port); static char *gethdr(char *buf, size_t bufsiz, FILE *fp, int *istrunc); static int ftpcmd(char *s1, char *s2, FILE *fp, char *buf); @@ -168,6 +169,7 @@ int extra_headers_left = sizeof(extra_headers); int which_long_opt = 0, option_index = -1; struct host_info server, target; + struct sockaddr_in *s_in; FILE *sfp = NULL; /* socket to web/ftp server */ FILE *dfp = NULL; /* socket to ftp server (data) */ @@ -289,6 +291,8 @@ do_continue = 0; } + s_in = lookup_host (server.host); + if (proxy || !target.is_ftp) { /* * HTTP session @@ -301,7 +305,7 @@ * Open socket to http server */ if (sfp) fclose(sfp); - sfp = open_socket(server.host, server.port); + sfp = open_socket(s_in, server.port); /* * Send HTTP request. @@ -407,7 +411,7 @@ if (! target.user) target.user = xstrdup("anonymous:busybox@"); - sfp = open_socket(server.host, server.port); + sfp = open_socket(s_in, server.port); if (ftpcmd(NULL, NULL, sfp, buf) != 220) close_delete_and_die("%s", buf+4); @@ -450,7 +454,7 @@ port = atoi(s+1); s = strrchr(buf, ','); port += atoi(s+1) * 256; - dfp = open_socket(server.host, port); + dfp = open_socket(s_in, port); if (do_continue) { sprintf(buf, "REST %ld", beg_range); @@ -552,26 +556,34 @@ } -FILE *open_socket(char *host, int port) +static struct sockaddr_in *lookup_host(char *host) { - struct sockaddr_in s_in; + static struct sockaddr_in s_in; struct hostent *hp; - int fd; - FILE *fp; memset(&s_in, 0, sizeof(s_in)); s_in.sin_family = AF_INET; hp = xgethostbyname(host); memcpy(&s_in.sin_addr, hp->h_addr_list[0], hp->h_length); - s_in.sin_port = htons(port); + + return &s_in; +} + + +FILE *open_socket(struct sockaddr_in *s_in, int port) +{ + int fd; + FILE *fp; + + s_in->sin_port = htons(port); /* * Get the server onto a stdio stream. */ if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) perror_msg_and_die("socket()"); - if (connect(fd, (struct sockaddr *) &s_in, sizeof(s_in)) < 0) - perror_msg_and_die("connect(%s)", host); + if (connect(fd, (struct sockaddr *) s_in, sizeof(*s_in)) < 0) + perror_msg_and_die("connect()"); if ((fp = fdopen(fd, "r+")) == NULL) perror_msg_and_die("fdopen()"); -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]