changeset 5482:7f7968235543 draft

BSD: NetBSD is the odd man out with SIOCGIFDATA So setup the #defines like so. On OpenBSD, pledge blocks it and there is no escape. Luckily we already allow indirect ioctls via privsep so it works fine.
author Roy Marples <roy@marples.name>
date Thu, 24 Sep 2020 03:31:43 +0100
parents 8d0d468b6144
children f137886e6211
files src/if-bsd.c src/privsep-bsd.c
diffstat 2 files changed, 33 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/src/if-bsd.c	Wed Sep 23 13:14:06 2020 +0100
+++ b/src/if-bsd.c	Thu Sep 24 03:31:43 2020 +0100
@@ -359,6 +359,23 @@
 #endif
 }
 
+static int if_indirect_ioctl(struct dhcpcd_ctx *ctx,
+    const char *ifname, unsigned long cmd, void *data, size_t len)
+{
+	struct ifreq ifr = { .ifr_flags = 0 };
+
+#if defined(PRIVSEP) && defined(HAVE_PLEDGE)
+	if (IN_PRIVSEP(ctx))
+		return (int)ps_root_indirectioctl(ctx, cmd, ifname, data, len);
+#else
+	UNUSED(len);
+#endif
+
+	strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
+	ifr.ifr_data = data;
+	return ioctl(ctx->pf_inet_fd, cmd, &ifr);
+}
+
 static int
 if_carrier0(struct interface *ifp)
 {
@@ -387,26 +404,29 @@
 	if (carrier != LINK_UNKNOWN)
 		return carrier;
 
-#ifdef __DragonFly__
-	struct if_data ifd = { .ifi_link_state = 0 };
-	struct ifreq ifr = { .ifr_data = &ifd };
-	struct if_data *ifdata = &ifd;
-
-	strlcpy(ifr.ifr_name, ifp->name, sizeof(ifr.ifr_name));
-	if (ioctl(ifp->ctx->pf_inet_fd, SIOCGIFDATA, &ifr) == -1)
-		return LINK_UNKNOWN;
-#else
+#ifdef __NetBSD__
 	struct ifdatareq ifdr = { .ifdr_data.ifi_link_state = 0 };
 	struct if_data *ifdata = &ifdr.ifdr_data;
 
 	strlcpy(ifdr.ifdr_name, ifp->name, sizeof(ifdr.ifdr_name));
 	if (ioctl(ifp->ctx->pf_inet_fd, SIOCGIFDATA, &ifdr) == -1)
 		return LINK_UNKNOWN;
+#else
+	struct if_data ifd = { .ifi_link_state = 0 };
+	struct if_data *ifdata = &ifd;
+
+	if (if_indirect_ioctl(ifp->ctx, ifp->name, SIOCGIFDATA,
+	    &ifd, sizeof(ifd)) == -1)
+		return LINK_UNKNOWN;
 #endif
 
 	switch (ifdata->ifi_link_state) {
 	case LINK_STATE_DOWN:
 		return LINK_DOWN;
+#ifdef LINK_STATE_HALF_DUPLEX
+	case LINK_STATE_HALF_DUPLEX:
+	case LINK_STATE_FULL_DUPLEX:
+#endif
 	case LINK_STATE_UP:
 		return LINK_UP;
 	}
@@ -420,7 +440,7 @@
 int
 if_carrier_ifadata(struct interface *ifp, void *ifadata)
 {
-	int carrier = if_carrier0(ifp);
+	int carrier = if_carrier(ifp);
 	struct if_data *ifdata;
 
 	if (carrier != LINK_UNKNOWN || ifadata == NULL)
@@ -447,25 +467,6 @@
 	sdl->sdl_index = (unsigned short)ifp->index;
 }
 
-#if defined(SIOCG80211NWID) || defined(SIOCGETVLAN)
-static int if_indirect_ioctl(struct dhcpcd_ctx *ctx,
-    const char *ifname, unsigned long cmd, void *data, size_t len)
-{
-	struct ifreq ifr = { .ifr_flags = 0 };
-
-#if defined(PRIVSEP) && defined(HAVE_PLEDGE)
-	if (IN_PRIVSEP(ctx))
-		return (int)ps_root_indirectioctl(ctx, cmd, ifname, data, len);
-#else
-	UNUSED(len);
-#endif
-
-	strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
-	ifr.ifr_data = data;
-	return ioctl(ctx->pf_inet_fd, cmd, &ifr);
-}
-#endif
-
 static int
 if_getssid1(struct dhcpcd_ctx *ctx, const char *ifname, void *ssid)
 {
--- a/src/privsep-bsd.c	Wed Sep 23 13:14:06 2020 +0100
+++ b/src/privsep-bsd.c	Thu Sep 24 03:31:43 2020 +0100
@@ -55,6 +55,9 @@
 
 	/* Only allow these ioctls */
 	switch(req) {
+#ifdef SIOCGIFDATA
+	case SIOCGIFDATA:	/* FALLTHROUGH */
+#endif
 #ifdef SIOCG80211NWID
 	case SIOCG80211NWID:	/* FALLTHROUGH */
 #endif