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