diff options
| author | Roy Marples <roy@marples.name> | 2020-09-23 09:59:47 +0100 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2020-09-23 09:59:47 +0100 |
| commit | af6fa9caa7ef25b6baae7dd9607c096549f15b50 (patch) | |
| tree | ecc0c45e6419fa4f30e58e275b4860aa920aeca8 /src/if-bsd.c | |
| parent | 84bfc372fc5e1c23ffa8078db1d6a0c59a05bf00 (diff) | |
| download | dhcpcd-af6fa9caa7ef25b6baae7dd9607c096549f15b50.tar.xz | |
BSD: Of course DragonFly does SIOCGIFDATA differently..
Diffstat (limited to 'src/if-bsd.c')
| -rw-r--r-- | src/if-bsd.c | 18 |
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; |
