diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-09-30 17:54:10 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-09-30 17:54:10 +0000 |
commit | d7b3350eb3eb8d906702db2d845196bab8c98e6e (patch) | |
tree | 2de2a3ed60a74012dbdeeebfbb7b71dad91b89c5 | |
parent | 5fb09656cadbec6a3bf609d95c7cccd7fc5c00a5 (diff) | |
download | busybox-w32-d7b3350eb3eb8d906702db2d845196bab8c98e6e.tar.gz busybox-w32-d7b3350eb3eb8d906702db2d845196bab8c98e6e.tar.bz2 busybox-w32-d7b3350eb3eb8d906702db2d845196bab8c98e6e.zip |
dhcpreplay: code shrink, -40 bytes
-rw-r--r-- | networking/udhcp/dhcprelay.c | 60 |
1 files changed, 29 insertions, 31 deletions
diff --git a/networking/udhcp/dhcprelay.c b/networking/udhcp/dhcprelay.c index 08dc23f23..91fcb151b 100644 --- a/networking/udhcp/dhcprelay.c +++ b/networking/udhcp/dhcprelay.c | |||
@@ -11,17 +11,15 @@ | |||
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include "common.h" | 13 | #include "common.h" |
14 | #include "dhcpd.h" | ||
15 | #include "options.h" | 14 | #include "options.h" |
16 | 15 | ||
17 | /* constants */ | 16 | /* constants */ |
18 | #define SELECT_TIMEOUT 5 /* select timeout in sec. */ | 17 | #define SELECT_TIMEOUT 5 /* select timeout in sec. */ |
19 | #define MAX_LIFETIME 2*60 /* lifetime of an xid entry in sec. */ | 18 | #define MAX_LIFETIME 2*60 /* lifetime of an xid entry in sec. */ |
20 | #define MAX_INTERFACES 9 | ||
21 | 19 | ||
22 | /* This list holds information about clients. The xid_* functions manipulate this list. */ | 20 | /* This list holds information about clients. The xid_* functions manipulate this list. */ |
23 | struct xid_item { | 21 | struct xid_item { |
24 | time_t timestamp; | 22 | unsigned timestamp; |
25 | int client; | 23 | int client; |
26 | uint32_t xid; | 24 | uint32_t xid; |
27 | struct sockaddr_in ip; | 25 | struct sockaddr_in ip; |
@@ -41,7 +39,7 @@ static struct xid_item *xid_add(uint32_t xid, struct sockaddr_in *ip, int client | |||
41 | item->ip = *ip; | 39 | item->ip = *ip; |
42 | item->xid = xid; | 40 | item->xid = xid; |
43 | item->client = client; | 41 | item->client = client; |
44 | item->timestamp = time(NULL); | 42 | item->timestamp = monotonic_sec(); |
45 | item->next = dhcprelay_xid_list.next; | 43 | item->next = dhcprelay_xid_list.next; |
46 | dhcprelay_xid_list.next = item; | 44 | dhcprelay_xid_list.next = item; |
47 | 45 | ||
@@ -52,7 +50,7 @@ static void xid_expire(void) | |||
52 | { | 50 | { |
53 | struct xid_item *item = dhcprelay_xid_list.next; | 51 | struct xid_item *item = dhcprelay_xid_list.next; |
54 | struct xid_item *last = &dhcprelay_xid_list; | 52 | struct xid_item *last = &dhcprelay_xid_list; |
55 | time_t current_time = time(NULL); | 53 | unsigned current_time = monotonic_sec(); |
56 | 54 | ||
57 | while (item != NULL) { | 55 | while (item != NULL) { |
58 | if ((current_time - item->timestamp) > MAX_LIFETIME) { | 56 | if ((current_time - item->timestamp) > MAX_LIFETIME) { |
@@ -120,31 +118,32 @@ static int get_dhcp_packet_type(struct dhcpMessage *p) | |||
120 | */ | 118 | */ |
121 | static char **get_client_devices(char *dev_list, int *client_number) | 119 | static char **get_client_devices(char *dev_list, int *client_number) |
122 | { | 120 | { |
123 | char *s, *list, **client_dev; | 121 | char *s, **client_dev; |
124 | int i, cn; | 122 | int i, cn; |
125 | 123 | ||
126 | /* copy list */ | 124 | /* copy list */ |
127 | list = xstrdup(dev_list); | 125 | dev_list = xstrdup(dev_list); |
128 | if (list == NULL) return NULL; | 126 | |
129 | 127 | /* get number of items, replace ',' with NULs */ | |
130 | /* get number of items */ | 128 | s = dev_list; |
131 | for (s = dev_list, cn = 1; *s; s++) | 129 | cn = 1; |
132 | if (*s == ',') | 130 | while (*s) { |
131 | if (*s == ',') { | ||
132 | *s = '\0'; | ||
133 | cn++; | 133 | cn++; |
134 | } | ||
135 | s++; | ||
136 | } | ||
137 | *client_number = cn; | ||
134 | 138 | ||
139 | /* create vector of pointers */ | ||
135 | client_dev = xzalloc(cn * sizeof(*client_dev)); | 140 | client_dev = xzalloc(cn * sizeof(*client_dev)); |
136 | 141 | client_dev[0] = dev_list; | |
137 | /* parse list */ | 142 | i = 1; |
138 | s = strtok(list, ","); | 143 | while (i != cn) { |
139 | i = 0; | 144 | client_dev[i] = client_dev[i - 1] + strlen(client_dev[i - 1]) + 1; |
140 | while (s != NULL) { | 145 | i++; |
141 | client_dev[i++] = xstrdup(s); | ||
142 | s = strtok(NULL, ","); | ||
143 | } | 146 | } |
144 | |||
145 | /* free copy and exit */ | ||
146 | free(list); | ||
147 | *client_number = cn; | ||
148 | return client_dev; | 147 | return client_dev; |
149 | } | 148 | } |
150 | 149 | ||
@@ -161,7 +160,7 @@ static int init_sockets(char **client, int num_clients, | |||
161 | 160 | ||
162 | for (i = 1; i < num_clients; i++) { | 161 | for (i = 1; i < num_clients; i++) { |
163 | /* listen for clients on bootps */ | 162 | /* listen for clients on bootps */ |
164 | fds[i] = listen_socket(/*NADDR_ANY,*/ 67, client[i-1]); | 163 | fds[i] = listen_socket(/*INADDR_ANY,*/ 67, client[i-1]); |
165 | if (fds[i] > n) | 164 | if (fds[i] > n) |
166 | n = fds[i]; | 165 | n = fds[i]; |
167 | } | 166 | } |
@@ -224,8 +223,6 @@ static void pass_back(struct dhcpMessage *p, int packet_len, int *fds) | |||
224 | 223 | ||
225 | if (item->ip.sin_addr.s_addr == htonl(INADDR_ANY)) | 224 | if (item->ip.sin_addr.s_addr == htonl(INADDR_ANY)) |
226 | item->ip.sin_addr.s_addr = htonl(INADDR_BROADCAST); | 225 | item->ip.sin_addr.s_addr = htonl(INADDR_BROADCAST); |
227 | if (item->client > MAX_INTERFACES) | ||
228 | return; | ||
229 | res = sendto(fds[item->client], p, packet_len, 0, (struct sockaddr*)(&item->ip), | 226 | res = sendto(fds[item->client], p, packet_len, 0, (struct sockaddr*)(&item->ip), |
230 | sizeof(item->ip)); | 227 | sizeof(item->ip)); |
231 | if (res != packet_len) { | 228 | if (res != packet_len) { |
@@ -285,7 +282,8 @@ static void dhcprelay_loop(int *fds, int num_sockets, int max_socket, char **cli | |||
285 | int dhcprelay_main(int argc, char **argv); | 282 | int dhcprelay_main(int argc, char **argv); |
286 | int dhcprelay_main(int argc, char **argv) | 283 | int dhcprelay_main(int argc, char **argv) |
287 | { | 284 | { |
288 | int num_sockets, max_socket, fds[MAX_INTERFACES]; | 285 | int num_sockets, max_socket; |
286 | int *fds; | ||
289 | uint32_t gw_ip; | 287 | uint32_t gw_ip; |
290 | char **clients; | 288 | char **clients; |
291 | struct sockaddr_in server_addr; | 289 | struct sockaddr_in server_addr; |
@@ -300,10 +298,10 @@ int dhcprelay_main(int argc, char **argv) | |||
300 | } else { | 298 | } else { |
301 | bb_show_usage(); | 299 | bb_show_usage(); |
302 | } | 300 | } |
303 | clients = get_client_devices(argv[1], &num_sockets); | ||
304 | if (!clients) return 0; | ||
305 | 301 | ||
302 | clients = get_client_devices(argv[1], &num_sockets); | ||
306 | num_sockets++; /* for server socket at fds[0] */ | 303 | num_sockets++; /* for server socket at fds[0] */ |
304 | fds = xmalloc(num_sockets * sizeof(fds[0])); | ||
307 | max_socket = init_sockets(clients, num_sockets, argv[2], fds); | 305 | max_socket = init_sockets(clients, num_sockets, argv[2], fds); |
308 | 306 | ||
309 | if (read_interface(argv[2], NULL, &gw_ip, NULL)) | 307 | if (read_interface(argv[2], NULL, &gw_ip, NULL)) |