summaryrefslogtreecommitdiffstats
path: root/src/if-bsd.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2020-09-23 09:59:47 +0100
committerRoy Marples <roy@marples.name>2020-09-23 09:59:47 +0100
commitaf6fa9caa7ef25b6baae7dd9607c096549f15b50 (patch)
treeecc0c45e6419fa4f30e58e275b4860aa920aeca8 /src/if-bsd.c
parent84bfc372fc5e1c23ffa8078db1d6a0c59a05bf00 (diff)
downloaddhcpcd-af6fa9caa7ef25b6baae7dd9607c096549f15b50.tar.xz
BSD: Of course DragonFly does SIOCGIFDATA differently..
Diffstat (limited to 'src/if-bsd.c')
-rw-r--r--src/if-bsd.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/if-bsd.c b/src/if-bsd.c
index 97a69441..52cc5b4e 100644
--- a/src/if-bsd.c
+++ b/src/if-bsd.c
@@ -382,18 +382,28 @@ int
if_carrier(struct interface *ifp)
{
int carrier = if_carrier0(ifp);
-#ifdef SIOCGIFDATA
- struct ifdatareq ifdr = { .ifdr_data.ifi_link_state = 0 };
- struct if_data *ifdata;
+#ifdef SIOCGIFDATA
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
+ 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;
+#endif
- ifdata = &ifdr.ifdr_data;
switch (ifdata->ifi_link_state) {
case LINK_STATE_DOWN:
return LINK_DOWN;