aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libbb.h6
-rw-r--r--libbb/inet_common.c51
-rw-r--r--libbb/lineedit.c4
-rw-r--r--libbb/messages.c3
-rw-r--r--libbb/xconnect.c5
-rw-r--r--modutils/insmod.c2
-rw-r--r--networking/arping.c3
-rw-r--r--networking/httpd.c4
-rw-r--r--networking/nc.c15
-rw-r--r--networking/netstat.c258
-rw-r--r--networking/ping.c3
-rw-r--r--networking/ping6.c17
-rw-r--r--networking/route.c72
-rw-r--r--networking/telnet.c4
-rw-r--r--networking/traceroute.c40
-rw-r--r--networking/udhcp/socket.c2
-rw-r--r--shell/lash.c2
17 files changed, 231 insertions, 260 deletions
diff --git a/include/libbb.h b/include/libbb.h
index c1c9486c4..cd192b9eb 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -486,6 +486,9 @@ extern void bb_vinfo_msg(const char *s, va_list p);
486extern int bb_cat(char** argv); 486extern int bb_cat(char** argv);
487extern int bb_echo(char** argv); 487extern int bb_echo(char** argv);
488extern int bb_test(int argc, char** argv); 488extern int bb_test(int argc, char** argv);
489#if ENABLE_ROUTE
490extern void bb_displayroutes(int noresolve, int netstatfmt);
491#endif
489 492
490 493
491/* Networking */ 494/* Networking */
@@ -740,6 +743,9 @@ extern const char bb_path_motd_file[];
740extern const char bb_path_wtmp_file[]; 743extern const char bb_path_wtmp_file[];
741extern const char bb_dev_null[]; 744extern const char bb_dev_null[];
742 745
746extern const int const_int_0;
747extern const int const_int_1;
748
743#ifndef BUFSIZ 749#ifndef BUFSIZ
744#define BUFSIZ 4096 750#define BUFSIZ 4096
745#endif 751#endif
diff --git a/libbb/inet_common.c b/libbb/inet_common.c
index 9cdcb11de..6b31c79f2 100644
--- a/libbb/inet_common.c
+++ b/libbb/inet_common.c
@@ -33,19 +33,23 @@ int INET_resolve(const char *name, struct sockaddr_in *s_in, int hostfirst)
33 /* If we expect this to be a hostname, try hostname database first */ 33 /* If we expect this to be a hostname, try hostname database first */
34#ifdef DEBUG 34#ifdef DEBUG
35 if (hostfirst) { 35 if (hostfirst) {
36 bb_error_msg("gethostbyname (%s)", name); 36 bb_error_msg("gethostbyname(%s)", name);
37 } 37 }
38#endif 38#endif
39 if (hostfirst && (hp = gethostbyname(name)) != (struct hostent *) NULL) { 39 if (hostfirst) {
40 memcpy((char *) &s_in->sin_addr, (char *) hp->h_addr_list[0], 40 hp = gethostbyname(name);
41 sizeof(struct in_addr)); 41 if (hp != NULL) {
42 return 0; 42 memcpy(&s_in->sin_addr, hp->h_addr_list[0],
43 sizeof(struct in_addr));
44 return 0;
45 }
43 } 46 }
44 /* Try the NETWORKS database to see if this is a known network. */ 47 /* Try the NETWORKS database to see if this is a known network. */
45#ifdef DEBUG 48#ifdef DEBUG
46 bb_error_msg("getnetbyname (%s)", name); 49 bb_error_msg("getnetbyname(%s)", name);
47#endif 50#endif
48 if ((np = getnetbyname(name)) != (struct netent *) NULL) { 51 np = getnetbyname(name);
52 if (np != NULL) {
49 s_in->sin_addr.s_addr = htonl(np->n_net); 53 s_in->sin_addr.s_addr = htonl(np->n_net);
50 return 1; 54 return 1;
51 } 55 }
@@ -59,14 +63,13 @@ int INET_resolve(const char *name, struct sockaddr_in *s_in, int hostfirst)
59#endif 63#endif
60 64
61#ifdef DEBUG 65#ifdef DEBUG
62 bb_error_msg("gethostbyname (%s)", name); 66 bb_error_msg("gethostbyname(%s)", name);
63#endif 67#endif
64 if ((hp = gethostbyname(name)) == (struct hostent *) NULL) { 68 hp = gethostbyname(name);
69 if (hp == NULL) {
65 return -1; 70 return -1;
66 } 71 }
67 memcpy((char *) &s_in->sin_addr, (char *) hp->h_addr_list[0], 72 memcpy(&s_in->sin_addr, hp->h_addr_list[0], sizeof(struct in_addr));
68 sizeof(struct in_addr));
69
70 return 0; 73 return 0;
71} 74}
72 75
@@ -78,7 +81,7 @@ struct addr {
78 struct addr *next; 81 struct addr *next;
79}; 82};
80 83
81static struct addr *INET_nn = NULL; /* addr-to-name cache */ 84static struct addr *INET_nn = NULL; /* addr-to-name cache */
82 85
83/* numeric: & 0x8000: default instead of *, 86/* numeric: & 0x8000: default instead of *,
84 * & 0x4000: host instead of net, 87 * & 0x4000: host instead of net,
@@ -90,7 +93,7 @@ int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in,
90 struct hostent *ent; 93 struct hostent *ent;
91 struct netent *np; 94 struct netent *np;
92 struct addr *pn; 95 struct addr *pn;
93 unsigned long ad, host_ad; 96 uint32_t ad, host_ad;
94 int host = 0; 97 int host = 0;
95 98
96 /* Grmpf. -FvK */ 99 /* Grmpf. -FvK */
@@ -102,9 +105,9 @@ int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in,
102 errno = EAFNOSUPPORT; 105 errno = EAFNOSUPPORT;
103 return -1; 106 return -1;
104 } 107 }
105 ad = (unsigned long) s_in->sin_addr.s_addr; 108 ad = s_in->sin_addr.s_addr;
106#ifdef DEBUG 109#ifdef DEBUG
107 bb_error_msg("rresolve: %08lx, mask %08x, num %08x", ad, netmask, numeric); 110 bb_error_msg("rresolve: %08x, mask %08x, num %08x", (unsigned)ad, netmask, numeric);
108#endif 111#endif
109 if (ad == INADDR_ANY) { 112 if (ad == INADDR_ANY) {
110 if ((numeric & 0x0FFF) == 0) { 113 if ((numeric & 0x0FFF) == 0) {
@@ -127,8 +130,8 @@ int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in,
127 if (pn->addr.sin_addr.s_addr == ad && pn->host == host) { 130 if (pn->addr.sin_addr.s_addr == ad && pn->host == host) {
128 safe_strncpy(name, pn->name, len); 131 safe_strncpy(name, pn->name, len);
129#ifdef DEBUG 132#ifdef DEBUG
130 bb_error_msg("rresolve: found %s %08lx in cache", 133 bb_error_msg("rresolve: found %s %08x in cache",
131 (host ? "host" : "net"), ad); 134 (host ? "host" : "net"), (unsigned)ad);
132#endif 135#endif
133 return 0; 136 return 0;
134 } 137 }
@@ -140,7 +143,7 @@ int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in,
140 ent = NULL; 143 ent = NULL;
141 if (host) { 144 if (host) {
142#ifdef DEBUG 145#ifdef DEBUG
143 bb_error_msg("gethostbyaddr (%08lx)", ad); 146 bb_error_msg("gethostbyaddr (%08x)", (unsigned)ad);
144#endif 147#endif
145 ent = gethostbyaddr((char *) &ad, 4, AF_INET); 148 ent = gethostbyaddr((char *) &ad, 4, AF_INET);
146 if (ent != NULL) { 149 if (ent != NULL) {
@@ -148,14 +151,14 @@ int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in,
148 } 151 }
149 } else { 152 } else {
150#ifdef DEBUG 153#ifdef DEBUG
151 bb_error_msg("getnetbyaddr (%08lx)", host_ad); 154 bb_error_msg("getnetbyaddr (%08x)", (unsigned)host_ad);
152#endif 155#endif
153 np = getnetbyaddr(host_ad, AF_INET); 156 np = getnetbyaddr(host_ad, AF_INET);
154 if (np != NULL) { 157 if (np != NULL) {
155 safe_strncpy(name, np->n_name, len); 158 safe_strncpy(name, np->n_name, len);
156 } 159 }
157 } 160 }
158 if ((ent == NULL) && (np == NULL)) { 161 if (!ent && !np) {
159 safe_strncpy(name, inet_ntoa(s_in->sin_addr), len); 162 safe_strncpy(name, inet_ntoa(s_in->sin_addr), len);
160 } 163 }
161 pn = xmalloc(sizeof(struct addr)); 164 pn = xmalloc(sizeof(struct addr));
@@ -164,7 +167,6 @@ int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in,
164 pn->host = host; 167 pn->host = host;
165 pn->name = xstrdup(name); 168 pn->name = xstrdup(name);
166 INET_nn = pn; 169 INET_nn = pn;
167
168 return 0; 170 return 0;
169} 171}
170 172
@@ -183,9 +185,7 @@ int INET6_resolve(const char *name, struct sockaddr_in6 *sin6)
183 return -1; 185 return -1;
184 } 186 }
185 memcpy(sin6, ai->ai_addr, sizeof(struct sockaddr_in6)); 187 memcpy(sin6, ai->ai_addr, sizeof(struct sockaddr_in6));
186
187 freeaddrinfo(ai); 188 freeaddrinfo(ai);
188
189 return 0; 189 return 0;
190} 190}
191 191
@@ -224,7 +224,8 @@ int INET6_rresolve(char *name, size_t len, struct sockaddr_in6 *sin6,
224 return 0; 224 return 0;
225 } 225 }
226 226
227 s = getnameinfo((struct sockaddr *) sin6, sizeof(struct sockaddr_in6), name, len, NULL, 0, 0); 227 s = getnameinfo((struct sockaddr *) sin6, sizeof(struct sockaddr_in6),
228 name, len, NULL, 0, 0);
228 if (s) { 229 if (s) {
229 bb_error_msg("getnameinfo failed"); 230 bb_error_msg("getnameinfo failed");
230 return -1; 231 return -1;
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index 2c849eb74..08dab26f0 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -1254,8 +1254,6 @@ static void win_changed(int nsig)
1254 1254
1255int read_line_input(const char* prompt, char* command, int maxsize, line_input_t *st) 1255int read_line_input(const char* prompt, char* command, int maxsize, line_input_t *st)
1256{ 1256{
1257 static const int null_flags;
1258
1259 int lastWasTab = FALSE; 1257 int lastWasTab = FALSE;
1260 unsigned int ic; 1258 unsigned int ic;
1261 unsigned char c; 1259 unsigned char c;
@@ -1270,7 +1268,7 @@ int read_line_input(const char* prompt, char* command, int maxsize, line_input_t
1270 maxsize = BUFSIZ; 1268 maxsize = BUFSIZ;
1271 1269
1272 /* With null flags, no other fields are ever used */ 1270 /* With null flags, no other fields are ever used */
1273 state = st ? st : (line_input_t*) &null_flags; 1271 state = st ? st : (line_input_t*) &const_int_0;
1274 if (state->flags & SAVE_HISTORY) 1272 if (state->flags & SAVE_HISTORY)
1275 load_history(state->hist_file); 1273 load_history(state->hist_file);
1276 1274
diff --git a/libbb/messages.c b/libbb/messages.c
index 6c3d2f608..105e4ce66 100644
--- a/libbb/messages.c
+++ b/libbb/messages.c
@@ -40,6 +40,9 @@ const char bb_path_motd_file[] = "/etc/motd";
40const char bb_default_login_shell[] = LIBBB_DEFAULT_LOGIN_SHELL; 40const char bb_default_login_shell[] = LIBBB_DEFAULT_LOGIN_SHELL;
41const char bb_dev_null[] = "/dev/null"; 41const char bb_dev_null[] = "/dev/null";
42 42
43const int const_int_0;
44const int const_int_1 = 1;
45
43#include <utmp.h> 46#include <utmp.h>
44/* This is usually something like "/var/adm/wtmp" or "/var/log/wtmp" */ 47/* This is usually something like "/var/adm/wtmp" or "/var/log/wtmp" */
45const char bb_path_wtmp_file[] = 48const char bb_path_wtmp_file[] =
diff --git a/libbb/xconnect.c b/libbb/xconnect.c
index 62cab95a1..0addda157 100644
--- a/libbb/xconnect.c
+++ b/libbb/xconnect.c
@@ -9,14 +9,13 @@
9#include <netinet/in.h> 9#include <netinet/in.h>
10#include "libbb.h" 10#include "libbb.h"
11 11
12static const int one = 1;
13int setsockopt_reuseaddr(int fd) 12int setsockopt_reuseaddr(int fd)
14{ 13{
15 return setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); 14 return setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &const_int_1, sizeof(const_int_1));
16} 15}
17int setsockopt_broadcast(int fd) 16int setsockopt_broadcast(int fd)
18{ 17{
19 return setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one)); 18 return setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &const_int_1, sizeof(const_int_1));
20} 19}
21 20
22void xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen) 21void xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen)
diff --git a/modutils/insmod.c b/modutils/insmod.c
index a9bf1854c..1ad3c23a4 100644
--- a/modutils/insmod.c
+++ b/modutils/insmod.c
@@ -337,7 +337,6 @@ extern int insmod_ng_main( int argc, char **argv);
337 337
338 338
339#ifndef MODUTILS_MODULE_H 339#ifndef MODUTILS_MODULE_H
340/* Why? static const int MODUTILS_MODULE_H = 1;*/
341 340
342/*======================================================================*/ 341/*======================================================================*/
343/* For sizeof() which are related to the module platform and not to the 342/* For sizeof() which are related to the module platform and not to the
@@ -494,7 +493,6 @@ int delete_module(const char *);
494 493
495 494
496#ifndef MODUTILS_OBJ_H 495#ifndef MODUTILS_OBJ_H
497/* Why? static const int MODUTILS_OBJ_H = 1; */
498 496
499/* The relocatable object is manipulated using elfin types. */ 497/* The relocatable object is manipulated using elfin types. */
500 498
diff --git a/networking/arping.c b/networking/arping.c
index 58d5b3bd6..55b27872b 100644
--- a/networking/arping.c
+++ b/networking/arping.c
@@ -335,13 +335,12 @@ int arping_main(int argc, char **argv)
335 saddr.sin_addr = src; 335 saddr.sin_addr = src;
336 xbind(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr)); 336 xbind(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr));
337 } else if (!(cfg & dad)) { 337 } else if (!(cfg & dad)) {
338 static const int on = 1;
339 socklen_t alen = sizeof(saddr); 338 socklen_t alen = sizeof(saddr);
340 339
341 saddr.sin_port = htons(1025); 340 saddr.sin_port = htons(1025);
342 saddr.sin_addr = dst; 341 saddr.sin_addr = dst;
343 342
344 if (setsockopt(probe_fd, SOL_SOCKET, SO_DONTROUTE, (char *) &on, sizeof(on)) == -1) 343 if (setsockopt(probe_fd, SOL_SOCKET, SO_DONTROUTE, &const_int_1, sizeof(const_int_1)) == -1)
345 bb_perror_msg("warning: setsockopt(SO_DONTROUTE)"); 344 bb_perror_msg("warning: setsockopt(SO_DONTROUTE)");
346 xconnect(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr)); 345 xconnect(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr));
347 if (getsockname(probe_fd, (struct sockaddr *) &saddr, &alen) == -1) { 346 if (getsockname(probe_fd, (struct sockaddr *) &saddr, &alen) == -1) {
diff --git a/networking/httpd.c b/networking/httpd.c
index d14b113a3..ea9fe0974 100644
--- a/networking/httpd.c
+++ b/networking/httpd.c
@@ -1764,8 +1764,6 @@ static void handleIncoming(void)
1764 ****************************************************************************/ 1764 ****************************************************************************/
1765static int miniHttpd(int server) 1765static int miniHttpd(int server)
1766{ 1766{
1767 static const int on = 1;
1768
1769 fd_set readfd, portfd; 1767 fd_set readfd, portfd;
1770 1768
1771 FD_ZERO(&portfd); 1769 FD_ZERO(&portfd);
@@ -1812,7 +1810,7 @@ static int miniHttpd(int server)
1812#endif 1810#endif
1813 1811
1814 /* set the KEEPALIVE option to cull dead connections */ 1812 /* set the KEEPALIVE option to cull dead connections */
1815 setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void *)&on, sizeof(on)); 1813 setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &const_int_1, sizeof(const_int_1));
1816 1814
1817 if (DEBUG || fork() == 0) { 1815 if (DEBUG || fork() == 0) {
1818 /* child */ 1816 /* child */
diff --git a/networking/nc.c b/networking/nc.c
index 09d89b0a8..dc9102b2a 100644
--- a/networking/nc.c
+++ b/networking/nc.c
@@ -43,10 +43,10 @@ int nc_main(int argc, char **argv)
43 else if (ENABLE_NC_SERVER && opt=='p') { 43 else if (ENABLE_NC_SERVER && opt=='p') {
44 USE_NC_SERVER(lport = bb_lookup_port(optarg, "tcp", 0)); 44 USE_NC_SERVER(lport = bb_lookup_port(optarg, "tcp", 0));
45 } 45 }
46 else if (ENABLE_NC_EXTRA && opt=='w') USE_NC_EXTRA( wsecs = xatou(optarg)); 46 else if (ENABLE_NC_EXTRA && opt=='w') USE_NC_EXTRA( wsecs = xatou(optarg));
47 else if (ENABLE_NC_EXTRA && opt=='i') USE_NC_EXTRA( delay = xatou(optarg)); 47 else if (ENABLE_NC_EXTRA && opt=='i') USE_NC_EXTRA( delay = xatou(optarg));
48 else if (ENABLE_NC_EXTRA && opt=='f') USE_NC_EXTRA( cfd = xopen(optarg, O_RDWR)); 48 else if (ENABLE_NC_EXTRA && opt=='f') USE_NC_EXTRA( cfd = xopen(optarg, O_RDWR));
49 else if (ENABLE_NC_EXTRA && opt=='e' && optind<=argc) { 49 else if (ENABLE_NC_EXTRA && opt=='e' && optind<=argc) {
50 /* We cannot just 'break'. We should let getopt finish. 50 /* We cannot just 'break'. We should let getopt finish.
51 ** Or else we won't be able to find where 51 ** Or else we won't be able to find where
52 ** 'host' and 'port' params are 52 ** 'host' and 'port' params are
@@ -91,8 +91,6 @@ int nc_main(int argc, char **argv)
91 91
92 if (!cfd) { 92 if (!cfd) {
93 if (do_listen) { 93 if (do_listen) {
94 socklen_t addrlen;
95
96 /* create_and_bind_stream_or_die(NULL, lport) 94 /* create_and_bind_stream_or_die(NULL, lport)
97 * would've work wonderfully, but we need 95 * would've work wonderfully, but we need
98 * to know lsa */ 96 * to know lsa */
@@ -105,15 +103,14 @@ int nc_main(int argc, char **argv)
105 /* If we didn't specify a port number, 103 /* If we didn't specify a port number,
106 * query and print it after listen() */ 104 * query and print it after listen() */
107 if (!lport) { 105 if (!lport) {
108 addrlen = lsa->len; 106 socklen_t addrlen = lsa->len;
109 getsockname(sfd, &lsa->sa, &addrlen); 107 getsockname(sfd, &lsa->sa, &addrlen);
110 lport = get_nport(lsa); 108 lport = get_nport(lsa);
111 fdprintf(2, "%d\n", ntohs(lport)); 109 fdprintf(2, "%d\n", ntohs(lport));
112 } 110 }
113 fcntl(sfd, F_SETFD, FD_CLOEXEC); 111 fcntl(sfd, F_SETFD, FD_CLOEXEC);
114 accept_again: 112 accept_again:
115 addrlen = lsa->len; 113 cfd = accept(sfd, NULL, 0);
116 cfd = accept(sfd, NULL, 0); /* &lsa->sa, &addrlen); */
117 if (cfd < 0) 114 if (cfd < 0)
118 bb_perror_msg_and_die("accept"); 115 bb_perror_msg_and_die("accept");
119 if (!execparam) 116 if (!execparam)
diff --git a/networking/netstat.c b/networking/netstat.c
index 3dad57a40..16ee52d9a 100644
--- a/networking/netstat.c
+++ b/networking/netstat.c
@@ -14,81 +14,70 @@
14#include "busybox.h" 14#include "busybox.h"
15#include "inet_common.h" 15#include "inet_common.h"
16 16
17#ifdef CONFIG_ROUTE 17#define NETSTAT_CONNECTED 0x01
18extern void displayroutes(int noresolve, int netstatfmt); 18#define NETSTAT_LISTENING 0x02
19#endif 19#define NETSTAT_NUMERIC 0x04
20
21#define NETSTAT_CONNECTED 0x01
22#define NETSTAT_LISTENING 0x02
23#define NETSTAT_NUMERIC 0x04
24/* Must match getopt32 option string */ 20/* Must match getopt32 option string */
25#define NETSTAT_TCP 0x10 21#define NETSTAT_TCP 0x10
26#define NETSTAT_UDP 0x20 22#define NETSTAT_UDP 0x20
27#define NETSTAT_RAW 0x40 23#define NETSTAT_RAW 0x40
28#define NETSTAT_UNIX 0x80 24#define NETSTAT_UNIX 0x80
29#define NETSTAT_ALLPROTO (NETSTAT_TCP|NETSTAT_UDP|NETSTAT_RAW|NETSTAT_UNIX) 25#define NETSTAT_ALLPROTO (NETSTAT_TCP|NETSTAT_UDP|NETSTAT_RAW|NETSTAT_UNIX)
30 26
31static int flags = NETSTAT_CONNECTED | NETSTAT_ALLPROTO; 27static int flags = NETSTAT_CONNECTED | NETSTAT_ALLPROTO;
32 28
33#define PROGNAME_WIDTHs PROGNAME_WIDTH1(PROGNAME_WIDTH)
34#define PROGNAME_WIDTH1(s) PROGNAME_WIDTH2(s)
35#define PROGNAME_WIDTH2(s) #s
36
37#define PRG_HASH_SIZE 211
38
39enum { 29enum {
40 TCP_ESTABLISHED = 1, 30 TCP_ESTABLISHED = 1,
41 TCP_SYN_SENT, 31 TCP_SYN_SENT,
42 TCP_SYN_RECV, 32 TCP_SYN_RECV,
43 TCP_FIN_WAIT1, 33 TCP_FIN_WAIT1,
44 TCP_FIN_WAIT2, 34 TCP_FIN_WAIT2,
45 TCP_TIME_WAIT, 35 TCP_TIME_WAIT,
46 TCP_CLOSE, 36 TCP_CLOSE,
47 TCP_CLOSE_WAIT, 37 TCP_CLOSE_WAIT,
48 TCP_LAST_ACK, 38 TCP_LAST_ACK,
49 TCP_LISTEN, 39 TCP_LISTEN,
50 TCP_CLOSING /* now a valid state */ 40 TCP_CLOSING /* now a valid state */
51}; 41};
52 42
53static const char * const tcp_state[] = 43static const char * const tcp_state[] =
54{ 44{
55 "", 45 "",
56 "ESTABLISHED", 46 "ESTABLISHED",
57 "SYN_SENT", 47 "SYN_SENT",
58 "SYN_RECV", 48 "SYN_RECV",
59 "FIN_WAIT1", 49 "FIN_WAIT1",
60 "FIN_WAIT2", 50 "FIN_WAIT2",
61 "TIME_WAIT", 51 "TIME_WAIT",
62 "CLOSE", 52 "CLOSE",
63 "CLOSE_WAIT", 53 "CLOSE_WAIT",
64 "LAST_ACK", 54 "LAST_ACK",
65 "LISTEN", 55 "LISTEN",
66 "CLOSING" 56 "CLOSING"
67}; 57};
68 58
69typedef enum { 59typedef enum {
70 SS_FREE = 0, /* not allocated */ 60 SS_FREE = 0, /* not allocated */
71 SS_UNCONNECTED, /* unconnected to any socket */ 61 SS_UNCONNECTED, /* unconnected to any socket */
72 SS_CONNECTING, /* in process of connecting */ 62 SS_CONNECTING, /* in process of connecting */
73 SS_CONNECTED, /* connected to socket */ 63 SS_CONNECTED, /* connected to socket */
74 SS_DISCONNECTING /* in process of disconnecting */ 64 SS_DISCONNECTING /* in process of disconnecting */
75} socket_state; 65} socket_state;
76 66
77#define SO_ACCEPTCON (1<<16) /* performed a listen */ 67#define SO_ACCEPTCON (1<<16) /* performed a listen */
78#define SO_WAITDATA (1<<17) /* wait data to read */ 68#define SO_WAITDATA (1<<17) /* wait data to read */
79#define SO_NOSPACE (1<<18) /* no space to write */ 69#define SO_NOSPACE (1<<18) /* no space to write */
80 70
81static char *get_sname(int port, const char *proto, int num) 71static char *get_sname(int port, const char *proto, int num)
82{ 72{
83 char *str=itoa(ntohs(port)); 73 char *str = itoa(ntohs(port));
84 if (num) { 74 if (!num) {
85 } else { 75 struct servent *se = getservbyport(port, proto);
86 struct servent *se=getservbyport(port,proto);
87 if (se) 76 if (se)
88 str=se->s_name; 77 str = se->s_name;
89 } 78 }
90 if (!port) { 79 if (!port) {
91 str="*"; 80 str = "*";
92 } 81 }
93 return str; 82 return str;
94} 83}
@@ -97,21 +86,21 @@ static void snprint_ip_port(char *ip_port, int size, struct sockaddr *addr, int
97{ 86{
98 char *port_name; 87 char *port_name;
99 88
100#ifdef CONFIG_FEATURE_IPV6 89#if ENABLE_FEATURE_IPV6
101 if (addr->sa_family == AF_INET6) { 90 if (addr->sa_family == AF_INET6) {
102 INET6_rresolve(ip_port, size, (struct sockaddr_in6 *)addr, 91 INET6_rresolve(ip_port, size, (struct sockaddr_in6 *)addr,
103 (numeric&NETSTAT_NUMERIC) ? 0x0fff : 0); 92 (numeric & NETSTAT_NUMERIC) ? 0x0fff : 0);
104 } else 93 } else
105#endif 94#endif
106 { 95 {
107 INET_rresolve(ip_port, size, (struct sockaddr_in *)addr, 96 INET_rresolve(ip_port, size, (struct sockaddr_in *)addr,
108 0x4000 | ((numeric&NETSTAT_NUMERIC) ? 0x0fff : 0), 97 0x4000 | ((numeric & NETSTAT_NUMERIC) ? 0x0fff : 0),
109 0xffffffff); 98 0xffffffff);
110 } 99 }
111 port_name=get_sname(htons(port), proto, numeric); 100 port_name = get_sname(htons(port), proto, numeric);
112 if ((strlen(ip_port) + strlen(port_name)) > 22) 101 if ((strlen(ip_port) + strlen(port_name)) > 22)
113 ip_port[22 - strlen(port_name)] = '\0'; 102 ip_port[22 - strlen(port_name)] = '\0';
114 ip_port+=strlen(ip_port); 103 ip_port += strlen(ip_port);
115 strcat(ip_port, ":"); 104 strcat(ip_port, ":");
116 strcat(ip_port, port_name); 105 strcat(ip_port, port_name);
117} 106}
@@ -122,7 +111,7 @@ static void tcp_do_one(int lnr, const char *line)
122 const char *state_str; 111 const char *state_str;
123 char more[512]; 112 char more[512];
124 int num, local_port, rem_port, d, state, timer_run, uid, timeout; 113 int num, local_port, rem_port, d, state, timer_run, uid, timeout;
125#ifdef CONFIG_FEATURE_IPV6 114#if ENABLE_FEATURE_IPV6
126 struct sockaddr_in6 localaddr, remaddr; 115 struct sockaddr_in6 localaddr, remaddr;
127 char addr6[INET6_ADDRSTRLEN]; 116 char addr6[INET6_ADDRSTRLEN];
128 struct in6_addr in6; 117 struct in6_addr in6;
@@ -142,7 +131,7 @@ static void tcp_do_one(int lnr, const char *line)
142 &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more); 131 &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more);
143 132
144 if (strlen(local_addr) > 8) { 133 if (strlen(local_addr) > 8) {
145#ifdef CONFIG_FEATURE_IPV6 134#if ENABLE_FEATURE_IPV6
146 sscanf(local_addr, "%08X%08X%08X%08X", 135 sscanf(local_addr, "%08X%08X%08X%08X",
147 &in6.s6_addr32[0], &in6.s6_addr32[1], 136 &in6.s6_addr32[0], &in6.s6_addr32[1],
148 &in6.s6_addr32[2], &in6.s6_addr32[3]); 137 &in6.s6_addr32[2], &in6.s6_addr32[3]);
@@ -170,20 +159,19 @@ static void tcp_do_one(int lnr, const char *line)
170 return; 159 return;
171 } 160 }
172 state_str = tcp_state[state]; 161 state_str = tcp_state[state];
173 if ((rem_port && (flags&NETSTAT_CONNECTED)) || 162 if ((rem_port && (flags & NETSTAT_CONNECTED))
174 (!rem_port && (flags&NETSTAT_LISTENING))) 163 || (!rem_port && (flags & NETSTAT_LISTENING))
175 { 164 ) {
176 snprint_ip_port(local_addr, sizeof(local_addr), 165 snprint_ip_port(local_addr, sizeof(local_addr),
177 (struct sockaddr *) &localaddr, local_port, 166 (struct sockaddr *) &localaddr, local_port,
178 "tcp", flags&NETSTAT_NUMERIC); 167 "tcp", flags & NETSTAT_NUMERIC);
179 168
180 snprint_ip_port(rem_addr, sizeof(rem_addr), 169 snprint_ip_port(rem_addr, sizeof(rem_addr),
181 (struct sockaddr *) &remaddr, rem_port, 170 (struct sockaddr *) &remaddr, rem_port,
182 "tcp", flags&NETSTAT_NUMERIC); 171 "tcp", flags & NETSTAT_NUMERIC);
183 172
184 printf("tcp %6ld %6ld %-23s %-23s %-12s\n", 173 printf("tcp %6ld %6ld %-23s %-23s %-12s\n",
185 rxq, txq, local_addr, rem_addr, state_str); 174 rxq, txq, local_addr, rem_addr, state_str);
186
187 } 175 }
188} 176}
189 177
@@ -192,7 +180,7 @@ static void udp_do_one(int lnr, const char *line)
192 char local_addr[64], rem_addr[64]; 180 char local_addr[64], rem_addr[64];
193 char *state_str, more[512]; 181 char *state_str, more[512];
194 int num, local_port, rem_port, d, state, timer_run, uid, timeout; 182 int num, local_port, rem_port, d, state, timer_run, uid, timeout;
195#ifdef CONFIG_FEATURE_IPV6 183#if ENABLE_FEATURE_IPV6
196 struct sockaddr_in6 localaddr, remaddr; 184 struct sockaddr_in6 localaddr, remaddr;
197 char addr6[INET6_ADDRSTRLEN]; 185 char addr6[INET6_ADDRSTRLEN];
198 struct in6_addr in6; 186 struct in6_addr in6;
@@ -212,7 +200,7 @@ static void udp_do_one(int lnr, const char *line)
212 &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more); 200 &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more);
213 201
214 if (strlen(local_addr) > 8) { 202 if (strlen(local_addr) > 8) {
215#ifdef CONFIG_FEATURE_IPV6 203#if ENABLE_FEATURE_IPV6
216 /* Demangle what the kernel gives us */ 204 /* Demangle what the kernel gives us */
217 sscanf(local_addr, "%08X%08X%08X%08X", 205 sscanf(local_addr, "%08X%08X%08X%08X",
218 &in6.s6_addr32[0], &in6.s6_addr32[1], 206 &in6.s6_addr32[0], &in6.s6_addr32[1],
@@ -254,7 +242,7 @@ static void udp_do_one(int lnr, const char *line)
254 break; 242 break;
255 } 243 }
256 244
257#ifdef CONFIG_FEATURE_IPV6 245#if ENABLE_FEATURE_IPV6
258# define notnull(A) (((A.sin6_family == AF_INET6) && \ 246# define notnull(A) (((A.sin6_family == AF_INET6) && \
259 ((A.sin6_addr.s6_addr32[0]) || \ 247 ((A.sin6_addr.s6_addr32[0]) || \
260 (A.sin6_addr.s6_addr32[1]) || \ 248 (A.sin6_addr.s6_addr32[1]) || \
@@ -265,20 +253,19 @@ static void udp_do_one(int lnr, const char *line)
265#else 253#else
266# define notnull(A) (A.sin_addr.s_addr) 254# define notnull(A) (A.sin_addr.s_addr)
267#endif 255#endif
268 if ((notnull(remaddr) && (flags&NETSTAT_CONNECTED)) || 256 if ((notnull(remaddr) && (flags & NETSTAT_CONNECTED))
269 (!notnull(remaddr) && (flags&NETSTAT_LISTENING))) 257 || (!notnull(remaddr) && (flags & NETSTAT_LISTENING))
270 { 258 ) {
271 snprint_ip_port(local_addr, sizeof(local_addr), 259 snprint_ip_port(local_addr, sizeof(local_addr),
272 (struct sockaddr *) &localaddr, local_port, 260 (struct sockaddr *) &localaddr, local_port,
273 "udp", flags&NETSTAT_NUMERIC); 261 "udp", flags & NETSTAT_NUMERIC);
274 262
275 snprint_ip_port(rem_addr, sizeof(rem_addr), 263 snprint_ip_port(rem_addr, sizeof(rem_addr),
276 (struct sockaddr *) &remaddr, rem_port, 264 (struct sockaddr *) &remaddr, rem_port,
277 "udp", flags&NETSTAT_NUMERIC); 265 "udp", flags & NETSTAT_NUMERIC);
278 266
279 printf("udp %6ld %6ld %-23s %-23s %-12s\n", 267 printf("udp %6ld %6ld %-23s %-23s %-12s\n",
280 rxq, txq, local_addr, rem_addr, state_str); 268 rxq, txq, local_addr, rem_addr, state_str);
281
282 } 269 }
283} 270}
284 271
@@ -287,7 +274,7 @@ static void raw_do_one(int lnr, const char *line)
287 char local_addr[64], rem_addr[64]; 274 char local_addr[64], rem_addr[64];
288 char *state_str, more[512]; 275 char *state_str, more[512];
289 int num, local_port, rem_port, d, state, timer_run, uid, timeout; 276 int num, local_port, rem_port, d, state, timer_run, uid, timeout;
290#ifdef CONFIG_FEATURE_IPV6 277#if ENABLE_FEATURE_IPV6
291 struct sockaddr_in6 localaddr, remaddr; 278 struct sockaddr_in6 localaddr, remaddr;
292 char addr6[INET6_ADDRSTRLEN]; 279 char addr6[INET6_ADDRSTRLEN];
293 struct in6_addr in6; 280 struct in6_addr in6;
@@ -307,7 +294,7 @@ static void raw_do_one(int lnr, const char *line)
307 &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more); 294 &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more);
308 295
309 if (strlen(local_addr) > 8) { 296 if (strlen(local_addr) > 8) {
310#ifdef CONFIG_FEATURE_IPV6 297#if ENABLE_FEATURE_IPV6
311 sscanf(local_addr, "%08X%08X%08X%08X", 298 sscanf(local_addr, "%08X%08X%08X%08X",
312 &in6.s6_addr32[0], &in6.s6_addr32[1], 299 &in6.s6_addr32[0], &in6.s6_addr32[1],
313 &in6.s6_addr32[2], &in6.s6_addr32[3]); 300 &in6.s6_addr32[2], &in6.s6_addr32[3]);
@@ -334,9 +321,9 @@ static void raw_do_one(int lnr, const char *line)
334 bb_error_msg("warning, got bogus raw line"); 321 bb_error_msg("warning, got bogus raw line");
335 return; 322 return;
336 } 323 }
337 state_str=itoa(state); 324 state_str = itoa(state);
338 325
339#ifdef CONFIG_FEATURE_IPV6 326#if ENABLE_FEATURE_IPV6
340# define notnull(A) (((A.sin6_family == AF_INET6) && \ 327# define notnull(A) (((A.sin6_family == AF_INET6) && \
341 ((A.sin6_addr.s6_addr32[0]) || \ 328 ((A.sin6_addr.s6_addr32[0]) || \
342 (A.sin6_addr.s6_addr32[1]) || \ 329 (A.sin6_addr.s6_addr32[1]) || \
@@ -347,20 +334,19 @@ static void raw_do_one(int lnr, const char *line)
347#else 334#else
348# define notnull(A) (A.sin_addr.s_addr) 335# define notnull(A) (A.sin_addr.s_addr)
349#endif 336#endif
350 if ((notnull(remaddr) && (flags&NETSTAT_CONNECTED)) || 337 if ((notnull(remaddr) && (flags & NETSTAT_CONNECTED))
351 (!notnull(remaddr) && (flags&NETSTAT_LISTENING))) 338 || (!notnull(remaddr) && (flags & NETSTAT_LISTENING))
352 { 339 ) {
353 snprint_ip_port(local_addr, sizeof(local_addr), 340 snprint_ip_port(local_addr, sizeof(local_addr),
354 (struct sockaddr *) &localaddr, local_port, 341 (struct sockaddr *) &localaddr, local_port,
355 "raw", flags&NETSTAT_NUMERIC); 342 "raw", flags & NETSTAT_NUMERIC);
356 343
357 snprint_ip_port(rem_addr, sizeof(rem_addr), 344 snprint_ip_port(rem_addr, sizeof(rem_addr),
358 (struct sockaddr *) &remaddr, rem_port, 345 (struct sockaddr *) &remaddr, rem_port,
359 "raw", flags&NETSTAT_NUMERIC); 346 "raw", flags & NETSTAT_NUMERIC);
360 347
361 printf("raw %6ld %6ld %-23s %-23s %-12s\n", 348 printf("raw %6ld %6ld %-23s %-23s %-12s\n",
362 rxq, txq, local_addr, rem_addr, state_str); 349 rxq, txq, local_addr, rem_addr, state_str);
363
364 } 350 }
365} 351}
366 352
@@ -390,12 +376,12 @@ static void unix_do_one(int nr, const char *line)
390 if (!(has & HAS_INODE)) 376 if (!(has & HAS_INODE))
391 snprintf(path,sizeof(path),"%d",inode); 377 snprintf(path,sizeof(path),"%d",inode);
392 378
393 if ((flags&(NETSTAT_LISTENING|NETSTAT_CONNECTED))!=(NETSTAT_LISTENING|NETSTAT_CONNECTED)) { 379 if ((flags & (NETSTAT_LISTENING|NETSTAT_CONNECTED)) != (NETSTAT_LISTENING|NETSTAT_CONNECTED)) {
394 if ((state == SS_UNCONNECTED) && (unix_flags & SO_ACCEPTCON)) { 380 if ((state == SS_UNCONNECTED) && (unix_flags & SO_ACCEPTCON)) {
395 if (!(flags&NETSTAT_LISTENING)) 381 if (!(flags & NETSTAT_LISTENING))
396 return; 382 return;
397 } else { 383 } else {
398 if (!(flags&NETSTAT_CONNECTED)) 384 if (!(flags & NETSTAT_CONNECTED))
399 return; 385 return;
400 } 386 }
401 } 387 }
@@ -502,20 +488,20 @@ static void do_info(const char *file, const char *name, void (*proc)(int, const
502 procinfo = fopen(file, "r"); 488 procinfo = fopen(file, "r");
503 if (procinfo == NULL) { 489 if (procinfo == NULL) {
504 if (errno != ENOENT) { 490 if (errno != ENOENT) {
505 perror(file); 491 bb_perror_msg("%s", file);
506 } else { 492 } else {
507 bb_error_msg("no support for '%s' on this system", name); 493 bb_error_msg("no support for '%s' on this system", name);
508 } 494 }
509 } else { 495 return;
510 do {
511 char *buffer = xmalloc_fgets(procinfo);
512 if (buffer) {
513 (proc)(lnr++, buffer);
514 free(buffer);
515 }
516 } while (!feof(procinfo));
517 fclose(procinfo);
518 } 496 }
497 do {
498 char *buffer = xmalloc_fgets(procinfo);
499 if (buffer) {
500 (proc)(lnr++, buffer);
501 free(buffer);
502 }
503 } while (!feof(procinfo));
504 fclose(procinfo);
519} 505}
520 506
521/* 507/*
@@ -529,12 +515,11 @@ int netstat_main(int argc, char **argv)
529 OPT_showroute = 0x100, 515 OPT_showroute = 0x100,
530 }; 516 };
531 unsigned opt; 517 unsigned opt;
532#ifdef CONFIG_FEATURE_IPV6 518#if ENABLE_FEATURE_IPV6
533 int inet = 1; 519 int inet = 1;
534 int inet6 = 1; 520 int inet6 = 1;
535#else 521#else
536# define inet 1 522 enum { inet = 1, inet6 = 0 };
537# define inet6 0
538#endif 523#endif
539 524
540 /* Option string must match NETSTAT_xxx constants */ 525 /* Option string must match NETSTAT_xxx constants */
@@ -551,8 +536,8 @@ int netstat_main(int argc, char **argv)
551 //if (opt & 0x40) // -w: NETSTAT_RAW 536 //if (opt & 0x40) // -w: NETSTAT_RAW
552 //if (opt & 0x80) // -x: NETSTAT_UNIX 537 //if (opt & 0x80) // -x: NETSTAT_UNIX
553 if (opt & OPT_showroute) { // -r 538 if (opt & OPT_showroute) { // -r
554#ifdef CONFIG_ROUTE 539#if ENABLE_ROUTE
555 displayroutes(flags & NETSTAT_NUMERIC, !(opt & OPT_extended)); 540 bb_displayroutes(flags & NETSTAT_NUMERIC, !(opt & OPT_extended));
556 return 0; 541 return 0;
557#else 542#else
558 bb_error_msg_and_die("-r (display routing table) is not compiled in"); 543 bb_error_msg_and_die("-r (display routing table) is not compiled in");
@@ -567,47 +552,42 @@ int netstat_main(int argc, char **argv)
567 if (flags & (NETSTAT_TCP|NETSTAT_UDP|NETSTAT_RAW)) { 552 if (flags & (NETSTAT_TCP|NETSTAT_UDP|NETSTAT_RAW)) {
568 printf("Active Internet connections "); /* xxx */ 553 printf("Active Internet connections "); /* xxx */
569 554
570 if ((flags&(NETSTAT_LISTENING|NETSTAT_CONNECTED))==(NETSTAT_LISTENING|NETSTAT_CONNECTED)) 555 if ((flags & (NETSTAT_LISTENING|NETSTAT_CONNECTED)) == (NETSTAT_LISTENING|NETSTAT_CONNECTED))
571 printf("(servers and established)"); 556 printf("(servers and established)");
572 else { 557 else if (flags & NETSTAT_LISTENING)
573 if (flags & NETSTAT_LISTENING) 558 printf("(only servers)");
574 printf("(only servers)"); 559 else
575 else 560 printf("(w/o servers)");
576 printf("(w/o servers)");
577 }
578 printf("\nProto Recv-Q Send-Q Local Address Foreign Address State\n"); 561 printf("\nProto Recv-Q Send-Q Local Address Foreign Address State\n");
579 } 562 }
580 if (inet && flags&NETSTAT_TCP) 563 if (inet && flags & NETSTAT_TCP)
581 do_info(_PATH_PROCNET_TCP,"AF INET (tcp)",tcp_do_one); 564 do_info(_PATH_PROCNET_TCP, "AF INET (tcp)", tcp_do_one);
582#ifdef CONFIG_FEATURE_IPV6 565#if ENABLE_FEATURE_IPV6
583 if (inet6 && flags&NETSTAT_TCP) 566 if (inet6 && flags & NETSTAT_TCP)
584 do_info(_PATH_PROCNET_TCP6,"AF INET6 (tcp)",tcp_do_one); 567 do_info(_PATH_PROCNET_TCP6, "AF INET6 (tcp)", tcp_do_one);
585#endif 568#endif
586 if (inet && flags&NETSTAT_UDP) 569 if (inet && flags & NETSTAT_UDP)
587 do_info(_PATH_PROCNET_UDP,"AF INET (udp)",udp_do_one); 570 do_info(_PATH_PROCNET_UDP, "AF INET (udp)", udp_do_one);
588#ifdef CONFIG_FEATURE_IPV6 571#if ENABLE_FEATURE_IPV6
589 if (inet6 && flags&NETSTAT_UDP) 572 if (inet6 && flags & NETSTAT_UDP)
590 do_info(_PATH_PROCNET_UDP6,"AF INET6 (udp)",udp_do_one); 573 do_info(_PATH_PROCNET_UDP6, "AF INET6 (udp)", udp_do_one);
591#endif 574#endif
592 if (inet && flags&NETSTAT_RAW) 575 if (inet && flags & NETSTAT_RAW)
593 do_info(_PATH_PROCNET_RAW,"AF INET (raw)",raw_do_one); 576 do_info(_PATH_PROCNET_RAW, "AF INET (raw)", raw_do_one);
594#ifdef CONFIG_FEATURE_IPV6 577#if ENABLE_FEATURE_IPV6
595 if (inet6 && flags&NETSTAT_RAW) 578 if (inet6 && flags & NETSTAT_RAW)
596 do_info(_PATH_PROCNET_RAW6,"AF INET6 (raw)",raw_do_one); 579 do_info(_PATH_PROCNET_RAW6, "AF INET6 (raw)", raw_do_one);
597#endif 580#endif
598 if (flags&NETSTAT_UNIX) { 581 if (flags & NETSTAT_UNIX) {
599 printf("Active UNIX domain sockets "); 582 printf("Active UNIX domain sockets ");
600 if ((flags&(NETSTAT_LISTENING|NETSTAT_CONNECTED))==(NETSTAT_LISTENING|NETSTAT_CONNECTED)) 583 if ((flags & (NETSTAT_LISTENING|NETSTAT_CONNECTED)) == (NETSTAT_LISTENING|NETSTAT_CONNECTED))
601 printf("(servers and established)"); 584 printf("(servers and established)");
602 else { 585 else if (flags & NETSTAT_LISTENING)
603 if (flags&NETSTAT_LISTENING) 586 printf("(only servers)");
604 printf("(only servers)"); 587 else
605 else 588 printf("(w/o servers)");
606 printf("(w/o servers)");
607 }
608
609 printf("\nProto RefCnt Flags Type State I-Node Path\n"); 589 printf("\nProto RefCnt Flags Type State I-Node Path\n");
610 do_info(_PATH_PROCNET_UNIX,"AF UNIX",unix_do_one); 590 do_info(_PATH_PROCNET_UNIX, "AF UNIX", unix_do_one);
611 } 591 }
612 return 0; 592 return 0;
613} 593}
diff --git a/networking/ping.c b/networking/ping.c
index d8a70334d..91708d282 100644
--- a/networking/ping.c
+++ b/networking/ping.c
@@ -343,8 +343,7 @@ static void ping(const char *host)
343 343
344 /* set recv buf for broadcast pings */ 344 /* set recv buf for broadcast pings */
345 sockopt = 48 * 1024; /* explain why 48k? */ 345 sockopt = 48 * 1024; /* explain why 48k? */
346 setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, (char *) &sockopt, 346 setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, &sockopt, sizeof(sockopt));
347 sizeof(sockopt));
348 347
349 printf("PING %s (%s)", 348 printf("PING %s (%s)",
350 hostent->h_name, 349 hostent->h_name,
diff --git a/networking/ping6.c b/networking/ping6.c
index dec3b426a..a92387e79 100644
--- a/networking/ping6.c
+++ b/networking/ping6.c
@@ -77,8 +77,7 @@ static void ping(const char *host)
77 pkt->icmp6_type = ICMP6_ECHO_REQUEST; 77 pkt->icmp6_type = ICMP6_ECHO_REQUEST;
78 78
79 sockopt = offsetof(struct icmp6_hdr, icmp6_cksum); 79 sockopt = offsetof(struct icmp6_hdr, icmp6_cksum);
80 setsockopt(pingsock, SOL_RAW, IPV6_CHECKSUM, (char *) &sockopt, 80 setsockopt(pingsock, SOL_RAW, IPV6_CHECKSUM, &sockopt, sizeof(sockopt));
81 sizeof(sockopt));
82 81
83 c = sendto(pingsock, packet, DEFDATALEN + sizeof (struct icmp6_hdr), 0, 82 c = sendto(pingsock, packet, DEFDATALEN + sizeof (struct icmp6_hdr), 0,
84 (struct sockaddr *) &pingaddr, sizeof(struct sockaddr_in6)); 83 (struct sockaddr *) &pingaddr, sizeof(struct sockaddr_in6));
@@ -312,6 +311,7 @@ static void unpack(char *packet, int sz, struct sockaddr_in6 *from, int hoplimit
312 fflush(stdout); 311 fflush(stdout);
313} 312}
314 313
314extern int BUG_bad_offsetof_icmp6_cksum(void);
315static void ping(const char *host) 315static void ping(const char *host)
316{ 316{
317 char packet[datalen + MAXIPLEN + MAXICMPLEN]; 317 char packet[datalen + MAXIPLEN + MAXICMPLEN];
@@ -353,18 +353,15 @@ static void ping(const char *host)
353 353
354 /* set recv buf for broadcast pings */ 354 /* set recv buf for broadcast pings */
355 sockopt = 48 * 1024; /* explain why 48k? */ 355 sockopt = 48 * 1024; /* explain why 48k? */
356 setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, (char *) &sockopt, 356 setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, &sockopt, sizeof(sockopt));
357 sizeof(sockopt));
358 357
359 sockopt = 2; /* iputils-ss020927 does this */
360 sockopt = offsetof(struct icmp6_hdr, icmp6_cksum); 358 sockopt = offsetof(struct icmp6_hdr, icmp6_cksum);
361 setsockopt(pingsock, SOL_RAW, IPV6_CHECKSUM, (char *) &sockopt, 359 if (offsetof(struct icmp6_hdr, icmp6_cksum) != 2)
362 sizeof(sockopt)); 360 BUG_bad_offsetof_icmp6_cksum();
361 setsockopt(pingsock, SOL_RAW, IPV6_CHECKSUM, &sockopt, sizeof(sockopt));
363 362
364 /* request ttl info to be returned in ancillary data */ 363 /* request ttl info to be returned in ancillary data */
365 sockopt = 1; 364 setsockopt(pingsock, SOL_IPV6, IPV6_HOPLIMIT, &const_int_1, sizeof(const_int_1));
366 setsockopt(pingsock, SOL_IPV6, IPV6_HOPLIMIT, (char *) &sockopt,
367 sizeof(sockopt));
368 365
369 if (if_index) 366 if (if_index)
370 pingaddr.sin6_scope_id = if_index; 367 pingaddr.sin6_scope_id = if_index;
diff --git a/networking/route.c b/networking/route.c
index d6d9b7dd9..c6fb5a371 100644
--- a/networking/route.c
+++ b/networking/route.c
@@ -63,14 +63,14 @@
63#endif 63#endif
64 64
65/* The RTACTION entries must agree with tbl_verb[] below! */ 65/* The RTACTION entries must agree with tbl_verb[] below! */
66#define RTACTION_ADD 1 66#define RTACTION_ADD 1
67#define RTACTION_DEL 2 67#define RTACTION_DEL 2
68 68
69/* For the various tbl_*[] arrays, the 1st byte is the offset to 69/* For the various tbl_*[] arrays, the 1st byte is the offset to
70 * the next entry and the 2nd byte is return value. */ 70 * the next entry and the 2nd byte is return value. */
71 71
72#define NET_FLAG 1 72#define NET_FLAG 1
73#define HOST_FLAG 2 73#define HOST_FLAG 2
74 74
75/* We remap '-' to '#' to avoid problems with getopt. */ 75/* We remap '-' to '#' to avoid problems with getopt. */
76static const char tbl_hash_net_host[] = 76static const char tbl_hash_net_host[] =
@@ -79,22 +79,22 @@ static const char tbl_hash_net_host[] =
79 "\007\002#host" /* Since last, we can save a byte. */ 79 "\007\002#host" /* Since last, we can save a byte. */
80; 80;
81 81
82#define KW_TAKES_ARG 020 82#define KW_TAKES_ARG 020
83#define KW_SETS_FLAG 040 83#define KW_SETS_FLAG 040
84 84
85#define KW_IPVx_METRIC 020 85#define KW_IPVx_METRIC 020
86#define KW_IPVx_NETMASK 021 86#define KW_IPVx_NETMASK 021
87#define KW_IPVx_GATEWAY 022 87#define KW_IPVx_GATEWAY 022
88#define KW_IPVx_MSS 023 88#define KW_IPVx_MSS 023
89#define KW_IPVx_WINDOW 024 89#define KW_IPVx_WINDOW 024
90#define KW_IPVx_IRTT 025 90#define KW_IPVx_IRTT 025
91#define KW_IPVx_DEVICE 026 91#define KW_IPVx_DEVICE 026
92 92
93#define KW_IPVx_FLAG_ONLY 040 93#define KW_IPVx_FLAG_ONLY 040
94#define KW_IPVx_REJECT 040 94#define KW_IPVx_REJECT 040
95#define KW_IPVx_MOD 041 95#define KW_IPVx_MOD 041
96#define KW_IPVx_DYN 042 96#define KW_IPVx_DYN 042
97#define KW_IPVx_REINSTATE 043 97#define KW_IPVx_REINSTATE 043
98 98
99static const char tbl_ipvx[] = 99static const char tbl_ipvx[] =
100 /* 020 is the "takes an arg" bit */ 100 /* 020 is the "takes an arg" bit */
@@ -167,7 +167,7 @@ static void INET_setroute(int action, char **args)
167 } 167 }
168 168
169 /* Clean out the RTREQ structure. */ 169 /* Clean out the RTREQ structure. */
170 memset((char *) &rt, 0, sizeof(struct rtentry)); 170 memset(&rt, 0, sizeof(rt));
171 171
172 { 172 {
173 const char *target = *args++; 173 const char *target = *args++;
@@ -334,7 +334,7 @@ static void INET_setroute(int action, char **args)
334 if (ENABLE_FEATURE_CLEAN_UP) close(skfd); 334 if (ENABLE_FEATURE_CLEAN_UP) close(skfd);
335} 335}
336 336
337#ifdef CONFIG_FEATURE_IPV6 337#if ENABLE_FEATURE_IPV6
338 338
339static void INET6_setroute(int action, char **args) 339static void INET6_setroute(int action, char **args)
340{ 340{
@@ -363,7 +363,7 @@ static void INET6_setroute(int action, char **args)
363 } 363 }
364 364
365 /* Clean out the RTREQ structure. */ 365 /* Clean out the RTREQ structure. */
366 memset((char *) &rt, 0, sizeof(struct in6_rtmsg)); 366 memset(&rt, 0, sizeof(rt));
367 367
368 memcpy(&rt.rtmsg_dst, sa6.sin6_addr.s6_addr, sizeof(struct in6_addr)); 368 memcpy(&rt.rtmsg_dst, sa6.sin6_addr.s6_addr, sizeof(struct in6_addr));
369 369
@@ -445,7 +445,7 @@ static const unsigned int flagvals[] = { /* Must agree with flagchars[]. */
445 RTF_REINSTATE, 445 RTF_REINSTATE,
446 RTF_DYNAMIC, 446 RTF_DYNAMIC,
447 RTF_MODIFIED, 447 RTF_MODIFIED,
448#ifdef CONFIG_FEATURE_IPV6 448#if ENABLE_FEATURE_IPV6
449 RTF_DEFAULT, 449 RTF_DEFAULT,
450 RTF_ADDRCONF, 450 RTF_ADDRCONF,
451 RTF_CACHE 451 RTF_CACHE
@@ -457,7 +457,7 @@ static const unsigned int flagvals[] = { /* Must agree with flagchars[]. */
457 457
458static const char flagchars[] = /* Must agree with flagvals[]. */ 458static const char flagchars[] = /* Must agree with flagvals[]. */
459 "GHRDM" 459 "GHRDM"
460#ifdef CONFIG_FEATURE_IPV6 460#if ENABLE_FEATURE_IPV6
461 "DAC" 461 "DAC"
462#endif 462#endif
463; 463;
@@ -476,7 +476,7 @@ static void set_flags(char *flagstr, int flags)
476} 476}
477 477
478/* also used in netstat */ 478/* also used in netstat */
479void displayroutes(int noresolve, int netstatfmt) 479void 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[16], sgw[16];
482 unsigned long int d, g, m; 482 unsigned long int d, g, m;
@@ -537,7 +537,7 @@ void displayroutes(int noresolve, int netstatfmt)
537 } 537 }
538} 538}
539 539
540#ifdef CONFIG_FEATURE_IPV6 540#if ENABLE_FEATURE_IPV6
541 541
542static void INET6_displayroutes(int noresolve) 542static void INET6_displayroutes(int noresolve)
543{ 543{
@@ -589,7 +589,7 @@ static void INET6_displayroutes(int noresolve)
589 goto ERROR; 589 goto ERROR;
590 } 590 }
591 addr6x[i++] = *p++; 591 addr6x[i++] = *p++;
592 if (!((i+1)%5)) { 592 if (!((i+1) % 5)) {
593 addr6x[i++] = ':'; 593 addr6x[i++] = ':';
594 } 594 }
595 } while (i < 40+28+7); 595 } while (i < 40+28+7);
@@ -626,10 +626,10 @@ static void INET6_displayroutes(int noresolve)
626 626
627#endif 627#endif
628 628
629#define ROUTE_OPT_A 0x01 629#define ROUTE_OPT_A 0x01
630#define ROUTE_OPT_n 0x02 630#define ROUTE_OPT_n 0x02
631#define ROUTE_OPT_e 0x04 631#define ROUTE_OPT_e 0x04
632#define ROUTE_OPT_INET6 0x08 /* Not an actual option. See below. */ 632#define ROUTE_OPT_INET6 0x08 /* Not an actual option. See below. */
633 633
634/* 1st byte is offset to next entry offset. 2nd byte is return value. */ 634/* 1st byte is offset to next entry offset. 2nd byte is return value. */
635static const char tbl_verb[] = /* 2nd byte matches RTACTION_* code */ 635static const char tbl_verb[] = /* 2nd byte matches RTACTION_* code */
@@ -649,15 +649,15 @@ int route_main(int argc, char **argv)
649 /* First, remap '-net' and '-host' to avoid getopt problems. */ 649 /* First, remap '-net' and '-host' to avoid getopt problems. */
650 p = argv; 650 p = argv;
651 while (*++p) { 651 while (*++p) {
652 if ((strcmp(*p, "-net") == 0) || (strcmp(*p, "-host") == 0)) { 652 if (strcmp(*p, "-net") == 0 || strcmp(*p, "-host") == 0) {
653 p[0][0] = '#'; 653 p[0][0] = '#';
654 } 654 }
655 } 655 }
656 656
657 opt = getopt32(argc, argv, "A:ne", &family); 657 opt = getopt32(argc, argv, "A:ne", &family);
658 658
659 if ((opt & ROUTE_OPT_A) && strcmp(family, "inet")) { 659 if ((opt & ROUTE_OPT_A) && strcmp(family, "inet") != 0) {
660#ifdef CONFIG_FEATURE_IPV6 660#if ENABLE_FEATURE_IPV6
661 if (strcmp(family, "inet6") == 0) { 661 if (strcmp(family, "inet6") == 0) {
662 opt |= ROUTE_OPT_INET6; /* Set flag for ipv6. */ 662 opt |= ROUTE_OPT_INET6; /* Set flag for ipv6. */
663 } else 663 } else
@@ -670,12 +670,12 @@ int route_main(int argc, char **argv)
670 /* No more args means display the routing table. */ 670 /* No more args means display the routing table. */
671 if (!*argv) { 671 if (!*argv) {
672 int noresolve = (opt & ROUTE_OPT_n) ? 0x0fff : 0; 672 int noresolve = (opt & ROUTE_OPT_n) ? 0x0fff : 0;
673#ifdef CONFIG_FEATURE_IPV6 673#if ENABLE_FEATURE_IPV6
674 if (opt & ROUTE_OPT_INET6) 674 if (opt & ROUTE_OPT_INET6)
675 INET6_displayroutes(noresolve); 675 INET6_displayroutes(noresolve);
676 else 676 else
677#endif 677#endif
678 displayroutes(noresolve, opt & ROUTE_OPT_e); 678 bb_displayroutes(noresolve, opt & ROUTE_OPT_e);
679 679
680 fflush_stdout_and_exit(EXIT_SUCCESS); 680 fflush_stdout_and_exit(EXIT_SUCCESS);
681 } 681 }
@@ -686,7 +686,7 @@ int route_main(int argc, char **argv)
686 bb_show_usage(); 686 bb_show_usage();
687 } 687 }
688 688
689#ifdef CONFIG_FEATURE_IPV6 689#if ENABLE_FEATURE_IPV6
690 if (opt & ROUTE_OPT_INET6) 690 if (opt & ROUTE_OPT_INET6)
691 INET6_setroute(what, argv); 691 INET6_setroute(what, argv);
692 else 692 else
diff --git a/networking/telnet.c b/networking/telnet.c
index 86586600b..fc70cc406 100644
--- a/networking/telnet.c
+++ b/networking/telnet.c
@@ -95,8 +95,6 @@ static void telopt(byte c);
95static int subneg(byte c); 95static int subneg(byte c);
96 96
97/* Some globals */ 97/* Some globals */
98static const int one = 1;
99
100#ifdef CONFIG_FEATURE_TELNET_TTYPE 98#ifdef CONFIG_FEATURE_TELNET_TTYPE
101static char *ttype; 99static char *ttype;
102#endif 100#endif
@@ -630,7 +628,7 @@ int telnet_main(int argc, char** argv)
630 628
631 G.netfd = create_and_connect_stream_or_die(host, port); 629 G.netfd = create_and_connect_stream_or_die(host, port);
632 630
633 setsockopt(G.netfd, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof one); 631 setsockopt(G.netfd, SOL_SOCKET, SO_KEEPALIVE, &const_int_1, sizeof(const_int_1));
634 632
635 signal(SIGINT, fgotsig); 633 signal(SIGINT, fgotsig);
636 634
diff --git a/networking/traceroute.c b/networking/traceroute.c
index 5eac6cd1e..47775aa8a 100644
--- a/networking/traceroute.c
+++ b/networking/traceroute.c
@@ -207,7 +207,6 @@
207//#undef CONFIG_FEATURE_TRACEROUTE_USE_ICMP 207//#undef CONFIG_FEATURE_TRACEROUTE_USE_ICMP
208//#define CONFIG_FEATURE_TRACEROUTE_USE_ICMP 208//#define CONFIG_FEATURE_TRACEROUTE_USE_ICMP
209 209
210#include "inet_common.h"
211 210
212#include <net/if.h> 211#include <net/if.h>
213#include <arpa/inet.h> 212#include <arpa/inet.h>
@@ -217,6 +216,7 @@
217#include <netinet/ip_icmp.h> 216#include <netinet/ip_icmp.h>
218 217
219#include "busybox.h" 218#include "busybox.h"
219#include "inet_common.h"
220 220
221 221
222/* 222/*
@@ -803,7 +803,8 @@ inetname(struct sockaddr_in *from)
803 char name[257]; 803 char name[257];
804 804
805 if (!nflag && from->sin_addr.s_addr != INADDR_ANY) { 805 if (!nflag && from->sin_addr.s_addr != INADDR_ANY) {
806 if (INET_rresolve(name, sizeof(name), from, 0x4000, 0xffffffff) >= 0) 806 if (INET_rresolve(name, sizeof(name), from, 0x4000,
807 0xffffffff) >= 0)
807 n = name; 808 n = name;
808 } 809 }
809 ina = inet_ntoa(from->sin_addr); 810 ina = inet_ntoa(from->sin_addr);
@@ -842,7 +843,7 @@ gethostinfo(const char *host)
842 843
843 hi = xzalloc(sizeof(*hi)); 844 hi = xzalloc(sizeof(*hi));
844 addr = inet_addr(host); 845 addr = inet_addr(host);
845 if ((int32_t)addr != -1) { 846 if (addr != 0xffffffff) {
846 hi->name = xstrdup(host); 847 hi->name = xstrdup(host);
847 hi->n = 1; 848 hi->n = 1;
848 hi->addrs = xzalloc(sizeof(hi->addrs[0])); 849 hi->addrs = xzalloc(sizeof(hi->addrs[0]));
@@ -888,8 +889,6 @@ getaddr(uint32_t *ap, const char *host)
888int 889int
889traceroute_main(int argc, char *argv[]) 890traceroute_main(int argc, char *argv[])
890{ 891{
891 static const int on = 1;
892
893 int code, n; 892 int code, n;
894 unsigned char *outp; 893 unsigned char *outp;
895 uint32_t *ap; 894 uint32_t *ap;
@@ -1043,19 +1042,19 @@ traceroute_main(int argc, char *argv[])
1043 1042
1044 /* Insure the socket fds won't be 0, 1 or 2 */ 1043 /* Insure the socket fds won't be 0, 1 or 2 */
1045 do n = xopen(bb_dev_null, O_RDONLY); while (n < 2); 1044 do n = xopen(bb_dev_null, O_RDONLY); while (n < 2);
1046 if (n > 2) 1045 while (n > 2)
1047 close(n); 1046 close(n--);
1048 1047
1049 s = xsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP); 1048 s = xsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
1050 1049
1051#if TRACEROUTE_SO_DEBUG 1050#if TRACEROUTE_SO_DEBUG
1052 if (op & USAGE_OP_DEBUG) 1051 if (op & USAGE_OP_DEBUG)
1053 (void)setsockopt(s, SOL_SOCKET, SO_DEBUG, (char *)&on, 1052 setsockopt(s, SOL_SOCKET, SO_DEBUG,
1054 sizeof(on)); 1053 &const_int_1, sizeof(const_int_1));
1055#endif 1054#endif
1056 if (op & USAGE_OP_BYPASS_ROUTE) 1055 if (op & USAGE_OP_BYPASS_ROUTE)
1057 (void)setsockopt(s, SOL_SOCKET, SO_DONTROUTE, (char *)&on, 1056 setsockopt(s, SOL_SOCKET, SO_DONTROUTE,
1058 sizeof(on)); 1057 &const_int_1, sizeof(const_int_1));
1059 1058
1060 sndsock = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW); 1059 sndsock = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW);
1061 1060
@@ -1087,32 +1086,31 @@ traceroute_main(int argc, char *argv[])
1087#endif /* CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE */ 1086#endif /* CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE */
1088 1087
1089#ifdef SO_SNDBUF 1088#ifdef SO_SNDBUF
1090 if (setsockopt(sndsock, SOL_SOCKET, SO_SNDBUF, (char *)&packlen, 1089 if (setsockopt(sndsock, SOL_SOCKET, SO_SNDBUF, &packlen, sizeof(packlen)) < 0) {
1091 sizeof(packlen)) < 0) {
1092 bb_perror_msg_and_die("SO_SNDBUF"); 1090 bb_perror_msg_and_die("SO_SNDBUF");
1093 } 1091 }
1094#endif 1092#endif
1095#ifdef IP_HDRINCL 1093#ifdef IP_HDRINCL
1096 if (setsockopt(sndsock, IPPROTO_IP, IP_HDRINCL, (char *)&on, 1094 if (setsockopt(sndsock, IPPROTO_IP, IP_HDRINCL, &const_int_1, sizeof(const_int_1)) < 0
1097 sizeof(on)) < 0 && errno != ENOPROTOOPT) { 1095 && errno != ENOPROTOOPT
1096 ) {
1098 bb_perror_msg_and_die("IP_HDRINCL"); 1097 bb_perror_msg_and_die("IP_HDRINCL");
1099 } 1098 }
1100#else 1099#else
1101#ifdef IP_TOS 1100#ifdef IP_TOS
1102 if (tos_str && setsockopt(sndsock, IPPROTO_IP, IP_TOS, 1101 if (tos_str && setsockopt(sndsock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) < 0) {
1103 (char *)&tos, sizeof(tos)) < 0) {
1104 bb_perror_msg_and_die("setsockopt tos %d", tos); 1102 bb_perror_msg_and_die("setsockopt tos %d", tos);
1105 } 1103 }
1106#endif 1104#endif
1107#endif 1105#endif
1108#if TRACEROUTE_SO_DEBUG 1106#if TRACEROUTE_SO_DEBUG
1109 if (op & USAGE_OP_DEBUG) 1107 if (op & USAGE_OP_DEBUG)
1110 (void)setsockopt(sndsock, SOL_SOCKET, SO_DEBUG, (char *)&on, 1108 setsockopt(sndsock, SOL_SOCKET, SO_DEBUG,
1111 sizeof(on)); 1109 &const_int_1, sizeof(const_int_1));
1112#endif 1110#endif
1113 if (op & USAGE_OP_BYPASS_ROUTE) 1111 if (op & USAGE_OP_BYPASS_ROUTE)
1114 (void)setsockopt(sndsock, SOL_SOCKET, SO_DONTROUTE, (char *)&on, 1112 setsockopt(sndsock, SOL_SOCKET, SO_DONTROUTE,
1115 sizeof(on)); 1113 &const_int_1, sizeof(const_int_1));
1116 1114
1117 /* Revert to non-privileged user after opening sockets */ 1115 /* Revert to non-privileged user after opening sockets */
1118 xsetgid(getgid()); 1116 xsetgid(getgid());
diff --git a/networking/udhcp/socket.c b/networking/udhcp/socket.c
index 8138f5a86..76ae7172d 100644
--- a/networking/udhcp/socket.c
+++ b/networking/udhcp/socket.c
@@ -112,7 +112,7 @@ int listen_socket(uint32_t ip, int port, char *inf)
112 } 112 }
113 113
114 strncpy(interface.ifr_name, inf, IFNAMSIZ); 114 strncpy(interface.ifr_name, inf, IFNAMSIZ);
115 if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, (char *)&interface, sizeof(interface)) < 0) { 115 if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &interface, sizeof(interface)) < 0) {
116 close(fd); 116 close(fd);
117 return -1; 117 return -1;
118 } 118 }
diff --git a/shell/lash.c b/shell/lash.c
index 4ea4e6763..90bd16885 100644
--- a/shell/lash.c
+++ b/shell/lash.c
@@ -30,7 +30,7 @@
30#define CONFIG_LASH_PIPE_N_REDIRECTS 30#define CONFIG_LASH_PIPE_N_REDIRECTS
31#define CONFIG_LASH_JOB_CONTROL 31#define CONFIG_LASH_JOB_CONTROL
32 32
33static const int MAX_READ = 128; /* size of input buffer for `read' builtin */ 33enum { MAX_READ = 128 }; /* size of input buffer for 'read' builtin */
34#define JOB_STATUS_FORMAT "[%d] %-22s %.40s\n" 34#define JOB_STATUS_FORMAT "[%d] %-22s %.40s\n"
35 35
36 36