From 7d15b7cd8fb5c8c74f1b41671a2fad7a27c80321 Mon Sep 17 00:00:00 2001 From: Gitea Date: Sat, 12 Dec 2020 13:33:43 -0600 Subject: [PATCH] It kinda works? mode needs fix? --- mkfifo.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 mkfifo.c diff --git a/mkfifo.c b/mkfifo.c new file mode 100644 index 0000000..a9f2038 --- /dev/null +++ b/mkfifo.c @@ -0,0 +1,122 @@ +#define _POSIX_C_SOURCE 200809L + +#include +#include +#include +#include + +mode_t parse_mode(char *); + +int main(int argc, char * argv[]) { + char c; mode_t mode; char * mode_text = NULL; + int failed = 0; + + while((c = getopt(argc, argv, "m:")) != -1) { + if(c == 'm') { + mode_text = optarg; + } + } + + mode = mode_text != NULL ? parse_mode(mode_text) : 0666; + + for(; optind < argc; optind++) { + int ohno = mkfifo(argv[optind], mode); + if(ohno != 0) { + failed = 1; + } + } + + if(failed == 0) { + return 0; + } + else { + return 1; + } +} + +mode_t parse_mode(char * symbolic) { + if(symbolic[0] >= '0' && symbolic[0] <= '9') { + return strtol(symbolic, NULL, 8); + } + + int i = 0; int who; int perm; + while(symbolic[i] != '+' && symbolic[i] != '-' && + symbolic[i] != '=' && symbolic[i] != '\0') { + switch(symbolic[i++]) { + case 'u': who |= 01; break; + case 'g': who |= 02; break; + case 'o': who |= 04; break; + case 'a': who |= 07; break; + } + } + + int j = i; + + while(symbolic[i] != '\0' && symbolic[i] != ',') { + switch(symbolic[++i]) { + case 'r': perm |= 01; break; + case 'w': perm |= 02; break; + case 'x': perm |= 04; break; + } + } + + mode_t mode = 0666; + + if(symbolic[j] == '+') { + if(who & 01) { + mode |= (perm & 01) ? 0400 : 0; + mode |= (perm & 02) ? 0200 : 0; + mode |= (perm & 04) ? 0100 : 0; + } + if(who & 02) { + mode |= (perm & 01) ? 040 : 0; + mode |= (perm & 02) ? 020 : 0; + mode |= (perm & 04) ? 010 : 0; + } + if(who & 04) { + mode |= (perm & 01) ? 04 : 0; + mode |= (perm & 02) ? 02 : 0; + mode |= (perm & 04) ? 01 : 0; + } + } + else if(symbolic[j] == '=') { + mode = 0; + if(who & 01) { + mode |= (perm & 01) ? 0400 : 0; + mode |= (perm & 02) ? 0200 : 0; + mode |= (perm & 04) ? 0100 : 0; + } + if(who & 02) { + mode |= (perm & 01) ? 040 : 0; + mode |= (perm & 02) ? 020 : 0; + mode |= (perm & 04) ? 010 : 0; + } + if(who & 04) { + mode |= (perm & 01) ? 04 : 0; + mode |= (perm & 02) ? 02 : 0; + mode |= (perm & 04) ? 01 : 0; + } + } + else if(symbolic[j] == '-') { + if(who & 01) { + mode ^= (perm & 01) ? 0400 : 0; + mode ^= (perm & 02) ? 0200 : 0; + mode ^= (perm & 04) ? 0100 : 0; + } + if(who & 02) { + mode ^= (perm & 01) ? 040 : 0; + mode ^= (perm & 02) ? 020 : 0; + mode ^= (perm & 04) ? 010 : 0; + } + if(who & 04) { + mode ^= (perm & 01) ? 04 : 0; + mode ^= (perm & 02) ? 02 : 0; + mode ^= (perm & 04) ? 01 : 0; + } + } + else { + return 0000; + } + + return mode; +} \ No newline at end of file