static int urandom_fd = -1;
+static void sighandler(_unused int signal)
+{
+ uloop_end();
+}
+
+
int main()
{
openlog("odhcpd", LOG_PERROR | LOG_PID, LOG_DAEMON);
return 4;
signal(SIGUSR1, SIG_IGN);
+ signal(SIGINT, sighandler);
+ signal(SIGTERM, sighandler);
if (init_router())
return 4;
return ret;
}
+int odhcpd_get_preferred_interface_address(int ifindex, struct in6_addr *addr)
+{
+ struct odhcpd_ipaddr ipaddrs[8];
+ ssize_t ip_cnt = odhcpd_get_interface_addresses(ifindex, ipaddrs, ARRAY_SIZE(ipaddrs));
+ uint32_t preferred = 0;
+ int ret = 0;
+
+ for (ssize_t i = 0; i < ip_cnt; i++) {
+ struct odhcpd_ipaddr *ipaddr = &ipaddrs[i];
+
+ if (ipaddr->preferred > preferred || !preferred) {
+ preferred = ipaddr->preferred;
+ *addr = ipaddr->addr;
+ ret = 1;
+ }
+ }
+
+ return ret;
+}
struct interface* odhcpd_get_interface_by_index(int ifindex)
{
return uloop_fd_add(&event->uloop, ULOOP_READ);
}
+void odhcpd_process(struct odhcpd_event *event)
+{
+ odhcpd_receive_packets(&event->uloop, 0);
+}
+
void odhcpd_urandom(void *data, size_t len)
{
read(urandom_fd, data, len);