Date: Mon, 25 Aug 2008 09:13:59 GMT From: Edward Tomasz Napierala <trasz@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 148364 for review Message-ID: <200808250913.m7P9DxGp081263@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=148364 Change 148364 by trasz@trasz_traszkan on 2008/08/25 09:13:08 Improve acl_is_trivial_np(3) API. Affected files ... .. //depot/projects/soc2008/trasz_nfs4acl/bin/cp/utils.c#3 edit .. //depot/projects/soc2008/trasz_nfs4acl/bin/ls/print.c#4 edit .. //depot/projects/soc2008/trasz_nfs4acl/bin/mv/mv.c#5 edit .. //depot/projects/soc2008/trasz_nfs4acl/lib/libc/posix1e/acl_is_trivial_np.3#3 edit .. //depot/projects/soc2008/trasz_nfs4acl/lib/libc/posix1e/acl_strip.c#3 edit .. //depot/projects/soc2008/trasz_nfs4acl/sys/sys/acl.h#23 edit Differences ... ==== //depot/projects/soc2008/trasz_nfs4acl/bin/cp/utils.c#3 (text+ko) ==== @@ -355,7 +355,7 @@ { acl_t acl; acl_type_t source_type, dest_type; - int source_acl_supported = 0, dest_acl_supported = 0; + int source_acl_supported = 0, dest_acl_supported = 0, trivial; if (fpathconf(source_fd, _PC_ACL_EXTENDED) == 1) { source_acl_supported = 1; @@ -386,7 +386,12 @@ return (1); } - if (acl_is_trivial_np(acl)) + if (acl_is_trivial_np(acl, &trivial)) { + warn("acl_is_trivial() failed"); + return (1); + } + + if (trivial) return (0); if (source_type != dest_type) { ==== //depot/projects/soc2008/trasz_nfs4acl/bin/ls/print.c#4 (text+ko) ==== @@ -616,7 +616,7 @@ aclmode(char *buf, const FTSENT *p, int *haveacls) { char name[MAXPATHLEN + 1]; - int type = ACL_TYPE_ACCESS, ret; + int type = ACL_TYPE_ACCESS, ret, trivial; acl_t facl; /* @@ -662,7 +662,12 @@ return; if ((facl = acl_get_file(name, type)) != NULL) { - if (!acl_is_trivial_np(facl)) + if (acl_is_trivial_np(facl, &trivial)) { + warn("%s", name); + return; + } + + if (!trivial) buf[10] = '+'; acl_free(facl); ==== //depot/projects/soc2008/trasz_nfs4acl/bin/mv/mv.c#5 (text+ko) ==== @@ -440,7 +440,7 @@ { acl_t acl; acl_type_t source_type, dest_type; - int source_acl_supported = 0, dest_acl_supported = 0; + int source_acl_supported = 0, dest_acl_supported = 0, trivial; if (fpathconf(source_fd, _PC_ACL_EXTENDED) == 1) { source_acl_supported = 1; @@ -471,7 +471,12 @@ return (1); } - if (acl_is_trivial_np(acl)) + if (acl_is_trivial_np(acl, &trivial)) { + warn("acl_is_trivial() failed"); + return (1); + } + + if (trivial) return (0); if (source_type != dest_type) { ==== //depot/projects/soc2008/trasz_nfs4acl/lib/libc/posix1e/acl_is_trivial_np.3#3 (text+ko) ==== @@ -39,13 +39,18 @@ .In sys/types.h .In sys/acl.h .Ft int -.Fn acl_is_trivial_np "const acl_t acl" +.Fn acl_is_trivial_np "const acl_t aclp" "int *trivialp" .Sh DESCRIPTION The .Fn acl_is_trivial function determines whether the ACL pointed to by the argument .Va acl is trivial. +Upon successful completion, the location referred to by the argument +.Fa trivialp +will be set to 1, if the ACL +.Fa aclp +points to is trivial, or 0 if it's not. .Pp ACL is trivial if it can be fully expressed as a file mode without loosing any access rules. @@ -55,9 +60,7 @@ File having non-trivial ACL have a plus sign appended after mode bits in "ls -al" output. .Sh RETURN VALUES -The -.Fn acl_is_trivial -function returns 0 if the ACL is not trivial, non-zero otherwise. +.Rv -std acl_get_tag_type .Sh SEE ALSO .Xr acl 3 , .Xr posix1e 3 ==== //depot/projects/soc2008/trasz_nfs4acl/lib/libc/posix1e/acl_strip.c#3 (text+ko) ==== @@ -155,15 +155,22 @@ * of the mode bits in "ls -l" output ;-) */ int -acl_is_trivial_np(acl_t aclp) +acl_is_trivial_np(const acl_t aclp, int *trivialp) { acl_t tmpacl; int differs; + if (aclp == NULL || trivialp == NULL) { + errno = EINVAL; + return (-1); + } + switch (_acl_brand(aclp)) { case ACL_BRAND_POSIX: if (aclp->ats_acl.acl_cnt == 3) - return (1); + *trivialp = 1; + else + *trivialp = 0; return (0); @@ -173,21 +180,22 @@ * with the original. */ tmpacl = acl_strip_np(aclp, 0); - /* XXX: This sucks. Can this happen at all? */ if (tmpacl == NULL) - return (0); + return (-1); differs = _acl_differs(aclp, tmpacl); acl_free(tmpacl); if (differs) - return (0); + *trivialp = 0; + else + *trivialp = 1; - return (1); + return (0); default: errno = EINVAL; - return (0); + return (-1); } } ==== //depot/projects/soc2008/trasz_nfs4acl/sys/sys/acl.h#23 (text+ko) ==== @@ -375,7 +375,7 @@ int acl_valid_fd_np(int _fd, acl_type_t _type, acl_t _acl); int acl_valid_file_np(const char *_path_p, acl_type_t _type, acl_t _acl); int acl_valid_link_np(const char *_path_p, acl_type_t _type, acl_t _acl); -int acl_is_trivial_np(const acl_t _acl); +int acl_is_trivial_np(const acl_t _acl, int *_trivialp); acl_t acl_strip_np(const acl_t _acl, int recalculate_mask); __END_DECLS
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200808250913.m7P9DxGp081263>