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