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 "libbb.h" 15#include "libcoreutils/coreutils.h" 16 17static const char modes_chars[] ALIGN1 = { 'p', 'c', 'u', 'b', 0, 1, 1, 2 }; 18static const mode_t modes_cubp[] = { S_IFIFO, S_IFCHR, S_IFBLK }; 19 20int mknod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 21int mknod_main(int argc, char **argv) 22{ 23 mode_t mode; 24 dev_t dev; 25 const char *name; 26 27 mode = getopt_mk_fifo_nod(argv); 28 argv += optind; 29 argc -= optind; 30 31 if (argc >= 2) { 32 name = strchr(modes_chars, argv[1][0]); 33 if (name != NULL) { 34 mode |= modes_cubp[(int)(name[4])]; 35 36 dev = 0; 37 if (*name != 'p') { 38 argc -= 2; 39 if (argc == 2) { 40 /* Autodetect what the system supports; these macros should 41 * optimize out to two constants. */ 42 dev = makedev(xatoul_range(argv[2], 0, major(UINT_MAX)), 43 xatoul_range(argv[3], 0, minor(UINT_MAX))); 44 } 45 } 46 47 if (argc == 2) { 48 name = *argv; 49 if (mknod(name, mode, dev) == 0) { 50 return EXIT_SUCCESS; 51 } 52 bb_simple_perror_msg_and_die(name); 53 } 54 } 55 } 56 bb_show_usage(); 57} 58