ifconfig(8): Fix support for automatic driver module loading.
authorSascha Wildner <saw@online.de>
Tue, 20 Oct 2015 16:10:10 +0000 (18:10 +0200)
committerSascha Wildner <saw@online.de>
Tue, 20 Oct 2015 16:10:10 +0000 (18:10 +0200)
Before this commit, trying to configure for example 'ifconfig vxnet ..."
would have kldload'ed the if_vx module even if there was a if_vxnet one
if they both existed and none of them was loaded.

FreeBSD fixed this in r279951. This commit brings in their ifmaybeload()
function wholesale.

Taken-from:  FreeBSD
Reported-by: Bill Yuan <bycn82@leaf.dragonflybsd.org>
sbin/ifconfig/ifconfig.c

index 0e9363d..142c0b2 100644 (file)
@@ -1023,17 +1023,23 @@ printb(const char *s, unsigned v, const char *bits)
 void
 ifmaybeload(const char *name)
 {
+#define MOD_PREFIX_LEN         3       /* "if_" */
        struct module_stat mstat;
        int fileid, modid;
-       char ifkind[35], *dp;
+       char ifkind[IFNAMSIZ + MOD_PREFIX_LEN], ifname[IFNAMSIZ], *dp;
        const char *cp;
 
+       /* trim the interface number off the end */
+       strlcpy(ifname, name, sizeof(ifname));
+       for (dp = ifname; *dp != 0; dp++)
+               if (isdigit(*dp)) {
+                       *dp = 0;
+                       break;
+               }
+
        /* turn interface and unit into module name */
-       strcpy(ifkind, "if_");
-       for (cp = name, dp = ifkind + 3;
-           (*cp != 0) && !isdigit(*cp); cp++, dp++)
-               *dp = *cp;
-       *dp = 0;
+       strlcpy(ifkind, "if_", sizeof(ifkind));
+       strlcat(ifkind, ifname, sizeof(ifkind));
 
        /* scan files in kernel */
        mstat.version = sizeof(struct module_stat);
@@ -1050,8 +1056,8 @@ ifmaybeload(const char *name)
                                cp = mstat.name;
                        }
                        /* already loaded? */
-                       if (strncmp(name, cp, strlen(cp)) == 0 ||
-                           strncmp(ifkind, cp, strlen(cp)) == 0)
+                       if (strcmp(ifname, cp) == 0 ||
+                           strcmp(ifkind, cp) == 0)
                                return;
                }
        }