#include "dhcpv6-pxe.h"
static struct blob_buf b;
-static int reload_pipe[2] = { -1, -1 };
static int lease_cfg_cmp(const void *k1, const void *k2, void *ptr);
static void lease_cfg_update(struct vlist_tree *tree, struct vlist_node *node_new,
uci_free_context(uci);
}
-static void handle_signal(int signal)
+static void signal_reload(_o_unused struct uloop_signal *signal)
{
- char b[1] = {0};
-
- if (signal == SIGHUP) {
- if (write(reload_pipe[1], b, sizeof(b)) < 0) {}
- } else
- uloop_end();
-}
-
-static void reload_cb(struct uloop_fd *u, _o_unused unsigned int events)
-{
- char b[512];
- if (read(u->fd, b, sizeof(b)) < 0) {}
-
odhcpd_reload();
}
-static struct uloop_fd reload_fd = { .fd = -1, .cb = reload_cb };
-
-void odhcpd_run(void)
+int odhcpd_run(void)
{
- if (pipe2(reload_pipe, O_NONBLOCK | O_CLOEXEC) < 0) {}
+ static struct uloop_signal sighup = { .signo = SIGHUP, .cb = signal_reload };
- reload_fd.fd = reload_pipe[0];
- uloop_fd_add(&reload_fd, ULOOP_READ);
-
- signal(SIGTERM, handle_signal);
- signal(SIGINT, handle_signal);
- signal(SIGHUP, handle_signal);
-
- while (ubus_init())
+ while (ubus_init()) {
+ if (uloop_cancelled)
+ return EXIT_FAILURE;
sleep(1);
+ }
odhcpd_reload();
+
+ /* uloop_init() already handles SIGINT/SIGTERM */
+ if (uloop_signal_add(&sighup) < 0)
+ return EXIT_FAILURE;
+
uloop_run();
+
+ return EXIT_SUCCESS;
}
va_end(ap);
}
-static void sighandler(_o_unused int signal)
-{
- uloop_end();
-}
-
static void print_usage(const char *app)
{
printf("== %s Usage ==\n"
}
}
+ if (getuid() != 0) {
+ error("Must be run as root!");
+ return 2;
+ }
+
if (config.log_syslog) {
openlog("odhcpd", LOG_PERROR | LOG_PID, LOG_DAEMON);
setlogmask(LOG_UPTO(config.log_level));
uloop_init();
- if (getuid() != 0) {
- error("Must be run as root!");
- return 2;
- }
-
ioctl_sock = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
if (ioctl_sock < 0)
return 4;
- signal(SIGUSR1, SIG_IGN);
- signal(SIGINT, sighandler);
- signal(SIGTERM, sighandler);
-
if (netlink_init())
return 4;
return 4;
#endif
- odhcpd_run();
- return 0;
+ return odhcpd_run();
}
struct interface* odhcpd_get_interface_by_index(int ifindex);
void odhcpd_urandom(void *data, size_t len);
-void odhcpd_run(void);
+int odhcpd_run(void);
time_t odhcpd_time(void);
ssize_t odhcpd_unhexlify(uint8_t *dst, size_t len, const char *src);
void odhcpd_hexlify(char *dst, const uint8_t *src, size_t len);