mknod.c - sbase - suckless unix tools
 (HTM) git clone git://git.suckless.org/sbase
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       mknod.c (1171B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #include <sys/stat.h>
            3 #include <sys/types.h>
            4 #ifndef makedev
            5 #include <sys/sysmacros.h>
            6 #endif
            7 
            8 #include <fcntl.h>
            9 #include <stdio.h>
           10 #include <stdlib.h>
           11 #include <string.h>
           12 #include <unistd.h>
           13 
           14 #include "util.h"
           15 
           16 static void
           17 usage(void)
           18 {
           19         eprintf("usage: %s [-m mode] name b|c|u major minor\n"
           20                 "       %s [-m mode] name p\n",
           21                 argv0, argv0);
           22 }
           23 
           24 int
           25 main(int argc, char *argv[])
           26 {
           27         mode_t mode = 0666;
           28         dev_t dev;
           29 
           30         ARGBEGIN {
           31         case 'm':
           32                 mode = parsemode(EARGF(usage()), mode, umask(0));
           33                 break;
           34         default:
           35                 usage();
           36         } ARGEND;
           37 
           38         if (argc < 2)
           39                 usage();
           40 
           41         if (strlen(argv[1]) != 1)
           42                 goto invalid;
           43         switch (argv[1][0]) {
           44         case 'b':
           45                 mode |= S_IFBLK;
           46                 break;
           47         case 'u':
           48         case 'c':
           49                 mode |= S_IFCHR;
           50                 break;
           51         case 'p':
           52                 mode |= S_IFIFO;
           53                 break;
           54         default:
           55         invalid:
           56                 eprintf("invalid type '%s'\n", argv[1]);
           57         }
           58 
           59         if (S_ISFIFO(mode)) {
           60                 if (argc != 2)
           61                         usage();
           62                 dev = 0;
           63         } else {
           64                 if (argc != 4)
           65                         usage();
           66                 dev = makedev(estrtonum(argv[2], 0, LLONG_MAX), estrtonum(argv[3], 0, LLONG_MAX));
           67         }
           68 
           69         if (mknod(argv[0], mode, dev) == -1)
           70                 eprintf("mknod %s:", argv[0]);
           71         return 0;
           72 }