|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.