diff --git a/sbin/ifconfig/af_inet.c b/sbin/ifconfig/af_inet.c --- a/sbin/ifconfig/af_inet.c +++ b/sbin/ifconfig/af_inet.c @@ -175,6 +175,16 @@ errx(1, "%s: bad value", s); } +static void +in_postproc(int s, const struct afswtch *afp, int newaddr, int ifflags) +{ + if (sintab[ADDR]->sin_len != 0 && sintab[MASK]->sin_len == 0 && + newaddr && (ifflags & (IFF_POINTOPOINT | IFF_LOOPBACK)) == 0) { + warnx("WARNING: setting interface address without mask " + "is deprecated,\ndefault mask may not be correct."); + } +} + static void in_status_tunnel(int s) { @@ -222,6 +232,7 @@ .af_af = AF_INET, .af_status = in_status, .af_getaddr = in_getaddr, + .af_postproc = in_postproc, .af_status_tunnel = in_status_tunnel, .af_settunnel = in_set_tunnel, .af_difaddr = SIOCDIFADDR, diff --git a/sbin/ifconfig/af_inet6.c b/sbin/ifconfig/af_inet6.c --- a/sbin/ifconfig/af_inet6.c +++ b/sbin/ifconfig/af_inet6.c @@ -419,7 +419,8 @@ } static void -in6_postproc(int s, const struct afswtch *afp) +in6_postproc(int s, const struct afswtch *afp, int newaddr __unused, + int ifflags __unused) { if (explicit_prefix == 0) { /* Aggregatable address architecture defines all prefixes diff --git a/sbin/ifconfig/ifconfig.h b/sbin/ifconfig/ifconfig.h --- a/sbin/ifconfig/ifconfig.h +++ b/sbin/ifconfig/ifconfig.h @@ -110,7 +110,8 @@ void (*af_getaddr)(const char *, int); /* parse prefix method (IPv6) */ void (*af_getprefix)(const char *, int); - void (*af_postproc)(int s, const struct afswtch *); + void (*af_postproc)(int s, const struct afswtch *, + int newaddr, int ifflags); u_long af_difaddr; /* set dst if address ioctl */ u_long af_aifaddr; /* set if address ioctl */ void *af_ridreq; /* */ diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c --- a/sbin/ifconfig/ifconfig.c +++ b/sbin/ifconfig/ifconfig.c @@ -116,7 +116,7 @@ static void tunnel_status(int s); static _Noreturn void usage(void); -static int getifflags(const char *ifname, int us); +static int getifflags(const char *ifname, int us, bool err_ok); static struct afswtch *af_getbyname(const char *name); static struct afswtch *af_getbyfamily(int af); @@ -603,7 +603,7 @@ if (iflen >= sizeof(name)) { warnx("%s: interface name too long, skipping", ifname); } else { - flags = getifflags(name, -1); + flags = getifflags(name, -1, false); if (!(((flags & IFF_CANTCONFIG) != 0) || (downonly && (flags & IFF_UP) != 0) || (uponly && (flags & IFF_UP) == 0))) @@ -1000,7 +1000,7 @@ * Do any post argument processing required by the address family. */ if (afp->af_postproc != NULL) - afp->af_postproc(s, afp); + afp->af_postproc(s, afp, newaddr, getifflags(name, s, true)); /* * Do deferred callbacks registered while processing * command-line arguments. @@ -1179,7 +1179,7 @@ } static int -getifflags(const char *ifname, int us) +getifflags(const char *ifname, int us, bool err_ok) { struct ifreq my_ifr; int s; @@ -1192,8 +1192,10 @@ } else s = us; if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&my_ifr) < 0) { - Perror("ioctl (SIOCGIFFLAGS)"); - exit(1); + if (!err_ok) { + Perror("ioctl (SIOCGIFFLAGS)"); + exit(1); + } } if (us < 0) close(s); @@ -1211,7 +1213,7 @@ struct ifreq my_ifr; int flags; - flags = getifflags(name, s); + flags = getifflags(name, s, false); if (value < 0) { value = -value; flags &= ~value;