Lots of updates. Finished implementing BB_FEATURE_TRIVIAL_HELP
[platform/upstream/busybox.git] / miscutils / makedevs.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * public domain -- Dave 'Kill a Cop' Cinege <dcinege@psychosis.com>
4  * 
5  * makedevs
6  * Make ranges of device files quickly. 
7  * known bugs: can't deal with alpha ranges
8  */
9
10 #include "internal.h"
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <fcntl.h>
15 #include <unistd.h>
16 #include <sys/types.h>
17 #include <sys/stat.h>
18
19 static const char makedevs_usage[] =
20         "makedevs NAME TYPE MAJOR MINOR FIRST LAST [s]\n"
21 #ifndef BB_FEATURE_TRIVIAL_HELP
22         "\nCreates a range of block or character special files\n\n"
23         "TYPEs include:\n"
24         "\tb:\tMake a block (buffered) device.\n"
25         "\tc or u:\tMake a character (un-buffered) device.\n"
26         "\tp:\tMake a named pipe. MAJOR and MINOR are ignored for named pipes.\n\n"
27         "FIRST specifies the number appended to NAME to create the first device.\n"
28         "LAST specifies the number of the last item that should be created.\n"
29         "If 's' is the last argument, the base device is created as well.\n\n"
30         "For example:\n"
31         "\tmakedevs /dev/ttyS c 4 66 2 63   ->  ttyS2-ttyS63\n"
32         "\tmakedevs /dev/hda b 3 0 0 8 s    ->  hda,hda1-hda8\n"
33 #endif
34         ;
35
36 int makedevs_main(int argc, char **argv)
37 {
38
39         const char *basedev = argv[1];
40         const char *type = argv[2];
41         int major = atoi(argv[3]);
42         int Sminor = atoi(argv[4]);
43         int S = atoi(argv[5]);
44         int E = atoi(argv[6]);
45         int sbase = argc == 8 ? 1 : 0;
46
47         mode_t mode = 0;
48         dev_t dev = 0;
49         char devname[255];
50         char buf[255];
51
52         if (argc < 7 || *argv[1]=='-')
53                 usage(makedevs_usage);
54
55         switch (type[0]) {
56         case 'c':
57                 mode = S_IFCHR;
58                 break;
59         case 'b':
60                 mode = S_IFBLK;
61                 break;
62         case 'f':
63                 mode = S_IFIFO;
64                 break;
65         default:
66                 usage(makedevs_usage);
67         }
68         mode |= 0660;
69
70         while (S <= E) {
71
72                 if (type[0] != 'f')
73                         dev = (major << 8) | Sminor;
74                 strcpy(devname, basedev);
75
76                 if (sbase == 0) {
77                         sprintf(buf, "%d", S);
78                         strcat(devname, buf);
79                 } else {
80                         sbase = 0;
81                 }
82
83                 if (mknod(devname, mode, dev))
84                         printf("Failed to create: %s\n", devname);
85
86                 S++;
87                 Sminor++;
88         }
89
90         return 0;
91 }
92
93 /*
94 And this is what this program replaces. The shell is too slow!
95
96 makedev () {
97 local basedev=$1; local S=$2; local E=$3
98 local major=$4; local Sminor=$5; local type=$6
99 local sbase=$7
100
101         if [ ! "$sbase" = "" ]; then
102                 mknod "$basedev" $type $major $Sminor
103                 S=`expr $S + 1`
104                 Sminor=`expr $Sminor + 1`
105         fi
106
107         while [ $S -le $E ]; do
108                 mknod "$basedev$S" $type $major $Sminor
109                 S=`expr $S + 1`
110                 Sminor=`expr $Sminor + 1`
111         done
112 }
113 */