|
|
1.1 ! root 1: /* ! 2: * chown uid[,gid] file ... ! 3: */ ! 4: ! 5: #include <stdio.h> ! 6: #include <ctype.h> ! 7: #include <sys/types.h> ! 8: #include <sys/stat.h> ! 9: #include <pwd.h> ! 10: #include <grp.h> ! 11: ! 12: int uid, gid; ! 13: int nouid, nogid; ! 14: ! 15: main (argc, argv) ! 16: char *argv[]; ! 17: { ! 18: register c; ! 19: int status; ! 20: struct stat stbuf; ! 21: int u, g; ! 22: ! 23: if (argc < 3) { ! 24: printf("usage: chown uid[,gid] file ...\n"); ! 25: exit(4); ! 26: } ! 27: uidgid(argv[1]); ! 28: for(c=2; c<argc; c++) { ! 29: if (stat(argv[c], &stbuf) < 0) { ! 30: perror(argv[c]); ! 31: status = 1; ! 32: continue; ! 33: } ! 34: u = nouid ? stbuf.st_uid : uid; ! 35: g = nogid ? stbuf.st_gid : gid; ! 36: if(chown(argv[c], u, g) < 0) { ! 37: perror(argv[c]); ! 38: status = 1; ! 39: } ! 40: } ! 41: exit(status); ! 42: } ! 43: ! 44: uidgid(ug) ! 45: char *ug; ! 46: { ! 47: char *g; ! 48: struct passwd *pwd; ! 49: struct group *grp; ! 50: char *strchr(); ! 51: struct passwd *getpwnam(); ! 52: struct group *getgrnam(); ! 53: ! 54: if ((g = strchr(ug, ',')) != NULL) ! 55: *g++ = '\0'; ! 56: if (*ug == '\0') ! 57: nouid++; ! 58: else if (isnumber(ug)) ! 59: uid = atoi(ug); ! 60: else if ((pwd = getpwnam(ug)) != NULL) ! 61: uid = pwd->pw_uid; ! 62: else { ! 63: fprintf(stderr, "unknown user id: %s\n", ug); ! 64: exit(4); ! 65: } ! 66: if (g == NULL || *g == '\0') ! 67: nogid++; ! 68: else if (isnumber(g)) ! 69: gid = atoi(g); ! 70: else if ((grp = getgrnam(g)) != NULL) ! 71: gid = grp->gr_gid; ! 72: else { ! 73: fprintf(stderr, "unknown group id: %s\n", g); ! 74: exit(4); ! 75: } ! 76: } ! 77: ! 78: isnumber(s) ! 79: char *s; ! 80: { ! 81: register c; ! 82: ! 83: while(c = *s++) ! 84: if(!isdigit(c)) ! 85: return(0); ! 86: return(1); ! 87: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.