OSDN Git Service

Cleanup mknod.
authorRob Landley <rob@landley.net>
Sat, 6 Oct 2012 04:33:36 +0000 (23:33 -0500)
committerRob Landley <rob@landley.net>
Sat, 6 Oct 2012 04:33:36 +0000 (23:33 -0500)
toys/lsb/mknod.c

index c1a543d..fbdc880 100644 (file)
@@ -15,37 +15,29 @@ config MKNOD
          usage: mknod NAME TYPE [MAJOR MINOR]
 
          Create a special file NAME with a given type, possible types are
-         b       create a block device with the given MAJOR/MINOR
-         c or u  create a character device with the given MAJOR/MINOR
-         p       create a named pipe ignoring MAJOR/MINOR
+         b     block device
+         c or u        character device
+         p     named pipe (ignores MAJOR/MINOR)
 */
 
 #include "toys.h"
 
-static const char modes_char[] = {'p', 'c', 'u', 'b'};
-static const mode_t modes[] = {S_IFIFO, S_IFCHR, S_IFCHR, S_IFBLK};
-
 void mknod_main(void)
 {
+       mode_t modes[] = {S_IFIFO, S_IFCHR, S_IFCHR, S_IFBLK};
        int major=0, minor=0, type;
-       char * tmp;
        int mode = 0660;
 
-       tmp = strchr(modes_char, toys.optargs[1][0]);
-       if (!tmp)
-               perror_exit("unknown special device type %c", toys.optargs[1][0]);
-
-       type = modes[tmp-modes_char];
-
-       if (type == S_IFCHR || type == S_IFBLK) {
-                if (toys.optc != 4)
-                    perror_exit("creating a block/char device requires major/minor");
+       type = stridx("pcub", *toys.optargs[1]);
+       if (type == -1) perror_exit("bad type '%c'", *toys.optargs[1]);
+       if (type) {
+                if (toys.optc != 4) perror_exit("need major/minor");
 
                major = atoi(toys.optargs[2]);
                minor = atoi(toys.optargs[3]);
        }
 
-       if (mknod(toys.optargs[0], mode | type, makedev(major, minor)))
+       if (mknod(toys.optargs[0], mode | modes[type], makedev(major, minor)))
                perror_exit("mknod %s failed", toys.optargs[0]);
 
 }