diff options
| author | bug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2004-01-17 05:03:31 +0000 |
|---|---|---|
| committer | bug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2004-01-17 05:03:31 +0000 |
| commit | d513a457e9b733962cabd486bb5f1ba5e279e82d (patch) | |
| tree | 2488441544ab16f8e08d0955d323019e96ed3d4f | |
| parent | 67b684b76ebc1a161e88404d35da4ee52364b5d8 (diff) | |
| download | busybox-w32-d513a457e9b733962cabd486bb5f1ba5e279e82d.tar.gz busybox-w32-d513a457e9b733962cabd486bb5f1ba5e279e82d.tar.bz2 busybox-w32-d513a457e9b733962cabd486bb5f1ba5e279e82d.zip | |
Modify bb_lookup_port to allow the protocol to be specified, allowing
/etc/services support for inetd, netcat and tftp.
git-svn-id: svn://busybox.net/trunk/busybox@8307 69ca8d6d-28ef-0310-b511-8ec308f3f277
| -rw-r--r-- | include/libbb.h | 2 | ||||
| -rw-r--r-- | libbb/xconnect.c | 4 | ||||
| -rw-r--r-- | networking/ftpgetput.c | 2 | ||||
| -rw-r--r-- | networking/inetd.c | 20 | ||||
| -rw-r--r-- | networking/nc.c | 6 | ||||
| -rw-r--r-- | networking/telnet.c | 2 | ||||
| -rw-r--r-- | networking/tftp.c | 13 | ||||
| -rw-r--r-- | networking/wget.c | 6 |
8 files changed, 23 insertions, 32 deletions
diff --git a/include/libbb.h b/include/libbb.h index b2592c824..86e4fbea7 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
| @@ -297,7 +297,7 @@ 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 unsigned short bb_lookup_port(const char *port, unsigned short default_port); | 300 | extern unsigned short bb_lookup_port(const char *port, const char *protocol, unsigned short default_port); |
| 301 | extern void bb_lookup_host(struct sockaddr_in *s_in, const char *host); | 301 | extern void bb_lookup_host(struct sockaddr_in *s_in, const char *host); |
| 302 | 302 | ||
| 303 | //#warning wrap this? | 303 | //#warning wrap this? |
diff --git a/libbb/xconnect.c b/libbb/xconnect.c index 29b984720..2443bb299 100644 --- a/libbb/xconnect.c +++ b/libbb/xconnect.c | |||
| @@ -23,7 +23,7 @@ | |||
| 23 | * If "port" is a name it is looked up in /etc/services, if it isnt found return | 23 | * If "port" is a name it is looked up in /etc/services, if it isnt found return |
| 24 | * default_port | 24 | * default_port |
| 25 | */ | 25 | */ |
| 26 | unsigned short bb_lookup_port(const char *port, unsigned short default_port) | 26 | unsigned short bb_lookup_port(const char *port, const char *protocol, unsigned short default_port) |
| 27 | { | 27 | { |
| 28 | unsigned short port_nr = htons(default_port); | 28 | unsigned short port_nr = htons(default_port); |
| 29 | if (port) { | 29 | if (port) { |
| @@ -37,7 +37,7 @@ unsigned short bb_lookup_port(const char *port, unsigned short default_port) | |||
| 37 | errno = 0; | 37 | errno = 0; |
| 38 | port_long = strtol(port, &endptr, 10); | 38 | port_long = strtol(port, &endptr, 10); |
| 39 | if (errno != 0 || *endptr!='\0' || endptr==port || port_long < 0 || port_long > 65535) { | 39 | if (errno != 0 || *endptr!='\0' || endptr==port || port_long < 0 || port_long > 65535) { |
| 40 | struct servent *tserv = getservbyname(port, "tcp"); | 40 | struct servent *tserv = getservbyname(port, protocol); |
| 41 | if (tserv) { | 41 | if (tserv) { |
| 42 | port_nr = tserv->s_port; | 42 | port_nr = tserv->s_port; |
| 43 | } | 43 | } |
diff --git a/networking/ftpgetput.c b/networking/ftpgetput.c index 27b272a48..4f6be1196 100644 --- a/networking/ftpgetput.c +++ b/networking/ftpgetput.c | |||
| @@ -349,7 +349,7 @@ int ftpgetput_main(int argc, char **argv) | |||
| 349 | * and we want to connect to only one IP... */ | 349 | * and we want to connect to only one IP... */ |
| 350 | server->s_in = &s_in; | 350 | server->s_in = &s_in; |
| 351 | bb_lookup_host(&s_in, argv[optind]); | 351 | bb_lookup_host(&s_in, argv[optind]); |
| 352 | s_in.sin_port = bb_lookup_port(port, 21); | 352 | s_in.sin_port = bb_lookup_port(port, "tcp", 21); |
| 353 | if (verbose_flag) { | 353 | if (verbose_flag) { |
| 354 | printf("Connecting to %s[%s]:%d\n", | 354 | printf("Connecting to %s[%s]:%d\n", |
| 355 | argv[optind], inet_ntoa(s_in.sin_addr), ntohs(s_in.sin_port)); | 355 | argv[optind], inet_ntoa(s_in.sin_addr), ntohs(s_in.sin_port)); |
diff --git a/networking/inetd.c b/networking/inetd.c index d225527a9..24415fe7d 100644 --- a/networking/inetd.c +++ b/networking/inetd.c | |||
| @@ -610,19 +610,13 @@ static void config(int signum) | |||
| 610 | sep->se_ctrladdr_in.sin_family = AF_INET; | 610 | sep->se_ctrladdr_in.sin_family = AF_INET; |
| 611 | sep->se_ctrladdr_size = sizeof sep->se_ctrladdr_in; | 611 | sep->se_ctrladdr_size = sizeof sep->se_ctrladdr_in; |
| 612 | { | 612 | { |
| 613 | u_short port = htons(atoi(sep->se_service)); | 613 | u_short port = bb_lookup_port(sep->se_service, sep->se_proto, 0); |
| 614 | 614 | ||
| 615 | if (!port) { | 615 | if (port == 0) { |
| 616 | struct servent *sp; | 616 | syslog(LOG_ERR, |
| 617 | sp = getservbyname(sep->se_service, | 617 | "%s/%s: unknown service", |
| 618 | sep->se_proto); | 618 | sep->se_service, sep->se_proto); |
| 619 | if (sp == 0) { | 619 | continue; |
| 620 | syslog(LOG_ERR, | ||
| 621 | "%s/%s: unknown service", | ||
| 622 | sep->se_service, sep->se_proto); | ||
| 623 | continue; | ||
| 624 | } | ||
| 625 | port = sp->s_port; | ||
| 626 | } | 620 | } |
| 627 | if (port != sep->se_ctrladdr_in.sin_port) { | 621 | if (port != sep->se_ctrladdr_in.sin_port) { |
| 628 | sep->se_ctrladdr_in.sin_port = port; | 622 | sep->se_ctrladdr_in.sin_port = port; |
diff --git a/networking/nc.c b/networking/nc.c index 4888ccceb..ecb4a007b 100644 --- a/networking/nc.c +++ b/networking/nc.c | |||
| @@ -61,7 +61,7 @@ int nc_main(int argc, char **argv) | |||
| 61 | do_listen++; | 61 | do_listen++; |
| 62 | break; | 62 | break; |
| 63 | case 'p': | 63 | case 'p': |
| 64 | lport = atoi(optarg); | 64 | lport = bb_lookup_port(optarg, "tcp", 0); |
| 65 | break; | 65 | break; |
| 66 | case 'i': | 66 | case 'i': |
| 67 | delay = atoi(optarg); | 67 | delay = atoi(optarg); |
| @@ -96,7 +96,7 @@ int nc_main(int argc, char **argv) | |||
| 96 | 96 | ||
| 97 | if (lport != 0) { | 97 | if (lport != 0) { |
| 98 | memset(&address.sin_addr, 0, sizeof(address.sin_addr)); | 98 | memset(&address.sin_addr, 0, sizeof(address.sin_addr)); |
| 99 | address.sin_port = htons(lport); | 99 | address.sin_port = lport; |
| 100 | 100 | ||
| 101 | if (bind(sfd, (struct sockaddr *) &address, sizeof(address)) < 0) | 101 | if (bind(sfd, (struct sockaddr *) &address, sizeof(address)) < 0) |
| 102 | bb_perror_msg_and_die("bind"); | 102 | bb_perror_msg_and_die("bind"); |
| @@ -117,7 +117,7 @@ int nc_main(int argc, char **argv) | |||
| 117 | hostinfo = xgethostbyname(argv[optind]); | 117 | hostinfo = xgethostbyname(argv[optind]); |
| 118 | 118 | ||
| 119 | address.sin_addr = *(struct in_addr *) *hostinfo->h_addr_list; | 119 | address.sin_addr = *(struct in_addr *) *hostinfo->h_addr_list; |
| 120 | address.sin_port = htons(atoi(argv[optind+1])); | 120 | address.sin_port = bb_lookup_port(argv[optind+1], "tcp", 0); |
| 121 | 121 | ||
| 122 | if (connect(sfd, (struct sockaddr *) &address, sizeof(address)) < 0) | 122 | if (connect(sfd, (struct sockaddr *) &address, sizeof(address)) < 0) |
| 123 | bb_perror_msg_and_die("connect"); | 123 | bb_perror_msg_and_die("connect"); |
diff --git a/networking/telnet.c b/networking/telnet.c index 110c9d151..1b71bf26a 100644 --- a/networking/telnet.c +++ b/networking/telnet.c | |||
| @@ -599,7 +599,7 @@ extern int telnet_main(int argc, char** argv) | |||
| 599 | bb_show_usage(); | 599 | bb_show_usage(); |
| 600 | 600 | ||
| 601 | bb_lookup_host(&s_in, argv[1]); | 601 | bb_lookup_host(&s_in, argv[1]); |
| 602 | s_in.sin_port = bb_lookup_port((argc == 3) ? argv[2] : "telnet", 23); | 602 | s_in.sin_port = bb_lookup_port((argc == 3) ? argv[2] : "telnet", "tcp", 23); |
| 603 | 603 | ||
| 604 | G.netfd = xconnect(&s_in); | 604 | G.netfd = xconnect(&s_in); |
| 605 | 605 | ||
diff --git a/networking/tftp.c b/networking/tftp.c index a1a79a09c..146857686 100644 --- a/networking/tftp.c +++ b/networking/tftp.c | |||
| @@ -138,7 +138,7 @@ static char *tftp_option_get(char *buf, int len, char *option) | |||
| 138 | #endif | 138 | #endif |
| 139 | 139 | ||
| 140 | static inline int tftp(const int cmd, const struct hostent *host, | 140 | static inline int tftp(const int cmd, const struct hostent *host, |
| 141 | const char *remotefile, int localfd, const int port, int tftp_bufsize) | 141 | const char *remotefile, int localfd, const unsigned short port, int tftp_bufsize) |
| 142 | { | 142 | { |
| 143 | const int cmd_get = cmd & tftp_cmd_get; | 143 | const int cmd_get = cmd & tftp_cmd_get; |
| 144 | const int cmd_put = cmd & tftp_cmd_put; | 144 | const int cmd_put = cmd & tftp_cmd_put; |
| @@ -179,7 +179,7 @@ static inline int tftp(const int cmd, const struct hostent *host, | |||
| 179 | bind(socketfd, (struct sockaddr *)&sa, len); | 179 | bind(socketfd, (struct sockaddr *)&sa, len); |
| 180 | 180 | ||
| 181 | sa.sin_family = host->h_addrtype; | 181 | sa.sin_family = host->h_addrtype; |
| 182 | sa.sin_port = htons(port); | 182 | sa.sin_port = port; |
| 183 | memcpy(&sa.sin_addr, (struct in_addr *) host->h_addr, | 183 | memcpy(&sa.sin_addr, (struct in_addr *) host->h_addr, |
| 184 | sizeof(sa.sin_addr)); | 184 | sizeof(sa.sin_addr)); |
| 185 | 185 | ||
| @@ -332,7 +332,7 @@ static inline int tftp(const int cmd, const struct hostent *host, | |||
| 332 | 332 | ||
| 333 | timeout = 0; | 333 | timeout = 0; |
| 334 | 334 | ||
| 335 | if (sa.sin_port == htons(port)) { | 335 | if (sa.sin_port == port) { |
| 336 | sa.sin_port = from.sin_port; | 336 | sa.sin_port = from.sin_port; |
| 337 | } | 337 | } |
| 338 | if (sa.sin_port == from.sin_port) { | 338 | if (sa.sin_port == from.sin_port) { |
| @@ -487,7 +487,7 @@ int tftp_main(int argc, char **argv) | |||
| 487 | struct hostent *host = NULL; | 487 | struct hostent *host = NULL; |
| 488 | char *localfile = NULL; | 488 | char *localfile = NULL; |
| 489 | char *remotefile = NULL; | 489 | char *remotefile = NULL; |
| 490 | int port = 69; | 490 | int port; |
| 491 | int cmd = 0; | 491 | int cmd = 0; |
| 492 | int fd = -1; | 492 | int fd = -1; |
| 493 | int flags = 0; | 493 | int flags = 0; |
| @@ -564,10 +564,7 @@ int tftp_main(int argc, char **argv) | |||
| 564 | } | 564 | } |
| 565 | 565 | ||
| 566 | host = xgethostbyname(argv[optind]); | 566 | host = xgethostbyname(argv[optind]); |
| 567 | 567 | port = bb_lookup_port(argv[optind + 1], "udp", 69); | |
| 568 | if (optind + 2 == argc) { | ||
| 569 | port = atoi(argv[optind + 1]); | ||
| 570 | } | ||
| 571 | 568 | ||
| 572 | #ifdef CONFIG_FEATURE_TFTP_DEBUG | 569 | #ifdef CONFIG_FEATURE_TFTP_DEBUG |
| 573 | printf("using server \"%s\", remotefile \"%s\", " | 570 | printf("using server \"%s\", remotefile \"%s\", " |
diff --git a/networking/wget.c b/networking/wget.c index 8bed7369f..c92771e18 100644 --- a/networking/wget.c +++ b/networking/wget.c | |||
| @@ -537,11 +537,11 @@ void parse_url(char *url, struct host_info *h) | |||
| 537 | char *cp, *sp, *up, *pp; | 537 | char *cp, *sp, *up, *pp; |
| 538 | 538 | ||
| 539 | if (strncmp(url, "http://", 7) == 0) { | 539 | if (strncmp(url, "http://", 7) == 0) { |
| 540 | h->port = bb_lookup_port("http", 80); | 540 | h->port = bb_lookup_port("http", "tcp", 80); |
| 541 | h->host = url + 7; | 541 | h->host = url + 7; |
| 542 | h->is_ftp = 0; | 542 | h->is_ftp = 0; |
| 543 | } else if (strncmp(url, "ftp://", 6) == 0) { | 543 | } else if (strncmp(url, "ftp://", 6) == 0) { |
| 544 | h->port = bb_lookup_port("ftp", 21); | 544 | h->port = bb_lookup_port("ftp", "tfp", 21); |
| 545 | h->host = url + 6; | 545 | h->host = url + 6; |
| 546 | h->is_ftp = 1; | 546 | h->is_ftp = 1; |
| 547 | } else | 547 | } else |
| @@ -834,7 +834,7 @@ progressmeter(int flag) | |||
| 834 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 834 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| 835 | * SUCH DAMAGE. | 835 | * SUCH DAMAGE. |
| 836 | * | 836 | * |
| 837 | * $Id: wget.c,v 1.64 2003/12/27 00:21:47 bug1 Exp $ | 837 | * $Id: wget.c,v 1.65 2004/01/17 05:03:31 bug1 Exp $ |
| 838 | */ | 838 | */ |
| 839 | 839 | ||
| 840 | 840 | ||
