aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2006-11-22 23:22:06 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2006-11-22 23:22:06 +0000
commit48237b0c88343154d58854020c3a9c8b07c61b10 (patch)
treeb36bc84f22dd797b45c8d665e50e2f6c690e1370
parentb40bdb383a6b7a7f0fd36d0b1cc24deb42cd5f0d (diff)
downloadbusybox-w32-48237b0c88343154d58854020c3a9c8b07c61b10.tar.gz
busybox-w32-48237b0c88343154d58854020c3a9c8b07c61b10.tar.bz2
busybox-w32-48237b0c88343154d58854020c3a9c8b07c61b10.zip
introduce setsockopt_reuseaddr(int fd), setsockopt_broadcast(int fd),
use them where appropriate. 200 bytes saved
-rw-r--r--include/libbb.h2
-rw-r--r--libbb/xconnect.c13
-rw-r--r--networking/arping.c2
-rw-r--r--networking/dnsd.c5
-rw-r--r--networking/ether-wake.c3
-rw-r--r--networking/fakeidentd.c9
-rw-r--r--networking/httpd.c9
-rw-r--r--networking/inetd.c6
-rw-r--r--networking/nc.c3
-rw-r--r--networking/ping.c4
-rw-r--r--networking/ping6.c4
-rw-r--r--networking/telnet.c2
-rw-r--r--networking/traceroute.c3
-rw-r--r--networking/udhcp/arpping.c7
-rw-r--r--networking/udhcp/packet.c3
-rw-r--r--networking/udhcp/socket.c7
16 files changed, 40 insertions, 42 deletions
diff --git a/include/libbb.h b/include/libbb.h
index c30c5a73d..c96ef6f94 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -244,6 +244,8 @@ typedef union {
244} sockaddr_inet; 244} sockaddr_inet;
245extern int dotted2sockaddr(const char *dotted, struct sockaddr* sp, int socklen); 245extern int dotted2sockaddr(const char *dotted, struct sockaddr* sp, int socklen);
246extern int create_and_bind_socket_ip4or6(const char *hostaddr, int port); 246extern int create_and_bind_socket_ip4or6(const char *hostaddr, int port);
247extern int setsockopt_reuseaddr(int fd);
248extern int setsockopt_broadcast(int fd);
247 249
248 250
249extern char *xstrdup(const char *s); 251extern char *xstrdup(const char *s);
diff --git a/libbb/xconnect.c b/libbb/xconnect.c
index 9f95e38f8..b85648007 100644
--- a/libbb/xconnect.c
+++ b/libbb/xconnect.c
@@ -67,6 +67,16 @@ int xconnect_tcp_v4(struct sockaddr_in *s_addr)
67 return s; 67 return s;
68} 68}
69 69
70static const int one = 1;
71int setsockopt_reuseaddr(int fd)
72{
73 return setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
74}
75int setsockopt_broadcast(int fd)
76{
77 return setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one));
78}
79
70int dotted2sockaddr(const char *dotted, struct sockaddr* sp, int socklen) 80int dotted2sockaddr(const char *dotted, struct sockaddr* sp, int socklen)
71{ 81{
72 union { 82 union {
@@ -116,7 +126,6 @@ int xsocket_stream_ip4or6(sa_family_t *fp)
116 126
117int create_and_bind_socket_ip4or6(const char *hostaddr, int port) 127int create_and_bind_socket_ip4or6(const char *hostaddr, int port)
118{ 128{
119 static const int on = 1;
120 int fd; 129 int fd;
121 sockaddr_inet sa; 130 sockaddr_inet sa;
122 131
@@ -128,7 +137,7 @@ int create_and_bind_socket_ip4or6(const char *hostaddr, int port)
128 fd = xsocket(sa.sa.sa_family, SOCK_STREAM, 0); 137 fd = xsocket(sa.sa.sa_family, SOCK_STREAM, 0);
129 } else 138 } else
130 fd = xsocket_stream_ip4or6(&sa.sa.sa_family); 139 fd = xsocket_stream_ip4or6(&sa.sa.sa_family);
131 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); 140 setsockopt_reuseaddr(fd);
132 141
133 /* if (port >= 0) { */ 142 /* if (port >= 0) { */
134#if ENABLE_FEATURE_IPV6 143#if ENABLE_FEATURE_IPV6
diff --git a/networking/arping.c b/networking/arping.c
index e4c9b86a9..2d92bf4be 100644
--- a/networking/arping.c
+++ b/networking/arping.c
@@ -354,7 +354,7 @@ int arping_main(int argc, char **argv)
354 bb_error_msg_and_die("bind"); 354 bb_error_msg_and_die("bind");
355 } 355 }
356 } else if (!(cfg&dad)) { 356 } else if (!(cfg&dad)) {
357 int on = 1; 357 static const int on = 1;
358 socklen_t alen = sizeof(saddr); 358 socklen_t alen = sizeof(saddr);
359 359
360 saddr.sin_port = htons(1025); 360 saddr.sin_port = htons(1025);
diff --git a/networking/dnsd.c b/networking/dnsd.c
index 6f9dc5d67..5e9cf52f1 100644
--- a/networking/dnsd.c
+++ b/networking/dnsd.c
@@ -200,12 +200,9 @@ static int listen_socket(char *iface_addr, int listen_port)
200 struct sockaddr_in a; 200 struct sockaddr_in a;
201 char msg[100]; 201 char msg[100];
202 int s; 202 int s;
203 int yes = 1;
204 s = xsocket(PF_INET, SOCK_DGRAM, 0); 203 s = xsocket(PF_INET, SOCK_DGRAM, 0);
205#ifdef SO_REUSEADDR 204 if (setsockopt_reuseaddr(s) < 0)
206 if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0)
207 bb_perror_msg_and_die("setsockopt() failed"); 205 bb_perror_msg_and_die("setsockopt() failed");
208#endif
209 memset(&a, 0, sizeof(a)); 206 memset(&a, 0, sizeof(a));
210 a.sin_port = htons(listen_port); 207 a.sin_port = htons(listen_port);
211 a.sin_family = AF_INET; 208 a.sin_family = AF_INET;
diff --git a/networking/ether-wake.c b/networking/ether-wake.c
index cc2fb62a3..f870f6a5f 100644
--- a/networking/ether-wake.c
+++ b/networking/ether-wake.c
@@ -175,8 +175,7 @@ int ether_wake_main(int argc, char *argv[])
175 175
176 /* This is necessary for broadcasts to work */ 176 /* This is necessary for broadcasts to work */
177 if (flags /*& 1 [OPT_BROADCAST]*/) { 177 if (flags /*& 1 [OPT_BROADCAST]*/) {
178 int one = 1; 178 if (setsockopt_broadcast(s) < 0)
179 if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (void *)&one, sizeof(one)) < 0)
180 bb_perror_msg("SO_BROADCAST"); 179 bb_perror_msg("SO_BROADCAST");
181 } 180 }
182 181
diff --git a/networking/fakeidentd.c b/networking/fakeidentd.c
index 0e543e772..04138cca3 100644
--- a/networking/fakeidentd.c
+++ b/networking/fakeidentd.c
@@ -77,17 +77,16 @@ static void inetbind(void)
77 int s, port; 77 int s, port;
78 struct sockaddr_in addr; 78 struct sockaddr_in addr;
79 int len = sizeof(addr); 79 int len = sizeof(addr);
80 int one = 1;
81 struct servent *se; 80 struct servent *se;
82 81
83 if ((se = getservbyname("identd", "tcp")) == NULL) 82 se = getservbyname("identd", "tcp");
84 port = IDENT_PORT; 83 port = IDENT_PORT;
85 else 84 if (se)
86 port = se->s_port; 85 port = se->s_port;
87 86
88 s = xsocket(AF_INET, SOCK_STREAM, 0); 87 s = xsocket(AF_INET, SOCK_STREAM, 0);
89 88
90 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); 89 setsockopt_reuseaddr(s);
91 90
92 memset(&addr, 0, sizeof(addr)); 91 memset(&addr, 0, sizeof(addr));
93 addr.sin_addr.s_addr = inet_addr(bind_ip_address); 92 addr.sin_addr.s_addr = inet_addr(bind_ip_address);
diff --git a/networking/httpd.c b/networking/httpd.c
index b82e9f995..97b04fb03 100644
--- a/networking/httpd.c
+++ b/networking/httpd.c
@@ -802,7 +802,6 @@ static int openServer(void)
802{ 802{
803 struct sockaddr_in lsocket; 803 struct sockaddr_in lsocket;
804 int fd; 804 int fd;
805 int on = 1;
806 805
807 /* create the socket right now */ 806 /* create the socket right now */
808 /* inet_addr() returns a value that is already in network order */ 807 /* inet_addr() returns a value that is already in network order */
@@ -814,9 +813,13 @@ static int openServer(void)
814 /* tell the OS it's OK to reuse a previous address even though */ 813 /* tell the OS it's OK to reuse a previous address even though */
815 /* it may still be in a close down state. Allows bind to succeed. */ 814 /* it may still be in a close down state. Allows bind to succeed. */
816#ifdef SO_REUSEPORT 815#ifdef SO_REUSEPORT
817 setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, (void *)&on, sizeof(on)); 816 {
817 static const int on = 1;
818 setsockopt(fd, SOL_SOCKET, SO_REUSEPORT,
819 (void *)&on, sizeof(on));
820 }
818#else 821#else
819 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(on)); 822 setsockopt_reuseaddr(fd);
820#endif 823#endif
821 xbind(fd, (struct sockaddr *)&lsocket, sizeof(lsocket)); 824 xbind(fd, (struct sockaddr *)&lsocket, sizeof(lsocket));
822 xlisten(fd, 9); 825 xlisten(fd, 9);
diff --git a/networking/inetd.c b/networking/inetd.c
index 75b2b14a7..ec7b2e8f7 100644
--- a/networking/inetd.c
+++ b/networking/inetd.c
@@ -419,7 +419,6 @@ static int bump_nofile (void)
419 419
420static void setup(servtab_t *sep) 420static void setup(servtab_t *sep)
421{ 421{
422 int on = 1;
423 int r; 422 int r;
424 423
425 sep->se_fd = socket(sep->se_family, sep->se_socktype, 0); 424 sep->se_fd = socket(sep->se_family, sep->se_socktype, 0);
@@ -427,11 +426,8 @@ static void setup(servtab_t *sep)
427 bb_perror_msg("%s/%s: socket", sep->se_service, sep->se_proto); 426 bb_perror_msg("%s/%s: socket", sep->se_service, sep->se_proto);
428 return; 427 return;
429 } 428 }
430#define turnon(fd, opt) \ 429 if (setsockopt_reuseaddr(sep->se_fd) < 0)
431setsockopt(fd, SOL_SOCKET, opt, (char *)&on, sizeof(on))
432 if (turnon(sep->se_fd, SO_REUSEADDR) < 0)
433 bb_perror_msg("setsockopt(SO_REUSEADDR)"); 430 bb_perror_msg("setsockopt(SO_REUSEADDR)");
434#undef turnon
435 431
436#ifdef CONFIG_FEATURE_INETD_RPC 432#ifdef CONFIG_FEATURE_INETD_RPC
437 if (isrpcservice(sep)) { 433 if (isrpcservice(sep)) {
diff --git a/networking/nc.c b/networking/nc.c
index 2f8a36bee..5fd9242cc 100644
--- a/networking/nc.c
+++ b/networking/nc.c
@@ -85,8 +85,7 @@ int nc_main(int argc, char **argv)
85 if (!cfd) { 85 if (!cfd) {
86 sfd = xsocket(AF_INET, SOCK_STREAM, 0); 86 sfd = xsocket(AF_INET, SOCK_STREAM, 0);
87 fcntl(sfd, F_SETFD, FD_CLOEXEC); 87 fcntl(sfd, F_SETFD, FD_CLOEXEC);
88 opt = 1; 88 setsockopt_reuseaddr(sfd);
89 setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
90 address.sin_family = AF_INET; 89 address.sin_family = AF_INET;
91 90
92 // Set local port. 91 // Set local port.
diff --git a/networking/ping.c b/networking/ping.c
index 400d565d9..fc01b5e1d 100644
--- a/networking/ping.c
+++ b/networking/ping.c
@@ -351,9 +351,7 @@ static void ping(const char *host)
351 memcpy(&pingaddr.sin_addr, hostent->h_addr, sizeof(pingaddr.sin_addr)); 351 memcpy(&pingaddr.sin_addr, hostent->h_addr, sizeof(pingaddr.sin_addr));
352 352
353 /* enable broadcast pings */ 353 /* enable broadcast pings */
354 sockopt = 1; 354 setsockopt_broadcast(pingsock);
355 setsockopt(pingsock, SOL_SOCKET, SO_BROADCAST, (char *) &sockopt,
356 sizeof(sockopt));
357 355
358 /* set recv buf for broadcast pings */ 356 /* set recv buf for broadcast pings */
359 sockopt = 48 * 1024; 357 sockopt = 48 * 1024;
diff --git a/networking/ping6.c b/networking/ping6.c
index 6ab9ce0f1..9f0509e66 100644
--- a/networking/ping6.c
+++ b/networking/ping6.c
@@ -356,9 +356,7 @@ static void ping(const char *host)
356#endif /*ICMP6_FILTER*/ 356#endif /*ICMP6_FILTER*/
357 357
358 /* enable broadcast pings */ 358 /* enable broadcast pings */
359 sockopt = 1; 359 setsockopt_broadcast(pingsock);
360 setsockopt(pingsock, SOL_SOCKET, SO_BROADCAST, (char *) &sockopt,
361 sizeof(sockopt));
362 360
363 /* set recv buf for broadcast pings */ 361 /* set recv buf for broadcast pings */
364 sockopt = 48 * 1024; 362 sockopt = 48 * 1024;
diff --git a/networking/telnet.c b/networking/telnet.c
index 628e2e6e3..6085d885a 100644
--- a/networking/telnet.c
+++ b/networking/telnet.c
@@ -103,7 +103,7 @@ static void telopt(byte c);
103static int subneg(byte c); 103static int subneg(byte c);
104 104
105/* Some globals */ 105/* Some globals */
106static int one = 1; 106static const int one = 1;
107 107
108#ifdef CONFIG_FEATURE_TELNET_TTYPE 108#ifdef CONFIG_FEATURE_TELNET_TTYPE
109static char *ttype; 109static char *ttype;
diff --git a/networking/traceroute.c b/networking/traceroute.c
index c4f050abb..490076543 100644
--- a/networking/traceroute.c
+++ b/networking/traceroute.c
@@ -888,13 +888,14 @@ getaddr(u_int32_t *ap, const char *host)
888int 888int
889traceroute_main(int argc, char *argv[]) 889traceroute_main(int argc, char *argv[])
890{ 890{
891 static const int on = 1;
892
891 int code, n; 893 int code, n;
892 unsigned char *outp; 894 unsigned char *outp;
893 u_int32_t *ap; 895 u_int32_t *ap;
894 struct sockaddr_in *from = (struct sockaddr_in *)&wherefrom; 896 struct sockaddr_in *from = (struct sockaddr_in *)&wherefrom;
895 struct sockaddr_in *to = (struct sockaddr_in *)&whereto; 897 struct sockaddr_in *to = (struct sockaddr_in *)&whereto;
896 struct hostinfo *hi; 898 struct hostinfo *hi;
897 int on = 1;
898 int ttl, probe, i; 899 int ttl, probe, i;
899 int seq = 0; 900 int seq = 0;
900 int tos = 0; 901 int tos = 0;
diff --git a/networking/udhcp/arpping.c b/networking/udhcp/arpping.c
index 471e36d62..9c8b9c562 100644
--- a/networking/udhcp/arpping.c
+++ b/networking/udhcp/arpping.c
@@ -44,9 +44,7 @@ struct arpMsg {
44/* FIXME: match response against chaddr */ 44/* FIXME: match response against chaddr */
45int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *mac, char *interface) 45int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *mac, char *interface)
46{ 46{
47
48 int timeout = 2; 47 int timeout = 2;
49 int optval = 1;
50 int s; /* socket */ 48 int s; /* socket */
51 int rv = 1; /* return value */ 49 int rv = 1; /* return value */
52 struct sockaddr addr; /* for interface name */ 50 struct sockaddr addr; /* for interface name */
@@ -56,12 +54,13 @@ int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *mac, char *interface)
56 time_t prevTime; 54 time_t prevTime;
57 55
58 56
59 if ((s = socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ARP))) == -1) { 57 s = socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ARP));
58 if (s == -1) {
60 bb_perror_msg(bb_msg_can_not_create_raw_socket); 59 bb_perror_msg(bb_msg_can_not_create_raw_socket);
61 return -1; 60 return -1;
62 } 61 }
63 62
64 if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(optval)) == -1) { 63 if (setsockopt_broadcast(s) == -1) {
65 bb_perror_msg("cannot setsocketopt on raw socket"); 64 bb_perror_msg("cannot setsocketopt on raw socket");
66 close(s); 65 close(s);
67 return -1; 66 return -1;
diff --git a/networking/udhcp/packet.c b/networking/udhcp/packet.c
index 85910447b..dec9d0ab3 100644
--- a/networking/udhcp/packet.c
+++ b/networking/udhcp/packet.c
@@ -173,7 +173,6 @@ int udhcp_kernel_packet(struct dhcpMessage *payload,
173 uint32_t source_ip, int source_port, 173 uint32_t source_ip, int source_port,
174 uint32_t dest_ip, int dest_port) 174 uint32_t dest_ip, int dest_port)
175{ 175{
176 int n = 1;
177 int fd, result; 176 int fd, result;
178 struct sockaddr_in client; 177 struct sockaddr_in client;
179 178
@@ -181,7 +180,7 @@ int udhcp_kernel_packet(struct dhcpMessage *payload,
181 if (fd < 0) 180 if (fd < 0)
182 return -1; 181 return -1;
183 182
184 if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) { 183 if (setsockopt_reuseaddr(fd) == -1) {
185 close(fd); 184 close(fd);
186 return -1; 185 return -1;
187 } 186 }
diff --git a/networking/udhcp/socket.c b/networking/udhcp/socket.c
index c19131d65..b27dca300 100644
--- a/networking/udhcp/socket.c
+++ b/networking/udhcp/socket.c
@@ -93,7 +93,6 @@ int listen_socket(uint32_t ip, int port, char *inf)
93 struct ifreq interface; 93 struct ifreq interface;
94 int fd; 94 int fd;
95 struct sockaddr_in addr; 95 struct sockaddr_in addr;
96 int n = 1;
97 96
98 DEBUG("Opening listen socket on 0x%08x:%d %s", ip, port, inf); 97 DEBUG("Opening listen socket on 0x%08x:%d %s", ip, port, inf);
99 fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 98 fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
@@ -107,17 +106,17 @@ int listen_socket(uint32_t ip, int port, char *inf)
107 addr.sin_port = htons(port); 106 addr.sin_port = htons(port);
108 addr.sin_addr.s_addr = ip; 107 addr.sin_addr.s_addr = ip;
109 108
110 if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) { 109 if (setsockopt_reuseaddr(fd) == -1) {
111 close(fd); 110 close(fd);
112 return -1; 111 return -1;
113 } 112 }
114 if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char *) &n, sizeof(n)) == -1) { 113 if (setsockopt_broadcast(fd) == -1) {
115 close(fd); 114 close(fd);
116 return -1; 115 return -1;
117 } 116 }
118 117
119 strncpy(interface.ifr_name, inf, IFNAMSIZ); 118 strncpy(interface.ifr_name, inf, IFNAMSIZ);
120 if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,(char *)&interface, sizeof(interface)) < 0) { 119 if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, (char *)&interface, sizeof(interface)) < 0) {
121 close(fd); 120 close(fd);
122 return -1; 121 return -1;
123 } 122 }