--- trunk/mkinitrd-magellan/klibc/usr/utils/mknod.c 2009/04/24 18:09:28 814 +++ trunk/mkinitrd-magellan/klibc/usr/utils/mknod.c 2009/04/24 18:32:46 815 @@ -1,24 +1,31 @@ #include #include +#include #include char *progname; static __noreturn usage(void) { - fprintf(stderr, "Usage: %s name {b|c|p} major minor\n", progname); + fprintf(stderr, "Usage: %s [-m mode] name {b|c|p} major minor\n", + progname); exit(1); } int main(int argc, char *argv[]) { char *name, *type, typec, *endp; - unsigned int major, minor; - mode_t mode; + unsigned int major_num, minor_num; + mode_t mode, mode_set = 0; dev_t dev; progname = *argv++; + if (argv[0][0] == '-' && argv[0][1] == 'm' && !argv[0][2]) { + mode_set = strtoul(argv[1], &endp, 8); + argv += 2; + } + name = *argv++; if (!name) usage(); @@ -49,13 +56,13 @@ if (!argv[0] || !argv[1]) usage(); - major = strtol(*argv++, &endp, 0); + major_num = strtol(*argv++, &endp, 0); if (*endp != '\0') usage(); - minor = strtol(*argv++, &endp, 0); + minor_num = strtol(*argv++, &endp, 0); if (*endp != '\0') usage(); - dev = makedev(major, minor); + dev = makedev(major_num, minor_num); } if (*argv) @@ -66,5 +73,10 @@ exit(1); } + if (mode_set && chmod(name, mode_set)) { + perror("chmod"); + exit(1); + } + exit(0); }