summaryrefslogtreecommitdiffstats
path: root/src/if.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2019-05-02 13:02:36 +0100
committerRoy Marples <roy@marples.name>2019-05-02 13:02:36 +0100
commitb66cc9a9889a3994a4d7a5a0d6144586b5930377 (patch)
tree23ffb2691fb8ac06e93dac14156cd167c0437543 /src/if.c
parentf24fc7d6c6748aae5fe5981402e2a6cbab5b12cf (diff)
downloaddhcpcd-b66cc9a9889a3994a4d7a5a0d6144586b5930377.tar.xz
BSD: RTM_IFINFO is not emitted for all interfaces past unknown link
It has to work for wireless interfaces, but we have no idea about other interfaces. So test valid carrier for unknown.
Diffstat (limited to 'src/if.c')
-rw-r--r--src/if.c70
1 files changed, 21 insertions, 49 deletions
diff --git a/src/if.c b/src/if.c
index efc4314c..28597dc2 100644
--- a/src/if.c
+++ b/src/if.c
@@ -126,65 +126,37 @@ if_closesockets(struct dhcpcd_ctx *ctx)
}
int
-if_carrier(struct interface *ifp)
+if_getflags(struct interface *ifp)
{
- int r;
- struct ifreq ifr;
-#ifdef SIOCGIFMEDIA
- struct ifmediareq ifmr;
-#endif
+ struct ifreq ifr = { .ifr_flags = 0 };
- memset(&ifr, 0, sizeof(ifr));
strlcpy(ifr.ifr_name, ifp->name, sizeof(ifr.ifr_name));
- r = ioctl(ifp->ctx->pf_inet_fd, SIOCGIFFLAGS, &ifr);
- if (r != -1)
- ifp->flags = (unsigned int)ifr.ifr_flags;
-
-#ifdef __sun
- return if_carrier_os(ifp);
-#else
- if (r == -1)
- return LINK_UNKNOWN;
-
-#ifdef SIOCGIFMEDIA
- memset(&ifmr, 0, sizeof(ifmr));
- strlcpy(ifmr.ifm_name, ifp->name, sizeof(ifmr.ifm_name));
- if (ioctl(ifp->ctx->pf_inet_fd, SIOCGIFMEDIA, &ifmr) != -1 &&
- ifmr.ifm_status & IFM_AVALID)
- {
- ifp->media_valid = true;
- r = (ifmr.ifm_status & IFM_ACTIVE) ? LINK_UP : LINK_DOWN;
- } else {
- ifp->media_valid = false;
- r = ifr.ifr_flags & IFF_RUNNING ? LINK_UP : LINK_UNKNOWN;
- }
-#else
- r = ifr.ifr_flags & IFF_RUNNING ? LINK_UP : LINK_DOWN;
-#endif
-#endif /* __sun */
- return r;
+ if (ioctl(ifp->ctx->pf_inet_fd, SIOCGIFFLAGS, &ifr) == -1)
+ return -1;
+ ifp->flags = (unsigned int)ifr.ifr_flags;
+ return 0;
}
int
if_setflag(struct interface *ifp, short flag)
{
- struct ifreq ifr;
- int r;
+ struct ifreq ifr = { .ifr_flags = 0 };
+ short f;
+
+ if (if_getflags(ifp) == -1)
+ return -1;
+
+ f = (short)ifp->flags;
+ if ((f & flag) == flag)
+ return 0;
- memset(&ifr, 0, sizeof(ifr));
strlcpy(ifr.ifr_name, ifp->name, sizeof(ifr.ifr_name));
- r = -1;
- if (ioctl(ifp->ctx->pf_inet_fd, SIOCGIFFLAGS, &ifr) == 0) {
- if (flag == 0 || (ifr.ifr_flags & flag) == flag)
- r = 0;
- else {
- ifr.ifr_flags |= flag;
- if (ioctl(ifp->ctx->pf_inet_fd, SIOCSIFFLAGS, &ifr) ==0)
- r = 0;
- }
- ifp->flags = (unsigned int)ifr.ifr_flags;
- }
- return r;
+ ifr.ifr_flags = f | flag;
+ if (ioctl(ifp->ctx->pf_inet_fd, SIOCSIFFLAGS, &ifr) == -1)
+ return -1;
+
+ ifp->flags = (unsigned int)ifr.ifr_flags;
+ return 0;
}
static int