7 #define A(x) (U(x)|G(x)|O(x))
9 #define DMRWE (DMREAD|DMWRITE|DMEXEC)
11 int parsemode(char *, ulong *, ulong *);
14 main(int argc, char *argv[])
22 fprint(2, "usage: chmod 0777 file ... or chmod [who]op[rwxalt] file ...\n");
25 mode = strtol(argv[1], &p, 8);
28 else if(!parsemode(argv[1], &mask, &mode)){
29 fprint(2, "chmod: bad mode: %s\n", argv[1]);
33 for(i=2; i<argc; i++){
34 dir = dirstat(argv[i]);
36 fprint(2, "chmod: can't stat %s: %r\n", argv[i]);
39 ndir.mode = (dir->mode & ~mask) | (mode & mask);
41 if(dirwstat(argv[i], &ndir)==-1){
42 fprint(2, "chmod: can't wstat %s: %r\n", argv[i]);
50 parsemode(char *spec, ulong *pmask, ulong *pmode)
57 mask = DMAPPEND | DMEXCL | DMTMP;
61 mask |= U(DMRWE); break;
63 mask |= G(DMRWE); break;
65 mask |= O(DMRWE); break;
67 mask |= A(DMRWE); break;
79 if(op != '+' && op != '-' && op != '=')
85 mode |= A(DMREAD); break;
87 mode |= A(DMWRITE); break;
89 mode |= A(DMEXEC); break;
91 mode |= DMAPPEND; break;
93 mode |= DMEXCL; break;
102 if(op == '+' || op == '-')