When making parent directories set permissions based on the base parent tree rather than the new directory to be created.

This commit is contained in:
Glenn L McGrath 2002-11-24 22:48:20 +00:00
parent eda4f53f2e
commit 822e7fd587
2 changed files with 29 additions and 9 deletions

View 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;

View File

@ -38,24 +38,41 @@
* 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);
}