source: MondoRescue/branches/stable/mindi-busybox/networking/udhcp/dhcpc.c@ 1770

Last change on this file since 1770 was 1770, checked in by Bruno Cornec, 16 years ago
  • Better output for mindi-busybox revision
  • Remove dummy file created on NFS - report from Arnaud Tiger <arnaud.tiger_at_hp.com>
  • strace useful for debug
  • fix new versions for pb (2.0.0 for mindi and 1.7.2 for mindi-busybox)
  • fix build process for mindi-busybox + options used in that version (dd for label-partitions-as-necessary)
  • fix typo in label-partitions-as-necessary which doesn't seem to work
  • Update to busybox 1.7.2
  • perl is now required at restore time to support uuid swap partitions (and will be used for many other thigs

in the future for sure)

  • next mindi version will be 2.0.0 due to all the changes made in it (udev may break working distros)
  • small optimization in mindi on keyboard handling (one single find instead of multiple)
  • better interaction for USB device when launching mindi manually
  • attempt to automatically guess block disk size for ramdisk
  • fix typos in bkphw
  • Fix the remaining problem with UUID support for swap partitions
  • Updates mondoarchive man page for USB support
  • Adds preliminary Hardware support to mindi (Proliant SSSTK)
  • Tries to add udev support also for rhel4
  • Fix UUID support which was still broken.
  • Be conservative in test for the start-nfs script
  • Update config file for mindi-busybox for 1.7.2 migration
  • Try to run around a busybox bug (1.2.2 pb on inexistant links)
  • Add build content for mindi-busybox in pb
  • Remove distributions content for mindi-busybox
  • Fix a warning on inexistant raidtab
  • Solve problem on tmpfs in restore init (Problem of inexistant symlink and busybox)
  • Create MONDO_CACHE and use it everywhere + creation at start
  • Really never try to eject a USB device
  • Fix a issue with &> usage (replaced with 1> and 2>)
  • Adds magic file to depllist in order to have file working + ldd which helps for debugging issues
  • tty modes correct to avoid sh error messages
  • Use ext3 normally and not ext2 instead
  • USB device should be corrected after reading (take 1st part)
  • Adds a mount_USB_here function derived from mount_CDROM_here
  • usb detection place before /dev detection in device name at restore time
  • Fix when restoring from USB: media is asked in interactive mode
  • Adds USB support for mondorestore
  • mount_cdrom => mount_media
  • elilo.efi is now searched throughout /boot/efi and not in a fixed place as there is no standard
  • untar-and-softlink => untar (+ interface change)
  • suppress useless softlinks creation/removal in boot process
  • avoids udevd messages on groups
  • Increase # of disks to 99 as in mindi at restore time (should be a conf file parameter)
  • skip existing big file creation
  • seems to work correctly for USB mindi boot
  • Adds group and tty link to udev conf
  • Always load usb-torage (even 2.6) to initiate USB bus discovery
  • Better printing of messages
  • Attempt to fix a bug in supporting OpenSusE 10.3 kernel for initramfs (mindi may now use multiple regex for kernel initrd detection)
  • Links were not correctly done as non relative for modules in mindi
  • exclusion of modules denied now works
  • Also create modules in their ordinary place, so that classical modprobe works + copy modules.dep
  • Fix bugs for DENY_MODS handling
  • Add device /dev/console for udev
  • ide-generic should now really be excluded
  • Fix a bug in major number for tty
  • If udev then adds modprobe/insmod to rootfs
  • tty0 is also cretaed with udev
  • ide-generic put rather in DENY_MODS
  • udevd remove from deplist s handled in mindi directly
  • better default for mindi when using --usb
  • Handles dynamically linked busybox (in case we want to use it soon ;-)
  • Adds fixed devices to create for udev
  • ide-generic should not be part of the initrd when using libata v2
  • support a dynamically linked udev (case on Ubuntu 7.10 and Mandriva 2008.0 so should be quite generic) This will give incitation to move to dyn. linked binaries in the initrd which will help for other tasks (ia6 4)
  • Improvement in udev support (do not use cl options not available in busybox)
  • Udev in mindi
    • auto creation of the right links at boot time with udev-links.conf(from Mandriva 2008.0)
    • rework startup of udev as current makes kernel crash (from Mandriva 2008.0)
    • add support for 64 bits udev
  • Try to render MyInsmod silent at boot time
  • Adds udev support (mandatory for newest distributions to avoid remapping of devices in a different way as on the original system)
  • We also need vaft format support for USB boot
  • Adds libusual support (Ubuntu 7.10 needs it for USB)
  • Improve Ubuntu/Debian keyboard detection and support
  • pbinit adapted to new pb (0.8.10). Filtering of docs done in it
  • Suppress some mondo warnings and errors on USB again
  • Tries to fix lack of files in deb mindi package
  • Verify should now work for USB devices
  • More log/mesages improvement for USB support
  • - Supress g_erase_tmpdir_and_scratchdir
  • Improve some log messages for USB support
  • Try to improve install in mindi to avoid issues with isolinux.cfg not installed vene if in the pkg :-(
  • Improve mindi-busybox build
  • In conformity with pb 0.8.9
  • Add support for Ubuntu 7.10 in build process
  • Add USB Key button to Menu UI (CD streamer removed)
  • Attempt to fix error messages on tmp/scratch files at the end by removing those dir at the latest possible.
  • Fix a bug linked to the size of the -E param which could be used (Arnaud Tiger/René Ribaud).
  • Integrate ~/.pbrc content into mondorescue.pb (required project-builder >= 0.8.7)
  • Put mondorescue in conformity with new pb filtering rules
  • Add USB support at restore time (no test done yet). New start-usb script PB varibale added where useful
  • Unmounting USB device before removal of temporary scratchdir
  • Stil refining USB copy back to mondo (one command was not executed)
  • No need to have the image subdor in the csratchdir when USB.
  • umount the USB partition before attempting to use it
  • Remove useless copy from mindi to mondo at end of USB handling

(risky merge, we are raising the limits of 2 diverging branches. The status of stable is not completely sure as such. Will need lots of tests, but it's not yet done :-()
(merge -r1692:1769 $SVN_M/branches/2.2.5)

File size: 14.8 KB
Line 
1/* vi: set sw=4 ts=4: */
2/* dhcpc.c
3 *
4 * udhcp DHCP client
5 *
6 * Russ Dill <Russ.Dill@asu.edu> July 2001
7 *
8 * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
9 */
10
11#include <getopt.h>
12#include <syslog.h>
13
14/* Override ENABLE_FEATURE_PIDFILE - ifupdown needs our pidfile to always exist */
15#define WANT_PIDFILE 1
16#include "common.h"
17#include "dhcpd.h"
18#include "dhcpc.h"
19#include "options.h"
20
21
22/* Something is definitely wrong here. IPv4 addresses
23 * in variables of type long?? BTW, we use inet_ntoa()
24 * in the code. Manpage says that struct in_addr has a member of type long (!)
25 * which holds IPv4 address, and the struct is passed by value (!!)
26 */
27static unsigned timeout;
28static uint32_t requested_ip; /* = 0 */
29static uint32_t server_addr;
30static int packet_num; /* = 0 */
31static int sockfd = -1;
32
33#define LISTEN_NONE 0
34#define LISTEN_KERNEL 1
35#define LISTEN_RAW 2
36static smallint listen_mode;
37
38static smallint state;
39
40struct client_config_t client_config;
41
42
43/* just a little helper */
44static void change_mode(int new_mode)
45{
46 DEBUG("entering %s listen mode",
47 new_mode ? (new_mode == 1 ? "kernel" : "raw") : "none");
48 if (sockfd >= 0) {
49 close(sockfd);
50 sockfd = -1;
51 }
52 listen_mode = new_mode;
53}
54
55
56/* perform a renew */
57static void perform_renew(void)
58{
59 bb_info_msg("Performing a DHCP renew");
60 switch (state) {
61 case BOUND:
62 change_mode(LISTEN_KERNEL);
63 case RENEWING:
64 case REBINDING:
65 state = RENEW_REQUESTED;
66 break;
67 case RENEW_REQUESTED: /* impatient are we? fine, square 1 */
68 udhcp_run_script(NULL, "deconfig");
69 case REQUESTING:
70 case RELEASED:
71 change_mode(LISTEN_RAW);
72 state = INIT_SELECTING;
73 break;
74 case INIT_SELECTING:
75 break;
76 }
77
78 /* start things over */
79 packet_num = 0;
80
81 /* Kill any timeouts because the user wants this to hurry along */
82 timeout = 0;
83}
84
85
86/* perform a release */
87static void perform_release(void)
88{
89 char buffer[sizeof("255.255.255.255")];
90 struct in_addr temp_addr;
91
92 /* send release packet */
93 if (state == BOUND || state == RENEWING || state == REBINDING) {
94 temp_addr.s_addr = server_addr;
95 strcpy(buffer, inet_ntoa(temp_addr));
96 temp_addr.s_addr = requested_ip;
97 bb_info_msg("Unicasting a release of %s to %s",
98 inet_ntoa(temp_addr), buffer);
99 send_release(server_addr, requested_ip); /* unicast */
100 udhcp_run_script(NULL, "deconfig");
101 }
102 bb_info_msg("Entering released state");
103
104 change_mode(LISTEN_NONE);
105 state = RELEASED;
106 timeout = INT_MAX;
107}
108
109
110static void client_background(void)
111{
112#if !BB_MMU
113 bb_error_msg("cannot background in uclinux (yet)");
114/* ... mainly because udhcpc calls client_background()
115 * in _the _middle _of _udhcpc _run_, not at the start!
116 * If that will be properly disabled for NOMMU, client_background()
117 * will work on NOMMU too */
118#else
119 bb_daemonize(0);
120 logmode &= ~LOGMODE_STDIO;
121 /* rewrite pidfile, as our pid is different now */
122 write_pidfile(client_config.pidfile);
123#endif
124 /* Do not fork again. */
125 client_config.foreground = 1;
126 client_config.background_if_no_lease = 0;
127}
128
129
130static uint8_t* alloc_dhcp_option(int code, const char *str, int extra)
131{
132 uint8_t *storage;
133 int len = strlen(str);
134 if (len > 255) len = 255;
135 storage = xzalloc(len + extra + OPT_DATA);
136 storage[OPT_CODE] = code;
137 storage[OPT_LEN] = len + extra;
138 memcpy(storage + extra + OPT_DATA, str, len);
139 return storage;
140}
141
142
143int udhcpc_main(int argc, char **argv);
144int udhcpc_main(int argc, char **argv)
145{
146 uint8_t *temp, *message;
147 char *str_c, *str_V, *str_h, *str_F, *str_r, *str_T, *str_t;
148 uint32_t xid = 0;
149 uint32_t lease = 0; /* can be given as 32-bit quantity */
150 unsigned t1 = 0, t2 = 0; /* what a wonderful names */
151 unsigned start = 0;
152 unsigned now;
153 unsigned opt;
154 int max_fd;
155 int retval;
156 int len;
157 struct timeval tv;
158 struct in_addr temp_addr;
159 struct dhcpMessage packet;
160 fd_set rfds;
161
162 enum {
163 OPT_c = 1 << 0,
164 OPT_C = 1 << 1,
165 OPT_V = 1 << 2,
166 OPT_f = 1 << 3,
167 OPT_b = 1 << 4,
168 OPT_H = 1 << 5,
169 OPT_h = 1 << 6,
170 OPT_F = 1 << 7,
171 OPT_i = 1 << 8,
172 OPT_n = 1 << 9,
173 OPT_p = 1 << 10,
174 OPT_q = 1 << 11,
175 OPT_R = 1 << 12,
176 OPT_r = 1 << 13,
177 OPT_s = 1 << 14,
178 OPT_T = 1 << 15,
179 OPT_t = 1 << 16,
180 OPT_v = 1 << 17,
181 OPT_S = 1 << 18,
182 };
183#if ENABLE_GETOPT_LONG
184 static const char udhcpc_longopts[] ALIGN1 =
185 "clientid\0" Required_argument "c"
186 "clientid-none\0" No_argument "C"
187 "vendorclass\0" Required_argument "V"
188 "foreground\0" No_argument "f"
189 "background\0" No_argument "b"
190 "hostname\0" Required_argument "H"
191 "hostname\0" Required_argument "h"
192 "fqdn\0" Required_argument "F"
193 "interface\0" Required_argument "i"
194 "now\0" No_argument "n"
195 "pidfile\0" Required_argument "p"
196 "quit\0" No_argument "q"
197 "release\0" No_argument "R"
198 "request\0" Required_argument "r"
199 "script\0" Required_argument "s"
200 "timeout\0" Required_argument "T"
201 "version\0" No_argument "v"
202 "retries\0" Required_argument "t"
203 "syslog\0" No_argument "S"
204 ;
205#endif
206 /* Default options. */
207 client_config.interface = "eth0";
208 client_config.script = DEFAULT_SCRIPT;
209 client_config.retries = 3;
210 client_config.timeout = 3;
211
212 /* Parse command line */
213 opt_complementary = "c--C:C--c" // mutually exclusive
214 ":hH:Hh"; // -h and -H are the same
215#if ENABLE_GETOPT_LONG
216 applet_long_options = udhcpc_longopts;
217#endif
218 opt = getopt32(argv, "c:CV:fbH:h:F:i:np:qRr:s:T:t:vS",
219 &str_c, &str_V, &str_h, &str_h, &str_F,
220 &client_config.interface, &client_config.pidfile, &str_r,
221 &client_config.script, &str_T, &str_t
222 );
223
224 if (opt & OPT_c)
225 client_config.clientid = alloc_dhcp_option(DHCP_CLIENT_ID, str_c, 0);
226 //if (opt & OPT_C)
227 if (opt & OPT_V)
228 client_config.vendorclass = alloc_dhcp_option(DHCP_VENDOR, str_V, 0);
229 if (opt & OPT_f)
230 client_config.foreground = 1;
231 if (opt & OPT_b)
232 client_config.background_if_no_lease = 1;
233 if (opt & OPT_h)
234 client_config.hostname = alloc_dhcp_option(DHCP_HOST_NAME, str_h, 0);
235 if (opt & OPT_F) {
236 client_config.fqdn = alloc_dhcp_option(DHCP_FQDN, str_F, 3);
237 /* Flags: 0000NEOS
238 S: 1 => Client requests Server to update A RR in DNS as well as PTR
239 O: 1 => Server indicates to client that DNS has been updated regardless
240 E: 1 => Name data is DNS format, i.e. <4>host<6>domain<4>com<0> not "host.domain.com"
241 N: 1 => Client requests Server to not update DNS
242 */
243 client_config.fqdn[OPT_DATA + 0] = 0x1;
244 /* client_config.fqdn[OPT_DATA + 1] = 0; - redundant */
245 /* client_config.fqdn[OPT_DATA + 2] = 0; - redundant */
246 }
247 // if (opt & OPT_i) client_config.interface = ...
248 if (opt & OPT_n)
249 client_config.abort_if_no_lease = 1;
250 // if (opt & OPT_p) client_config.pidfile = ...
251 if (opt & OPT_q)
252 client_config.quit_after_lease = 1;
253 if (opt & OPT_R)
254 client_config.release_on_quit = 1;
255 if (opt & OPT_r)
256 requested_ip = inet_addr(str_r);
257 // if (opt & OPT_s) client_config.script = ...
258 if (opt & OPT_T)
259 client_config.timeout = xatoi_u(str_T);
260 if (opt & OPT_t)
261 client_config.retries = xatoi_u(str_t);
262 if (opt & OPT_v) {
263 printf("version %s\n", BB_VER);
264 return 0;
265 }
266
267 if (opt & OPT_S) {
268 openlog(applet_name, LOG_PID, LOG_LOCAL0);
269 logmode |= LOGMODE_SYSLOG;
270 }
271
272 if (read_interface(client_config.interface, &client_config.ifindex,
273 NULL, client_config.arp))
274 return 1;
275
276 /* Make sure fd 0,1,2 are open */
277 bb_sanitize_stdio();
278 /* Equivalent of doing a fflush after every \n */
279 setlinebuf(stdout);
280
281 /* Create pidfile */
282 write_pidfile(client_config.pidfile);
283 /* if (!..) bb_perror_msg("cannot create pidfile %s", pidfile); */
284
285 /* Goes to stdout and possibly syslog */
286 bb_info_msg("%s (v%s) started", applet_name, BB_VER);
287
288 /* if not set, and not suppressed, setup the default client ID */
289 if (!client_config.clientid && !(opt & OPT_C)) {
290 client_config.clientid = alloc_dhcp_option(DHCP_CLIENT_ID, "", 7);
291 client_config.clientid[OPT_DATA] = 1;
292 memcpy(client_config.clientid + OPT_DATA+1, client_config.arp, 6);
293 }
294
295 if (!client_config.vendorclass)
296 client_config.vendorclass = alloc_dhcp_option(DHCP_VENDOR, "udhcp "BB_VER, 0);
297
298 /* setup the signal pipe */
299 udhcp_sp_setup();
300
301 state = INIT_SELECTING;
302 udhcp_run_script(NULL, "deconfig");
303 change_mode(LISTEN_RAW);
304 tv.tv_sec = 0;
305 goto jump_in;
306
307 for (;;) {
308 tv.tv_sec = timeout - monotonic_sec();
309 jump_in:
310 tv.tv_usec = 0;
311
312 if (listen_mode != LISTEN_NONE && sockfd < 0) {
313 if (listen_mode == LISTEN_KERNEL)
314 sockfd = listen_socket(/*INADDR_ANY,*/ CLIENT_PORT, client_config.interface);
315 else
316 sockfd = raw_socket(client_config.ifindex);
317 }
318 max_fd = udhcp_sp_fd_set(&rfds, sockfd);
319
320 retval = 0; /* If we already timed out, fall through, else... */
321 if (tv.tv_sec > 0) {
322 DEBUG("Waiting on select...");
323 retval = select(max_fd + 1, &rfds, NULL, NULL, &tv);
324 }
325
326 now = monotonic_sec();
327 if (retval < 0) {
328 /* EINTR? signal was caught, don't panic */
329 if (errno != EINTR) {
330 /* Else: an error occured, panic! */
331 bb_perror_msg_and_die("select");
332 }
333 } else if (retval == 0) {
334 /* timeout dropped to zero */
335 switch (state) {
336 case INIT_SELECTING:
337 if (packet_num < client_config.retries) {
338 if (packet_num == 0)
339 xid = random_xid();
340
341 /* send discover packet */
342 send_discover(xid, requested_ip); /* broadcast */
343
344 timeout = now + client_config.timeout;
345 packet_num++;
346 } else {
347 udhcp_run_script(NULL, "leasefail");
348 if (client_config.background_if_no_lease) {
349 bb_info_msg("No lease, forking to background");
350 client_background();
351 } else if (client_config.abort_if_no_lease) {
352 bb_info_msg("No lease, failing");
353 retval = 1;
354 goto ret;
355 }
356 /* wait to try again */
357 packet_num = 0;
358 timeout = now + 60;
359 }
360 break;
361 case RENEW_REQUESTED:
362 case REQUESTING:
363 if (packet_num < client_config.retries) {
364 /* send request packet */
365 if (state == RENEW_REQUESTED)
366 send_renew(xid, server_addr, requested_ip); /* unicast */
367 else send_selecting(xid, server_addr, requested_ip); /* broadcast */
368
369 timeout = now + ((packet_num == 2) ? 10 : 2);
370 packet_num++;
371 } else {
372 /* timed out, go back to init state */
373 if (state == RENEW_REQUESTED)
374 udhcp_run_script(NULL, "deconfig");
375 state = INIT_SELECTING;
376 timeout = now;
377 packet_num = 0;
378 change_mode(LISTEN_RAW);
379 }
380 break;
381 case BOUND:
382 /* Lease is starting to run out, time to enter renewing state */
383 state = RENEWING;
384 change_mode(LISTEN_KERNEL);
385 DEBUG("Entering renew state");
386 /* fall right through */
387 case RENEWING:
388 /* Either set a new T1, or enter REBINDING state */
389 if ((t2 - t1) <= (lease / 14400 + 1)) {
390 /* timed out, enter rebinding state */
391 state = REBINDING;
392 timeout = now + (t2 - t1);
393 DEBUG("Entering rebinding state");
394 } else {
395 /* send a request packet */
396 send_renew(xid, server_addr, requested_ip); /* unicast */
397 t1 = (t2 - t1) / 2 + t1;
398 timeout = start + t1;
399 }
400 break;
401 case REBINDING:
402 /* Either set a new T2, or enter INIT state */
403 if ((lease - t2) <= (lease / 14400 + 1)) {
404 /* timed out, enter init state */
405 state = INIT_SELECTING;
406 bb_info_msg("Lease lost, entering init state");
407 udhcp_run_script(NULL, "deconfig");
408 timeout = now;
409 packet_num = 0;
410 change_mode(LISTEN_RAW);
411 } else {
412 /* send a request packet */
413 send_renew(xid, 0, requested_ip); /* broadcast */
414 t2 = (lease - t2) / 2 + t2;
415 timeout = start + t2;
416 }
417 break;
418 case RELEASED:
419 /* yah, I know, *you* say it would never happen */
420 timeout = INT_MAX;
421 break;
422 }
423 } else if (listen_mode != LISTEN_NONE && FD_ISSET(sockfd, &rfds)) {
424 /* a packet is ready, read it */
425
426 if (listen_mode == LISTEN_KERNEL)
427 len = udhcp_get_packet(&packet, sockfd);
428 else len = get_raw_packet(&packet, sockfd);
429
430 if (len == -1 && errno != EINTR) {
431 DEBUG("error on read, %s, reopening socket", strerror(errno));
432 change_mode(listen_mode); /* just close and reopen */
433 }
434 if (len < 0) continue;
435
436 if (packet.xid != xid) {
437 DEBUG("Ignoring XID %x (our xid is %x)",
438 (unsigned)packet.xid, (unsigned)xid);
439 continue;
440 }
441
442 /* Ignore packets that aren't for us */
443 if (memcmp(packet.chaddr, client_config.arp, 6)) {
444 DEBUG("Packet does not have our chaddr - ignoring");
445 continue;
446 }
447
448 message = get_option(&packet, DHCP_MESSAGE_TYPE);
449 if (message == NULL) {
450 bb_error_msg("cannot get option from packet - ignoring");
451 continue;
452 }
453
454 switch (state) {
455 case INIT_SELECTING:
456 /* Must be a DHCPOFFER to one of our xid's */
457 if (*message == DHCPOFFER) {
458 temp = get_option(&packet, DHCP_SERVER_ID);
459 if (temp) {
460 /* can be misaligned, thus memcpy */
461 memcpy(&server_addr, temp, 4);
462 xid = packet.xid;
463 requested_ip = packet.yiaddr;
464
465 /* enter requesting state */
466 state = REQUESTING;
467 timeout = now;
468 packet_num = 0;
469 } else {
470 bb_error_msg("no server ID in message");
471 }
472 }
473 break;
474 case RENEW_REQUESTED:
475 case REQUESTING:
476 case RENEWING:
477 case REBINDING:
478 if (*message == DHCPACK) {
479 temp = get_option(&packet, DHCP_LEASE_TIME);
480 if (!temp) {
481 bb_error_msg("no lease time with ACK, using 1 hour lease");
482 lease = 60 * 60;
483 } else {
484 /* can be misaligned, thus memcpy */
485 memcpy(&lease, temp, 4);
486 lease = ntohl(lease);
487 }
488
489 /* enter bound state */
490 t1 = lease / 2;
491
492 /* little fixed point for n * .875 */
493 t2 = (lease * 7) >> 3;
494 temp_addr.s_addr = packet.yiaddr;
495 bb_info_msg("Lease of %s obtained, lease time %u",
496 inet_ntoa(temp_addr), (unsigned)lease);
497 start = now;
498 timeout = start + t1;
499 requested_ip = packet.yiaddr;
500 udhcp_run_script(&packet,
501 ((state == RENEWING || state == REBINDING) ? "renew" : "bound"));
502
503 state = BOUND;
504 change_mode(LISTEN_NONE);
505 if (client_config.quit_after_lease) {
506 if (client_config.release_on_quit)
507 perform_release();
508 goto ret0;
509 }
510 if (!client_config.foreground)
511 client_background();
512
513 } else if (*message == DHCPNAK) {
514 /* return to init state */
515 bb_info_msg("Received DHCP NAK");
516 udhcp_run_script(&packet, "nak");
517 if (state != REQUESTING)
518 udhcp_run_script(NULL, "deconfig");
519 state = INIT_SELECTING;
520 timeout = now;
521 requested_ip = 0;
522 packet_num = 0;
523 change_mode(LISTEN_RAW);
524 sleep(3); /* avoid excessive network traffic */
525 }
526 break;
527 /* case BOUND, RELEASED: - ignore all packets */
528 }
529 } else {
530 int signo = udhcp_sp_read(&rfds);
531 switch (signo) {
532 case SIGUSR1:
533 perform_renew();
534 break;
535 case SIGUSR2:
536 perform_release();
537 break;
538 case SIGTERM:
539 bb_info_msg("Received SIGTERM");
540 if (client_config.release_on_quit)
541 perform_release();
542 goto ret0;
543 }
544 }
545 } /* for (;;) */
546 ret0:
547 retval = 0;
548 ret:
549 /*if (client_config.pidfile) - remove_pidfile has it's own check */
550 remove_pidfile(client_config.pidfile);
551 return retval;
552}
Note: See TracBrowser for help on using the repository browser.