--- man/en_US/nameif.8 +++ man/en_US/nameif.8 @@ -4,26 +4,37 @@ .SH SYNOPSIS .B "nameif [-c configfile] [-s]" .br -.B "nameif [-c configfile] [-s] {interface macaddress}" +.B "nameif [-c configfile] [-s] [interface macaddress]" +.br +.B "nameif [-c configfile] [-r] [newifname oldifname]" .SH DESCRIPTION .B nameif -renames network interfaces based on mac addresses. When no arguments are -given +renames network interfaces based on mac addresses or interface names. +When no arguments are given .I /etc/mactab is read. Each line of it contains an interface name and a Ethernet MAC address. Comments are allowed starting with #. Otherwise the interfaces specified on the command line are processed. .I nameif -looks for the interface with the given MAC address and renames it to the -name given. - -When the -.I -s -argument is given all error messages go to the syslog. - -When the -.I -c -argument is given with a file name that file is read instead of /etc/mactab. +looks for the interface with the given MAC address or old interface name +and renames it to the name given. +.SH OPTIONS +.TP +.B "[-s|--syslog]" +Log all error messages to syslog. +.TP +.B "[-r|--rename]" +Rename the interface given by +.I oldifname +to the new name +.I newifname +without consulting any macaddress. +.TP +.B "[-c|--config-file configfile]" +Read +.I configfile +instead of +.I /etc/mactab. .SH NOTES .I nameif --- nameif.c +++ nameif.c @@ -26,6 +26,7 @@ const char default_conf[] = "/etc/mactab"; const char *fname = default_conf; int use_syslog; +int do_rename; int ctl_sk = -1; void err(char *msg) @@ -118,7 +119,8 @@ struct change { struct change *next,**pprev; - char ifname[IFNAMSIZ+1]; + char ifname_old[IFNAMSIZ+1]; + char ifname_new[IFNAMSIZ+1]; unsigned char mac[6]; }; struct change *clist; @@ -132,13 +134,28 @@ return NULL; } +struct change *lookupifname(unsigned char *ifname_old) +{ + struct change *ch; + for (ch = clist;ch;ch = ch->next) + if (!strcmp(ch->ifname_old, ifname_old)) + return ch; + return NULL; +} + int addchange(char *p, struct change *ch, char *pos) { - if (strchr(ch->ifname, ':')) - warning(_("alias device %s at %s probably has no mac"), - ch->ifname, pos); - if (parsemac(p,ch->mac) < 0) - complain(_("cannot parse MAC `%s' at %s"), p, pos); + if (do_rename) { + if (strlen(p)+1>IFNAMSIZ) + complain(_("interface name `%s' too long"), p); + strcpy(ch->ifname_old, p); + } else { + if (strchr(ch->ifname_new, ':')) + warning(_("alias device %s at %s probably has no mac"), + ch->ifname_new, pos); + if (parsemac(p,ch->mac) < 0) + complain(_("cannot parse MAC `%s' at %s"), p, pos); + } if (clist) clist->pprev = &ch->next; ch->next = clist; @@ -179,8 +196,8 @@ n = strcspn(p, " \t"); if (n > IFNAMSIZ) complain(_("interface name too long at line %d"), line); - memcpy(ch->ifname, p, n); - ch->ifname[n] = 0; + memcpy(ch->ifname_new, p, n); + ch->ifname_new[n] = 0; p += n; p += strspn(p, " \t"); n = strspn(p, "0123456789ABCDEFabcdef:"); @@ -193,6 +210,7 @@ struct option lopt[] = { {"syslog", 0, NULL, 's' }, + {"rename", 0, NULL, 'r' }, {"config-file", 1, NULL, 'c' }, {"help", 0, NULL, '?' }, {NULL}, @@ -200,7 +218,7 @@ void usage(void) { - fprintf(stderr, _("usage: nameif [-c configurationfile] [-s] {ifname macaddress}")); + fprintf(stderr, _("usage: nameif [-c configurationfile] [-s] [-r] {ifname macaddress|oldifname}\n")); exit(1); } @@ -214,7 +232,7 @@ size_t linel = 0; for (;;) { - int c = getopt_long(ac,av,"c:s",lopt,NULL); + int c = getopt_long(ac,av,"c:sr",lopt,NULL); if (c == -1) break; switch (c) { default: @@ -226,6 +244,9 @@ case 's': use_syslog = 1; break; + case 'r': + do_rename = 1; + break; } } @@ -240,7 +261,7 @@ usage(); if (strlen(av[optind])+1>IFNAMSIZ) complain(_("interface name `%s' too long"), av[optind]); - strcpy(ch->ifname, av[optind]); + strcpy(ch->ifname_new, av[optind]); optind++; sprintf(pos,_("argument %d"),optind); addchange(av[optind], ch, pos); @@ -271,18 +292,22 @@ if (n > IFNAMSIZ-1) complain(_("interface name `%s' too long"), p); - if (getmac(p, mac) < 0) - continue; + if (do_rename) { + ch = lookupifname(p); + } else { + if (getmac(p, mac) < 0) + continue; - ch = lookupmac(mac); + ch = lookupmac(mac); + } if (!ch) continue; - + *ch->pprev = ch->next; - if (strcmp(p, ch->ifname)) { - if (setname(p, ch->ifname) < 0) + if (strcmp(p, ch->ifname_new)) { + if (setname(p, ch->ifname_new) < 0) complain(_("cannot change name of %s to %s: %s"), - p, ch->ifname, strerror(errno)); + p, ch->ifname_new, strerror(errno)); } free(ch); } @@ -291,7 +316,7 @@ while (clist) { struct change *ch = clist; clist = clist->next; - warning(_("interface '%s' not found"), ch->ifname); + complain(_("interface '%s' not found"), ch->ifname_new); free(ch); }