aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/dhcprelay.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-09-28 10:29:17 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-09-28 10:29:17 +0000
commitb9256054419582dc35917b1cb39c7e09f489dfad (patch)
tree2ce3a816b788b3af5fa54109b765ee22d5550c5e /networking/udhcp/dhcprelay.c
parentc3122bca53255799f052fcc0e911b68237faa12d (diff)
downloadbusybox-w32-b9256054419582dc35917b1cb39c7e09f489dfad.tar.gz
busybox-w32-b9256054419582dc35917b1cb39c7e09f489dfad.tar.bz2
busybox-w32-b9256054419582dc35917b1cb39c7e09f489dfad.zip
assorted static vars removal
function old new delta tcpudpsvd_main 1829 1839 +10 update_status 567 569 +2 sigterm 1 - -1 ......... dhcprelay_signal_handler 8 - -8 nfs_strerror 60 49 -11 singlemount 4579 4564 -15 static.p 16 - -16 svstatus 20 - -20 dhcprelay_xid_list 32 - -32 runsv_main 1785 1746 -39 static.buf 74 28 -46 svd 56 - -56 dhcprelay_main 1141 1080 -61 ------------------------------------------------------------------------------ (add/remove: 0/20 grow/shrink: 2/10 up/down: 12/-386) Total: -374 bytes
Diffstat (limited to 'networking/udhcp/dhcprelay.c')
-rw-r--r--networking/udhcp/dhcprelay.c63
1 files changed, 20 insertions, 43 deletions
diff --git a/networking/udhcp/dhcprelay.c b/networking/udhcp/dhcprelay.c
index 3e1758d5c..08dc23f23 100644
--- a/networking/udhcp/dhcprelay.c
+++ b/networking/udhcp/dhcprelay.c
@@ -19,16 +19,16 @@
19#define MAX_LIFETIME 2*60 /* lifetime of an xid entry in sec. */ 19#define MAX_LIFETIME 2*60 /* lifetime of an xid entry in sec. */
20#define MAX_INTERFACES 9 20#define MAX_INTERFACES 9
21 21
22
23/* This list holds information about clients. The xid_* functions manipulate this list. */ 22/* This list holds information about clients. The xid_* functions manipulate this list. */
24static struct xid_item { 23struct xid_item {
24 time_t timestamp;
25 int client;
25 uint32_t xid; 26 uint32_t xid;
26 struct sockaddr_in ip; 27 struct sockaddr_in ip;
27 int client;
28 time_t timestamp;
29 struct xid_item *next; 28 struct xid_item *next;
30} dhcprelay_xid_list = {0, {0}, 0, 0, NULL}; 29};
31 30
31#define dhcprelay_xid_list (*(struct xid_item*)&bb_common_bufsiz1)
32 32
33static struct xid_item *xid_add(uint32_t xid, struct sockaddr_in *ip, int client) 33static struct xid_item *xid_add(uint32_t xid, struct sockaddr_in *ip, int client)
34{ 34{
@@ -114,17 +114,6 @@ static int get_dhcp_packet_type(struct dhcpMessage *p)
114} 114}
115 115
116/** 116/**
117 * signal_handler - handles signals ;-)
118 * sig - sent signal
119 */
120static smallint dhcprelay_stopflag;
121
122static void dhcprelay_signal_handler(int sig)
123{
124 dhcprelay_stopflag = 1;
125}
126
127/**
128 * get_client_devices - parses the devices list 117 * get_client_devices - parses the devices list
129 * dev_list - comma separated list of devices 118 * dev_list - comma separated list of devices
130 * returns array 119 * returns array
@@ -160,27 +149,23 @@ static char **get_client_devices(char *dev_list, int *client_number)
160} 149}
161 150
162 151
163/* Creates listen sockets (in fds) and returns the number allocated. */ 152/* Creates listen sockets (in fds) and returns numerically max fd. */
164static int init_sockets(char **client, int num_clients, 153static int init_sockets(char **client, int num_clients,
165 char *server, int *fds, int *max_socket) 154 char *server, int *fds)
166{ 155{
167 int i; 156 int i, n;
168 157
169 /* talk to real server on bootps */ 158 /* talk to real server on bootps */
170 fds[0] = listen_socket(/*INADDR_ANY,*/ 67, server); 159 fds[0] = listen_socket(/*INADDR_ANY,*/ 67, server);
171 *max_socket = fds[0]; 160 n = fds[0];
172
173 /* array starts at 1 since server is 0 */
174 num_clients++;
175 161
176 for (i = 1; i < num_clients; i++) { 162 for (i = 1; i < num_clients; i++) {
177 /* listen for clients on bootps */ 163 /* listen for clients on bootps */
178 fds[i] = listen_socket(/*NADDR_ANY,*/ 67, client[i-1]); 164 fds[i] = listen_socket(/*NADDR_ANY,*/ 67, client[i-1]);
179 if (fds[i] > *max_socket) 165 if (fds[i] > n)
180 *max_socket = fds[i]; 166 n = fds[i];
181 } 167 }
182 168 return n;
183 return i;
184} 169}
185 170
186 171
@@ -253,6 +238,8 @@ static void pass_back(struct dhcpMessage *p, int packet_len, int *fds)
253} 238}
254 239
255static void dhcprelay_loop(int *fds, int num_sockets, int max_socket, char **clients, 240static void dhcprelay_loop(int *fds, int num_sockets, int max_socket, char **clients,
241 struct sockaddr_in *server_addr, uint32_t gw_ip) ATTRIBUTE_NORETURN;
242static void dhcprelay_loop(int *fds, int num_sockets, int max_socket, char **clients,
256 struct sockaddr_in *server_addr, uint32_t gw_ip) 243 struct sockaddr_in *server_addr, uint32_t gw_ip)
257{ 244{
258 struct dhcpMessage dhcp_msg; 245 struct dhcpMessage dhcp_msg;
@@ -263,7 +250,7 @@ static void dhcprelay_loop(int *fds, int num_sockets, int max_socket, char **cli
263 struct timeval tv; 250 struct timeval tv;
264 int i; 251 int i;
265 252
266 while (!dhcprelay_stopflag) { 253 while (1) {
267 FD_ZERO(&rfds); 254 FD_ZERO(&rfds);
268 for (i = 0; i < num_sockets; i++) 255 for (i = 0; i < num_sockets; i++)
269 FD_SET(fds[i], &rfds); 256 FD_SET(fds[i], &rfds);
@@ -298,7 +285,7 @@ static void dhcprelay_loop(int *fds, int num_sockets, int max_socket, char **cli
298int dhcprelay_main(int argc, char **argv); 285int dhcprelay_main(int argc, char **argv);
299int dhcprelay_main(int argc, char **argv) 286int dhcprelay_main(int argc, char **argv)
300{ 287{
301 int i, num_sockets, max_socket, fds[MAX_INTERFACES]; 288 int num_sockets, max_socket, fds[MAX_INTERFACES];
302 uint32_t gw_ip; 289 uint32_t gw_ip;
303 char **clients; 290 char **clients;
304 struct sockaddr_in server_addr; 291 struct sockaddr_in server_addr;
@@ -316,23 +303,13 @@ int dhcprelay_main(int argc, char **argv)
316 clients = get_client_devices(argv[1], &num_sockets); 303 clients = get_client_devices(argv[1], &num_sockets);
317 if (!clients) return 0; 304 if (!clients) return 0;
318 305
319 signal(SIGTERM, dhcprelay_signal_handler); 306 num_sockets++; /* for server socket at fds[0] */
320 signal(SIGQUIT, dhcprelay_signal_handler); 307 max_socket = init_sockets(clients, num_sockets, argv[2], fds);
321 signal(SIGINT, dhcprelay_signal_handler);
322
323 num_sockets = init_sockets(clients, num_sockets, argv[2], fds, &max_socket);
324 308
325 if (read_interface(argv[2], NULL, &gw_ip, NULL)) 309 if (read_interface(argv[2], NULL, &gw_ip, NULL))
326 return 1; 310 return 1;
327 311
312 /* doesn't return */
328 dhcprelay_loop(fds, num_sockets, max_socket, clients, &server_addr, gw_ip); 313 dhcprelay_loop(fds, num_sockets, max_socket, clients, &server_addr, gw_ip);
329 314 /* return 0; - not reached */
330 if (ENABLE_FEATURE_CLEAN_UP) {
331 for (i = 0; i < num_sockets; i++) {
332 close(fds[i]);
333 free(clients[i]);
334 }
335 }
336
337 return 0;
338} 315}