selinux support by Yuichi Nakamura <ynakam@hitachisoft.jp> (HitachiSoft)
[oweals/busybox.git] / coreutils / mkdir.c
index 67819e7841155b2b9a863a86ee1d7afb88892336..93ded1dd5742009140ac8dfbaafc4da276ea589c 100644 (file)
@@ -16,6 +16,9 @@
  * conjunction with -m.
  */
 
+/* Nov 28, 2006      Yoshinori Sato <ysato@users.sourceforge.jp>: Add SELinux Support.
+ */
+
 #include <stdlib.h>
 #include <unistd.h>
 #include <getopt.h> /* struct option */
@@ -25,6 +28,9 @@
 static const struct option mkdir_long_options[] = {
        { "mode", 1, NULL, 'm' },
        { "parents", 0, NULL, 'p' },
+#if ENABLE_SELINUX
+       { "context", 1, NULL, 'Z' },
+#endif
        { 0, 0, 0, 0 }
 };
 #endif
@@ -37,11 +43,14 @@ int mkdir_main(int argc, char **argv)
        int flags = 0;
        unsigned opt;
        char *smode;
+#if ENABLE_SELINUX
+       security_context_t scontext;
+#endif
 
 #if ENABLE_FEATURE_MKDIR_LONG_OPTIONS
        applet_long_options = mkdir_long_options;
 #endif
-       opt = getopt32(argc, argv, "m:p", &smode);
+       opt = getopt32(argc, argv, "m:p" USE_SELINUX("Z:"), &smode USE_SELINUX(,&scontext));
        if (opt & 1) {
                mode = 0777;
                if (!bb_parse_mode(smode, &mode)) {
@@ -50,6 +59,15 @@ int mkdir_main(int argc, char **argv)
        }
        if (opt & 2)
                flags |= FILEUTILS_RECUR;
+#if ENABLE_SELINUX
+       if (opt & 4) {
+               selinux_or_die();
+               if (setfscreatecon(scontext)) {
+                       bb_error_msg_and_die("cannot set default file creation context "
+                                             "to %s", scontext);
+               }
+       }
+#endif
 
        if (optind == argc) {
                bb_show_usage();