oops, must pushl after calling uudma
[unix-history] / usr / src / usr.sbin / chown / chgrp.c
CommitLineData
5f0e98a5 1#ifndef lint
780a0dc2 2static char *sccsid = "@(#)chgrp.c 4.6 83/05/10";
5f0e98a5
BJ
3#endif
4
de68ad37
BJ
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>
85f1f03c 14#include <pwd.h>
de68ad37 15
5f0e98a5
BJ
16struct group *gr, *getgrnam(), *getgrgid();
17struct passwd *getpwuid(), *pwd;
18struct stat stbuf;
85f1f03c 19int gid, uid;
de68ad37 20int status;
8788247f 21int fflag;
5f0e98a5
BJ
22/* VARARGS */
23int fprintf();
de68ad37
BJ
24
25main(argc, argv)
5f0e98a5
BJ
26 int argc;
27 char *argv[];
de68ad37 28{
85f1f03c 29 register c, i;
de68ad37 30
5f0e98a5 31 argc--, argv++;
8788247f
RC
32 if (argc > 0 && strcmp(argv[0], "-f") == 0) {
33 fflag++;
34 argv++, argc--;
35 }
5f0e98a5 36 if (argc < 2) {
8788247f 37 printf("usage: chgrp [-f] gid file ...\n");
5f0e98a5 38 exit(2);
de68ad37 39 }
85f1f03c 40 uid = getuid();
5f0e98a5 41 if (isnumber(argv[0])) {
77d4d541 42 gid = atoi(argv[0]);
5f0e98a5
BJ
43 gr = getgrgid(gid);
44 if (uid && gr == NULL) {
45 printf("%s: unknown group\n", argv[0]);
46 exit(2);
85f1f03c 47 }
de68ad37 48 } else {
5f0e98a5
BJ
49 gr = getgrnam(argv[0]);
50 if (gr == NULL) {
51 printf("%s: unknown group\n", argv[0]);
52 exit(2);
de68ad37
BJ
53 }
54 gid = gr->gr_gid;
55 }
5f0e98a5
BJ
56 pwd = getpwuid(uid);
57 if (pwd == NULL) {
58 fprintf(stderr, "Who are you?\n");
59 exit(2);
85f1f03c 60 }
5f0e98a5
BJ
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;
8788247f
RC
65 if (fflag)
66 exit(0);
5f0e98a5
BJ
67 fprintf(stderr, "You are not a member of the %s group.\n",
68 argv[0]);
69 exit(2);
85f1f03c 70 }
5f0e98a5
BJ
71ok:
72 for (c = 1; c < argc; c++) {
73 if (stat(argv[c], &stbuf)) {
74 perror(argv[c]);
75 continue;
76 }
85f1f03c 77 if (uid && uid != stbuf.st_uid) {
8788247f
RC
78 if (fflag)
79 continue;
5f0e98a5
BJ
80 fprintf(stderr, "You are not the owner of %s\n",
81 argv[c]);
de68ad37 82 status = 1;
5f0e98a5
BJ
83 continue;
84 }
780a0dc2 85 if (chown(argv[c], stbuf.st_uid, gid) && !fflag)
5f0e98a5 86 perror(argv[c]);
de68ad37
BJ
87 }
88 exit(status);
89}
90
91isnumber(s)
5f0e98a5 92 char *s;
de68ad37 93{
5f0e98a5 94 register int c;
de68ad37 95
5f0e98a5
BJ
96 while (c = *s++)
97 if (!isdigit(c))
98 return (0);
99 return (1);
de68ad37 100}