busybox/coreutils/mknod.c
<<
>>
Prefs
   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 source tree.
   8 */
   9//config:config MKNOD
  10//config:       bool "mknod (4.5 kb)"
  11//config:       default y
  12//config:       help
  13//config:       mknod is used to create FIFOs or block/character special
  14//config:       files with the specified names.
  15
  16//applet:IF_MKNOD(APPLET_NOEXEC(mknod, mknod, BB_DIR_BIN, BB_SUID_DROP, mknod))
  17
  18//kbuild:lib-$(CONFIG_MKNOD) += mknod.o
  19
  20/* BB_AUDIT SUSv3 N/A -- Matches GNU behavior. */
  21
  22//usage:#define mknod_trivial_usage
  23//usage:       "[-m MODE] " IF_SELINUX("[-Z] ") "NAME TYPE [MAJOR MINOR]"
  24//usage:#define mknod_full_usage "\n\n"
  25//usage:       "Create a special file (block, character, or pipe)\n"
  26//usage:     "\n        -m MODE Creation mode (default a=rw)"
  27//usage:        IF_SELINUX(
  28//usage:     "\n        -Z      Set security context"
  29//usage:        )
  30//usage:     "\nTYPE:"
  31//usage:     "\n        b       Block device"
  32//usage:     "\n        c or u  Character device"
  33//usage:     "\n        p       Named pipe (MAJOR MINOR must be omitted)"
  34//usage:
  35//usage:#define mknod_example_usage
  36//usage:       "$ mknod /dev/fd0 b 2 0\n"
  37//usage:       "$ mknod -m 644 /tmp/pipe p\n"
  38
  39#ifdef __linux__
  40# include <sys/sysmacros.h>  // For makedev
  41#endif
  42
  43#include "libbb.h"
  44#include "libcoreutils/coreutils.h"
  45
  46/* This is a NOEXEC applet. Be very careful! */
  47
  48static const char modes_chars[] ALIGN1 = { 'p', 'c', 'u', 'b', 0, 1, 1, 2 };
  49static const mode_t modes_cubp[] = { S_IFIFO, S_IFCHR, S_IFBLK };
  50
  51int mknod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  52int mknod_main(int argc UNUSED_PARAM, char **argv)
  53{
  54        mode_t mode;
  55        dev_t dev;
  56        const char *type, *arg;
  57
  58        mode = getopt_mk_fifo_nod(argv);
  59        argv += optind;
  60        //argc -= optind;
  61
  62        if (!argv[0] || !argv[1])
  63                bb_show_usage();
  64        type = strchr(modes_chars, argv[1][0]);
  65        if (!type)
  66                bb_show_usage();
  67
  68        mode |= modes_cubp[(int)(type[4])];
  69
  70        dev = 0;
  71        arg = argv[2];
  72        if (*type != 'p') {
  73                if (!argv[2] || !argv[3])
  74                        bb_show_usage();
  75                /* Autodetect what the system supports; these macros should
  76                 * optimize out to two constants. */
  77                dev = makedev(xatoul_range(argv[2], 0, major(UINT_MAX)),
  78                                xatoul_range(argv[3], 0, minor(UINT_MAX)));
  79                arg = argv[4];
  80        }
  81        if (arg)
  82                bb_show_usage();
  83
  84        if (mknod(argv[0], mode, dev) != 0) {
  85                bb_simple_perror_msg_and_die(argv[0]);
  86        }
  87        return EXIT_SUCCESS;
  88}
  89