diff options
| author | Roy Marples <roy@marples.name> | 2018-01-07 17:46:56 +0000 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2018-01-07 17:46:56 +0000 |
| commit | 4dc49f7d1d41301ad91de3a2d62c23e2bb9de6a2 (patch) | |
| tree | 8532695f6d06d863a7bb5557a24e8678e892337d /src/dhcpcd.c | |
| parent | 6cd6c1cba4877aab3e570afc78554b0730ebaaf9 (diff) | |
| download | dhcpcd-4dc49f7d1d41301ad91de3a2d62c23e2bb9de6a2.tar.xz | |
dhcp: don't loop needlessly when handling an interface
Diffstat (limited to 'src/dhcpcd.c')
| -rw-r--r-- | src/dhcpcd.c | 74 |
1 files changed, 26 insertions, 48 deletions
diff --git a/src/dhcpcd.c b/src/dhcpcd.c index 15940549..4372ab99 100644 --- a/src/dhcpcd.c +++ b/src/dhcpcd.c @@ -977,7 +977,7 @@ dhcpcd_handleinterface(void *arg, int action, const char *ifname) struct dhcpcd_ctx *ctx; struct ifaddrs *ifaddrs; struct if_head *ifs; - struct interface *ifp, *iff, *ifn; + struct interface *ifp, *iff; const char * const argv[] = { ifname }; int i; @@ -1004,56 +1004,36 @@ dhcpcd_handleinterface(void *arg, int action, const char *ifname) logerr(__func__); return -1; } - TAILQ_FOREACH_SAFE(ifp, ifs, next, ifn) { - if (strcmp(ifp->name, ifname) != 0) - continue; - - /* If running off an interface list, check it's in it. */ - if (ctx->ifc || ctx->options & DHCPCD_INACTIVE) { - for (i = 0; i < ctx->ifc; i++) - if (strcmp(ctx->ifv[i], ifname) == 0) - break; - if (i >= ctx->ifc) { - ifp->active = IF_INACTIVE; - ifp->carrier = LINK_UNKNOWN; - } - } - - i = 0; - /* Check if we already have the interface */ - iff = if_find(ctx->ifaces, ifp->name); - if (iff) { - if (iff->active) - logdebugx("%s: interface updated", iff->name); - /* The flags and hwaddr could have changed */ - iff->flags = ifp->flags; - iff->hwlen = ifp->hwlen; - if (ifp->hwlen != 0) - memcpy(iff->hwaddr, ifp->hwaddr, iff->hwlen); - } else { - TAILQ_REMOVE(ifs, ifp, next); - TAILQ_INSERT_TAIL(ctx->ifaces, ifp, next); - if (!ifp->active) - continue; + ifp = if_find(ifs, ifname); + if (ifp == NULL) { + /* This can happen if an interface is quickly added + * and then removed. */ + errno = ENOENT; + return -1; + } + /* Check if we already have the interface */ + iff = if_find(ctx->ifaces, ifp->name); + if (iff != NULL) { + if (iff->active) + logdebugx("%s: interface updated", iff->name); + /* The flags and hwaddr could have changed */ + iff->flags = ifp->flags; + iff->hwlen = ifp->hwlen; + if (ifp->hwlen != 0) + memcpy(iff->hwaddr, ifp->hwaddr, iff->hwlen); + } else { + TAILQ_REMOVE(ifs, ifp, next); + TAILQ_INSERT_TAIL(ctx->ifaces, ifp, next); + if (ifp->active) { logdebugx("%s: interface added", ifp->name); dhcpcd_initstate(ifp, 0); run_preinit(ifp); - iff = ifp; } - if (action > 0 && iff->active) - dhcpcd_prestartinterface(iff); + iff = ifp; } - if_learnaddrs(ctx, ifs, &ifaddrs); - - /* Now we have learned addresses, start the interface */ - TAILQ_FOREACH_SAFE(ifp, ifs, next, ifn) { - if (strcmp(ifp->name, ifname) != 0) - continue; - iff = if_find(ctx->ifaces, ifp->name); - if (action > 0 && iff->active) - dhcpcd_prestartinterface(iff); - } + if (action > 0 && iff->active) + dhcpcd_prestartinterface(iff); /* Free our discovered list */ while ((ifp = TAILQ_FIRST(ifs))) { @@ -1062,9 +1042,7 @@ dhcpcd_handleinterface(void *arg, int action, const char *ifname) } free(ifs); - if (i == -1) - errno = ENOENT; - return i; + return 1; } void |
