diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-06-19 11:12:46 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-06-19 11:12:46 +0000 |
commit | 6d9ea24611090f06b74e0e5b038b6c5b4bbe1063 (patch) | |
tree | 7fbefb532c3412b0264a9faf7d0ad3f42254b86e /networking | |
parent | 1b16bdaebf7d0e543e048dfec9f34f06e983336c (diff) | |
download | busybox-w32-6d9ea24611090f06b74e0e5b038b6c5b4bbe1063.tar.gz busybox-w32-6d9ea24611090f06b74e0e5b038b6c5b4bbe1063.tar.bz2 busybox-w32-6d9ea24611090f06b74e0e5b038b6c5b4bbe1063.zip |
networking/interface.c: huke remaining big statics; use malloc for INET[6]_rresolve
return value. Went thru callers and adjusted them - code got smaller too.
function old new delta
ip_port_str - 126 +126
INET6_rresolve 165 182 +17
static.cache 20 24 +4
route_main 2092 2091 -1
INET_sprint 61 59 -2
INET_nn 4 - -4
INET6_sprint 59 53 -6
udp_do_one 518 508 -10
tcp_do_one 433 423 -10
raw_do_one 494 484 -10
traceroute_main 4117 4105 -12
INET_rresolve 334 321 -13
bb_displayroutes 494 456 -38
snprint_ip_port 244 - -244
static.buff 264 16 -248
------------------------------------------------------------------------------
(add/remove: 1/2 grow/shrink: 2/10 up/down: 147/-598) Total: -451 bytes
size busybox_old busybox_unstripped
text data bss dec hex filename
751073 3048 14688 768809 bbb29 busybox_old
750873 3048 14440 768361 bb969 busybox_unstripped
Diffstat (limited to 'networking')
-rw-r--r-- | networking/interface.c | 13 | ||||
-rw-r--r-- | networking/netstat.c | 79 | ||||
-rw-r--r-- | networking/route.c | 26 | ||||
-rw-r--r-- | networking/traceroute.c | 18 |
4 files changed, 61 insertions, 75 deletions
diff --git a/networking/interface.c b/networking/interface.c index f8721f409..204febf7d 100644 --- a/networking/interface.c +++ b/networking/interface.c | |||
@@ -84,13 +84,12 @@ struct in6_ifreq { | |||
84 | /* Display an Internet socket address. */ | 84 | /* Display an Internet socket address. */ |
85 | static const char *INET_sprint(struct sockaddr *sap, int numeric) | 85 | static const char *INET_sprint(struct sockaddr *sap, int numeric) |
86 | { | 86 | { |
87 | static char buff[128]; | 87 | static char *buff; |
88 | 88 | ||
89 | free(buff); | ||
89 | if (sap->sa_family == 0xFFFF || sap->sa_family == 0) | 90 | if (sap->sa_family == 0xFFFF || sap->sa_family == 0) |
90 | return "[NONE SET]"; | 91 | return "[NONE SET]"; |
91 | if (INET_rresolve(buff, sizeof(buff), (struct sockaddr_in *) sap, | 92 | buff = INET_rresolve((struct sockaddr_in *) sap, numeric, 0xffffff00); |
92 | numeric, 0xffffff00) != 0) | ||
93 | return NULL; | ||
94 | return buff; | 93 | return buff; |
95 | } | 94 | } |
96 | 95 | ||
@@ -167,12 +166,12 @@ static const struct aftype inet_aftype = { | |||
167 | /* dirty! struct sockaddr usually doesn't suffer for inet6 addresses, fst. */ | 166 | /* dirty! struct sockaddr usually doesn't suffer for inet6 addresses, fst. */ |
168 | static const char *INET6_sprint(struct sockaddr *sap, int numeric) | 167 | static const char *INET6_sprint(struct sockaddr *sap, int numeric) |
169 | { | 168 | { |
170 | static char buff[128]; | 169 | static char *buff; |
171 | 170 | ||
171 | free(buff); | ||
172 | if (sap->sa_family == 0xFFFF || sap->sa_family == 0) | 172 | if (sap->sa_family == 0xFFFF || sap->sa_family == 0) |
173 | return "[NONE SET]"; | 173 | return "[NONE SET]"; |
174 | if (INET6_rresolve(buff, sizeof(buff), (struct sockaddr_in6 *) sap, numeric)) | 174 | buff = INET6_rresolve((struct sockaddr_in6 *) sap, numeric); |
175 | return "[UNKNOWN]"; | ||
176 | return buff; | 175 | return buff; |
177 | } | 176 | } |
178 | 177 | ||
diff --git a/networking/netstat.c b/networking/netstat.c index d6c10b07b..746e25091 100644 --- a/networking/netstat.c +++ b/networking/netstat.c | |||
@@ -120,50 +120,33 @@ static void build_ipv4_addr(char* local_addr, struct sockaddr_in* localaddr) | |||
120 | ((struct sockaddr *) localaddr)->sa_family = AF_INET; | 120 | ((struct sockaddr *) localaddr)->sa_family = AF_INET; |
121 | } | 121 | } |
122 | 122 | ||
123 | static const char *get_sname(int port, const char *proto, int num) | 123 | static const char *get_sname(int port, const char *proto, int numeric) |
124 | { | 124 | { |
125 | /* hummm, we return static buffer here!! */ | 125 | if (!port) |
126 | const char *str = itoa(ntohs(port)); | 126 | return "*"; |
127 | if (!num) { | 127 | if (!numeric) { |
128 | struct servent *se = getservbyport(port, proto); | 128 | struct servent *se = getservbyport(port, proto); |
129 | if (se) | 129 | if (se) |
130 | str = se->s_name; | 130 | return se->s_name; |
131 | } | 131 | } |
132 | if (!port) { | 132 | /* hummm, we may return static buffer here!! */ |
133 | str = "*"; | 133 | return itoa(ntohs(port)); |
134 | } | ||
135 | return str; | ||
136 | } | 134 | } |
137 | 135 | ||
138 | static void snprint_ip_port(char *ip_port, int size, struct sockaddr *addr, int port, const char *proto, int numeric) | 136 | static char *ip_port_str(struct sockaddr *addr, int port, const char *proto, int numeric) |
139 | { | 137 | { |
140 | const char *port_name; | 138 | enum { salen = USE_FEATURE_IPV6(sizeof(struct sockaddr_in6)) SKIP_FEATURE_IPV6(sizeof(struct sockaddr_in)) }; |
141 | int max_len; | 139 | char *host, *host_port; |
142 | int port_name_len; | ||
143 | 140 | ||
144 | // TODO: replace by xmalloc_sockaddr2host? | 141 | /* Code which used "*" for INADDR_ANY is removed: it's ambiguous in IPv6, |
145 | #if ENABLE_FEATURE_IPV6 | 142 | * while "0.0.0.0" is not. */ |
146 | if (addr->sa_family == AF_INET6) { | 143 | |
147 | INET6_rresolve(ip_port, size, (struct sockaddr_in6 *)addr, | 144 | host = numeric ? xmalloc_sockaddr2dotted_noport(addr, salen) |
148 | (numeric & NETSTAT_NUMERIC) ? 0x0fff : 0); | 145 | : xmalloc_sockaddr2host_noport(addr, salen); |
149 | } else | 146 | |
150 | #endif | 147 | host_port = xasprintf("%s:%s", host, get_sname(htons(port), proto, numeric)); |
151 | { | 148 | free(host); |
152 | INET_rresolve(ip_port, size, (struct sockaddr_in *)addr, | 149 | return host_port; |
153 | 0x4000 | ((numeric & NETSTAT_NUMERIC) ? 0x0fff : 0), | ||
154 | 0xffffffff); | ||
155 | } | ||
156 | port_name = get_sname(htons(port), proto, numeric); | ||
157 | |||
158 | max_len = (option_mask32 & OPT_widedisplay) | ||
159 | ? (PRINT_IP_MAX_SIZE_WIDE - 1) | ||
160 | : (PRINT_IP_MAX_SIZE - 1); | ||
161 | port_name_len = strlen(port_name); | ||
162 | if ((strlen(ip_port) + port_name_len) > max_len) | ||
163 | ip_port[max_len - port_name_len] = '\0'; | ||
164 | ip_port += strlen(ip_port); | ||
165 | *ip_port++ = ':'; | ||
166 | strcpy(ip_port, port_name); | ||
167 | } | 150 | } |
168 | 151 | ||
169 | static void tcp_do_one(int lnr, const char *line) | 152 | static void tcp_do_one(int lnr, const char *line) |
@@ -206,14 +189,16 @@ static void tcp_do_one(int lnr, const char *line) | |||
206 | if ((rem_port && (flags & NETSTAT_CONNECTED)) | 189 | if ((rem_port && (flags & NETSTAT_CONNECTED)) |
207 | || (!rem_port && (flags & NETSTAT_LISTENING)) | 190 | || (!rem_port && (flags & NETSTAT_LISTENING)) |
208 | ) { | 191 | ) { |
209 | snprint_ip_port(local_addr, sizeof(local_addr), | 192 | char *l = ip_port_str( |
210 | (struct sockaddr *) &localaddr, local_port, | 193 | (struct sockaddr *) &localaddr, local_port, |
211 | "tcp", flags & NETSTAT_NUMERIC); | 194 | "tcp", flags & NETSTAT_NUMERIC); |
212 | snprint_ip_port(rem_addr, sizeof(rem_addr), | 195 | char *r = ip_port_str( |
213 | (struct sockaddr *) &remaddr, rem_port, | 196 | (struct sockaddr *) &remaddr, rem_port, |
214 | "tcp", flags & NETSTAT_NUMERIC); | 197 | "tcp", flags & NETSTAT_NUMERIC); |
215 | printf(net_conn_line, | 198 | printf(net_conn_line, |
216 | "tcp", rxq, txq, local_addr, rem_addr, tcp_state[state]); | 199 | "tcp", rxq, txq, l, r, tcp_state[state]); |
200 | free(l); | ||
201 | free(r); | ||
217 | } | 202 | } |
218 | } | 203 | } |
219 | 204 | ||
@@ -285,14 +270,16 @@ static void udp_do_one(int lnr, const char *line) | |||
285 | if ((have_remaddr && (flags & NETSTAT_CONNECTED)) | 270 | if ((have_remaddr && (flags & NETSTAT_CONNECTED)) |
286 | || (!have_remaddr && (flags & NETSTAT_LISTENING)) | 271 | || (!have_remaddr && (flags & NETSTAT_LISTENING)) |
287 | ) { | 272 | ) { |
288 | snprint_ip_port(local_addr, sizeof(local_addr), | 273 | char *l = ip_port_str( |
289 | (struct sockaddr *) &localaddr, local_port, | 274 | (struct sockaddr *) &localaddr, local_port, |
290 | "udp", flags & NETSTAT_NUMERIC); | 275 | "udp", flags & NETSTAT_NUMERIC); |
291 | snprint_ip_port(rem_addr, sizeof(rem_addr), | 276 | char *r = ip_port_str( |
292 | (struct sockaddr *) &remaddr, rem_port, | 277 | (struct sockaddr *) &remaddr, rem_port, |
293 | "udp", flags & NETSTAT_NUMERIC); | 278 | "udp", flags & NETSTAT_NUMERIC); |
294 | printf(net_conn_line, | 279 | printf(net_conn_line, |
295 | "udp", rxq, txq, local_addr, rem_addr, state_str); | 280 | "udp", rxq, txq, l, r, state_str); |
281 | free(l); | ||
282 | free(r); | ||
296 | } | 283 | } |
297 | } | 284 | } |
298 | } | 285 | } |
@@ -339,14 +326,16 @@ static void raw_do_one(int lnr, const char *line) | |||
339 | if ((have_remaddr && (flags & NETSTAT_CONNECTED)) | 326 | if ((have_remaddr && (flags & NETSTAT_CONNECTED)) |
340 | || (!have_remaddr && (flags & NETSTAT_LISTENING)) | 327 | || (!have_remaddr && (flags & NETSTAT_LISTENING)) |
341 | ) { | 328 | ) { |
342 | snprint_ip_port(local_addr, sizeof(local_addr), | 329 | char *l = ip_port_str( |
343 | (struct sockaddr *) &localaddr, local_port, | 330 | (struct sockaddr *) &localaddr, local_port, |
344 | "raw", flags & NETSTAT_NUMERIC); | 331 | "raw", flags & NETSTAT_NUMERIC); |
345 | snprint_ip_port(rem_addr, sizeof(rem_addr), | 332 | char *r = ip_port_str( |
346 | (struct sockaddr *) &remaddr, rem_port, | 333 | (struct sockaddr *) &remaddr, rem_port, |
347 | "raw", flags & NETSTAT_NUMERIC); | 334 | "raw", flags & NETSTAT_NUMERIC); |
348 | printf(net_conn_line, | 335 | printf(net_conn_line, |
349 | "raw", rxq, txq, local_addr, rem_addr, itoa(state)); | 336 | "raw", rxq, txq, l, r, itoa(state)); |
337 | free(l); | ||
338 | free(r); | ||
350 | } | 339 | } |
351 | } | 340 | } |
352 | } | 341 | } |
diff --git a/networking/route.c b/networking/route.c index 881332b9f..b5490ddd8 100644 --- a/networking/route.c +++ b/networking/route.c | |||
@@ -478,7 +478,7 @@ static void set_flags(char *flagstr, int flags) | |||
478 | /* also used in netstat */ | 478 | /* also used in netstat */ |
479 | void bb_displayroutes(int noresolve, int netstatfmt) | 479 | void bb_displayroutes(int noresolve, int netstatfmt) |
480 | { | 480 | { |
481 | char devname[64], flags[16], sdest[16], sgw[16]; | 481 | char devname[64], flags[16], *sdest, *sgw; |
482 | unsigned long d, g, m; | 482 | unsigned long d, g, m; |
483 | int flgs, ref, use, metric, mtu, win, ir; | 483 | int flgs, ref, use, metric, mtu, win, ir; |
484 | struct sockaddr_in s_addr; | 484 | struct sockaddr_in s_addr; |
@@ -520,15 +520,14 @@ void bb_displayroutes(int noresolve, int netstatfmt) | |||
520 | memset(&s_addr, 0, sizeof(struct sockaddr_in)); | 520 | memset(&s_addr, 0, sizeof(struct sockaddr_in)); |
521 | s_addr.sin_family = AF_INET; | 521 | s_addr.sin_family = AF_INET; |
522 | s_addr.sin_addr.s_addr = d; | 522 | s_addr.sin_addr.s_addr = d; |
523 | INET_rresolve(sdest, sizeof(sdest), &s_addr, | 523 | sdest = INET_rresolve(&s_addr, (noresolve | 0x8000), m); /* 'default' instead of '*' */ |
524 | (noresolve | 0x8000), m); /* Default instead of *. */ | ||
525 | |||
526 | s_addr.sin_addr.s_addr = g; | 524 | s_addr.sin_addr.s_addr = g; |
527 | INET_rresolve(sgw, sizeof(sgw), &s_addr, | 525 | sgw = INET_rresolve(&s_addr, (noresolve | 0x4000), m); /* Host instead of net */ |
528 | (noresolve | 0x4000), m); /* Host instead of net. */ | ||
529 | |||
530 | mask.s_addr = m; | 526 | mask.s_addr = m; |
531 | printf("%-16s%-16s%-16s%-6s", sdest, sgw, inet_ntoa(mask), flags); | 527 | /* "%15.15s" truncates hostnames, do we really want that? */ |
528 | printf("%-15.15s %-15.15s %-16s%-6s", sdest, sgw, inet_ntoa(mask), flags); | ||
529 | free(sdest); | ||
530 | free(sgw); | ||
532 | if (netstatfmt) { | 531 | if (netstatfmt) { |
533 | printf("%5d %-5d %6d %s\n", mtu, win, ir, devname); | 532 | printf("%5d %-5d %6d %s\n", mtu, win, ir, devname); |
534 | } else { | 533 | } else { |
@@ -541,7 +540,7 @@ void bb_displayroutes(int noresolve, int netstatfmt) | |||
541 | 540 | ||
542 | static void INET6_displayroutes(int noresolve) | 541 | static void INET6_displayroutes(int noresolve) |
543 | { | 542 | { |
544 | char addr6[128], naddr6[128]; | 543 | char addr6[128], *naddr6; |
545 | /* In addr6x, we store both 40-byte ':'-delimited ipv6 addresses. | 544 | /* In addr6x, we store both 40-byte ':'-delimited ipv6 addresses. |
546 | * We read the non-delimited strings into the tail of the buffer | 545 | * We read the non-delimited strings into the tail of the buffer |
547 | * using fscanf and then modify the buffer by shifting forward | 546 | * using fscanf and then modify the buffer by shifting forward |
@@ -581,7 +580,7 @@ static void INET6_displayroutes(int noresolve) | |||
581 | 580 | ||
582 | do { | 581 | do { |
583 | if (!*p) { | 582 | if (!*p) { |
584 | if (i==40) { /* nul terminator for 1st address? */ | 583 | if (i == 40) { /* nul terminator for 1st address? */ |
585 | addr6x[39] = 0; /* Fixup... need 0 instead of ':'. */ | 584 | addr6x[39] = 0; /* Fixup... need 0 instead of ':'. */ |
586 | ++p; /* Skip and continue. */ | 585 | ++p; /* Skip and continue. */ |
587 | continue; | 586 | continue; |
@@ -606,18 +605,19 @@ static void INET6_displayroutes(int noresolve) | |||
606 | inet_pton(AF_INET6, addr6x + r, | 605 | inet_pton(AF_INET6, addr6x + r, |
607 | (struct sockaddr *) &snaddr6.sin6_addr); | 606 | (struct sockaddr *) &snaddr6.sin6_addr); |
608 | snaddr6.sin6_family = AF_INET6; | 607 | snaddr6.sin6_family = AF_INET6; |
609 | INET6_rresolve(naddr6, sizeof(naddr6), | 608 | naddr6 = INET6_rresolve((struct sockaddr_in6 *) &snaddr6, |
610 | (struct sockaddr_in6 *) &snaddr6, | ||
611 | 0x0fff /* Apparently, upstream never resolves. */ | 609 | 0x0fff /* Apparently, upstream never resolves. */ |
612 | ); | 610 | ); |
613 | 611 | ||
614 | if (!r) { /* 1st pass */ | 612 | if (!r) { /* 1st pass */ |
615 | snprintf(addr6, sizeof(addr6), "%s/%d", naddr6, prefix_len); | 613 | snprintf(addr6, sizeof(addr6), "%s/%d", naddr6, prefix_len); |
616 | r += 40; | 614 | r += 40; |
615 | free(naddr6); | ||
617 | } else { /* 2nd pass */ | 616 | } else { /* 2nd pass */ |
618 | /* Print the info. */ | 617 | /* Print the info. */ |
619 | printf("%-43s %-39s %-5s %-6d %-2d %7d %-8s\n", | 618 | printf("%-43s %-39s %-5s %-6d %-2d %7d %-8s\n", |
620 | addr6, naddr6, flags, metric, refcnt, use, iface); | 619 | addr6, naddr6, flags, metric, refcnt, use, iface); |
620 | free(naddr6); | ||
621 | break; | 621 | break; |
622 | } | 622 | } |
623 | } while (1); | 623 | } while (1); |
diff --git a/networking/traceroute.c b/networking/traceroute.c index 9fc15d390..577738a97 100644 --- a/networking/traceroute.c +++ b/networking/traceroute.c | |||
@@ -802,22 +802,20 @@ packet_ok(unsigned char *buf, int cc, struct sockaddr_in *from, int seq) | |||
802 | * numeric value, otherwise try for symbolic name. | 802 | * numeric value, otherwise try for symbolic name. |
803 | */ | 803 | */ |
804 | static inline void | 804 | static inline void |
805 | inetname(struct sockaddr_in *from) | 805 | print_inetname(struct sockaddr_in *from) |
806 | { | 806 | { |
807 | const char *n = NULL; | ||
808 | const char *ina; | 807 | const char *ina; |
809 | char name[257]; | ||
810 | 808 | ||
811 | if (!nflag && from->sin_addr.s_addr != INADDR_ANY) { | ||
812 | if (INET_rresolve(name, sizeof(name), from, 0x4000, | ||
813 | 0xffffffff) >= 0) | ||
814 | n = name; | ||
815 | } | ||
816 | ina = inet_ntoa(from->sin_addr); | 809 | ina = inet_ntoa(from->sin_addr); |
817 | if (nflag) | 810 | if (nflag) |
818 | printf(" %s", ina); | 811 | printf(" %s", ina); |
819 | else | 812 | else { |
813 | char *n = NULL; | ||
814 | if (from->sin_addr.s_addr != INADDR_ANY) | ||
815 | n = xmalloc_sockaddr2host_noport((struct sockaddr*)from, sizeof(*from)); | ||
820 | printf(" %s (%s)", (n ? n : ina), ina); | 816 | printf(" %s (%s)", (n ? n : ina), ina); |
817 | free(n); | ||
818 | } | ||
821 | } | 819 | } |
822 | 820 | ||
823 | static inline void | 821 | static inline void |
@@ -830,7 +828,7 @@ print(unsigned char *buf, int cc, struct sockaddr_in *from) | |||
830 | hlen = ip->ip_hl << 2; | 828 | hlen = ip->ip_hl << 2; |
831 | cc -= hlen; | 829 | cc -= hlen; |
832 | 830 | ||
833 | inetname(from); | 831 | print_inetname(from); |
834 | #if ENABLE_FEATURE_TRACEROUTE_VERBOSE | 832 | #if ENABLE_FEATURE_TRACEROUTE_VERBOSE |
835 | if (verbose) | 833 | if (verbose) |
836 | printf(" %d bytes to %s", cc, inet_ntoa(ip->ip_dst)); | 834 | printf(" %d bytes to %s", cc, inet_ntoa(ip->ip_dst)); |