(main): Don't set the umask to 0 and hand-apply
authorJim Meyering <jim@meyering.net>
Sat, 30 Sep 2000 08:56:06 +0000 (08:56 +0000)
committerJim Meyering <jim@meyering.net>
Sat, 30 Sep 2000 08:56:06 +0000 (08:56 +0000)
the previously-set umask unconditionally.  Do that only when a
MODE has been specified.  Otherwise, call mkfifo with the full
creation mask (0777 or 0666) and let the kernel apply the umask.
The difference shows up only on file systems with ACL support
when the containing directory has a default ACL.
Patch by Andreas Gruenbacher.
(main): Rename local `symbolic_mode' to `specified_mode'.
Also, when MODE is specified, call chmod to ensure that the
permission bits are set as specified even when the containing
directory has a default ACL.

src/mkfifo.c

index ec933ee8ac246dae133dda7644dd77532487b2b5..3d360a54e28b8772e9f0d0f365fce4c90fb51dcc 100644 (file)
@@ -114,10 +114,10 @@ main (int argc, char **argv)
       usage (1);
     }
 
-  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"));
@@ -128,11 +128,23 @@ main (int argc, char **argv)
 
   for (; optind < argc; ++optind)
     {
-      if (mkfifo (argv[optind], newmode))
-       {
-         error (0, errno, _("cannot make fifo %s"), quote (argv[optind]));
-         errors = 1;
-       }
+      int fail = mkfifo (argv[optind], newmode);
+      if (fail)
+       error (0, errno, _("cannot create fifo `%s'"), quote (argv[optind]));
+
+      /* If the containing directory happens to have a default ACL, chmod
+        ensures the file mode permission bits are still set as desired.  */
+
+      if (fail == 0 && symbolic_mode)
+       {
+         fail = chmod (argv[optind], newmode);
+         if (fail)
+           error (0, errno, _("cannot set permissions of fifo `%s'"),
+                  quote (argv[optind]));
+       }
+
+      if (fail)
+       errors = 1;
     }
 
   exit (errors);