PERFORCE change 146166 for review
Edward Tomasz Napierala
trasz at FreeBSD.org
Mon Jul 28 21:52:32 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=146166
Change 146166 by trasz at 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);
More information about the p4-projects
mailing list