]> git.saurik.com Git - apple/file_cmds.git/blobdiff - chmod/chmod.c
file_cmds-264.50.1.tar.gz
[apple/file_cmds.git] / chmod / chmod.c
index 78013406f1b088781c556b2a25ade47f5e0c052b..442815d4916aea55b8f492471ebefa6e4e064947 100644 (file)
@@ -31,8 +31,9 @@
  * SUCH DAMAGE.
  */
 
+#include <sys/cdefs.h>
 #ifndef lint
-static char const copyright[] =
+__used static char const copyright[] =
 "@(#) Copyright (c) 1989, 1993, 1994\n\
        The Regents of the University of California.  All rights reserved.\n";
 #endif /* not lint */
@@ -75,21 +76,24 @@ 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
@@ -99,13 +103,16 @@ main(int argc, char *argv[])
                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;
@@ -131,8 +138,8 @@ main(int argc, char *argv[])
                                --optind;
                        goto done;
                case 'A':
-                       acloptflags |= ACL_FLAG | ACL_TO_STDOUT;
-                       ace_arg_not_required = 1;
+//                     acloptflags |= ACL_FLAG | ACL_TO_STDOUT;
+//                     ace_arg_not_required = 1;
                        errx(1, "-A not implemented");
                        goto done;
                case 'E':
@@ -158,8 +165,8 @@ main(int argc, char *argv[])
                        ace_arg_not_required = 1;
                        goto done;
                case 'V':
-                       acloptflags |= ACL_FLAG | ACL_INVOKE_EDITOR;
-                       ace_arg_not_required = 1;
+//                     acloptflags |= ACL_FLAG | ACL_INVOKE_EDITOR;
+//                     ace_arg_not_required = 1;
                        errx(1, "-V not implemented");
                        goto done;
 #endif /* __APPLE__ */
@@ -189,10 +196,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')) {
@@ -233,7 +242,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;
 
@@ -246,7 +255,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;
@@ -283,7 +292,8 @@ apnoacl:
                change_mode = chmod;
 #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);
                
@@ -297,7 +307,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;
@@ -321,8 +331,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);
                        }
                }
        }
@@ -385,7 +394,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 {
@@ -394,7 +403,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) {
@@ -440,7 +449,7 @@ usage(void)
 #ifdef __APPLE__
        (void)fprintf(stderr,
                      "usage:\tchmod [-fhv] [-R [-H | -L | -P]] [-a | +a | =a  [i][# [ n]]] mode|entry file ...\n"
-                     "\tchmod [-fhv] [-R [-H | -L | -P]] [-E | -C | -i | -I] file ...\n"); /* add -A and -V when implemented */
+                     "\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");