commit befec8cf677ba01674ac5997fb83623177ceb151
parent ee6f7d3fc077c0afdfc510e57dc13b326b21fdd8
Author: FRIGN <dev@frign.de>
Date:   Wed, 28 Jan 2015 20:55:50 +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?
Diffstat:
3 files changed, 44 insertions(+), 24 deletions(-)
diff --git 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
@@ -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
@@ -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;
 }