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/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) 10 * 11 * Fixed broken permission setting when -p was used; especially in 12 * conjunction with -m. 13 */ 14/* Nov 28, 2006 Yoshinori Sato <ysato@users.sourceforge.jp>: Add SELinux Support. 15 */ 16//config:config MKDIR 17//config: bool "mkdir (4.4 kb)" 18//config: default y 19//config: help 20//config: mkdir is used to create directories with the specified names. 21 22//applet:IF_MKDIR(APPLET_NOFORK(mkdir, mkdir, BB_DIR_BIN, BB_SUID_DROP, mkdir)) 23 24//kbuild:lib-$(CONFIG_MKDIR) += mkdir.o 25 26/* BB_AUDIT SUSv3 compliant */ 27/* http://www.opengroup.org/onlinepubs/007904975/utilities/mkdir.html */ 28 29//usage:#define mkdir_trivial_usage 30//usage: "[OPTIONS] DIRECTORY..." 31//usage:#define mkdir_full_usage "\n\n" 32//usage: "Create DIRECTORY\n" 33//usage: "\n -m MODE Mode" 34//usage: "\n -p No error if exists; make parent directories as needed" 35//usage: IF_SELINUX( 36//usage: "\n -Z Set security context" 37//usage: ) 38//usage: 39//usage:#define mkdir_example_usage 40//usage: "$ mkdir /tmp/foo\n" 41//usage: "$ mkdir /tmp/foo\n" 42//usage: "/tmp/foo: File exists\n" 43//usage: "$ mkdir /tmp/foo/bar/baz\n" 44//usage: "/tmp/foo/bar/baz: No such file or directory\n" 45//usage: "$ mkdir -p /tmp/foo/bar/baz\n" 46 47#include "libbb.h" 48 49/* This is a NOFORK applet. Be very careful! */ 50 51int mkdir_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 52int mkdir_main(int argc UNUSED_PARAM, char **argv) 53{ 54 long mode = -1; 55 int status = EXIT_SUCCESS; 56 int flags = 0; 57 unsigned opt; 58 char *smode; 59#if ENABLE_SELINUX 60 security_context_t scontext; 61#endif 62 63 opt = getopt32long(argv, "m:pv" IF_SELINUX("Z:"), 64 "mode\0" Required_argument "m" 65 "parents\0" No_argument "p" 66# if ENABLE_SELINUX 67 "context\0" Required_argument "Z" 68# endif 69# if ENABLE_FEATURE_VERBOSE 70 "verbose\0" No_argument "v" 71# endif 72 , &smode IF_SELINUX(,&scontext) 73 ); 74 if (opt & 1) { 75 mode_t mmode = bb_parse_mode(smode, 0777); 76 if (mmode == (mode_t)-1) { 77 bb_error_msg_and_die("invalid mode '%s'", smode); 78 } 79 mode = mmode; 80 } 81 if (opt & 2) 82 flags |= FILEUTILS_RECUR; 83 if ((opt & 4) && FILEUTILS_VERBOSE) 84 flags |= FILEUTILS_VERBOSE; 85#if ENABLE_SELINUX 86 if (opt & 8) { 87 selinux_or_die(); 88 setfscreatecon_or_die(scontext); 89 } 90#endif 91 92 argv += optind; 93 if (!argv[0]) 94 bb_show_usage(); 95 96 do { 97 if (bb_make_directory(*argv, mode, flags)) { 98 status = EXIT_FAILURE; 99 } 100 } while (*++argv); 101 102 return status; 103} 104