Index: ifconfig.c =================================================================== RCS file: /cvs/src/sbin/ifconfig/ifconfig.c,v retrieving revision 1.440 diff -u -p -r1.440 ifconfig.c --- ifconfig.c 13 Mar 2021 21:23:29 -0000 1.440 +++ ifconfig.c 15 Mar 2021 01:33:23 -0000 @@ -255,6 +255,7 @@ void unsettrunkport(const char *, int); void settrunkproto(const char *, int); void settrunklacpmode(const char *, int); void settrunklacptimeout(const char *, int); +void linkwait(const char *, int); void trunk_status(void); void list_cloners(void); @@ -669,6 +671,7 @@ const struct cmd { { "inst", NEXTARG, A_MEDIAINST, setmediainst }, { "lladdr", NEXTARG, 0, setiflladdr }, { "llprio", NEXTARG, 0, setifllprio }, + { "wait", NEXTARG, 0, linkwait }, { NULL, /*src*/ 0, 0, setifaddr }, { NULL, /*dst*/ 0, 0, setifdstaddr }, { NULL, /*illegal*/0, 0, NULL }, @@ -6710,6 +6713,35 @@ setiflladdr(const char *addr, int param) bcopy(eap, ifr.ifr_addr.sa_data, ETHER_ADDR_LEN); if (ioctl(sock, SIOCSIFLLADDR, (caddr_t)&ifr) == -1) warn("SIOCSIFLLADDR"); +} + +void +linkwait(const char *arg, int param) +{ + int waittime; + const char *errstr; + struct if_data ifrdat; + + waittime = strtonum(arg, 1, 120, &errstr); + if (errstr != NULL) + errx(1, "%s wait time %s: %s", ifname, arg, errstr); + + do { + memset(&ifr, 0, sizeof(ifr)); + memset(&ifrdat, 0, sizeof(ifrdat)); + + strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + ifr.ifr_data = (caddr_t)&ifrdat; + if (ioctl(sock, SIOCGIFDATA, (caddr_t)&ifr) == -1) + err(1, "%s SIOCGIFDATA", ifname); + + if (LINK_STATE_IS_UP(ifrdat.ifi_link_state)) + return; + + sleep(1); + } while (--waittime > 1); + + errx(1, "%s wait %s expired", ifname, arg); } #ifndef SMALL