summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mknod.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/mknod.c b/src/mknod.c
index c17b9fdda..19167fa41 100644
--- a/src/mknod.c
+++ b/src/mknod.c
@@ -117,10 +117,10 @@ main (int argc, char **argv)
}
}
- newmode = ((S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
- & ~ umask (0));
+ newmode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if (symbolic_mode)
{
+ newmode &= ~ umask (0);
change = mode_compile (symbolic_mode, 0);
if (change == MODE_INVALID)
error (1, 0, _("invalid mode"));
@@ -223,5 +223,16 @@ major and minor device numbers may not be specified for fifo files"));
usage (1);
}
+ /* Perform an explicit chmod to ensure the file mode permission bits
+ are set as specified. This extra step is necessary in some cases
+ when the containing directory has a default ACL. */
+
+ if (symbolic_mode)
+ {
+ if (chmod (argv[optind], newmode))
+ error (0, errno, _("cannot set permissions of `%s'"),
+ quote (argv[optind]));
+ }
+
exit (0);
}