diff options
Diffstat (limited to 'networking/netstat.c')
-rw-r--r-- | networking/netstat.c | 79 |
1 files changed, 34 insertions, 45 deletions
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 | } |