|
|
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: status = 0;
29: for(c=2; c<argc; c++) {
30: if (stat(argv[c], &stbuf) < 0) {
31: perror(argv[c]);
32: status = 1;
33: continue;
34: }
35: u = nouid ? stbuf.st_uid : uid;
36: g = nogid ? stbuf.st_gid : gid;
37: if(u == stbuf.st_uid && g == stbuf.st_gid)
38: ;
39: else if(chown(argv[c], u, g) < 0) {
40: perror(argv[c]);
41: status = 1;
42: }
43: }
44: exit(status);
45: }
46:
47: uidgid(ug)
48: char *ug;
49: {
50: char *g;
51: struct passwd *pwd;
52: struct group *grp;
53: char *strchr();
54: struct passwd *getpwnam();
55: struct group *getgrnam();
56:
57: if ((g = strchr(ug, ',')) != NULL)
58: *g++ = '\0';
59: if (*ug == '\0')
60: nouid++;
61: else if (isnumber(ug))
62: uid = atoi(ug);
63: else if ((pwd = getpwnam(ug)) != NULL)
64: uid = pwd->pw_uid;
65: else {
66: fprintf(stderr, "unknown user id: %s\n", ug);
67: exit(4);
68: }
69: if (g == NULL || *g == '\0')
70: nogid++;
71: else if (isnumber(g))
72: gid = atoi(g);
73: else if ((grp = getgrnam(g)) != NULL)
74: gid = grp->gr_gid;
75: else {
76: fprintf(stderr, "unknown group id: %s\n", g);
77: exit(4);
78: }
79: }
80:
81: isnumber(s)
82: char *s;
83: {
84: register c;
85:
86: if(*s == '-') s++;
87: while(c = *s++)
88: if(!isdigit(c))
89: return(0);
90: return(1);
91: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.