1 /* mkfifo - Make FIFO special files Author: V. Archer */
3 /* Copyright 1991 by Vincent Archer
4 * You may freely redistribute this software, in source or binary
5 * form, provided that you do not alter this copyright mention in any
14 #include <minix/minlib.h>
17 #define USR_MODES (S_ISUID|S_IRWXU)
18 #define GRP_MODES (S_ISGID|S_IRWXG)
19 #define EXE_MODES (S_IXUSR|S_IXGRP|S_IXOTH)
21 #define ALL_MODES (USR_MODES|GRP_MODES|S_IRWXO|S_ISVTX)
23 #define ALL_MODES (USR_MODES|GRP_MODES|S_IRWXO)
25 #define DEFAULT_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
28 /* Global u_mask needed in changemode.h */
31 _PROTOTYPE(int main
, (int argc
, char **argv
));
32 _PROTOTYPE(mode_t parsemode
, (char *symbolic
, mode_t oldmode
));
33 _PROTOTYPE(void usage
, (void));
35 /* Parse a P1003.2 4.7.7-conformant symbolic mode. */
36 mode_t
parsemode(char *symbolic
, mode_t oldmode
)
38 mode_t who
, mask
, newmode
, tmpmask
;
41 newmode
= oldmode
& ALL_MODES
;
44 for (; *symbolic
; symbolic
++) {
45 if (*symbolic
== 'a') {
49 if (*symbolic
== 'u') {
53 if (*symbolic
== 'g') {
57 if (*symbolic
== 'o') {
63 if (!*symbolic
|| *symbolic
== ',') usage();
65 if (*symbolic
== ',') break;
71 case '=': action
= *symbolic
++;
74 for (; *symbolic
; symbolic
++) {
75 if (*symbolic
== 'u') {
76 tmpmask
= newmode
& S_IRWXU
;
77 mask
|= tmpmask
| (tmpmask
<< 3) | (tmpmask
<< 6);
81 if (*symbolic
== 'g') {
82 tmpmask
= newmode
& S_IRWXG
;
83 mask
|= tmpmask
| (tmpmask
>> 3) | (tmpmask
<< 3);
87 if (*symbolic
== 'o') {
88 tmpmask
= newmode
& S_IRWXO
;
89 mask
|= tmpmask
| (tmpmask
>> 3) | (tmpmask
>> 6);
93 if (*symbolic
== 'r') {
94 mask
|= S_IRUSR
| S_IRGRP
| S_IROTH
;
97 if (*symbolic
== 'w') {
98 mask
|= S_IWUSR
| S_IWGRP
| S_IWOTH
;
101 if (*symbolic
== 'x') {
105 if (*symbolic
== 's') {
106 mask
|= S_ISUID
| S_ISGID
;
109 if (*symbolic
== 'X') {
110 if (S_ISDIR(oldmode
) || (oldmode
& EXE_MODES
))
115 if (*symbolic
== 't') {
131 newmode
|= who
& mask
;
133 newmode
|= mask
& (~u_mask
);
137 newmode
&= ~(who
& mask
);
139 newmode
&= ~mask
| u_mask
;
142 if (*symbolic
) symbolic
++;
148 /* Main module. Since only one option (-m mode) is allowed, there's no need
149 * to include the whole getopt() stuff.
158 if (argc
> 2 && *argv
[1] == '-' && strcmp(argv
[1], "-m") != 0) usage();
161 if (argc
&& strncmp(*argv
, "-m", (size_t) 2) == 0) {
164 symbolic
= (*argv
++) + 2;
166 if (!argc
--) usage();
173 symbolic
= (char *) 0;
176 for (; argc
--; argv
++)
177 if (mkfifo(*argv
, DEFAULT_MODE
)) {
180 } else if (symbolic
&& chmod(*argv
, parsemode(symbolic
, DEFAULT_MODE
))) {
189 /* Posix command prototype. */
192 std_err("Usage: mkfifo [-m mode] file...\n");