aboutsummaryrefslogtreecommitdiff
path: root/busybox/miscutils/makedevs.c
diff options
context:
space:
mode:
Diffstat (limited to 'busybox/miscutils/makedevs.c')
-rw-r--r--busybox/miscutils/makedevs.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/busybox/miscutils/makedevs.c b/busybox/miscutils/makedevs.c
new file mode 100644
index 000000000..54a2e000a
--- /dev/null
+++ b/busybox/miscutils/makedevs.c
@@ -0,0 +1,93 @@
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 <sys/sysmacros.h> /* major() and minor() */
17#include "busybox.h"
18
19int makedevs_main(int argc, char **argv)
20{
21 mode_t mode;
22 char *basedev, *type, *nodname, buf[255];
23 int Smajor, Sminor, S, E;
24
25 if (argc < 7 || *argv[1]=='-')
26 bb_show_usage();
27
28 basedev = argv[1];
29 type = argv[2];
30 Smajor = atoi(argv[3]);
31 Sminor = atoi(argv[4]);
32 S = atoi(argv[5]);
33 E = atoi(argv[6]);
34 nodname = argc == 8 ? basedev : buf;
35
36 mode = 0660;
37
38 switch (type[0]) {
39 case 'c':
40 mode |= S_IFCHR;
41 break;
42 case 'b':
43 mode |= S_IFBLK;
44 break;
45 case 'f':
46 mode |= S_IFIFO;
47 break;
48 default:
49 bb_show_usage();
50 }
51
52 while (S <= E) {
53 int sz;
54
55 sz = snprintf(buf, sizeof(buf), "%s%d", basedev, S);
56 if(sz<0 || sz>=sizeof(buf)) /* libc different */
57 bb_error_msg_and_die("%s too large", basedev);
58
59 /* if mode != S_IFCHR and != S_IFBLK third param in mknod() ignored */
60
61 if (mknod(nodname, mode, makedev(Smajor, Sminor)))
62 bb_error_msg("Failed to create: %s", nodname);
63
64 if (nodname == basedev) /* ex. /dev/hda - to /dev/hda1 ... */
65 nodname = buf;
66 S++;
67 Sminor++;
68 }
69
70 return 0;
71}
72
73/*
74And this is what this program replaces. The shell is too slow!
75
76makedev () {
77local basedev=$1; local S=$2; local E=$3
78local major=$4; local Sminor=$5; local type=$6
79local sbase=$7
80
81 if [ ! "$sbase" = "" ]; then
82 mknod "$basedev" $type $major $Sminor
83 S=`expr $S + 1`
84 Sminor=`expr $Sminor + 1`
85 fi
86
87 while [ $S -le $E ]; do
88 mknod "$basedev$S" $type $major $Sminor
89 S=`expr $S + 1`
90 Sminor=`expr $Sminor + 1`
91 done
92}
93*/