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