diff options
author | Bill Nottingham <notting@redhat.com> | 2006-11-28 23:11:52 +0000 |
---|---|---|
committer | Bill Nottingham <notting@redhat.com> | 2006-11-28 23:11:52 +0000 |
commit | 4c77b2792a38498f1c6467a9fb5efc86ed0a4ea4 (patch) | |
tree | b1bec4cfa13826880442731ed1404e320d5a2068 | |
parent | 2f2e61329acb4e6f2da37a23449e217cbe626d9c (diff) | |
download | initscripts-4c77b2792a38498f1c6467a9fb5efc86ed0a4ea4.tar.gz initscripts-4c77b2792a38498f1c6467a9fb5efc86ed0a4ea4.tar.xz initscripts-4c77b2792a38498f1c6467a9fb5efc86ed0a4ea4.zip |
add a step to rename any temporarily renamed devices (#208740, #214817)
-rw-r--r-- | src/rename_device.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/rename_device.c b/src/rename_device.c index ffc184aa..b506fdd5 100644 --- a/src/rename_device.c +++ b/src/rename_device.c @@ -29,6 +29,7 @@ #include <unistd.h> #include <sys/ioctl.h> +#include <sys/time.h> #include <sys/types.h> #include <linux/sockios.h> @@ -50,8 +51,15 @@ struct netdev { struct netdev *next; }; +struct tmp { + char *src; + char *target; + struct tmp *next; +}; + struct netdev *configs = NULL; struct netdev *devs = NULL; +struct tmp *tmplist = NULL; struct netdev *get_devs() { DIR *dir; @@ -238,6 +246,7 @@ void rename_device(char *src, char *target, struct netdev *current) { char *curdev; char *dev = NULL; struct netdev *i, *tmpdev; + char *fallback = NULL; hw = get_hwaddr(target); if (!hw) { @@ -253,14 +262,25 @@ void rename_device(char *src, char *target, struct netdev *current) { if (nconfig) { dev = nconfig; for (i = current; i; i = i->next) { - if (!strcmp(i->dev,dev)) + if (!strcmp(i->dev,dev)) { + fallback = dev; dev = NULL; + } } } if (!dev) asprintf(&dev,"__tmp%d",rand()); if (!dev) return; + if (fallback) { + struct tmp *ntmp = calloc(1, sizeof(struct tmp)); + + ntmp->src = strdup(dev); + ntmp->target = strdup(fallback); + if (tmplist) + ntmp->next = tmplist; + tmplist = ntmp; + } tmpdev = calloc(1,sizeof(struct netdev)); tmpdev->dev = curdev; if (current) @@ -308,7 +328,11 @@ void take_lock() { int main(int argc, char **argv) { char *src, *target, *hw; - + struct tmp *tmpdev; + struct timeval tv; + + gettimeofday(&tv, NULL); + srand(tv.tv_usec); take_lock(); signal(SIGSEGV,sighandler); @@ -332,6 +356,9 @@ int main(int argc, char **argv) { goto out_unlock; rename_device(src, target, NULL); + for (tmpdev = tmplist; tmpdev ; tmpdev = tmpdev->next) { + rename_device(tmpdev->src, tmpdev->target, NULL); + } printf("INTERFACE=%s\n",target); printf("DEVPATH=/class/net/%s\n", target); out_unlock: |