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>