commit 145602ec334400b795a3a2376e59019d33617bee
Author: FRIGN <[email protected]>
Date:   Wed Jan 28 20:55:50 2015 +0100

    Add mandoc-manpage for mkfifo(1) and add full mode support
    
    and mark it as finished in the README.
    
    Previously, it would only parse octal mode strings. Given
    we have the parsemode()-function in util.h anyway, why not
    also use it?

diff --git a/README b/README
index dab73bc..987f26f 100644
--- a/README
+++ b/README
@@ -43,7 +43,7 @@ The following tools are implemented ('*' == finished, '#' == 
UTF-8 support,
 =  ls              no                              -C, -R, -q, -u
    md5sum          non-posix                       none
 =* mkdir           yes                             none
-=  mkfifo          yes                             none
+=* mkfifo          yes                             none
 =  mktemp          non-posix                       none
 =  mv              yes                             (-i)
 =  nice            yes                             none
diff --git a/mkfifo.1 b/mkfifo.1
index 0f60d87..ea5ec6c 100644
--- a/mkfifo.1
+++ b/mkfifo.1
@@ -1,19 +1,29 @@
-.TH MKFIFO 1 sbase\-VERSION
-.SH NAME
-mkfifo \- make named pipe
-.SH SYNOPSIS
-.B mkfifo
-.RB [ \-m
-.IR mode ]
-.I name ...
-.SH DESCRIPTION
-.B mkfifo
-creates named pipes (FIFOs) with the given names.
-.SH OPTIONS
-.TP
-.B \-m
-Set the file permission bits of newly created FIFOs to mode.  The mode
-is specified in octal as we do not currently support all the formats that
-the chmod(1) utility supports.
-.SH SEE ALSO
-.IR mkfifo (3)
+.Dd January 28, 2015
+.Dt MKFIFO 1 sbase\-VERSION
+.Sh NAME
+.Nm mkfifo
+.Nd create named pipes
+.Sh SYNOPSIS
+.Nm mkfifo
+.Op Fl m Ar mode
+.Ar name ...
+.Sh DESCRIPTION
+.Nm
+creates a named pipe for each
+.Ar name
+if it does not already exist.
+.Sh OPTIONS
+.Bl -tag -width Ds
+.It Fl m
+Set the file
+.Ar mode
+of newly created named pipes.
+.El
+.Sh SEE ALSO
+.Xr mkfifo 3
+.Sh STANDARDS
+The
+.Nm
+utility is compliant with the
+.St -p1003.1-2008
+specification.
diff --git a/mkfifo.c b/mkfifo.c
index fbaee4c..5bad406 100644
--- a/mkfifo.c
+++ b/mkfifo.c
@@ -15,13 +15,16 @@ usage(void)
 int
 main(int argc, char *argv[])
 {
-       mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP |
-               S_IWGRP | S_IROTH | S_IWOTH;
+       mode_t mode = 0;
+       mode_t mask;
+       int mflag = 0;
        int ret = 0;
 
        ARGBEGIN {
        case 'm':
-               mode = estrtol(EARGF(usage()), 8);
+               mflag = 1;
+               mask = getumask();
+               mode = parsemode(EARGF(usage()), mode, mask);
                break;
        default:
                usage();
@@ -31,10 +34,17 @@ main(int argc, char *argv[])
                usage();
 
        for (; argc > 0; argc--, argv++) {
-               if (mkfifo(argv[0], mode) < 0) {
+               if (mkfifo(argv[0], S_IRUSR | S_IWUSR |
+                   S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) < 0) {
                        weprintf("mkfifo %s:", argv[0]);
                        ret = 1;
                }
+               if (mflag) {
+                       if (chmod(argv[0], mode) < 0) {
+                               weprintf("chmod %s:", argv[0]);
+                               ret = 1;
+                       }
+               }
        }
        return ret;
 }

Reply via email to