X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fodhcpd.git;a=blobdiff_plain;f=src%2Fodhcpd.c;h=74830ac8d9d9fb69bf2bd4e86b4baf2cab21f49f;hp=9c7f27c4f4ac43b206e8030a05fae44ddba27e2b;hb=32b977a5336612a5c01f7426c4d165685fa8aca0;hpb=5b12eeba475a3301c362cf59f138ec7aa60d2dd9 diff --git a/src/odhcpd.c b/src/odhcpd.c index 9c7f27c..74830ac 100644 --- a/src/odhcpd.c +++ b/src/odhcpd.c @@ -367,6 +367,15 @@ static void odhcpd_receive_packets(struct uloop_fd *u, _unused unsigned int even struct sockaddr_nl nl; } addr; + if (u->error) { + int ret = -1; + socklen_t ret_len = sizeof(ret); + getsockopt(u->fd, SOL_SOCKET, SO_ERROR, &ret, &ret_len); + u->error = false; + if (e->handle_error) + e->handle_error(ret); + } + while (true) { struct iovec iov = {data_buf, sizeof(data_buf)}; struct msghdr msg = { @@ -446,7 +455,8 @@ static void odhcpd_receive_packets(struct uloop_fd *u, _unused unsigned int even int odhcpd_register(struct odhcpd_event *event) { event->uloop.cb = odhcpd_receive_packets; - return uloop_fd_add(&event->uloop, ULOOP_READ); + return uloop_fd_add(&event->uloop, ULOOP_READ | + ((event->handle_error) ? ULOOP_ERROR_CB : 0)); } void odhcpd_process(struct odhcpd_event *event)