diff options
Diffstat (limited to 'coreutils/mknod.c')
-rw-r--r-- | coreutils/mknod.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/coreutils/mknod.c b/coreutils/mknod.c new file mode 100644 index 000000000..8ca511cd5 --- /dev/null +++ b/coreutils/mknod.c | |||
@@ -0,0 +1,50 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * mknod implementation for busybox | ||
4 | * | ||
5 | * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org> | ||
6 | * | ||
7 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | ||
8 | */ | ||
9 | |||
10 | /* BB_AUDIT SUSv3 N/A -- Matches GNU behavior. */ | ||
11 | |||
12 | #include <sys/sysmacros.h> // For makedev | ||
13 | |||
14 | #include "busybox.h" | ||
15 | #include "libcoreutils/coreutils.h" | ||
16 | |||
17 | static const char modes_chars[] = { 'p', 'c', 'u', 'b', 0, 1, 1, 2 }; | ||
18 | static const mode_t modes_cubp[] = { S_IFIFO, S_IFCHR, S_IFBLK }; | ||
19 | |||
20 | int mknod_main(int argc, char **argv) | ||
21 | { | ||
22 | mode_t mode; | ||
23 | dev_t dev; | ||
24 | const char *name; | ||
25 | |||
26 | mode = getopt_mk_fifo_nod(argc, argv); | ||
27 | argv += optind; | ||
28 | argc -= optind; | ||
29 | |||
30 | if ((argc >= 2) && ((name = strchr(modes_chars, argv[1][0])) != NULL)) { | ||
31 | mode |= modes_cubp[(int)(name[4])]; | ||
32 | |||
33 | dev = 0; | ||
34 | if ((*name != 'p') && ((argc -= 2) == 2)) { | ||
35 | /* Autodetect what the system supports; these macros should | ||
36 | * optimize out to two constants. */ | ||
37 | dev = makedev(xatoul_range(argv[2], 0, major(UINT_MAX)), | ||
38 | xatoul_range(argv[3], 0, minor(UINT_MAX))); | ||
39 | } | ||
40 | |||
41 | if (argc == 2) { | ||
42 | name = *argv; | ||
43 | if (mknod(name, mode, dev) == 0) { | ||
44 | return EXIT_SUCCESS; | ||
45 | } | ||
46 | bb_perror_msg_and_die("%s", name); | ||
47 | } | ||
48 | } | ||
49 | bb_show_usage(); | ||
50 | } | ||