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:
parent
eda4f53f2e
commit
822e7fd587
@ -41,8 +41,10 @@ extern int mkdir_main (int argc, char **argv)
|
|||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'm':
|
case 'm':
|
||||||
mode = 0777;
|
mode = 0777;
|
||||||
if (!parse_mode (optarg, &mode))
|
if (!parse_mode (optarg, &mode)) {
|
||||||
error_msg_and_die ("invalid mode `%s'", optarg);
|
error_msg_and_die ("invalid mode `%s'", optarg);
|
||||||
|
}
|
||||||
|
umask(0);
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
flags |= FILEUTILS_RECUR;
|
flags |= FILEUTILS_RECUR;
|
||||||
|
@ -38,24 +38,41 @@
|
|||||||
* Also create parent directories as necessary if flags contains
|
* Also create parent directories as necessary if flags contains
|
||||||
* FILEUTILS_RECUR. */
|
* 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 make_directory (char *path, long mode, int flags)
|
||||||
{
|
{
|
||||||
int ret;
|
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) {
|
if (flags == FILEUTILS_RECUR) {
|
||||||
char *pp = strrchr(path, '/');
|
char *pp = strrchr(path, '/');
|
||||||
if ((pp) && (pp != path)) {
|
if ((pp) && (pp != path)) {
|
||||||
*pp = '\0';
|
*pp = '\0';
|
||||||
make_directory(path, mode, flags);
|
make_directory(path, -1, flags);
|
||||||
*pp = '/';
|
*pp = '/';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mode == -1) {
|
||||||
|
mode = default_permission(path, 07777);
|
||||||
|
}
|
||||||
|
|
||||||
ret = mkdir(path, mode);
|
ret = mkdir(path, mode);
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
if ((flags == FILEUTILS_RECUR) && (errno == EEXIST)) {
|
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);
|
perror_msg_and_die("Cannot create directory '%s'", path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user