Teach makedevs to not segfault quite so much
[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 <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <fcntl.h>
14 #include <unistd.h>
15 #include <sys/types.h>
16 #include "busybox.h"
17
18 int makedevs_main(int argc, char **argv)
19 {
20         dev_t dev = 0;
21         mode_t mode = 0;
22         char *basedev, *type, devname[255], buf[255];
23         int major, Sminor, S, E, sbase;
24
25         if (argc < 7 || *argv[1]=='-')
26                 show_usage();
27
28         basedev = argv[1];
29         type = argv[2];
30         major = atoi(argv[3]);
31         Sminor = atoi(argv[4]);
32         S = atoi(argv[5]);
33         E = atoi(argv[6]);
34         sbase = argc == 8 ? 1 : 0;
35
36         switch (type[0]) {
37         case 'c':
38                 mode = S_IFCHR;
39                 break;
40         case 'b':
41                 mode = S_IFBLK;
42                 break;
43         case 'f':
44                 mode = S_IFIFO;
45                 break;
46         default:
47                 show_usage();
48         }
49         mode |= 0660;
50
51         while (S <= E) {
52
53                 if (type[0] != 'f')
54                         dev = (major << 8) | Sminor;
55                 strcpy(devname, basedev);
56
57                 if (sbase == 0) {
58                         sprintf(buf, "%d", S);
59                         strcat(devname, buf);
60                 } else {
61                         sbase = 0;
62                 }
63
64                 if (mknod(devname, mode, dev))
65                         printf("Failed to create: %s\n", devname);
66
67                 S++;
68                 Sminor++;
69         }
70
71         return 0;
72 }
73
74 /*
75 And this is what this program replaces. The shell is too slow!
76
77 makedev () {
78 local basedev=$1; local S=$2; local E=$3
79 local major=$4; local Sminor=$5; local type=$6
80 local sbase=$7
81
82         if [ ! "$sbase" = "" ]; then
83                 mknod "$basedev" $type $major $Sminor
84                 S=`expr $S + 1`
85                 Sminor=`expr $Sminor + 1`
86         fi
87
88         while [ $S -le $E ]; do
89                 mknod "$basedev$S" $type $major $Sminor
90                 S=`expr $S + 1`
91                 Sminor=`expr $Sminor + 1`
92         done
93 }
94 */