From owner-p4-projects@FreeBSD.ORG Mon Jul 28 21:52:32 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 237CA106567B; Mon, 28 Jul 2008 21:52:32 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DAF9E1065670 for ; Mon, 28 Jul 2008 21:52:31 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id BDCDC8FC21 for ; Mon, 28 Jul 2008 21:52:31 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.2/8.14.2) with ESMTP id m6SLqV2C090767 for ; Mon, 28 Jul 2008 21:52:31 GMT (envelope-from trasz@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.2/8.14.1/Submit) id m6SLqVdK090765 for perforce@freebsd.org; Mon, 28 Jul 2008 21:52:31 GMT (envelope-from trasz@freebsd.org) Date: Mon, 28 Jul 2008 21:52:31 GMT Message-Id: <200807282152.m6SLqVdK090765@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to trasz@freebsd.org using -f From: Edward Tomasz Napierala To: Perforce Change Reviews Cc: Subject: PERFORCE change 146166 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 28 Jul 2008 21:52:32 -0000 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);