summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-08-05 11:01:32 -0400
committerJakob Kaivo <jkk@ung.org>2019-08-05 11:01:32 -0400
commit7a01cc6e4e52a1fc1a70e211a7037963ac9abc98 (patch)
treec90564a7825a28f59d08bdf058d6571cff08faca
parenta135b5aef1f28ffe400504406da99c9db3e0fc6b (diff)
prep for recursive execution
-rw-r--r--chgrp.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/chgrp.c b/chgrp.c
index 62fcf57..80fdb7f 100644
--- a/chgrp.c
+++ b/chgrp.c
@@ -24,6 +24,7 @@
#define _XOPEN_SOURCE 700
#include <errno.h>
+#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -31,17 +32,19 @@
#include <sys/stat.h>
#include <unistd.h>
-#define FOLLOWCOMMANDLINE (1)
-#define FOLLOWRECURSIVE (2)
-#define NOFOLLOW (3)
+static int newgid = 0;
+static int retval = 0;
+static enum { UNSET, COMMANDLINE, RECURSIVE, NONE } follow = UNSET;
-static int chgrp(gid_t gid, const char *path, int flag)
+int chgrp(const char *p, const struct stat *st, int typeflag, struct FTW *f)
{
- (void)flag;
- if (chown(path, (uid_t)-1, gid) == -1) {
- fprintf(stderr, "chgrp: Couldn't change group of %s: %s\n", path, strerror(errno));
- return 1;
+ (void)st; (void)typeflag; (void)f;
+
+ if (chown(p, (uid_t)-1, newgid) == -1) {
+ fprintf(stderr, "chgrp: %s: %s\n", p, strerror(errno));
+ retval = 1;
}
+
return 0;
}
@@ -61,9 +64,8 @@ static gid_t strtogid(const char *s)
int main(int argc, char **argv)
{
- int c = 0, r = 0;
+ int c = 0;
int changelink = 0;
- int flag = 0;
int recursive = 0;
while ((c = getopt(argc, argv, "hHLPR")) != -1) {
@@ -73,15 +75,15 @@ int main(int argc, char **argv)
break;
case 'H':
- flag = FOLLOWCOMMANDLINE;
+ follow = COMMANDLINE;
break;
case 'L':
- flag = FOLLOWRECURSIVE;
+ follow = RECURSIVE;
break;
case 'P':
- flag = NOFOLLOW;
+ follow = NONE;
break;
case 'R':
@@ -103,11 +105,11 @@ int main(int argc, char **argv)
return 1;
}
- gid_t gid = strtogid(argv[optind++]);
+ newgid = strtogid(argv[optind++]);
while (optind < argc) {
- r |= chgrp(gid, argv[optind++], flag);
+ chgrp(argv[optind++], NULL, 0, NULL);
}
- return r;
+ return retval;
}