Path: utzoo!utgpu!jarvis.csri.toronto.edu!rutgers!iuvax!silver!regoli From: regoli@silver.bacs.indiana.edu (michael regoli) Newsgroups: alt.sources Subject: chmode.c (was Re: chmod args) Message-ID: <21508@iuvax.cs.indiana.edu> Date: 2 Jun 89 14:46:39 GMT Sender: root@iuvax.cs.indiana.edu Reply-To: regoli@silver.bacs.indiana.edu (michael regoli) Lines: 140 In article <1771@papaya.bbn.com> rsalz@bbn.com (Rich Salz) writes: | [ Note the follow-ups.] | | Why hasn't anyone written a chmod(1) that takes a bloody "rwsr-xr-x" string? | /r$ | -- | Please send comp.sources.unix-related mail to rsalz@uunet.uu.net. ][ here's something i found lying around that does exactly that (well, almost--but it's a start). if an industrious soul wants to make improvements to allow more than any combination of "rwxrwxrwx" (e.g., "rwsr-xr-x") the patches would be most appreciated. please post your patches here. or rewrite the whole damn thing. -- michael regoli regoli@iubacs.bitnet regoli@sivler.bacs.indiana.edu ...rutgers!iuvax!silver!regoli -- /* * * CHMODE.C * * New version of the chmod program: accepts inputs of the * same format as given by the ls -l command, ie it can * be invoked like 'chmode rwxrw-r-- *' to make the modes * of each file specified match the template! * * If automatic aggregate initialization is available, * compile with: * * cc -Dauto chmode.c -o chmode * * otherwise use: * * cc chmode.c -o chmode * */ #include #include #define ERROR -1 #define O_RD 256 /** 400 octal **/ #define O_WR 128 /** 200 octal **/ #define O_EX 64 /** 100 octal **/ #define G_RD 32 /** 40 octal **/ #define G_WR 16 /** 20 octal **/ #define G_EX 8 /** 10 octal **/ #define E_RD 4 #define E_WR 2 #define E_EX 1 main(argc, argv) int argc; char *argv[]; { register int newmode; register int j; char buffer[16]; if (argc < 3) exit(printf("Usage: %s \n",argv[0])); --argc; newmode = 0; j = 1; strncpy(buffer,argv[j++], 9); if (strlen(buffer) != 9) exit(printf("Usage: %s <9 char graphic mode> \n",argv[0])); /** lets figure out the graphic mode translation! **/ if ((newmode = translate(buffer)) == ERROR) { printf("Bad graphic mode designator! Please use 'rwxrwxrwx' as a template, \n"); printf("indicating those accesses that you desire to prevent with a dash\n"); printf(" For example: 'chmode rw-r--r-- test.c'\n"); exit(1); } while (--argc > 0) chmod(argv[j++], newmode); } int translate(buffer) char buffer[]; { /** translate a graphic representation of file access to an equivalent number as defined in CHMOD(2) **/ register int loc = 0, sum = 0, val; #ifdef auto char type[] = "rwxrwxrwx"; int mode[] = { O_RD, O_WR, O_EX, G_RD, G_WR, G_EX, E_RD, E_WR, E_EX }; #else char type[9]; int mode[9]; mode[0] = O_RD; mode[1] = O_WR; mode[2] = O_EX; mode[3] = G_RD; mode[4] = G_WR; mode[5] = G_EX; mode[6] = E_RD; mode[7] = E_WR; mode[8] = E_EX; strcpy(type,"rwxrwxrwx"); #endif for (loc = 0; loc < 9; loc++) if ((val = check(buffer[loc], type[loc], mode[loc])) == ERROR) return(ERROR); else sum += val; return(sum); } int check(ch, type, mask) char ch; int mask; { /** check to see if ch is either type or '-', returning either mask or ERROR **/ if (ch == type) return(mask); else if (ch == '-') return(0); else return(ERROR); } /* * CHMODE.C: Finis. */