--- 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;