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 | |
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
-rw-r--r-- | include/inet_common.h | 8 | ||||
-rw-r--r-- | libbb/inet_common.c | 104 | ||||
-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 |
6 files changed, 112 insertions, 136 deletions
diff --git a/include/inet_common.h b/include/inet_common.h index fa48fdffa..eb4cb7325 100644 --- a/include/inet_common.h +++ b/include/inet_common.h | |||
@@ -18,9 +18,9 @@ int INET_resolve(const char *name, struct sockaddr_in *s_in, int hostfirst); | |||
18 | * & 0x4000: host instead of net, | 18 | * & 0x4000: host instead of net, |
19 | * & 0x0fff: don't resolve | 19 | * & 0x0fff: don't resolve |
20 | */ | 20 | */ |
21 | int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in, | ||
22 | int numeric, unsigned int netmask); | ||
23 | |||
24 | 21 | ||
25 | int INET6_resolve(const char *name, struct sockaddr_in6 *sin6); | 22 | int INET6_resolve(const char *name, struct sockaddr_in6 *sin6); |
26 | int INET6_rresolve(char *name, size_t len, struct sockaddr_in6 *sin6, int numeric); | 23 | |
24 | /* These return malloced string */ | ||
25 | char *INET_rresolve(struct sockaddr_in *s_in, int numeric, uint32_t netmask); | ||
26 | char *INET6_rresolve(struct sockaddr_in6 *sin6, int numeric); | ||
diff --git a/libbb/inet_common.c b/libbb/inet_common.c index 44b44a4cc..8449201ab 100644 --- a/libbb/inet_common.c +++ b/libbb/inet_common.c | |||
@@ -72,26 +72,24 @@ int INET_resolve(const char *name, struct sockaddr_in *s_in, int hostfirst) | |||
72 | return 0; | 72 | return 0; |
73 | } | 73 | } |
74 | 74 | ||
75 | /* cache */ | ||
76 | struct addr { | ||
77 | struct sockaddr_in addr; | ||
78 | char *name; | ||
79 | int host; | ||
80 | struct addr *next; | ||
81 | }; | ||
82 | |||
83 | static struct addr *INET_nn = NULL; /* addr-to-name cache */ | ||
84 | 75 | ||
85 | /* numeric: & 0x8000: default instead of *, | 76 | /* numeric: & 0x8000: default instead of *, |
86 | * & 0x4000: host instead of net, | 77 | * & 0x4000: host instead of net, |
87 | * & 0x0fff: don't resolve | 78 | * & 0x0fff: don't resolve |
88 | */ | 79 | */ |
89 | int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in, | 80 | char *INET_rresolve(struct sockaddr_in *s_in, int numeric, uint32_t netmask) |
90 | int numeric, unsigned int netmask) | ||
91 | { | 81 | { |
92 | struct hostent *ent; | 82 | /* addr-to-name cache */ |
93 | struct netent *np; | 83 | struct addr { |
84 | struct addr *next; | ||
85 | struct sockaddr_in addr; | ||
86 | int host; | ||
87 | char name[1]; | ||
88 | }; | ||
89 | static struct addr *cache = NULL; | ||
90 | |||
94 | struct addr *pn; | 91 | struct addr *pn; |
92 | char *name; | ||
95 | uint32_t ad, host_ad; | 93 | uint32_t ad, host_ad; |
96 | int host = 0; | 94 | int host = 0; |
97 | 95 | ||
@@ -102,7 +100,7 @@ int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in, | |||
102 | s_in->sin_family); | 100 | s_in->sin_family); |
103 | #endif | 101 | #endif |
104 | errno = EAFNOSUPPORT; | 102 | errno = EAFNOSUPPORT; |
105 | return -1; | 103 | return NULL; |
106 | } | 104 | } |
107 | ad = s_in->sin_addr.s_addr; | 105 | ad = s_in->sin_addr.s_addr; |
108 | #ifdef DEBUG | 106 | #ifdef DEBUG |
@@ -111,62 +109,58 @@ int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in, | |||
111 | if (ad == INADDR_ANY) { | 109 | if (ad == INADDR_ANY) { |
112 | if ((numeric & 0x0FFF) == 0) { | 110 | if ((numeric & 0x0FFF) == 0) { |
113 | if (numeric & 0x8000) | 111 | if (numeric & 0x8000) |
114 | safe_strncpy(name, bb_str_default, len); | 112 | return xstrdup(bb_str_default); |
115 | else | 113 | return xstrdup("*"); |
116 | safe_strncpy(name, "*", len); | ||
117 | return 0; | ||
118 | } | 114 | } |
119 | } | 115 | } |
120 | if (numeric & 0x0FFF) { | 116 | if (numeric & 0x0FFF) |
121 | safe_strncpy(name, inet_ntoa(s_in->sin_addr), len); | 117 | return xstrdup(inet_ntoa(s_in->sin_addr)); |
122 | return 0; | ||
123 | } | ||
124 | 118 | ||
125 | if ((ad & (~netmask)) != 0 || (numeric & 0x4000)) | 119 | if ((ad & (~netmask)) != 0 || (numeric & 0x4000)) |
126 | host = 1; | 120 | host = 1; |
127 | pn = INET_nn; | 121 | pn = cache; |
128 | while (pn != NULL) { | 122 | while (pn) { |
129 | if (pn->addr.sin_addr.s_addr == ad && pn->host == host) { | 123 | if (pn->addr.sin_addr.s_addr == ad && pn->host == host) { |
130 | safe_strncpy(name, pn->name, len); | ||
131 | #ifdef DEBUG | 124 | #ifdef DEBUG |
132 | bb_error_msg("rresolve: found %s %08x in cache", | 125 | bb_error_msg("rresolve: found %s %08x in cache", |
133 | (host ? "host" : "net"), (unsigned)ad); | 126 | (host ? "host" : "net"), (unsigned)ad); |
134 | #endif | 127 | #endif |
135 | return 0; | 128 | return xstrdup(pn->name); |
136 | } | 129 | } |
137 | pn = pn->next; | 130 | pn = pn->next; |
138 | } | 131 | } |
139 | 132 | ||
140 | host_ad = ntohl(ad); | 133 | host_ad = ntohl(ad); |
141 | np = NULL; | 134 | name = NULL; |
142 | ent = NULL; | ||
143 | if (host) { | 135 | if (host) { |
136 | struct hostent *ent; | ||
144 | #ifdef DEBUG | 137 | #ifdef DEBUG |
145 | bb_error_msg("gethostbyaddr (%08x)", (unsigned)ad); | 138 | bb_error_msg("gethostbyaddr (%08x)", (unsigned)ad); |
146 | #endif | 139 | #endif |
147 | ent = gethostbyaddr((char *) &ad, 4, AF_INET); | 140 | ent = gethostbyaddr((char *) &ad, 4, AF_INET); |
148 | if (ent != NULL) { | 141 | if (ent) |
149 | safe_strncpy(name, ent->h_name, len); | 142 | name = xstrdup(ent->h_name); |
150 | } | ||
151 | } else { | 143 | } else { |
144 | /* Hmmm... this is very rare to have named nets, | ||
145 | * and this getnetbyaddr() call is the only one in bbox. | ||
146 | * Maybe get rid of or make configurable? */ | ||
147 | struct netent *np; | ||
152 | #ifdef DEBUG | 148 | #ifdef DEBUG |
153 | bb_error_msg("getnetbyaddr (%08x)", (unsigned)host_ad); | 149 | bb_error_msg("getnetbyaddr (%08x)", (unsigned)host_ad); |
154 | #endif | 150 | #endif |
155 | np = getnetbyaddr(host_ad, AF_INET); | 151 | np = getnetbyaddr(host_ad, AF_INET); |
156 | if (np != NULL) { | 152 | if (np) |
157 | safe_strncpy(name, np->n_name, len); | 153 | name = xstrdup(np->n_name); |
158 | } | ||
159 | } | ||
160 | if (!ent && !np) { | ||
161 | safe_strncpy(name, inet_ntoa(s_in->sin_addr), len); | ||
162 | } | 154 | } |
163 | pn = xmalloc(sizeof(struct addr)); | 155 | if (!name) |
156 | name = xstrdup(inet_ntoa(s_in->sin_addr)); | ||
157 | pn = xmalloc(sizeof(*pn) + strlen(name)); /* no '+ 1', it's already accounted for */ | ||
158 | pn->next = cache; | ||
164 | pn->addr = *s_in; | 159 | pn->addr = *s_in; |
165 | pn->next = INET_nn; | ||
166 | pn->host = host; | 160 | pn->host = host; |
167 | pn->name = xstrdup(name); | 161 | strcpy(pn->name, name); |
168 | INET_nn = pn; | 162 | cache = pn; |
169 | return 0; | 163 | return name; |
170 | } | 164 | } |
171 | 165 | ||
172 | #ifdef CONFIG_FEATURE_IPV6 | 166 | #ifdef CONFIG_FEATURE_IPV6 |
@@ -195,9 +189,9 @@ int INET6_resolve(const char *name, struct sockaddr_in6 *sin6) | |||
195 | #endif | 189 | #endif |
196 | 190 | ||
197 | 191 | ||
198 | int INET6_rresolve(char *name, size_t len, struct sockaddr_in6 *sin6, | 192 | char *INET6_rresolve(struct sockaddr_in6 *sin6, int numeric) |
199 | int numeric) | ||
200 | { | 193 | { |
194 | char name[128]; | ||
201 | int s; | 195 | int s; |
202 | 196 | ||
203 | /* Grmpf. -FvK */ | 197 | /* Grmpf. -FvK */ |
@@ -207,29 +201,25 @@ int INET6_rresolve(char *name, size_t len, struct sockaddr_in6 *sin6, | |||
207 | sin6->sin6_family); | 201 | sin6->sin6_family); |
208 | #endif | 202 | #endif |
209 | errno = EAFNOSUPPORT; | 203 | errno = EAFNOSUPPORT; |
210 | return -1; | 204 | return NULL; |
211 | } | 205 | } |
212 | if (numeric & 0x7FFF) { | 206 | if (numeric & 0x7FFF) { |
213 | inet_ntop(AF_INET6, &sin6->sin6_addr, name, len); | 207 | inet_ntop(AF_INET6, &sin6->sin6_addr, name, sizeof(name)); |
214 | return 0; | 208 | return xstrdup(name); |
215 | } | 209 | } |
216 | if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { | 210 | if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { |
217 | if (numeric & 0x8000) { | 211 | if (numeric & 0x8000) |
218 | strcpy(name, bb_str_default); | 212 | return xstrdup(bb_str_default); |
219 | } else { | 213 | return xstrdup("*"); |
220 | name[0] = '*'; | ||
221 | name[1] = '\0'; | ||
222 | } | ||
223 | return 0; | ||
224 | } | 214 | } |
225 | 215 | ||
226 | s = getnameinfo((struct sockaddr *) sin6, sizeof(struct sockaddr_in6), | 216 | s = getnameinfo((struct sockaddr *) sin6, sizeof(struct sockaddr_in6), |
227 | name, len, NULL, 0, 0); | 217 | name, sizeof(name), NULL, 0, 0); |
228 | if (s) { | 218 | if (s) { |
229 | bb_error_msg("getnameinfo failed"); | 219 | bb_error_msg("getnameinfo failed"); |
230 | return -1; | 220 | return NULL; |
231 | } | 221 | } |
232 | return 0; | 222 | return xstrdup(name); |
233 | } | 223 | } |
234 | 224 | ||
235 | #endif /* CONFIG_FEATURE_IPV6 */ | 225 | #endif /* CONFIG_FEATURE_IPV6 */ |
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)); |