xref: /original-bsd/usr.sbin/chown/chgrp.c (revision 3708840b)
1 #ifndef lint
2 static	char *sccsid = "@(#)chgrp.c	4.6 83/05/10";
3 #endif
4 
5 /*
6  * chgrp gid file ...
7  */
8 
9 #include <stdio.h>
10 #include <ctype.h>
11 #include <sys/types.h>
12 #include <sys/stat.h>
13 #include <grp.h>
14 #include <pwd.h>
15 
16 struct	group *gr, *getgrnam(), *getgrgid();
17 struct	passwd *getpwuid(), *pwd;
18 struct	stat stbuf;
19 int	gid, uid;
20 int	status;
21 int	fflag;
22 /* VARARGS */
23 int	fprintf();
24 
25 main(argc, argv)
26 	int argc;
27 	char *argv[];
28 {
29 	register c, i;
30 
31 	argc--, argv++;
32 	if (argc > 0 && strcmp(argv[0], "-f") == 0) {
33 		fflag++;
34 		argv++, argc--;
35 	}
36 	if (argc < 2) {
37 		printf("usage: chgrp [-f] gid file ...\n");
38 		exit(2);
39 	}
40 	uid = getuid();
41 	if (isnumber(argv[0])) {
42 		gid = atoi(argv[0]);
43 		gr = getgrgid(gid);
44 		if (uid && gr == NULL) {
45 			printf("%s: unknown group\n", argv[0]);
46 			exit(2);
47 		}
48 	} else {
49 		gr = getgrnam(argv[0]);
50 		if (gr == NULL) {
51 			printf("%s: unknown group\n", argv[0]);
52 			exit(2);
53 		}
54 		gid = gr->gr_gid;
55 	}
56 	pwd = getpwuid(uid);
57 	if (pwd == NULL) {
58 		fprintf(stderr, "Who are you?\n");
59 		exit(2);
60 	}
61 	if (uid && pwd->pw_gid != gid) {
62 		for (i=0; gr->gr_mem[i]; i++)
63 			if (!(strcmp(pwd->pw_name, gr->gr_mem[i])))
64 				goto ok;
65 		if (fflag)
66 			exit(0);
67 		fprintf(stderr, "You are not a member of the %s group.\n",
68 		    argv[0]);
69 		exit(2);
70 	}
71 ok:
72 	for (c = 1; c < argc; c++) {
73 		if (stat(argv[c], &stbuf)) {
74 			perror(argv[c]);
75 			continue;
76 		}
77 		if (uid && uid != stbuf.st_uid) {
78 			if (fflag)
79 				continue;
80 			fprintf(stderr, "You are not the owner of %s\n",
81 			    argv[c]);
82 			status = 1;
83 			continue;
84 		}
85 		if (chown(argv[c], stbuf.st_uid, gid) && !fflag)
86 			perror(argv[c]);
87 	}
88 	exit(status);
89 }
90 
91 isnumber(s)
92 	char *s;
93 {
94 	register int c;
95 
96 	while (c = *s++)
97 		if (!isdigit(c))
98 			return (0);
99 	return (1);
100 }
101