xref: /original-bsd/usr.sbin/chown/chgrp.c (revision c05f5e42)
1 static	char *sccsid = "@(#)chgrp.c	4.2 82/03/05";
2 /*
3  * chgrp gid file ...
4  */
5 
6 #include <stdio.h>
7 #include <ctype.h>
8 #include <sys/types.h>
9 #include <sys/stat.h>
10 #include <grp.h>
11 #include <pwd.h>
12 
13 struct	group	*gr, *getgrnam(), *getgrgid();
14 struct passwd *getpwuid(), *pwd;
15 struct	stat	stbuf;
16 int	gid, uid;
17 int	status;
18 char	ingroup;
19 
20 main(argc, argv)
21 char *argv[];
22 {
23 	register c, i;
24 	char	*getlogin(), *name;
25 
26 	if(argc < 3) {
27 		printf("usage: chgrp gid file ...\n");
28 		exit(4);
29 	}
30 	uid = getuid();
31 	if(isnumber(argv[1])) {
32 		gid = atoi(argv[1]);
33 		if (uid && (gr=getgrgid(gid)) == NULL) {
34 			printf("unknown group: %s\n",argv[1]);
35 			exit(4);
36 		}
37 	} else {
38 		if((gr=getgrnam(argv[1])) == NULL) {
39 			printf("unknown group: %s\n",argv[1]);
40 			exit(4);
41 		}
42 		gid = gr->gr_gid;
43 	}
44 	if (!(name = getlogin())) {
45 		pwd = getpwuid(uid);
46 		name = pwd->pw_name;
47 	}
48 	for (i=0; uid && gr->gr_mem[i]; i++)
49 		if (!(strcmp(name, gr->gr_mem[i])))
50 			ingroup = 1;
51 	if (!ingroup && uid) {
52 		printf("illegal group: %s\n",argv[1]);
53 		exit(4);
54 	}
55 	for(c=2; c<argc; c++) {
56 		stat(argv[c], &stbuf);
57 		if (uid && uid != stbuf.st_uid) {
58 			printf("%s: not owner\n", argv[c]);
59 			status = 1;
60 		} else
61 			chown(argv[c], stbuf.st_uid, gid);
62 	}
63 	exit(status);
64 }
65 
66 isnumber(s)
67 char *s;
68 {
69 	register c;
70 
71 	while(c = *s++)
72 		if(!isdigit(c))
73 			return(0);
74 	return(1);
75 }
76 
77 
78