diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2003-12-20 01:47:18 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2003-12-20 01:47:18 +0000 |
commit | ffccf6eb5de311a3db8c3d7f7496e2f0cad69a23 (patch) | |
tree | 859f5849c30de6cb69bf6336af6d2228402f2395 | |
parent | 03d8091859f45a6bb5e3aadc110b279e789399f2 (diff) | |
download | busybox-w32-ffccf6eb5de311a3db8c3d7f7496e2f0cad69a23.tar.gz busybox-w32-ffccf6eb5de311a3db8c3d7f7496e2f0cad69a23.tar.bz2 busybox-w32-ffccf6eb5de311a3db8c3d7f7496e2f0cad69a23.zip |
Change interface to bb_lookup_host, dont try and set port inside this
function as there is no gracefull way of handling failures.
Rename bb_getport to bb_lookup_port, allow a default port to be
specified so it always returns a correct value.
Modify ftpgetput/rdate/wget to use the new interface.
wget/rdate now use etc/services with a falback default value.
-rw-r--r-- | include/libbb.h | 4 | ||||
-rw-r--r-- | libbb/xconnect.c | 33 | ||||
-rw-r--r-- | networking/ftpgetput.c | 3 | ||||
-rw-r--r-- | networking/telnet.c | 10 | ||||
-rw-r--r-- | networking/wget.c | 35 | ||||
-rw-r--r-- | util-linux/rdate.c | 3 |
6 files changed, 39 insertions, 49 deletions
diff --git a/include/libbb.h b/include/libbb.h index 1367ee624..b2592c824 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
@@ -297,8 +297,8 @@ extern struct hostent *xgethostbyname2(const char *name, int af); | |||
297 | extern int create_icmp_socket(void); | 297 | extern int create_icmp_socket(void); |
298 | extern int create_icmp6_socket(void); | 298 | extern int create_icmp6_socket(void); |
299 | extern int xconnect(struct sockaddr_in *s_addr); | 299 | extern int xconnect(struct sockaddr_in *s_addr); |
300 | extern int bb_getport(const char *port); | 300 | extern unsigned short bb_lookup_port(const char *port, unsigned short default_port); |
301 | extern void bb_lookup_host(struct sockaddr_in *s_in, const char *host, const char *port); | 301 | extern void bb_lookup_host(struct sockaddr_in *s_in, const char *host); |
302 | 302 | ||
303 | //#warning wrap this? | 303 | //#warning wrap this? |
304 | char *dirname (char *path); | 304 | char *dirname (char *path); |
diff --git a/libbb/xconnect.c b/libbb/xconnect.c index 2cbc8400b..b3619fd0e 100644 --- a/libbb/xconnect.c +++ b/libbb/xconnect.c | |||
@@ -18,30 +18,31 @@ | |||
18 | #include <arpa/inet.h> | 18 | #include <arpa/inet.h> |
19 | #include "libbb.h" | 19 | #include "libbb.h" |
20 | 20 | ||
21 | int bb_getport(const char *port) | 21 | /* Return network byte ordered port number for a service. |
22 | * If "port" is a number use it as the port. | ||
23 | * If "port" is a name it is looked up in /etc/services, if it isnt found return | ||
24 | * default_port | ||
25 | */ | ||
26 | unsigned short bb_lookup_port(const char *port, unsigned short default_port) | ||
22 | { | 27 | { |
23 | int port_nr; | 28 | unsigned short port_nr = htons(default_port); |
29 | if (port) { | ||
24 | char *endptr; | 30 | char *endptr; |
25 | struct servent *tserv; | 31 | long port_long = strtol(port, &endptr, 10); |
26 | 32 | ||
27 | if (!port) { | 33 | if (errno != 0 || *endptr!='\0' || endptr==port || port_long < 0 || port_long > 65535) { |
28 | return -1; | 34 | struct servent *tserv = getservbyname(port, "tcp"); |
29 | } | 35 | if (tserv) { |
30 | port_nr=strtol(port, &endptr, 10); | ||
31 | if (errno != 0 || *endptr!='\0' || endptr==port || port_nr < 1 || port_nr > 65536) | ||
32 | { | ||
33 | if (port_nr==0 && (tserv = getservbyname(port, "tcp")) != NULL) { | ||
34 | port_nr = tserv->s_port; | 36 | port_nr = tserv->s_port; |
35 | } else { | ||
36 | return -1; | ||
37 | } | 37 | } |
38 | } else { | 38 | } else { |
39 | port_nr = htons(port_nr); | 39 | port_nr = htons(port_long); |
40 | } | ||
40 | } | 41 | } |
41 | return port_nr; | 42 | return port_nr; |
42 | } | 43 | } |
43 | 44 | ||
44 | void bb_lookup_host(struct sockaddr_in *s_in, const char *host, const char *port) | 45 | void bb_lookup_host(struct sockaddr_in *s_in, const char *host) |
45 | { | 46 | { |
46 | struct hostent *he; | 47 | struct hostent *he; |
47 | 48 | ||
@@ -49,10 +50,6 @@ void bb_lookup_host(struct sockaddr_in *s_in, const char *host, const char *port | |||
49 | s_in->sin_family = AF_INET; | 50 | s_in->sin_family = AF_INET; |
50 | he = xgethostbyname(host); | 51 | he = xgethostbyname(host); |
51 | memcpy(&(s_in->sin_addr), he->h_addr_list[0], he->h_length); | 52 | memcpy(&(s_in->sin_addr), he->h_addr_list[0], he->h_length); |
52 | |||
53 | if (port) { | ||
54 | s_in->sin_port=bb_getport(port); | ||
55 | } | ||
56 | } | 53 | } |
57 | 54 | ||
58 | int xconnect(struct sockaddr_in *s_addr) | 55 | int xconnect(struct sockaddr_in *s_addr) |
diff --git a/networking/ftpgetput.c b/networking/ftpgetput.c index 8724739b5..cc7a2a754 100644 --- a/networking/ftpgetput.c +++ b/networking/ftpgetput.c | |||
@@ -356,7 +356,8 @@ int ftpgetput_main(int argc, char **argv) | |||
356 | * and we want to connect to only one IP... */ | 356 | * and we want to connect to only one IP... */ |
357 | server->s_in = &s_in; | 357 | server->s_in = &s_in; |
358 | server->host = argv[optind]; | 358 | server->host = argv[optind]; |
359 | bb_lookup_host(&s_in, server->host, NULL); | 359 | bb_lookup_host(&s_in, server->host); |
360 | s_in.sin_port = bb_lookup_port(server->port, 21); | ||
360 | if (verbose_flag) { | 361 | if (verbose_flag) { |
361 | fprintf(stdout, "Connecting to %s[%s]:%s\n", | 362 | fprintf(stdout, "Connecting to %s[%s]:%s\n", |
362 | server->host, inet_ntoa(s_in.sin_addr), server->port); | 363 | server->host, inet_ntoa(s_in.sin_addr), server->port); |
diff --git a/networking/telnet.c b/networking/telnet.c index 92ddfaebf..110c9d151 100644 --- a/networking/telnet.c +++ b/networking/telnet.c | |||
@@ -570,8 +570,6 @@ static void cookmode(void) | |||
570 | 570 | ||
571 | extern int telnet_main(int argc, char** argv) | 571 | extern int telnet_main(int argc, char** argv) |
572 | { | 572 | { |
573 | char *host; | ||
574 | char *port; | ||
575 | int len; | 573 | int len; |
576 | struct sockaddr_in s_in; | 574 | struct sockaddr_in s_in; |
577 | #ifdef USE_POLL | 575 | #ifdef USE_POLL |
@@ -597,12 +595,12 @@ extern int telnet_main(int argc, char** argv) | |||
597 | G.termios_raw = G.termios_def; | 595 | G.termios_raw = G.termios_def; |
598 | cfmakeraw(&G.termios_raw); | 596 | cfmakeraw(&G.termios_raw); |
599 | 597 | ||
600 | if (argc < 2) bb_show_usage(); | 598 | if (argc < 2) |
601 | port = (argc > 2)? argv[2] : "23"; | 599 | bb_show_usage(); |
602 | 600 | ||
603 | host = argv[1]; | 601 | bb_lookup_host(&s_in, argv[1]); |
602 | s_in.sin_port = bb_lookup_port((argc == 3) ? argv[2] : "telnet", 23); | ||
604 | 603 | ||
605 | bb_lookup_host(&s_in, host, port); | ||
606 | G.netfd = xconnect(&s_in); | 604 | G.netfd = xconnect(&s_in); |
607 | 605 | ||
608 | setsockopt(G.netfd, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof one); | 606 | setsockopt(G.netfd, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof one); |
diff --git a/networking/wget.c b/networking/wget.c index 3e74ed357..9f5dbaf21 100644 --- a/networking/wget.c +++ b/networking/wget.c | |||
@@ -40,7 +40,7 @@ struct host_info { | |||
40 | }; | 40 | }; |
41 | 41 | ||
42 | static void parse_url(char *url, struct host_info *h); | 42 | static void parse_url(char *url, struct host_info *h); |
43 | static FILE *open_socket(struct sockaddr_in *s_in, int port); | 43 | static FILE *open_socket(struct sockaddr_in *s_in); |
44 | static char *gethdr(char *buf, size_t bufsiz, FILE *fp, int *istrunc); | 44 | static char *gethdr(char *buf, size_t bufsiz, FILE *fp, int *istrunc); |
45 | static int ftpcmd(char *s1, char *s2, FILE *fp, char *buf); | 45 | static int ftpcmd(char *s1, char *s2, FILE *fp, char *buf); |
46 | 46 | ||
@@ -286,10 +286,11 @@ int wget_main(int argc, char **argv) | |||
286 | /* We want to do exactly _one_ DNS lookup, since some | 286 | /* We want to do exactly _one_ DNS lookup, since some |
287 | * sites (i.e. ftp.us.debian.org) use round-robin DNS | 287 | * sites (i.e. ftp.us.debian.org) use round-robin DNS |
288 | * and we want to connect to only one IP... */ | 288 | * and we want to connect to only one IP... */ |
289 | bb_lookup_host(&s_in, server.host, NULL); | 289 | bb_lookup_host(&s_in, server.host); |
290 | s_in.sin_port = server.port; | ||
290 | if (quiet_flag==FALSE) { | 291 | if (quiet_flag==FALSE) { |
291 | fprintf(stdout, "Connecting to %s[%s]:%d\n", | 292 | fprintf(stdout, "Connecting to %s[%s]:%d\n", |
292 | server.host, inet_ntoa(s_in.sin_addr), server.port); | 293 | server.host, inet_ntoa(s_in.sin_addr), ntohs(server.port)); |
293 | } | 294 | } |
294 | 295 | ||
295 | if (proxy || !target.is_ftp) { | 296 | if (proxy || !target.is_ftp) { |
@@ -306,7 +307,7 @@ int wget_main(int argc, char **argv) | |||
306 | * Open socket to http server | 307 | * Open socket to http server |
307 | */ | 308 | */ |
308 | if (sfp) fclose(sfp); | 309 | if (sfp) fclose(sfp); |
309 | sfp = open_socket(&s_in, server.port); | 310 | sfp = open_socket(&s_in); |
310 | 311 | ||
311 | /* | 312 | /* |
312 | * Send HTTP request. | 313 | * Send HTTP request. |
@@ -418,7 +419,7 @@ read_response: | |||
418 | if (! target.user) | 419 | if (! target.user) |
419 | target.user = bb_xstrdup("anonymous:busybox@"); | 420 | target.user = bb_xstrdup("anonymous:busybox@"); |
420 | 421 | ||
421 | sfp = open_socket(&s_in, server.port); | 422 | sfp = open_socket(&s_in); |
422 | if (ftpcmd(NULL, NULL, sfp, buf) != 220) | 423 | if (ftpcmd(NULL, NULL, sfp, buf) != 220) |
423 | close_delete_and_die("%s", buf+4); | 424 | close_delete_and_die("%s", buf+4); |
424 | 425 | ||
@@ -461,7 +462,8 @@ read_response: | |||
461 | port = atoi(s+1); | 462 | port = atoi(s+1); |
462 | s = strrchr(buf, ','); | 463 | s = strrchr(buf, ','); |
463 | port += atoi(s+1) * 256; | 464 | port += atoi(s+1) * 256; |
464 | dfp = open_socket(&s_in, port); | 465 | s_in.sin_port = htons(port); |
466 | dfp = open_socket(&s_in); | ||
465 | 467 | ||
466 | if (do_continue) { | 468 | if (do_continue) { |
467 | sprintf(buf, "REST %ld", beg_range); | 469 | sprintf(buf, "REST %ld", beg_range); |
@@ -535,11 +537,11 @@ void parse_url(char *url, struct host_info *h) | |||
535 | char *cp, *sp, *up, *pp; | 537 | char *cp, *sp, *up, *pp; |
536 | 538 | ||
537 | if (strncmp(url, "http://", 7) == 0) { | 539 | if (strncmp(url, "http://", 7) == 0) { |
538 | h->port = 80; | 540 | h->port = bb_lookup_port("http", 80); |
539 | h->host = url + 7; | 541 | h->host = url + 7; |
540 | h->is_ftp = 0; | 542 | h->is_ftp = 0; |
541 | } else if (strncmp(url, "ftp://", 6) == 0) { | 543 | } else if (strncmp(url, "ftp://", 6) == 0) { |
542 | h->port = 21; | 544 | h->port = bb_lookup_port("ftp", 21); |
543 | h->host = url + 6; | 545 | h->host = url + 6; |
544 | h->is_ftp = 1; | 546 | h->is_ftp = 1; |
545 | } else | 547 | } else |
@@ -586,21 +588,12 @@ void parse_url(char *url, struct host_info *h) | |||
586 | } | 588 | } |
587 | 589 | ||
588 | 590 | ||
589 | FILE *open_socket(struct sockaddr_in *s_in, int port) | 591 | FILE *open_socket(struct sockaddr_in *s_in) |
590 | { | 592 | { |
591 | int fd; | ||
592 | FILE *fp; | 593 | FILE *fp; |
593 | 594 | ||
594 | if (port>0 && port < 65536) { | 595 | fp = fdopen(xconnect(s_in), "r+"); |
595 | s_in->sin_port=htons(port); | 596 | if (fp == NULL) |
596 | } | ||
597 | |||
598 | fd=xconnect(s_in); | ||
599 | |||
600 | /* | ||
601 | * Get the server onto a stdio stream. | ||
602 | */ | ||
603 | if ((fp = fdopen(fd, "r+")) == NULL) | ||
604 | bb_perror_msg_and_die("fdopen()"); | 597 | bb_perror_msg_and_die("fdopen()"); |
605 | 598 | ||
606 | return fp; | 599 | return fp; |
@@ -842,7 +835,7 @@ progressmeter(int flag) | |||
842 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 835 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
843 | * SUCH DAMAGE. | 836 | * SUCH DAMAGE. |
844 | * | 837 | * |
845 | * $Id: wget.c,v 1.62 2003/12/19 12:08:56 bug1 Exp $ | 838 | * $Id: wget.c,v 1.63 2003/12/20 01:47:18 bug1 Exp $ |
846 | */ | 839 | */ |
847 | 840 | ||
848 | 841 | ||
diff --git a/util-linux/rdate.c b/util-linux/rdate.c index 0b5f8e460..a317cda55 100644 --- a/util-linux/rdate.c +++ b/util-linux/rdate.c | |||
@@ -50,7 +50,8 @@ static time_t askremotedate(const char *host) | |||
50 | struct sockaddr_in s_in; | 50 | struct sockaddr_in s_in; |
51 | int fd; | 51 | int fd; |
52 | 52 | ||
53 | bb_lookup_host(&s_in, host, "time"); | 53 | bb_lookup_host(&s_in, host); |
54 | s_in.sin_port = bb_lookup_port("time", 37); | ||
54 | 55 | ||
55 | /* Add a timeout for dead or non accessable servers */ | 56 | /* Add a timeout for dead or non accessable servers */ |
56 | alarm(10); | 57 | alarm(10); |