Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Aug 1999 22:42:16 -0400 (EDT)
From:      James Howard <howardjp@wam.umd.edu>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/13365: Patch to mkfifo(1) for Unix 98 compliance
Message-ID:  <199908250242.WAA07674@rac9.wam.umd.edu>

next in thread | raw e-mail | index | archive | help

>Number:         13365
>Category:       bin
>Synopsis:       Patch to mkfifo(1) for Unix 98 compliance
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue Aug 24 19:50:01 PDT 1999
>Closed-Date:
>Last-Modified:
>Originator:     James Howard
>Release:        FreeBSD 3.2-STABLE i386
>Organization:
University of Maryland
>Environment:

FreeBSD byzantine 3.2-STABLE FreeBSD 3.2-STABLE #5: Sat Aug  7 23:43:54 GMT 1999     root@byzantine:/usr/src/sys/compile/BYZANTINE  i386
	
>Description:

Unix 98 requires that mkfifo(1) take an argument -m.  If this
argument is given, it is followed by a string which specifies
the mode which the FIFO will be set to.  The behaviour is 
identical to the -m argument to mkdir(1).  Consquently, the 
changes to mkfifo were derived from mkdir.  Apply the diff 
below to /usr/src/usr.bin/mkfifo to update mkfifo.c and 
mkfifo.1.

>How-To-Repeat:

mkfifo -m gives an illegal option error

>Fix:
	
diff -c /usr/src/usr.bin/mkfifo/mkfifo.1 /usr/local/src/mkfifo/mkfifo.1
*** /usr/src/usr.bin/mkfifo/mkfifo.1	Sun Apr 27 08:45:45 1997
--- /usr/local/src/mkfifo/mkfifo.1	Tue Aug 24 18:53:24 1999
***************
*** 43,48 ****
--- 43,49 ----
  .Nd make fifos
  .Sh SYNOPSIS
  .Nm
+ .Op Fl m Ar mode
  .Ar fifo_name  ...
  .Sh DESCRIPTION
  The
***************
*** 54,59 ****
--- 55,77 ----
  The
  .Nm
  command requires write permission in the parent directory.
+ .Pp
+ The options are as follows
+ .Pp
+ .Bl -tag -width indent
+ .It Fl m
+ Set the file permission bits of the final created directory to
+ the specified mode.
+ The mode argument can be in any of the formats specified to the
+ .Xr chmod 1
+ command.
+ If a symbolic mode is specified, the operation characters
+ .Dq +
+ and
+ .Dq -
+ are interpreted relative to an initial mode of
+ .Dq a=rwx .
+ .El
  .Pp
  The
  .Nm
diff -c /usr/src/usr.bin/mkfifo/mkfifo.c /usr/local/src/mkfifo/mkfifo.c
*** /usr/src/usr.bin/mkfifo/mkfifo.c	Thu Jul 24 07:02:55 1997
--- /usr/local/src/mkfifo/mkfifo.c	Tue Aug 24 19:11:30 1999
***************
*** 50,55 ****
--- 50,56 ----
  
  #include <err.h>
  #include <stdio.h>
+ #include <stdlib.h>
  #include <string.h>
  #include <unistd.h>
  
***************
*** 61,70 ****
  	char *argv[];
  {
  	extern int optind;
! 	int ch, exitval;
  
! 	while ((ch = getopt(argc, argv, "")) != -1)
  		switch(ch) {
  		case '?':
  		default:
  			usage();
--- 62,77 ----
  	char *argv[];
  {
  	extern int optind;
! 	int ch, exitval, omode, success;
! 	mode_t *set = (mode_t *)NULL;
! 	char *mode;
  
! 	mode = NULL;
! 	while ((ch = getopt(argc, argv, "m:")) != -1)
  		switch(ch) {
+ 		case 'm':
+ 			mode = optarg;
+ 			break;
  		case '?':
  		default:
  			usage();
***************
*** 74,84 ****
  	if (argv[0] == NULL)
  		usage();
  
! 	for (exitval = 0; *argv != NULL; ++argv)
! 		if (mkfifo(*argv, S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
  			warn("%s", *argv);
! 			exitval = 1;
  		}
  	exit(exitval);
  }
  
--- 81,116 ----
  	if (argv[0] == NULL)
  		usage();
  
! 	if (mode == NULL) {
!                 omode = S_IRWXU | S_IRWXG | S_IRWXO;
!         } else {
!                 if ((set = setmode(mode)) == NULL)
!                         errx(1, "invalid file mode: %s", mode);
!                 omode = getmode(set, S_IRWXU | S_IRWXG | S_IRWXO);
!                 free(set);
!         }
! 
! 	for (exitval = 0; *argv != NULL; ++argv) {
! 		success = 1;
! 		if (mkfifo(*argv, omode) < 0) {
  			warn("%s", *argv);
! 			success = 0;
  		}
+ 		if (!success)
+ 			exitval = 1;
+ 		/*
+                  * The mkdir() and umask() calls both honor only the low
+                  * nine bits, so if you try to set a mode including the
+                  * sticky, setuid, setgid bits you lose them.  Don't do
+                  * this unless the user has specifically requested a mode,
+                  * as chmod will (obviously) ignore the umask.
+                  */
+                 if (success && mode != NULL && chmod(*argv, omode) == -1) {
+                         warn("%s", *argv);
+                         exitval = 1;
+                 }
+         }
+ 	
  	exit(exitval);
  }
  

>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199908250242.WAA07674>