busybox/coreutils/mkdir.c
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2/*
   3 * Mini mkdir implementation for busybox
   4 *
   5 * Copyright (C) 2001 Matt Kraai <kraai@alumni.carnegiemellon.edu>
   6 *
   7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
   8 */
   9
  10/* BB_AUDIT SUSv3 compliant */
  11/* http://www.opengroup.org/onlinepubs/007904975/utilities/mkdir.html */
  12
  13/* Mar 16, 2003      Manuel Novoa III   (mjn3@codepoet.org)
  14 *
  15 * Fixed broken permission setting when -p was used; especially in
  16 * conjunction with -m.
  17 */
  18
  19/* Nov 28, 2006      Yoshinori Sato <ysato@users.sourceforge.jp>: Add SELinux Support.
  20 */
  21
  22//usage:#define mkdir_trivial_usage
  23//usage:       "[OPTIONS] DIRECTORY..."
  24//usage:#define mkdir_full_usage "\n\n"
  25//usage:       "Create DIRECTORY\n"
  26//usage:     "\n        -m MODE Mode"
  27//usage:     "\n        -p      No error if exists; make parent directories as needed"
  28//usage:        IF_SELINUX(
  29//usage:     "\n        -Z      Set security context"
  30//usage:        )
  31//usage:
  32//usage:#define mkdir_example_usage
  33//usage:       "$ mkdir /tmp/foo\n"
  34//usage:       "$ mkdir /tmp/foo\n"
  35//usage:       "/tmp/foo: File exists\n"
  36//usage:       "$ mkdir /tmp/foo/bar/baz\n"
  37//usage:       "/tmp/foo/bar/baz: No such file or directory\n"
  38//usage:       "$ mkdir -p /tmp/foo/bar/baz\n"
  39
  40#include "libbb.h"
  41
  42/* This is a NOFORK applet. Be very careful! */
  43
  44#if ENABLE_FEATURE_MKDIR_LONG_OPTIONS
  45static const char mkdir_longopts[] ALIGN1 =
  46        "mode\0"    Required_argument "m"
  47        "parents\0" No_argument       "p"
  48#if ENABLE_SELINUX
  49        "context\0" Required_argument "Z"
  50#endif
  51#if ENABLE_FEATURE_VERBOSE
  52        "verbose\0" No_argument       "v"
  53#endif
  54        ;
  55#endif
  56
  57int mkdir_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  58int mkdir_main(int argc UNUSED_PARAM, char **argv)
  59{
  60        long mode = -1;
  61        int status = EXIT_SUCCESS;
  62        int flags = 0;
  63        unsigned opt;
  64        char *smode;
  65#if ENABLE_SELINUX
  66        security_context_t scontext;
  67#endif
  68
  69#if ENABLE_FEATURE_MKDIR_LONG_OPTIONS
  70        applet_long_options = mkdir_longopts;
  71#endif
  72        opt = getopt32(argv, "m:pv" IF_SELINUX("Z:"), &smode IF_SELINUX(,&scontext));
  73        if (opt & 1) {
  74                mode_t mmode = bb_parse_mode(smode, 0777);
  75                if (mmode == (mode_t)-1) {
  76                        bb_error_msg_and_die("invalid mode '%s'", smode);
  77                }
  78                mode = mmode;
  79        }
  80        if (opt & 2)
  81                flags |= FILEUTILS_RECUR;
  82        if ((opt & 4) && FILEUTILS_VERBOSE)
  83                flags |= FILEUTILS_VERBOSE;
  84#if ENABLE_SELINUX
  85        if (opt & 8) {
  86                selinux_or_die();
  87                setfscreatecon_or_die(scontext);
  88        }
  89#endif
  90
  91        argv += optind;
  92        if (!argv[0])
  93                bb_show_usage();
  94
  95        do {
  96                if (bb_make_directory(*argv, mode, flags)) {
  97                        status = EXIT_FAILURE;
  98                }
  99        } while (*++argv);
 100
 101        return status;
 102}
 103