Commit | Line | Data |
---|---|---|
5f0e98a5 | 1 | #ifndef lint |
780a0dc2 | 2 | static 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 |
16 | struct group *gr, *getgrnam(), *getgrgid(); |
17 | struct passwd *getpwuid(), *pwd; | |
18 | struct stat stbuf; | |
85f1f03c | 19 | int gid, uid; |
de68ad37 | 20 | int status; |
8788247f | 21 | int fflag; |
5f0e98a5 BJ |
22 | /* VARARGS */ |
23 | int fprintf(); | |
de68ad37 BJ |
24 | |
25 | main(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 |
71 | ok: |
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 | ||
91 | isnumber(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 | } |