Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 28 Jul 2008 21:52:31 GMT
From:      Edward Tomasz Napierala <trasz@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 146166 for review
Message-ID:  <200807282152.m6SLqVdK090765@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=146166

Change 146166 by trasz@trasz_traszkan on 2008/07/28 21:51:57

	Refactor _nfs4_acl_to_text_np() to make it easier to read.

Affected files ...

.. //depot/projects/soc2008/trasz_nfs4acl/TODO#18 edit
.. //depot/projects/soc2008/trasz_nfs4acl/lib/libc/posix1e/acl_support_nfs4.c#2 edit
.. //depot/projects/soc2008/trasz_nfs4acl/lib/libc/posix1e/acl_to_text_nfs4.c#6 edit

Differences ...

==== //depot/projects/soc2008/trasz_nfs4acl/TODO#18 (text+ko) ====

@@ -14,8 +14,6 @@
 
 - Update getfacl(1) and setfacl(1) manual pages.
 
-- Add error checking to acl_to_text_nfs4.c.
-
 - Either add or extend existing manual pages for new API routines:
   acl_add_flag_np, acl_clear_flags_np, acl_create_entry_np, acl_delete_entry_np,
   acl_delete_flag_np, acl_get_extended_np, acl_get_flag_np, acl_get_flagset_np,

==== //depot/projects/soc2008/trasz_nfs4acl/lib/libc/posix1e/acl_support_nfs4.c#2 (text+ko) ====

@@ -102,7 +102,7 @@
 		str[off] = '\0';
 	}
 
-	return (off);
+	return (0);
 }
 
 static int
@@ -121,7 +121,7 @@
 
 	str[i] = '\0';
 
-	return (i);
+	return (0);
 }
 
 static int

==== //depot/projects/soc2008/trasz_nfs4acl/lib/libc/posix1e/acl_to_text_nfs4.c#6 (text+ko) ====

@@ -55,7 +55,8 @@
 
 	switch (tag) {
 	case ACL_USER_OBJ:
-		return (snprintf(str, size, "owner@"));
+		snprintf(str, size, "owner@");
+		break;
 
 	case ACL_USER:
 		id = (id_t *)acl_get_qualifier(entry);
@@ -63,13 +64,14 @@
 		/* XXX: Thread-unsafe. */
 		pwd = getpwuid(*id);
 		if (pwd == NULL)
-			return (snprintf(str, size, "user:%d",
-			    (unsigned int)*id));
-
-		return (snprintf(str, size, "user:%s", pwd->pw_name));
+			snprintf(str, size, "user:%d", (unsigned int)*id);
+		else
+			snprintf(str, size, "user:%s", pwd->pw_name);
+		break;
 
 	case ACL_GROUP_OBJ:
-		return (snprintf(str, size, "group@"));
+		snprintf(str, size, "group@");
+		break;
 
 	case ACL_GROUP:
 		id = (id_t *)acl_get_qualifier(entry);
@@ -77,18 +79,21 @@
 		/* XXX: Thread-unsafe. */
 		grp = getgrgid(*id);
 		if (grp == NULL)
-			return (snprintf(str, size, "group:%d",
-			    (unsigned int)*id));
-
-		return (snprintf(str, size, "group:%s", grp->gr_name));
+			snprintf(str, size, "group:%d", (unsigned int)*id);
+		else
+			snprintf(str, size, "group:%s", grp->gr_name);
+		break;
 
 	case ACL_EVERYONE:
-		return (snprintf(str, size, "everyone@"));
+		snprintf(str, size, "everyone@");
+		break;
 
 	default:
 		assert(!"Tag?");
 		return (-1);
 	}
+
+	return (0);
 }
 
 static int
@@ -102,71 +107,84 @@
 
 	switch (extended) {
 	case ACL_EXTENDED_ALLOW:
-		return (snprintf(str, size, "allow"));
+		snprintf(str, size, "allow");
+		break;
 
 	case ACL_EXTENDED_DENY:
-		return (snprintf(str, size, "deny"));
+		snprintf(str, size, "deny");
+		break;
 
 	case ACL_EXTENDED_AUDIT:
-		return (snprintf(str, size, "audit"));
+		snprintf(str, size, "audit");
+		break;
 
 	case ACL_EXTENDED_ALARM:
-		return (snprintf(str, size, "alarm"));
+		snprintf(str, size, "alarm");
+		break;
 
 	default:
 		assert(!"Extended?");
 		return (-1);
 	}
-}
 
-size_t
-add_padding(char *str, size_t size, size_t padding_length)
-{
-	assert(padding_length < size);
-
-	memmove(str + padding_length, str, strlen(str));
-	memset(str, ' ', padding_length);
-
-	return (padding_length);
+	return (0);
 }
 
 static int
 format_entry(char *str, size_t size, const acl_entry_t entry, int verbose)
 {
-	size_t off = 0, maximum_who_field_length = 18;
+	size_t off = 0, padding_length, maximum_who_field_length = 18;
 	acl_permset_t permset;
 	acl_flagset_t flagset;
+	int error, len;
+	char buf[MAX_ENTRY_LENGTH + 1];
 
 	assert(_entry_brand(entry) == ACL_BRAND_NFS4);
 
-	if (acl_get_flagset_np(entry, &flagset))
-		return (0);
+	error = acl_get_flagset_np(entry, &flagset);
+	if (error)
+		return (error);
+
+	error = acl_get_permset(entry, &permset);
+	if (error)
+		return (error);
 
-	if (acl_get_permset(entry, &permset))
-		return (0);
+	error = format_who(buf, sizeof(buf), entry);
+	if (error)
+		return (error);
+	len = strlen(buf);
+	padding_length = maximum_who_field_length - len;
+	if (padding_length > 0) {
+		memset(str, ' ', padding_length);
+		off += padding_length;
+	}
+	off += snprintf(str + off, size - off, "%s:", buf);
 
-	off += format_who(str + off, size - off, entry);
+	error = _nfs4_format_access_mask(buf, sizeof(buf), *permset, verbose);
+	if (error)
+		return (error);
+	off += snprintf(str + off, size - off, "%s:", buf);
 
-	if (off < maximum_who_field_length)
-		off += add_padding(str, size - off, maximum_who_field_length - off);
+	error = _nfs4_format_flags(buf, sizeof(buf), *flagset, verbose);
+	if (error)
+		return (error);
+	off += snprintf(str + off, size - off, "%s:", buf);
 
-	off += snprintf(str + off, size - off, ":");
-	off += _nfs4_format_access_mask(str + off, size - off, *permset, verbose);
-	off += snprintf(str + off, size - off, ":");
-	off += _nfs4_format_flags(str + off, size - off, *flagset, verbose);
-	off += snprintf(str + off, size - off, ":");
-	off += format_extended(str + off, size - off, entry);
+	error = format_extended(buf, sizeof(buf), entry);
+	if (error)
+		return (error);
+	off += snprintf(str + off, size - off, "%s\n", buf);
 
 	/* Make sure we didn't truncate anything. */
 	assert (off < size);
 
-	return (off);
+	return (0);
 }
 
 char *
 _nfs4_acl_to_text_np(const acl_t aclp, ssize_t *len_p, int verbose)
 {
-	int off = 0, size, entry_id = ACL_FIRST_ENTRY;
+	int error, off = 0, size, entry_id = ACL_FIRST_ENTRY;
 	char *str;
 	acl_entry_t entry;
 
@@ -183,8 +201,13 @@
 
 		assert(off < size);
 
-		off += format_entry(str + off, size - off, entry, verbose);
-		off += snprintf(str + off, size - off, "\n");
+		error = format_entry(str + off, size - off, entry, verbose);
+		if (error) {
+			errno = EINVAL;
+			return (NULL);
+		}
+
+		off = strlen(str);
 	}
 
 	assert(off < size);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200807282152.m6SLqVdK090765>