diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-08-18 14:16:39 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-08-18 14:16:39 +0000 |
commit | a27a11bb2c033d3e0312dc1d62430a002314686f (patch) | |
tree | 74b32a18cb1e09c4f663a49c27ffa3725d3e4ee5 /networking/udhcp | |
parent | b98c26ad684e3aed8f1480458737f1ab90477c9e (diff) | |
download | busybox-w32-a27a11bb2c033d3e0312dc1d62430a002314686f.tar.gz busybox-w32-a27a11bb2c033d3e0312dc1d62430a002314686f.tar.bz2 busybox-w32-a27a11bb2c033d3e0312dc1d62430a002314686f.zip |
introduce and use xdup2(int, int)
stop checking whether setsockopt_reuseaddr(int fd) was successful (it always is)
remove second parameter (sockllen) from xmalloc_sockaddr2xxxxx functions
sockaddr2str 142 156 +14
collect_blk 467 474 +7
xdup2 28 33 +5
singlemount 4456 4454 -2
print_host 214 212 -2
nslookup_main 139 137 -2
ftpgetput_main 414 412 -2
udhcpd_main 1258 1255 -3
udhcpc_main 2405 2402 -3
traceroute_main 4125 4122 -3
nc_main 1072 1069 -3
buffer_fill_and_print 76 73 -3
xmalloc_sockaddr2hostonly_noport 18 14 -4
xmalloc_sockaddr2host_noport 18 14 -4
xmalloc_sockaddr2host 15 11 -4
xmalloc_sockaddr2dotted_noport 18 14 -4
xmalloc_sockaddr2dotted 18 14 -4
wget_main 2618 2614 -4
ping_main 393 389 -4
ip_port_str 120 115 -5
dhcprelay_main 1146 1141 -5
dnsd_main 1531 1525 -6
passwd_main 1110 1102 -8
udhcp_kernel_packet 206 197 -9
udhcp_listen_socket 154 144 -10
getty_main 2576 2566 -10
setup 655 640 -15
xmove_fd 51 34 -17
dolisten 759 742 -17
tcpudpsvd_main 1866 1836 -30
startservice 339 299 -40
Diffstat (limited to 'networking/udhcp')
-rw-r--r-- | networking/udhcp/common.h | 2 | ||||
-rw-r--r-- | networking/udhcp/dhcpc.c | 2 | ||||
-rw-r--r-- | networking/udhcp/dhcpd.c | 2 | ||||
-rw-r--r-- | networking/udhcp/dhcprelay.c | 9 | ||||
-rw-r--r-- | networking/udhcp/packet.c | 7 | ||||
-rw-r--r-- | networking/udhcp/socket.c | 42 |
6 files changed, 24 insertions, 40 deletions
diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h index bc21176a5..33417af09 100644 --- a/networking/udhcp/common.h +++ b/networking/udhcp/common.h | |||
@@ -83,7 +83,7 @@ int udhcp_sp_fd_set(fd_set *rfds, int extra_fd); | |||
83 | int udhcp_sp_read(fd_set *rfds); | 83 | int udhcp_sp_read(fd_set *rfds); |
84 | int raw_socket(int ifindex); | 84 | int raw_socket(int ifindex); |
85 | int read_interface(const char *interface, int *ifindex, uint32_t *addr, uint8_t *arp); | 85 | int read_interface(const char *interface, int *ifindex, uint32_t *addr, uint8_t *arp); |
86 | int listen_socket(uint32_t ip, int port, const char *inf); | 86 | int listen_socket(/*uint32_t ip,*/ int port, const char *inf); |
87 | /* Returns 1 if no reply received */ | 87 | /* Returns 1 if no reply received */ |
88 | int arpping(uint32_t test_ip, uint32_t from_ip, uint8_t *from_mac, const char *interface); | 88 | int arpping(uint32_t test_ip, uint32_t from_ip, uint8_t *from_mac, const char *interface); |
89 | 89 | ||
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index 7d38742b9..f0a3351fd 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c | |||
@@ -311,7 +311,7 @@ int udhcpc_main(int argc, char **argv) | |||
311 | 311 | ||
312 | if (listen_mode != LISTEN_NONE && sockfd < 0) { | 312 | if (listen_mode != LISTEN_NONE && sockfd < 0) { |
313 | if (listen_mode == LISTEN_KERNEL) | 313 | if (listen_mode == LISTEN_KERNEL) |
314 | sockfd = listen_socket(INADDR_ANY, CLIENT_PORT, client_config.interface); | 314 | sockfd = listen_socket(/*INADDR_ANY,*/ CLIENT_PORT, client_config.interface); |
315 | else | 315 | else |
316 | sockfd = raw_socket(client_config.ifindex); | 316 | sockfd = raw_socket(client_config.ifindex); |
317 | } | 317 | } |
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c index fb42e2f73..2fd16ce9b 100644 --- a/networking/udhcp/dhcpd.c +++ b/networking/udhcp/dhcpd.c | |||
@@ -95,7 +95,7 @@ int udhcpd_main(int argc, char **argv) | |||
95 | while (1) { /* loop until universe collapses */ | 95 | while (1) { /* loop until universe collapses */ |
96 | 96 | ||
97 | if (server_socket < 0) { | 97 | if (server_socket < 0) { |
98 | server_socket = listen_socket(INADDR_ANY, SERVER_PORT, | 98 | server_socket = listen_socket(/*INADDR_ANY,*/ SERVER_PORT, |
99 | server_config.interface); | 99 | server_config.interface); |
100 | } | 100 | } |
101 | 101 | ||
diff --git a/networking/udhcp/dhcprelay.c b/networking/udhcp/dhcprelay.c index 4ed65a2d6..3e1758d5c 100644 --- a/networking/udhcp/dhcprelay.c +++ b/networking/udhcp/dhcprelay.c | |||
@@ -167,16 +167,17 @@ static int init_sockets(char **client, int num_clients, | |||
167 | int i; | 167 | int i; |
168 | 168 | ||
169 | /* talk to real server on bootps */ | 169 | /* talk to real server on bootps */ |
170 | fds[0] = listen_socket(htonl(INADDR_ANY), 67, server); | 170 | fds[0] = listen_socket(/*INADDR_ANY,*/ 67, server); |
171 | *max_socket = fds[0]; | 171 | *max_socket = fds[0]; |
172 | 172 | ||
173 | /* array starts at 1 since server is 0 */ | 173 | /* array starts at 1 since server is 0 */ |
174 | num_clients++; | 174 | num_clients++; |
175 | 175 | ||
176 | for (i=1; i < num_clients; i++) { | 176 | for (i = 1; i < num_clients; i++) { |
177 | /* listen for clients on bootps */ | 177 | /* listen for clients on bootps */ |
178 | fds[i] = listen_socket(htonl(INADDR_ANY), 67, client[i-1]); | 178 | fds[i] = listen_socket(/*NADDR_ANY,*/ 67, client[i-1]); |
179 | if (fds[i] > *max_socket) *max_socket = fds[i]; | 179 | if (fds[i] > *max_socket) |
180 | *max_socket = fds[i]; | ||
180 | } | 181 | } |
181 | 182 | ||
182 | return i; | 183 | return i; |
diff --git a/networking/udhcp/packet.c b/networking/udhcp/packet.c index 272e79df1..41cd32135 100644 --- a/networking/udhcp/packet.c +++ b/networking/udhcp/packet.c | |||
@@ -194,17 +194,14 @@ int udhcp_kernel_packet(struct dhcpMessage *payload, | |||
194 | if (fd < 0) | 194 | if (fd < 0) |
195 | return -1; | 195 | return -1; |
196 | 196 | ||
197 | if (setsockopt_reuseaddr(fd) == -1) { | 197 | setsockopt_reuseaddr(fd); |
198 | close(fd); | ||
199 | return -1; | ||
200 | } | ||
201 | 198 | ||
202 | memset(&client, 0, sizeof(client)); | 199 | memset(&client, 0, sizeof(client)); |
203 | client.sin_family = AF_INET; | 200 | client.sin_family = AF_INET; |
204 | client.sin_port = htons(source_port); | 201 | client.sin_port = htons(source_port); |
205 | client.sin_addr.s_addr = source_ip; | 202 | client.sin_addr.s_addr = source_ip; |
206 | 203 | ||
207 | if (bind(fd, (struct sockaddr *)&client, sizeof(struct sockaddr)) == -1) { | 204 | if (bind(fd, (struct sockaddr *)&client, sizeof(client)) == -1) { |
208 | close(fd); | 205 | close(fd); |
209 | return -1; | 206 | return -1; |
210 | } | 207 | } |
diff --git a/networking/udhcp/socket.c b/networking/udhcp/socket.c index 1e62f8e40..79ddfb1e2 100644 --- a/networking/udhcp/socket.c +++ b/networking/udhcp/socket.c | |||
@@ -45,10 +45,6 @@ int read_interface(const char *interface, int *ifindex, uint32_t *addr, uint8_t | |||
45 | 45 | ||
46 | memset(&ifr, 0, sizeof(ifr)); | 46 | memset(&ifr, 0, sizeof(ifr)); |
47 | fd = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW); | 47 | fd = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW); |
48 | // if (fd < 0) { | ||
49 | // bb_perror_msg("socket failed"); | ||
50 | // return -1; | ||
51 | // } | ||
52 | 48 | ||
53 | ifr.ifr_addr.sa_family = AF_INET; | 49 | ifr.ifr_addr.sa_family = AF_INET; |
54 | strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name)); | 50 | strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name)); |
@@ -87,40 +83,30 @@ int read_interface(const char *interface, int *ifindex, uint32_t *addr, uint8_t | |||
87 | return 0; | 83 | return 0; |
88 | } | 84 | } |
89 | 85 | ||
90 | 86 | /* 1. None of the callers expects it to ever fail */ | |
91 | int listen_socket(uint32_t ip, int port, const char *inf) | 87 | /* 2. ip was always INADDR_ANY */ |
88 | int listen_socket(/*uint32_t ip,*/ int port, const char *inf) | ||
92 | { | 89 | { |
93 | struct ifreq interface; | ||
94 | int fd; | 90 | int fd; |
91 | struct ifreq interface; | ||
95 | struct sockaddr_in addr; | 92 | struct sockaddr_in addr; |
96 | 93 | ||
97 | DEBUG("Opening listen socket on 0x%08x:%d %s", ip, port, inf); | 94 | DEBUG("Opening listen socket on 0x%08x:%d %s", ip, port, inf); |
98 | fd = xsocket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); | 95 | fd = xsocket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); |
99 | 96 | ||
100 | memset(&addr, 0, sizeof(addr)); | 97 | setsockopt_reuseaddr(fd); |
101 | addr.sin_family = AF_INET; | 98 | if (setsockopt_broadcast(fd) == -1) |
102 | addr.sin_port = htons(port); | 99 | bb_perror_msg_and_die("SO_BROADCAST"); |
103 | addr.sin_addr.s_addr = ip; | ||
104 | |||
105 | if (setsockopt_reuseaddr(fd) == -1) { | ||
106 | close(fd); | ||
107 | return -1; | ||
108 | } | ||
109 | if (setsockopt_broadcast(fd) == -1) { | ||
110 | close(fd); | ||
111 | return -1; | ||
112 | } | ||
113 | 100 | ||
114 | strncpy(interface.ifr_name, inf, IFNAMSIZ); | 101 | strncpy(interface.ifr_name, inf, IFNAMSIZ); |
115 | if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &interface, sizeof(interface)) < 0) { | 102 | if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &interface, sizeof(interface)) == -1) |
116 | close(fd); | 103 | bb_perror_msg_and_die("SO_BINDTODEVICE"); |
117 | return -1; | ||
118 | } | ||
119 | 104 | ||
120 | if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) { | 105 | memset(&addr, 0, sizeof(addr)); |
121 | close(fd); | 106 | addr.sin_family = AF_INET; |
122 | return -1; | 107 | addr.sin_port = htons(port); |
123 | } | 108 | /* addr.sin_addr.s_addr = ip; - all-zeros is INADDR_ANY */ |
109 | xbind(fd, (struct sockaddr *)&addr, sizeof(addr)); | ||
124 | 110 | ||
125 | return fd; | 111 | return fd; |
126 | } | 112 | } |