Sophie

Sophie

distrib > Arklinux > devel > x86_64 > by-pkgid > 5b940e974faae500b8be8331a3cc5064 > files > 22

mkinitrd-5.0.17-24ark.src.rpm

--- mkinitrd-5.0.8/nash/nash.c.mknod~	2005-10-24 20:15:12.000000000 +0200
+++ mkinitrd-5.0.8/nash/nash.c	2005-10-24 20:17:52.000000000 +0200
@@ -213,17 +213,49 @@
     return -errno;
 }
 
+int dynmknod(char *device, mode_t mode, char *sysfs) {
+      char buf[256];
+      int major, minor;
+      FILE *f=fopen(sysfs, "r");
+      if(!f) {
+              printf("Failed to open %s\n", sysfs);
+              return -1;
+      }
+      if(!fgets(buf, 256, f)) {
+              printf("Failed to read from %s\n", sysfs);
+              fclose(f);
+              errno=EINVAL;
+              return -1;
+      }
+      fclose(f);
+
+      if(!strchr(buf, ':')) {
+              printf("Invalid data in %s:%s\n", sysfs, buf);
+              errno=EINVAL;
+              return -1;
+      }
+
+      major=atoi(buf);
+      minor=atoi(strchr(buf, ':') + 1);
+
+      return smartmknod(device, mode, makedev(major, minor));
+}
+
 static char *
 getArg(char * cmd, char * end, char ** arg)
 {
     char quote = '\0';
 
-    if (!cmd || cmd >= end)
+    if (!cmd || cmd >= end) {
+	*arg=NULL;
         return NULL;
+    }
 
     while (isspace(*cmd) && cmd < end) cmd++;
-    if (cmd >= end)
+    if (cmd >= end) {
+	*arg=NULL;
         return NULL;
+    }
 
     if (*cmd == '"')
 	cmd++, quote = '"';
@@ -238,6 +270,7 @@
 
 	if (cmd == end) {
 	    eprintf("error: quote mismatch for %s\n", *arg);
+	    *arg=NULL;
 	    return NULL;
 	}
 
@@ -1771,6 +1804,7 @@
     char * majorStr, * minorStr;
     int major;
     int minor;
+    int is_sysfs=0;
     char * chptr;
     mode_t mode;
 
@@ -1778,9 +1812,11 @@
     cmd = getArg(cmd, end, &type);
     cmd = getArg(cmd, end, &majorStr);
     cmd = getArg(cmd, end, &minorStr);
-    if (!minorStr) {
-	eprintf("mknod: usage mknod <path> [c|b] <major> <minor>\n");
+    if (!minorStr && access(majorStr, R_OK)) {
+	eprintf("mknod: usage mknod <path> [c|b] {<major> <minor>,<sysfs entry>}\n");
 	return 1;
+    } else if(!minorStr) {
+        is_sysfs=1;
     }
 
     if (!strcmp(type, "b")) {
@@ -1792,21 +1828,28 @@
 	return 1;
     }
 
-    major = strtol(majorStr, &chptr, 10);
-    if (*chptr) {
-	eprintf("invalid major number\n");
-	return 1;
-    }
+    if (is_sysfs) {
+        if (dynmknod(path, mode | 0600, majorStr)) {
+            printf("mknod: failed to create %s: %d\n", path, errno);
+	    return 1;
+	}
+    } else {
+        major = strtol(majorStr, &chptr, 10);
+        if (*chptr) {
+	    eprintf("invalid major number\n");
+	    return 1;
+        }
 
-    minor = strtol(minorStr, &chptr, 10);
-    if (*chptr) {
-	eprintf("invalid minor number\n");
-	return 1;
-    }
+        minor = strtol(minorStr, &chptr, 10);
+        if (*chptr) {
+	    eprintf("invalid minor number\n");
+	    return 1;
+        }
 
-    if (smartmknod(path, mode | 0600, makedev(major, minor))) {
-	eprintf("mknod: failed to create %s: %s\n", path, strerror(errno));
-	return 1;
+        if (smartmknod(path, mode | 0600, makedev(major, minor))) {
+	    eprintf("mknod: failed to create %s: %s\n", path, strerror(errno));
+	    return 1;
+        }
     }
 
     return 0;