dhcvp4: use tmp fd in dhcpv4_setup_interface()
authorDavid Härdeman <[email protected]>
Fri, 17 Oct 2025 11:54:50 +0000 (13:54 +0200)
committerÁlvaro Fernández Rojas <[email protected]>
Sun, 23 Nov 2025 19:05:03 +0000 (20:05 +0100)
This makes the code a little bit easier to read.

Signed-off-by: David Härdeman <[email protected]>
Link: https://github.com/openwrt/odhcpd/pull/318
Signed-off-by: Álvaro Fernández Rojas <[email protected]>
src/dhcpv4.c

index 3f41188be575ecb4bd397a976a70a40b90913131..c31d521ce3fccd25466caa9599975fbbe7f78700 100644 (file)
@@ -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;
 }