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)) |
