]> git.saurik.com Git - apple/file_cmds.git/blobdiff - chmod/chmod.c
file_cmds-230.tar.gz
[apple/file_cmds.git] / chmod / chmod.c
index 8651176b6a1a93cadeb4bca043785da9a17b512d..a4ab0357b9fc5cf7ad7de42c006b4f1a6e172c12 100644 (file)
@@ -75,37 +75,43 @@ main(int argc, char *argv[])
        mode_t *set = NULL;
        long val = 0;
        int oct = 0;
-       int Hflag, Lflag, Rflag, ch, fts_options, hflag, rval;
+       int Hflag, Lflag, Pflag, Rflag, ch, fts_options, hflag, rval;
        int vflag;
        char *ep, *mode;
        mode_t newmode, omode;
 #ifdef __APPLE__
        unsigned int acloptflags = 0;
-       int aclpos = -1, inheritance_level = 0;
-       int index = 0, acloptlen = 0, ace_arg_not_required = 0;
+       long aclpos = -1;
+       int inheritance_level = 0;
+       int index = 0;
+       size_t acloptlen = 0;
+       int ace_arg_not_required = 0;
        acl_t acl_input = NULL;
 #endif /* __APPLE__*/
        int (*change_mode)(const char *, mode_t);
 
        set = NULL;
        omode = 0;
-       Hflag = Lflag = Rflag = fflag = hflag = vflag = 0;
+       Hflag = Lflag = Pflag = Rflag = fflag = hflag = vflag = 0;
 #ifndef __APPLE__
        while ((ch = getopt(argc, argv, "HLPRXfghorstuvwx")) != -1)
 #else
-       while ((ch = getopt(argc, argv, "ACEHILPRVXafginorstuvwx")) != -1)
+       while ((ch = getopt(argc, argv, "ACEHILNPRVXafghinorstuvwx")) != -1)
 #endif
                switch (ch) {
                case 'H':
                        Hflag = 1;
                        Lflag = 0;
+                       Pflag = 0;
                        break;
                case 'L':
                        Lflag = 1;
                        Hflag = 0;
+                       Pflag = 0;
                        break;
                case 'P':
                        Hflag = Lflag = 0;
+                       Pflag = 1;
                        break;
                case 'R':
                        Rflag = 1;
@@ -113,7 +119,6 @@ main(int argc, char *argv[])
                case 'f':
                        fflag = 1;
                        break;
-#ifndef __APPLE__
                case 'h':
                        /*
                         * In System V (and probably POSIX.2) the -h option
@@ -125,12 +130,17 @@ main(int argc, char *argv[])
                         */
                        hflag = 1;
                        break;
-#else
+#ifdef __APPLE__
                case 'a':
                        if (argv[optind - 1][0] == '-' &&
                            argv[optind - 1][1] == ch)
                                --optind;
                        goto done;
+               case 'A':
+//                     acloptflags |= ACL_FLAG | ACL_TO_STDOUT;
+//                     ace_arg_not_required = 1;
+                       errx(1, "-A not implemented");
+                       goto done;
                case 'E':
                        acloptflags |= ACL_FLAG | ACL_FROM_STDIN;
                        goto done;
@@ -149,10 +159,15 @@ main(int argc, char *argv[])
                case 'n':
                        acloptflags |= ACL_FLAG | ACL_NO_TRANSLATE;
                        break;
-               case 'V':
-                       acloptflags |= ACL_FLAG | ACL_INVOKE_EDITOR;
+               case 'N':
+                       acloptflags |= ACL_FLAG | ACL_CLEAR_FLAG;
                        ace_arg_not_required = 1;
                        goto done;
+               case 'V':
+//                     acloptflags |= ACL_FLAG | ACL_INVOKE_EDITOR;
+//                     ace_arg_not_required = 1;
+                       errx(1, "-V not implemented");
+                       goto done;
 #endif /* __APPLE__ */
                /*
                 * XXX
@@ -180,10 +195,12 @@ done:     argv += optind;
 #ifdef __APPLE__
        if (argc < ((acloptflags & ACL_FLAG) ? 1 : 2))
                usage();
-#else
+       if (!Rflag && (Hflag || Lflag || Pflag))
+               warnx("options -H, -L, -P only useful with -R");
+#else  /* !__APPLE__ */
        if (argc < 2)
                usage();
-#endif
+#endif /* __APPLE__ */
 
 #ifdef __APPLE__
        if (!(acloptflags & ACL_FLAG) && ((acloptlen = strlen(argv[0])) > 1) && (argv[0][1] == 'a')) {
@@ -224,7 +241,7 @@ done:       argv += optind;
                                            || aclpos < 0)
                                                errno = ERANGE;
                                        if (errno || *ep)
-                                               err(1, "Invalid ACL entry number: %s", aclpos);
+                                               errx(1, "Invalid ACL entry number: %ld", aclpos);
                                        if (acloptflags & ACL_DELETE_FLAG)
                                                ace_arg_not_required = 1;
 
@@ -237,7 +254,7 @@ done:       argv += optind;
                                         */
                                        inheritance_level++;
                                        if (inheritance_level > 1)
-                                               warn("Inheritance across more than one generation is not currently supported");
+                                               warnx("Inheritance across more than one generation is not currently supported");
                                        if (inheritance_level >= MAX_INHERITANCE_LEVEL)
                                                goto apdone;
                                        break;
@@ -268,17 +285,14 @@ apnoacl:
        } else
                fts_options = hflag ? FTS_PHYSICAL : FTS_LOGICAL;
 
-#ifndef __APPLE__
        if (hflag)
                change_mode = lchmod;
        else
                change_mode = chmod;
-#else
-       change_mode = chmod;
-#endif /* __APPLE__ */
 #ifdef __APPLE__
        if (acloptflags & ACL_FROM_STDIN) {
-               int readval = 0, readtotal = 0;
+               ssize_t readval = 0;
+               size_t readtotal = 0;
                
                mode = (char *) malloc(MAX_ACL_TEXT_SIZE);
                
@@ -292,7 +306,7 @@ apnoacl:
                } while ((readval > 0) && (readtotal <= MAX_ACL_TEXT_SIZE));
                        
                if (0 == readtotal)
-                       err(1, "-E specified, but read from STDIN failed");
+                       errx(1, "-E specified, but read from STDIN failed");
                else
                        mode[readtotal - 1] = '\0';
                --argv;
@@ -316,8 +330,7 @@ apnoacl:
                         /* Parse the text into an ACL*/
                        acl_input = parse_acl_entries(mode);
                        if (acl_input == NULL) {
-                               errno = EINVAL;
-                               err(1, "Invalid ACL specification: %s", mode);
+                               errx(1, "Invalid ACL specification: %s", mode);
                        }
                }
        }
@@ -346,16 +359,20 @@ apnoacl:
                err(1, "fts_open");
        for (rval = 0; (p = fts_read(ftsp)) != NULL;) {
                switch (p->fts_info) {
-               case FTS_D:                     /* Change it at FTS_DP. */
+               case FTS_D:
                        if (!Rflag)
-                               fts_set(ftsp, p, FTS_SKIP);
-                       continue;
+                               (void)fts_set(ftsp, p, FTS_SKIP);
+                       break;
                case FTS_DNR:                   /* Warn, chmod, continue. */
                        warnx("%s: %s", p->fts_path, strerror(p->fts_errno));
                        rval = 1;
                        break;
-               case FTS_ERR:                   /* Warn, continue. */
+               case FTS_DP:                    /* Already changed at FTS_D. */
+                       continue;
                case FTS_NS:
+                       if (acloptflags & ACL_FLAG) /* don't need stat for -N */
+                               break;
+               case FTS_ERR:                   /* Warn, continue. */
                        warnx("%s: %s", p->fts_path, strerror(p->fts_errno));
                        rval = 1;
                        continue;
@@ -376,7 +393,7 @@ apnoacl:
 #ifdef __APPLE__
 /* If an ACL manipulation option was specified, manipulate */
                if (acloptflags & ACL_FLAG)     {
-                       if (0 != modify_file_acl(acloptflags, p->fts_accpath, acl_input, aclpos, inheritance_level))
+                       if (0 != modify_file_acl(acloptflags, p->fts_accpath, acl_input, (int)aclpos, inheritance_level, !hflag))
                                rval = 1;
                }
                else {
@@ -385,7 +402,7 @@ apnoacl:
                        if ((newmode & ALLPERMS) == (p->fts_statp->st_mode & ALLPERMS))
                                continue;
                        if ((*change_mode)(p->fts_accpath, newmode) && !fflag) {
-                               warn("%s", p->fts_path);
+                               warn("Unable to change file mode on %s", p->fts_path);
                                rval = 1;
                        } else {
                                if (vflag) {
@@ -430,7 +447,8 @@ usage(void)
 {
 #ifdef __APPLE__
        (void)fprintf(stderr,
-           "usage: chmod [-fv] [-R [-H | -L | -P]] [-a | +a | =a  [i][# [ n]]] mode|entry file ...\n");
+                     "usage:\tchmod [-fhv] [-R [-H | -L | -P]] [-a | +a | =a  [i][# [ n]]] mode|entry file ...\n"
+                     "\tchmod [-fhv] [-R [-H | -L | -P]] [-E | -C | -N | -i | -I] file ...\n"); /* add -A and -V when implemented */
 #else
        (void)fprintf(stderr,
            "usage: chmod [-fhv] [-R [-H | -L | -P]] mode file ...\n");