commit 560340341fffe3a5798421cb9ed82d9b09276743
parent ff474a8cbc9514424c9d18013febfb8faca001c7
Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Wed, 9 Apr 2014 15:17:20 +0200
make parsemode() generic
use for uudecode and chmod
Signed-off-by: Hiltjo Posthuma <hiltjo@codemadness.org>
Diffstat:
M | Makefile | | | 1 | + |
M | chmod.c | | | 75 | ++------------------------------------------------------------------------- |
M | util.h | | | 3 | +++ |
A | util/mode.c | | | 77 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
M | uudecode.c | | | 32 | +------------------------------- |
5 files changed, 84 insertions(+), 104 deletions(-)
diff --git a/Makefile b/Makefile
@@ -17,6 +17,7 @@ LIB = \
util/fnck.o \
util/getlines.o \
util/md5.o \
+ util/mode.o \
util/putword.o \
util/recurse.o \
util/rm.o \
diff --git a/chmod.c b/chmod.c
@@ -7,10 +7,9 @@
#include "util.h"
static void chmodr(const char *);
-static void parsemode(const char *);
static bool rflag = false;
-static char oper = '=';
+static int oper = '=';
static mode_t mode = 0;
static void
@@ -46,7 +45,7 @@ main(int argc, char *argv[])
}
done:
- parsemode(argv[0]);
+ parsemode(argv[0], &mode, &oper);
argv++;
argc--;
@@ -82,73 +81,3 @@ chmodr(const char *path)
if(rflag)
recurse(path, chmodr);
}
-
-void
-parsemode(const char *str)
-{
- char *end;
- const char *p;
- int octal;
- mode_t mask = 0;
-
- octal = strtol(str, &end, 8);
- if(*end == '\0') {
- if( octal < 0 || octal > 07777) eprintf("invalid mode\n");
- if(octal & 04000) mode |= S_ISUID;
- if(octal & 02000) mode |= S_ISGID;
- if(octal & 01000) mode |= S_ISVTX;
- if(octal & 00400) mode |= S_IRUSR;
- if(octal & 00200) mode |= S_IWUSR;
- if(octal & 00100) mode |= S_IXUSR;
- if(octal & 00040) mode |= S_IRGRP;
- if(octal & 00020) mode |= S_IWGRP;
- if(octal & 00010) mode |= S_IXGRP;
- if(octal & 00004) mode |= S_IROTH;
- if(octal & 00002) mode |= S_IWOTH;
- if(octal & 00001) mode |= S_IXOTH;
- return;
- }
- for(p = str; *p; p++)
- switch(*p) {
- /* masks */
- case 'u':
- mask |= S_IRWXU;
- break;
- case 'g':
- mask |= S_IRWXG;
- break;
- case 'o':
- mask |= S_IRWXO;
- break;
- case 'a':
- mask |= S_IRWXU|S_IRWXG|S_IRWXO;
- break;
- /* opers */
- case '+':
- case '-':
- case '=':
- oper = *p;
- break;
- /* modes */
- case 'r':
- mode |= S_IRUSR|S_IRGRP|S_IROTH;
- break;
- case 'w':
- mode |= S_IWUSR|S_IWGRP|S_IWOTH;
- break;
- case 'x':
- mode |= S_IXUSR|S_IXGRP|S_IXOTH;
- break;
- case 's':
- mode |= S_ISUID|S_ISGID;
- break;
- case 't':
- mode |= S_ISVTX;
- break;
- /* error */
- default:
- eprintf("%s: invalid mode\n", str);
- }
- if(mask)
- mode &= mask;
-}
diff --git a/util.h b/util.h
@@ -1,5 +1,6 @@
/* See LICENSE file for copyright and license details. */
#include <stddef.h>
+#include <sys/stat.h>
#include "arg.h"
#define UTF8_POINT(c) (((c) & 0xc0) != 0x80)
@@ -25,3 +26,5 @@ size_t strlcat(char *, const char *, size_t);
#undef strlcpy
size_t strlcpy(char *, const char *, size_t);
void weprintf(const char *, ...);
+
+void parsemode(const char *, mode_t *, int *);
diff --git a/util/mode.c b/util/mode.c
@@ -0,0 +1,77 @@
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include "../util.h"
+
+void
+parsemode(const char *str, mode_t *mode, int *oper)
+{
+ char *end;
+ const char *p;
+ int octal;
+ mode_t mask = 0;
+
+ octal = strtol(str, &end, 8);
+ if(*end == '\0') {
+ if(octal < 0 || octal > 07777)
+ eprintf("%s: invalid mode\n", str);
+ if(octal & 04000) *mode |= S_ISUID;
+ if(octal & 02000) *mode |= S_ISGID;
+ if(octal & 01000) *mode |= S_ISVTX;
+ if(octal & 00400) *mode |= S_IRUSR;
+ if(octal & 00200) *mode |= S_IWUSR;
+ if(octal & 00100) *mode |= S_IXUSR;
+ if(octal & 00040) *mode |= S_IRGRP;
+ if(octal & 00020) *mode |= S_IWGRP;
+ if(octal & 00010) *mode |= S_IXGRP;
+ if(octal & 00004) *mode |= S_IROTH;
+ if(octal & 00002) *mode |= S_IWOTH;
+ if(octal & 00001) *mode |= S_IXOTH;
+ return;
+ }
+ for(p = str; *p; p++)
+ switch(*p) {
+ /* masks */
+ case 'u':
+ mask |= S_IRWXU;
+ break;
+ case 'g':
+ mask |= S_IRWXG;
+ break;
+ case 'o':
+ mask |= S_IRWXO;
+ break;
+ case 'a':
+ mask |= S_IRWXU|S_IRWXG|S_IRWXO;
+ break;
+ /* opers */
+ case '+':
+ case '-':
+ case '=':
+ if(oper)
+ *oper = (int)*p;
+ break;
+ /* modes */
+ case 'r':
+ *mode |= S_IRUSR|S_IRGRP|S_IROTH;
+ break;
+ case 'w':
+ *mode |= S_IWUSR|S_IWGRP|S_IWOTH;
+ break;
+ case 'x':
+ *mode |= S_IXUSR|S_IXGRP|S_IXOTH;
+ break;
+ case 's':
+ *mode |= S_ISUID|S_ISGID;
+ break;
+ case 't':
+ *mode |= S_ISVTX;
+ break;
+ /* error */
+ default:
+ eprintf("%s: invalid mode\n", str);
+ }
+ if(mask)
+ *mode &= mask;
+}
diff --git a/uudecode.c b/uudecode.c
@@ -12,7 +12,6 @@
static void uudecode(FILE *, FILE *);
static void parseheader(FILE *, const char *, const char *, mode_t *, char **);
-static void parsemode(const char *, mode_t *);
static FILE *parsefile(const char *);
static void
@@ -108,7 +107,7 @@ parseheader(FILE *fp, const char *s, const char *header, mode_t *mode, char **fn
eprintf("malformed mode string in header\n");
*q++ = '\0';
/* now mode should be null terminated, q points to fname */
- parsemode(p, mode);
+ parsemode(p, mode, NULL);
n = strlen(q);
while (n > 0 && (q[n - 1] == '\n' || q[n - 1] == '\r'))
q[--n] = '\0';
@@ -117,35 +116,6 @@ parseheader(FILE *fp, const char *s, const char *header, mode_t *mode, char **fn
}
static void
-parsemode(const char *str, mode_t *validmode)
-{
- char *end;
- int octal;
-
- if (str == NULL || str == '\0')
- eprintf("invalid mode\n");
- octal = strtol(str, &end, 8);
- if (*end == '\0') {
- if (octal >= 0 && octal <= 07777) {
- if(octal & 04000) *validmode |= S_ISUID;
- if(octal & 02000) *validmode |= S_ISGID;
- if(octal & 01000) *validmode |= S_ISVTX;
- if(octal & 00400) *validmode |= S_IRUSR;
- if(octal & 00200) *validmode |= S_IWUSR;
- if(octal & 00100) *validmode |= S_IXUSR;
- if(octal & 00040) *validmode |= S_IRGRP;
- if(octal & 00020) *validmode |= S_IWGRP;
- if(octal & 00010) *validmode |= S_IXGRP;
- if(octal & 00004) *validmode |= S_IROTH;
- if(octal & 00002) *validmode |= S_IWOTH;
- if(octal & 00001) *validmode |= S_IXOTH;
- } else {
- eprintf("invalid mode\n");
- }
- }
-}
-
-static void
uudecode(FILE *fp, FILE *outfp)
{
char *bufb = NULL, *p, *nl;