From: David Härdeman Date: Fri, 17 Oct 2025 11:54:50 +0000 (+0200) Subject: dhcvp4: use tmp fd in dhcpv4_setup_interface() X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;h=24f0135006910abf619831b2b7a881895e6d15ff;p=project%2Fodhcpd.git dhcvp4: use tmp fd in dhcpv4_setup_interface() This makes the code a little bit easier to read. Signed-off-by: David Härdeman Link: https://github.com/openwrt/odhcpd/pull/318 Signed-off-by: Álvaro Fernández Rojas --- diff --git a/src/dhcpv4.c b/src/dhcpv4.c index 3f41188..c31d521 100644 --- a/src/dhcpv4.c +++ b/src/dhcpv4.c @@ -1444,6 +1444,7 @@ int dhcpv4_setup_interface(struct interface *iface, bool enable) .sin_addr = { INADDR_ANY }, }; int val = 1; + int fd; if (iface->dhcpv4_event.uloop.fd >= 0) { uloop_fd_delete(&iface->dhcpv4_event.uloop); @@ -1459,60 +1460,54 @@ int dhcpv4_setup_interface(struct interface *iface, bool enable) return 0; } - iface->dhcpv4_event.uloop.fd = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_UDP); - if (iface->dhcpv4_event.uloop.fd < 0) { + fd = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_UDP); + if (fd < 0) { error("socket(AF_INET): %m"); ret = -1; goto out; } /* Basic IPv4 configuration */ - if (setsockopt(iface->dhcpv4_event.uloop.fd, SOL_SOCKET, SO_REUSEADDR, - &val, sizeof(val)) < 0) { + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) < 0) { error("setsockopt(SO_REUSEADDR): %m"); ret = -1; goto out; } - if (setsockopt(iface->dhcpv4_event.uloop.fd, SOL_SOCKET, SO_BROADCAST, - &val, sizeof(val)) < 0) { + if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val)) < 0) { error("setsockopt(SO_BROADCAST): %m"); ret = -1; goto out; } - if (setsockopt(iface->dhcpv4_event.uloop.fd, IPPROTO_IP, IP_PKTINFO, - &val, sizeof(val)) < 0) { + if (setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &val, sizeof(val)) < 0) { error("setsockopt(IP_PKTINFO): %m"); ret = -1; goto out; } val = IPTOS_CLASS_CS6; - if (setsockopt(iface->dhcpv4_event.uloop.fd, IPPROTO_IP, IP_TOS, &val, - sizeof(val)) < 0) { + if (setsockopt(fd, IPPROTO_IP, IP_TOS, &val, sizeof(val)) < 0) { error("setsockopt(IP_TOS): %m"); ret = -1; goto out; } val = IP_PMTUDISC_DONT; - if (setsockopt(iface->dhcpv4_event.uloop.fd, IPPROTO_IP, IP_MTU_DISCOVER, - &val, sizeof(val)) < 0) { + if (setsockopt(fd, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val)) < 0) { error("setsockopt(IP_MTU_DISCOVER): %m"); ret = -1; goto out; } - if (setsockopt(iface->dhcpv4_event.uloop.fd, SOL_SOCKET, SO_BINDTODEVICE, - iface->ifname, strlen(iface->ifname)) < 0) { + if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, iface->ifname, + strlen(iface->ifname)) < 0) { error("setsockopt(SO_BINDTODEVICE): %m"); ret = -1; goto out; } - if (bind(iface->dhcpv4_event.uloop.fd, (struct sockaddr *)&bind_addr, - sizeof(bind_addr)) < 0) { + if (bind(fd, (struct sockaddr *)&bind_addr, sizeof(bind_addr)) < 0) { error("bind(): %m"); ret = -1; goto out; @@ -1523,15 +1518,13 @@ int dhcpv4_setup_interface(struct interface *iface, bool enable) goto out; } + iface->dhcpv4_event.uloop.fd = fd; iface->dhcpv4_event.handle_dgram = dhcpv4_handle_dgram; odhcpd_register(&iface->dhcpv4_event); + return 0; out: - if (ret < 0 && iface->dhcpv4_event.uloop.fd >= 0) { - close(iface->dhcpv4_event.uloop.fd); - iface->dhcpv4_event.uloop.fd = -1; - } - + close(fd); return ret; }