aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Nottingham <notting@redhat.com>2006-11-28 23:11:52 +0000
committerBill Nottingham <notting@redhat.com>2006-11-28 23:11:52 +0000
commit4c77b2792a38498f1c6467a9fb5efc86ed0a4ea4 (patch)
treeb1bec4cfa13826880442731ed1404e320d5a2068
parent2f2e61329acb4e6f2da37a23449e217cbe626d9c (diff)
downloadinitscripts-4c77b2792a38498f1c6467a9fb5efc86ed0a4ea4.tar
initscripts-4c77b2792a38498f1c6467a9fb5efc86ed0a4ea4.tar.gz
initscripts-4c77b2792a38498f1c6467a9fb5efc86ed0a4ea4.tar.bz2
initscripts-4c77b2792a38498f1c6467a9fb5efc86ed0a4ea4.tar.xz
initscripts-4c77b2792a38498f1c6467a9fb5efc86ed0a4ea4.zip
add a step to rename any temporarily renamed devices (#208740, #214817)
-rw-r--r--src/rename_device.c31
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: