SCCS-vsn: bin/chmod/chmod.c 4.5
-static char *sccsid = "@(#)chmod.c 4.4 %G%";
+static char *sccsid = "@(#)chmod.c 4.5 %G%";
/*
* chmod options mode files
* where
/*
* chmod options mode files
* where
- * mode is [ugoa][+-=][rwxstugo] or a octal number
+ * mode is [ugoa][+-=][rwxXstugo] or a octal number
* options are -R
*/
#include <stdio.h>
* options are -R
*/
#include <stdio.h>
char *modestring, *ms;
int um;
int status;
char *modestring, *ms;
int um;
int status;
-int rflag, debug, Xflag;
main(argc,argv)
char **argv;
main(argc,argv)
char **argv;
register char *p, *flags;
struct stat st;
register char *p, *flags;
struct stat st;
if (argc < 3) {
fprintf(stderr
if (argc < 3) {
fprintf(stderr
- ,"Usage: chmod [-RX] [ugoa][+-=][rwxstugo] file ...\n");
+ ,"Usage: chmod [-R] [ugoa][+-=][rwxXstugo] file ...\n");
switch (*flags) {
case '-': break;
case 'R': rflag++; break;
switch (*flags) {
case '-': break;
case 'R': rflag++; break;
- case 'X': Xflag++; break;
+ default: argc = 0; goto usage;
chmodr(dir, mode)
char *dir;
{
chmodr(dir, mode)
char *dir;
{
-#define CHECK(name,sbuf)\
- if (stat(name, sbuf) < 0) {\
- fprintf(stderr, "chmod: can't access %s\n", dp->d_name);\
- return(1);\
- }
-
register DIR *dirp;
register struct direct *dp;
register struct stat st;
register DIR *dirp;
register struct direct *dp;
register struct stat st;
dp = readdir(dirp);
dp = readdir(dirp); /* read "." and ".." */
for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
dp = readdir(dirp);
dp = readdir(dirp); /* read "." and ".." */
for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
- CHECK(dp->d_name, &st);
+ if (stat(dp->d_name, &st) < 0) {
+ fprintf(stderr, "chmod: can't access %s\n", dp->d_name);
+ return(1);
+ }
chmod(dp->d_name, newmode(st.st_mode));
if (st.st_mode & S_IFDIR)
chmodr(dp->d_name, mode);
chmod(dp->d_name, newmode(st.st_mode));
if (st.st_mode & S_IFDIR)
chmodr(dp->d_name, mode);
ms = modestring;
savem = nm;
m = abs();
ms = modestring;
savem = nm;
m = abs();
- if (!*ms) {
- nm = m;
- goto ret;
- }
do {
m = who();
while (o = what()) {
do {
m = who();
while (o = what()) {
fprintf(stderr, "chmod: invalid mode\n");
exit(255);
}
fprintf(stderr, "chmod: invalid mode\n");
exit(255);
}
-ret:
- if (Xflag && ((savem & S_IFDIR) || (savem & S_IEXEC)))
- nm = nm | ((nm & 0444) >> 2);
m |= EXEC;
continue;
case 'X':
m |= EXEC;
continue;
case 'X':
+ if ((om & S_IFDIR) || (om & EXEC))
+ m |= EXEC;
continue;
case 's':
m |= SETID;
continue;
case 's':
m |= SETID;