summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkrw <krw@openbsd.org>2020-06-03 18:15:57 +0000
committerkrw <krw@openbsd.org>2020-06-03 18:15:57 +0000
commit02c5bef54a611e04bc6d58a1e7bf5a902493e20c (patch)
tree0894f57158eccc3d71e70f245265dd84cd386392
parentPass sockaddr instead of sockaddr_storage to sa_address. (diff)
downloadwireguard-openbsd-02c5bef54a611e04bc6d58a1e7bf5a902493e20c.tar.xz
wireguard-openbsd-02c5bef54a611e04bc6d58a1e7bf5a902493e20c.zip
Simplify logic in add_route(), eliminating pointless code duplication and
improving clarity. No intentional functional change.
-rw-r--r--sbin/dhclient/kroute.c91
1 files changed, 32 insertions, 59 deletions
diff --git a/sbin/dhclient/kroute.c b/sbin/dhclient/kroute.c
index 579d9b9e625..d7d541d5904 100644
--- a/sbin/dhclient/kroute.c
+++ b/sbin/dhclient/kroute.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kroute.c,v 1.187 2020/05/28 16:02:56 krw Exp $ */
+/* $OpenBSD: kroute.c,v 1.188 2020/06/03 18:15:57 krw Exp $ */
/*
* Copyright 2012 Kenneth R Westerback <krw@openbsd.org>
@@ -390,79 +390,52 @@ add_route(char *name, int rdomain, int routefd, struct in_addr dest,
char destbuf[INET_ADDRSTRLEN];
char maskbuf[INET_ADDRSTRLEN];
struct iovec iov[5];
+ struct sockaddr_in sockaddr_in[4];
struct rt_msghdr rtm;
- struct sockaddr_in sadest, sagateway, samask, saifa;
- int index, iovcnt = 0;
-
- index = if_nametoindex(name);
- if (index == 0)
- return;
-
- /* Build RTM header */
+ int i, iovcnt = 0;
memset(&rtm, 0, sizeof(rtm));
+ rtm.rtm_index = if_nametoindex(name);
+ if (rtm.rtm_index == 0)
+ return;
rtm.rtm_version = RTM_VERSION;
rtm.rtm_type = RTM_ADD;
- rtm.rtm_index = index;
rtm.rtm_tableid = rdomain;
rtm.rtm_priority = RTP_NONE;
- rtm.rtm_addrs = RTA_DST | RTA_NETMASK | RTA_GATEWAY;
rtm.rtm_flags = flags;
- rtm.rtm_msglen = sizeof(rtm);
- iov[iovcnt].iov_base = &rtm;
- iov[iovcnt++].iov_len = sizeof(rtm);
+ iov[0].iov_base = &rtm;
+ iov[0].iov_len = sizeof(rtm);
+
+ memset(sockaddr_in, 0, sizeof(sockaddr_in));
+ for (i = 0; i < 4; i++) {
+ sockaddr_in[i].sin_len = sizeof(sockaddr_in[i]);
+ sockaddr_in[i].sin_family = AF_INET;
+ iov[i+1].iov_base = &sockaddr_in[i];
+ iov[i+1].iov_len = sizeof(sockaddr_in[i]);
+ }
- /* Add the destination address. */
- memset(&sadest, 0, sizeof(sadest));
- sadest.sin_len = sizeof(sadest);
- sadest.sin_family = AF_INET;
- sadest.sin_addr.s_addr = dest.s_addr;
-
- rtm.rtm_msglen += sizeof(sadest);
- iov[iovcnt].iov_base = &sadest;
- iov[iovcnt++].iov_len = sizeof(sadest);
-
- /* Add the gateways address. */
- memset(&sagateway, 0, sizeof(sagateway));
- sagateway.sin_len = sizeof(sagateway);
- sagateway.sin_family = AF_INET;
- sagateway.sin_addr.s_addr = gateway.s_addr;
-
- rtm.rtm_msglen += sizeof(sagateway);
- iov[iovcnt].iov_base = &sagateway;
- iov[iovcnt++].iov_len = sizeof(sagateway);
-
- /* Add the network mask. */
- memset(&samask, 0, sizeof(samask));
- samask.sin_len = sizeof(samask);
- samask.sin_family = AF_INET;
- samask.sin_addr.s_addr = netmask.s_addr;
-
- rtm.rtm_msglen += sizeof(samask);
- iov[iovcnt].iov_base = &samask;
- iov[iovcnt++].iov_len = sizeof(samask);
-
- if (address.s_addr != INADDR_ANY) {
- /* Add the ifa */
- memset(&saifa, 0, sizeof(saifa));
- saifa.sin_len = sizeof(saifa);
- saifa.sin_family = AF_INET;
- saifa.sin_addr.s_addr = address.s_addr;
-
- rtm.rtm_msglen += sizeof(saifa);
- iov[iovcnt].iov_base = &saifa;
- iov[iovcnt++].iov_len = sizeof(saifa);
- rtm.rtm_addrs |= RTA_IFA;
+ /* Order of sockaddr_in's is mandatory! */
+ sockaddr_in[0].sin_addr = dest;
+ sockaddr_in[1].sin_addr = gateway;
+ sockaddr_in[2].sin_addr = netmask;
+ sockaddr_in[3].sin_addr = address;
+ if (address.s_addr == INADDR_ANY) {
+ rtm.rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
+ iovcnt = 4;
+ } else {
+ rtm.rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK | RTA_IFA;
+ iovcnt = 5;
}
+ for (i = 0; i < iovcnt; i++)
+ rtm.rtm_msglen += iov[i].iov_len;
+
if (writev(routefd, iov, iovcnt) == -1) {
if (errno != EEXIST || log_getverbose() != 0) {
- strlcpy(destbuf, inet_ntoa(dest),
- sizeof(destbuf));
- strlcpy(maskbuf, inet_ntoa(netmask),
- sizeof(maskbuf));
+ strlcpy(destbuf, inet_ntoa(dest), sizeof(destbuf));
+ strlcpy(maskbuf, inet_ntoa(netmask),sizeof(maskbuf));
log_warn("%s: add route %s/%s via %s", log_procname,
destbuf, maskbuf, inet_ntoa(gateway));
}