summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Härdeman2025-10-17 11:54:50 +0000
committerÁlvaro Fernández Rojas2025-11-23 19:05:03 +0000
commit24f0135006910abf619831b2b7a881895e6d15ff (patch)
tree0d23c37ae1ee9a32c98927bedb2e3e73218ee8ce
parentc10784ece29c13f91517ef016b1b9d281dd4a2a7 (diff)
downloadodhcpd-24f0135006910abf619831b2b7a881895e6d15ff.tar.gz
dhcvp4: use tmp fd in dhcpv4_setup_interface()
This makes the code a little bit easier to read. Signed-off-by: David Härdeman <david@hardeman.nu> Link: https://github.com/openwrt/odhcpd/pull/318 Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
-rw-r--r--src/dhcpv4.c35
1 files changed, 14 insertions, 21 deletions
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;
}