ifconfig(8): Default to AF_LOCAL sockets for non-family-specific operations
authorAaron LI <aly@aaronly.me>
Fri, 23 Mar 2018 01:40:57 +0000 (09:40 +0800)
committerAaron LI <aly@aaronly.me>
Sun, 5 Aug 2018 01:47:42 +0000 (09:47 +0800)
This allows the query operations to work in non-IPv4 jails, as will be necessary
in a future possible non-INET networking.

Obtained-from: FreeBSD (r18964)

sbin/ifconfig/ifclone.c
sbin/ifconfig/ifconfig.c

index e517968..d74f701 100644 (file)
@@ -51,9 +51,9 @@ list_cloners(void)
        int idx;
        int s;
 
-       s = socket(AF_INET, SOCK_DGRAM, 0);
+       s = socket(AF_LOCAL, SOCK_DGRAM, 0);
        if (s == -1)
-               err(1, "socket(AF_INET,SOCK_DGRAM)");
+               err(1, "socket(AF_LOCAL,SOCK_DGRAM)");
 
        memset(&ifcr, 0, sizeof(ifcr));
 
index c5ae843..964bc43 100644 (file)
@@ -496,10 +496,12 @@ ifconfig(int argc, char *const *argv, int iscreate, const struct afswtch *uafp)
 top:
        ifr.ifr_addr.sa_family =
                afp->af_af == AF_LINK || afp->af_af == AF_UNSPEC ?
-               AF_INET : afp->af_af;
+               AF_LOCAL : afp->af_af;
 
-       if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
-               err(1, "socket(family %u,SOCK_DGRAM", ifr.ifr_addr.sa_family);
+       if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0 &&
+           (uafp != NULL || errno != EAFNOSUPPORT ||
+            (s = socket(AF_LOCAL, SOCK_DGRAM, 0)) < 0))
+               err(1, "socket(family %u,SOCK_DGRAM)", ifr.ifr_addr.sa_family);
 
        while (argc > 0) {
                const struct cmd *p;
@@ -880,11 +882,12 @@ status(const struct afswtch *afp, int addrcount, struct   sockaddr_dl *sdl,
 
        if (afp == NULL) {
                allfamilies = 1;
-               afp = af_getbyname("inet");
-       } else
+               ifr.ifr_addr.sa_family = AF_LOCAL;
+       } else {
                allfamilies = 0;
-
-       ifr.ifr_addr.sa_family = afp->af_af == AF_LINK ? AF_INET : afp->af_af;
+               ifr.ifr_addr.sa_family =
+                   afp->af_af == AF_LINK ? AF_LOCAL : afp->af_af;
+       }
        strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
 
        s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0);