When making parent directories set permissions based on the base parent tree rather...
authorGlenn L McGrath <bug1@ihug.co.nz>
Sun, 24 Nov 2002 22:48:20 +0000 (22:48 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Sun, 24 Nov 2002 22:48:20 +0000 (22:48 -0000)
coreutils/mkdir.c
libbb/make_directory.c

index 6a4ce6e1a8b43cbd52096e609882a00b595511c0..f003db99fa25d606f2b83ab11168815e02f7f74a 100644 (file)
@@ -41,8 +41,10 @@ extern int mkdir_main (int argc, char **argv)
                switch (opt) {
                case 'm':
                        mode = 0777;
-                       if (!parse_mode (optarg, &mode))
+                       if (!parse_mode (optarg, &mode)) {
                                error_msg_and_die ("invalid mode `%s'", optarg);
+                       }
+                       umask(0);
                        break;
                case 'p':
                        flags |= FILEUTILS_RECUR;
index ca3eb495c859f676d640cb9f5b823c17a3637536..e25ac21eeb60638ef2451e55628c56159b90dd27 100644 (file)
  * Also create parent directories as necessary if flags contains
  * FILEUTILS_RECUR.  */
 
+static mode_t default_permission(char *path, mode_t old_permision)
+{
+       struct stat statbuf;
+       char *pp;
+
+       statbuf.st_mode = 0777;
+
+       /* stat the directory */
+       pp = strrchr(path, '/');
+       if ((pp) && (pp != path)) {
+               *pp = '\0';
+               stat(path, &statbuf);
+               *pp = '/';
+       }
+
+       return(statbuf.st_mode & old_permision);
+}
+
 int make_directory (char *path, long mode, int flags)
 {
        int ret;
-       
-       /* Calling apps probably should use 0777 instead of -1
-        * then we dont need this condition
-        */
-       if (mode == -1) {
-               mode = 0777;
-       }
+
        if (flags == FILEUTILS_RECUR) {
                char *pp = strrchr(path, '/');
                if ((pp) && (pp != path)) {
                        *pp = '\0';
-                       make_directory(path, mode, flags);
+                       make_directory(path, -1, flags);
                        *pp = '/';
                }
        }
+
+       if (mode == -1) {
+               mode = default_permission(path, 07777);
+       }
+
        ret = mkdir(path, mode);
        if (ret == -1) {
                if ((flags == FILEUTILS_RECUR) && (errno == EEXIST)) {
@@ -64,5 +81,6 @@ int make_directory (char *path, long mode, int flags)
                        perror_msg_and_die("Cannot create directory '%s'", path);
                }
        }
+
        return(ret);
 }