948 chmod(1M) is not -R friendly when doing ACLs
authorYuri Pankov <yuri.pankov@gmail.com>
Thu, 12 May 2011 03:41:48 +0400
changeset 13369 e294a7201085
parent 13368 7a14691acba0
child 13370 8c04143bd318
948 chmod(1M) is not -R friendly when doing ACLs Reviewed by: Jason King <[email protected]> Reviewed by: Garrett D'Amore <[email protected]> Reviewed by: Albert Lee <[email protected]> Approved by: Gordon Ross <[email protected]>
usr/src/cmd/chmod/chmod.c
--- a/usr/src/cmd/chmod/chmod.c	Wed Apr 27 17:08:10 2011 -0400
+++ b/usr/src/cmd/chmod/chmod.c	Thu May 12 03:41:48 2011 +0400
@@ -20,6 +20,7 @@
  */
 /*
  * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
  */
 
 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T			*/
@@ -450,7 +451,7 @@
 	va_start(ap, format);
 
 	/*
-	 * Always print error message if this is a fatal error (code == 0);
+	 * Always print error message if this is a fatal error (code != 0);
 	 * otherwise, print message if fflag == 0 (no -f option specified)
 	 */
 	if (!fflag || (code != 0)) {
@@ -729,14 +730,14 @@
 	error = acl_get(file, 0, &aclp);
 
 	if (error != 0) {
-		errmsg(1, 1, "%s\n", acl_strerror(error));
+		errmsg(1, 0, "%s\n", acl_strerror(error));
 		return (1);
 	}
 	switch (acl_args->acl_action) {
 	case ACL_ADD:
 		if ((error = acl_addentries(aclp,
 		    acl_args->acl_aclp, acl_args->acl_slot)) != 0) {
-			errmsg(1, 1, "%s\n", acl_strerror(error));
+			errmsg(1, 0, "%s\n", acl_strerror(error));
 			acl_free(aclp);
 			return (1);
 		}
@@ -744,14 +745,14 @@
 		break;
 	case ACL_SLOT_DELETE:
 		if (acl_args->acl_slot + 1 > aclp->acl_cnt) {
-			errmsg(1, 1,
+			errmsg(1, 0,
 			    gettext("Invalid slot specified for removal\n"));
 			acl_free(aclp);
 			return (1);
 		}
 
 		if (acl_args->acl_slot == 0 && aclp->acl_cnt == 1) {
-			errmsg(1, 1,
+			errmsg(1, 0,
 			    gettext("Can't remove all ACL "
 			    "entries from a file\n"));
 			acl_free(aclp);
@@ -781,13 +782,13 @@
 	case ACL_DELETE:
 		if ((error = acl_removeentries(aclp, acl_args->acl_aclp,
 		    acl_args->acl_slot, ACL_REMOVE_ALL)) != 0) {
-			errmsg(1, 1, "%s\n", acl_strerror(error));
+			errmsg(1, 0, "%s\n", acl_strerror(error));
 			acl_free(aclp);
 			return (1);
 		}
 
 		if (aclp->acl_cnt == 0) {
-			errmsg(1, 1,
+			errmsg(1, 0,
 			    gettext("Can't remove all ACL "
 			    "entries from a file\n"));
 			acl_free(aclp);
@@ -801,7 +802,7 @@
 			error = acl_modifyentries(aclp, acl_args->acl_aclp,
 			    acl_args->acl_slot);
 			if (error) {
-				errmsg(1, 1, "%s\n", acl_strerror(error));
+				errmsg(1, 0, "%s\n", acl_strerror(error));
 				acl_free(aclp);
 				return (1);
 			}
@@ -813,24 +814,23 @@
 	case ACL_STRIP:
 		error = acl_strip(file, st->st_uid, st->st_gid, st->st_mode);
 		if (error) {
-			errmsg(1, 1, "%s\n", acl_strerror(error));
+			errmsg(1, 0, "%s\n", acl_strerror(error));
+			acl_free(aclp);
 			return (1);
 		}
 		acl_free(aclp);
 		return (0);
 		/*NOTREACHED*/
 	default:
-		errmsg(1, 0, gettext("Unknown ACL action requested\n"));
-		return (1);
-		break;
+		errmsg(1, 2, gettext("Unknown ACL action requested\n"));
+		/*NOTREACHED*/
 	}
 	error = acl_check(set_aclp, isdir);
 
 	if (error) {
-		errmsg(1, 0, "%s\n%s", acl_strerror(error),
+		errmsg(1, 2, "%s\n%s", acl_strerror(error),
 		    gettext("See chmod(1) for more information on "
 		    "valid ACL syntax\n"));
-		return (1);
 	}
 	if ((error = acl_set(file, set_aclp)) != 0) {
 			errmsg(1, 0, gettext("Failed to set ACL: %s\n"),