File nameif-rename.patch of Package net-tools
--- 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);
}