Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_nfs4_get_who.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,103 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  NFSv4 ACL Code
Steve Dickson 83ba30
+ *  Read the who value from the ace and return its type and optionally
Steve Dickson 83ba30
+ *  its value.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Ace is a reference to the ace to extract the who value from.
Steve Dickson 83ba30
+ *  Type is a reference where the value of the whotype will be stored.
Steve Dickson 83ba30
+ *  Who is a double reference that should either be passed as NULL
Steve Dickson 83ba30
+ *  (and thus no who string will be returned) or as a pointer to a
Steve Dickson 83ba30
+ *  char* where the who string will be allocated. This string must be
Steve Dickson 83ba30
+ *  freed by the caller.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2002, 2003 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include "libacl_nfs4.h"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+int acl_nfs4_get_who(struct nfs4_ace* ace, int* type, char** who)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	int itype;
Steve Dickson 83ba30
+	char* iwho = NULL;
Steve Dickson 83ba30
+	int wholen;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if(ace == NULL || ace->who == NULL)
Steve Dickson 83ba30
+		goto inval_failed;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	itype = acl_nfs4_get_whotype(ace->who);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if(type != NULL) {
Steve Dickson 83ba30
+		*type = itype;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if(who == NULL)
Steve Dickson 83ba30
+		return 0;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	switch(itype)
Steve Dickson 83ba30
+	{
Steve Dickson 83ba30
+		case NFS4_ACL_WHO_NAMED:
Steve Dickson 83ba30
+			iwho = ace->who;
Steve Dickson 83ba30
+			break;
Steve Dickson 83ba30
+		case NFS4_ACL_WHO_OWNER:
Steve Dickson 83ba30
+			iwho = NFS4_ACL_WHO_OWNER_STRING;
Steve Dickson 83ba30
+			break;
Steve Dickson 83ba30
+		case NFS4_ACL_WHO_GROUP:
Steve Dickson 83ba30
+			iwho = NFS4_ACL_WHO_GROUP_STRING;
Steve Dickson 83ba30
+			break;
Steve Dickson 83ba30
+		case NFS4_ACL_WHO_EVERYONE:
Steve Dickson 83ba30
+			iwho = NFS4_ACL_WHO_EVERYONE_STRING;
Steve Dickson 83ba30
+			break;
Steve Dickson 83ba30
+		default:
Steve Dickson 83ba30
+			goto inval_failed;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	wholen = strlen(iwho);
Steve Dickson 83ba30
+	if(wholen < 0)
Steve Dickson 83ba30
+		goto inval_failed;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	(*who) = (char *) malloc(sizeof(char) * (wholen + 1));
Steve Dickson 83ba30
+	if((*who) == NULL) {
Steve Dickson 83ba30
+		errno = ENOMEM;
Steve Dickson 83ba30
+		goto failed;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	strcpy((*who), iwho);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return 0;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+inval_failed:
Steve Dickson 83ba30
+	errno = EINVAL;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+failed:
Steve Dickson 83ba30
+	return -1;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_nfs4_add_ace.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,83 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  NFSv4 ACL Code
Steve Dickson 83ba30
+ *  Add an ace to the acl
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2002, 2003 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Marius Aamodt Eriksen <marius@umich.edu>
Steve Dickson 83ba30
+ *  J. Bruce Fields <bfields@umich.edu>
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *  Jeff Sedlak <jsedlak@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include "libacl_nfs4.h"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+int
Steve Dickson 83ba30
+acl_nfs4_add_ace(struct nfs4_acl *acl, u32 type, u32 flag, u32 access_mask,
Steve Dickson 83ba30
+		int whotype, char* who)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	struct nfs4_ace *ace;
Steve Dickson 83ba30
+	int result;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if(acl == NULL)
Steve Dickson 83ba30
+	{
Steve Dickson 83ba30
+		errno = EINVAL;
Steve Dickson 83ba30
+		return -1;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if ((ace = malloc(sizeof(*ace))) == NULL)
Steve Dickson 83ba30
+	{
Steve Dickson 83ba30
+		errno = ENOMEM;
Steve Dickson 83ba30
+		return -1;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	ace->type = type;
Steve Dickson 83ba30
+	ace->flag = flag;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if( type == NFS4_ACE_ACCESS_DENIED_ACE_TYPE )
Steve Dickson 83ba30
+		access_mask = access_mask & ~(NFS4_ACE_MASK_IGNORE);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	/* Castrate delete_child if we aren't a directory */
Steve Dickson 83ba30
+	if (!acl->is_directory)
Steve Dickson 83ba30
+		access_mask &= ~NFS4_ACE_DELETE_CHILD;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	ace->access_mask = access_mask & NFS4_ACE_MASK_ALL;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_nfs4_set_who(ace, whotype, who);
Steve Dickson 83ba30
+	if(result < 0)
Steve Dickson 83ba30
+		return -1;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	TAILQ_INSERT_TAIL(&acl->ace_head, ace, l_ace);
Steve Dickson 83ba30
+	acl->naces++;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return 0;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_nfs4_get_whotype.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,60 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  NFSv4 ACL Code
Steve Dickson 83ba30
+ *  Get the whotype of the who string passed
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2002, 2003 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Marius Aamodt Eriksen <marius@umich.edu>
Steve Dickson 83ba30
+ *  J. Bruce Fields <bfields@umich.edu>
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *  Jeff Sedlak <jsedlak@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include "libacl_nfs4.h"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+inline int
Steve Dickson 83ba30
+acl_nfs4_get_whotype(char *p)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	if(0 == strcmp(p, NFS4_ACL_WHO_OWNER_STRING) &&
Steve Dickson 83ba30
+			strlen(p) == strlen(NFS4_ACL_WHO_OWNER_STRING)) {
Steve Dickson 83ba30
+		return NFS4_ACL_WHO_OWNER;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+	if(0 == strcmp(p, NFS4_ACL_WHO_GROUP_STRING) &&
Steve Dickson 83ba30
+			strlen(p) == strlen(NFS4_ACL_WHO_GROUP_STRING)) {
Steve Dickson 83ba30
+		return NFS4_ACL_WHO_GROUP;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+	if(0 == strcmp(p, NFS4_ACL_WHO_EVERYONE_STRING) &&
Steve Dickson 83ba30
+			strlen(p) == strlen(NFS4_ACL_WHO_EVERYONE_STRING)) {
Steve Dickson 83ba30
+		return NFS4_ACL_WHO_EVERYONE;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return NFS4_ACL_WHO_NAMED;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_nfs4_free.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,61 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  Copyright (c) 2004 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Marius Aamodt Eriksen <marius@umich.edu>
Steve Dickson 83ba30
+ *  J. Bruce Fields <bfields@umich.edu>
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *  Jeff Sedlak <jsedlak@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions, the following disclaimer, and
Steve Dickson 83ba30
+ *     any and all other licensing or copyright notices included in
Steve Dickson 83ba30
+ *     any files in this distribution.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include "libacl_nfs4.h"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+void
Steve Dickson 83ba30
+acl_nfs4_free(struct nfs4_acl *acl)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	struct nfs4_ace *ace;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (!acl)
Steve Dickson 83ba30
+		return;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	while (!TAILQ_IS_EMPTY(acl->ace_head)) {
Steve Dickson 83ba30
+		ace = (acl)->ace_head.tqh_first;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		TAILQ_REMOVE( &(acl->ace_head), ace, l_ace);
Steve Dickson 83ba30
+		free(ace->who);
Steve Dickson 83ba30
+		free(ace);
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	free(acl);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_n4tp_acl_trans.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,439 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  NFSv4 ACL Code
Steve Dickson 83ba30
+ *  Convert NFSv4 ACL to a POSIX ACL
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2002, 2003 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include <acl/libacl.h>
Steve Dickson 83ba30
+#include <nfsidmap.h>
Steve Dickson 83ba30
+#include "libacl_nfs4.h"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ * While processing the NFSv4 ACE, this maintains bitmasks representing
Steve Dickson 83ba30
+ * which permission bits have been allowed and which denied to a given
Steve Dickson 83ba30
+ * entity: */
Steve Dickson 83ba30
+struct posix_ace_state {
Steve Dickson 83ba30
+	u_int32_t allow;
Steve Dickson 83ba30
+	u_int32_t deny;
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+struct posix_user_ace_state {
Steve Dickson 83ba30
+	uid_t uid;
Steve Dickson 83ba30
+	struct posix_ace_state perms;
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+struct posix_ace_state_array {
Steve Dickson 83ba30
+	int n;
Steve Dickson 83ba30
+	struct posix_user_ace_state aces[];
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ * While processing the NFSv4 ACE, this maintains the partial permissions
Steve Dickson 83ba30
+ * calculated so far: */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+struct posix_acl_state {
Steve Dickson 83ba30
+	struct posix_ace_state owner;
Steve Dickson 83ba30
+	struct posix_ace_state group;
Steve Dickson 83ba30
+	struct posix_ace_state other;
Steve Dickson 83ba30
+	struct posix_ace_state everyone;
Steve Dickson 83ba30
+	struct posix_ace_state mask; /* Deny unused in this case */
Steve Dickson 83ba30
+	struct posix_ace_state_array *users;
Steve Dickson 83ba30
+	struct posix_ace_state_array *groups;
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+static int
Steve Dickson 83ba30
+init_state(struct posix_acl_state *state, int cnt)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	int alloc;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	memset(state, 0, sizeof(struct posix_acl_state));
Steve Dickson 83ba30
+	/*
Steve Dickson 83ba30
+	 * In the worst case, each individual acl could be for a distinct
Steve Dickson 83ba30
+	 * named user or group, but we don't know which, so we allocate
Steve Dickson 83ba30
+	 * enough space for either:
Steve Dickson 83ba30
+	 */
Steve Dickson 83ba30
+	alloc = sizeof(struct posix_ace_state_array)
Steve Dickson 83ba30
+		+ cnt*sizeof(struct posix_user_ace_state);
Steve Dickson 83ba30
+	state->users = calloc(1, alloc);
Steve Dickson 83ba30
+	if (!state->users)
Steve Dickson 83ba30
+		return -ENOMEM;
Steve Dickson 83ba30
+	state->groups = calloc(1, alloc);
Steve Dickson 83ba30
+	if (!state->groups) {
Steve Dickson 83ba30
+		free(state->users);
Steve Dickson 83ba30
+		return -ENOMEM;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+	return 0;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+static void
Steve Dickson 83ba30
+free_state(struct posix_acl_state *state) {
Steve Dickson 83ba30
+	free(state->users);
Steve Dickson 83ba30
+	free(state->groups);
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+static inline void add_to_mask(struct posix_acl_state *state, struct posix_ace_state *astate)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	state->mask.allow |= astate->allow;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ * We only map from NFSv4 to POSIX ACLs when getting ACLs, when we err on the
Steve Dickson 83ba30
+ * side of permissiveness (so as not to make the file appear more secure than
Steve Dickson 83ba30
+ * it really is), so the mode bit mapping below is optimistic.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+static void
Steve Dickson 83ba30
+set_mode_from_nfs4(acl_entry_t pace, u_int32_t perm, int is_dir)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	u32 write_mode = NFS4_WRITE_MODE;
Steve Dickson 83ba30
+	acl_permset_t perms;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	acl_get_permset(pace, &perms;;
Steve Dickson 83ba30
+	acl_clear_perms(perms);
Steve Dickson 83ba30
+	if (is_dir)
Steve Dickson 83ba30
+		write_mode |= NFS4_ACE_DELETE_CHILD;
Steve Dickson 83ba30
+	if (perm & NFS4_READ_MODE)
Steve Dickson 83ba30
+		acl_add_perm(perms, ACL_READ);
Steve Dickson 83ba30
+	if (perm & write_mode)
Steve Dickson 83ba30
+		acl_add_perm(perms, ACL_WRITE);
Steve Dickson 83ba30
+	if (perm & NFS4_EXECUTE_MODE)
Steve Dickson 83ba30
+		acl_add_perm(perms, ACL_EXECUTE);
Steve Dickson 83ba30
+	acl_set_permset(pace, perms);
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* XXX: add a "check allow" that can warn on e.g. allows of WRITE_ACL
Steve Dickson 83ba30
+ * to non-owner? */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* XXX: replace error returns by errno sets all over.  Ugh. */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+static acl_t
Steve Dickson 83ba30
+posix_state_to_acl(struct posix_acl_state *state, int is_dir)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	acl_entry_t pace;
Steve Dickson 83ba30
+	acl_t pacl;
Steve Dickson 83ba30
+	int nace;
Steve Dickson 83ba30
+	int i, error = 0;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (state->users->n || state->groups->n)
Steve Dickson 83ba30
+		nace = 4 + state->users->n + state->groups->n;
Steve Dickson 83ba30
+	else
Steve Dickson 83ba30
+		nace = 3;
Steve Dickson 83ba30
+	pacl = acl_init(nace);
Steve Dickson 83ba30
+	if (!pacl)
Steve Dickson 83ba30
+		return NULL;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	error = acl_create_entry(&pacl, &pace);
Steve Dickson 83ba30
+	if (error)
Steve Dickson 83ba30
+		goto out_err;
Steve Dickson 83ba30
+	acl_set_tag_type(pace, ACL_USER_OBJ);
Steve Dickson 83ba30
+	set_mode_from_nfs4(pace, state->owner.allow, is_dir);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	for (i=0; i < state->users->n; i++) {
Steve Dickson 83ba30
+		error = acl_create_entry(&pacl, &pace);
Steve Dickson 83ba30
+		if (error)
Steve Dickson 83ba30
+			goto out_err;
Steve Dickson 83ba30
+		acl_set_tag_type(pace, ACL_USER);
Steve Dickson 83ba30
+		set_mode_from_nfs4(pace, state->users->aces[i].perms.allow,
Steve Dickson 83ba30
+					is_dir);
Steve Dickson 83ba30
+		acl_set_qualifier(pace, &state->users->aces[i].uid);
Steve Dickson 83ba30
+		add_to_mask(state, &state->users->aces[i].perms);
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	error = acl_create_entry(&pacl, &pace);
Steve Dickson 83ba30
+	if (error)
Steve Dickson 83ba30
+		goto out_err;
Steve Dickson 83ba30
+	acl_set_tag_type(pace, ACL_GROUP_OBJ);
Steve Dickson 83ba30
+	set_mode_from_nfs4(pace, state->group.allow, is_dir);
Steve Dickson 83ba30
+	add_to_mask(state, &state->group);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	for (i=0; i < state->groups->n; i++) {
Steve Dickson 83ba30
+		error = acl_create_entry(&pacl, &pace);
Steve Dickson 83ba30
+		if (error)
Steve Dickson 83ba30
+			goto out_err;
Steve Dickson 83ba30
+		acl_set_tag_type(pace, ACL_GROUP);
Steve Dickson 83ba30
+		set_mode_from_nfs4(pace, state->groups->aces[i].perms.allow,
Steve Dickson 83ba30
+					is_dir);
Steve Dickson 83ba30
+		acl_set_qualifier(pace, &state->groups->aces[i].uid);
Steve Dickson 83ba30
+		add_to_mask(state, &state->groups->aces[i].perms);
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (nace > 3) {
Steve Dickson 83ba30
+		error = acl_create_entry(&pacl, &pace);
Steve Dickson 83ba30
+		if (error)
Steve Dickson 83ba30
+			goto out_err;
Steve Dickson 83ba30
+		acl_set_tag_type(pace, ACL_MASK);
Steve Dickson 83ba30
+		set_mode_from_nfs4(pace, state->mask.allow, is_dir);
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	error = acl_create_entry(&pacl, &pace);
Steve Dickson 83ba30
+	if (error)
Steve Dickson 83ba30
+		goto out_err;
Steve Dickson 83ba30
+	acl_set_tag_type(pace, ACL_OTHER);
Steve Dickson 83ba30
+	set_mode_from_nfs4(pace, state->other.allow, is_dir);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return pacl;
Steve Dickson 83ba30
+out_err:
Steve Dickson 83ba30
+	acl_free(pacl);
Steve Dickson 83ba30
+	return NULL;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+static inline void allow_bits(struct posix_ace_state *astate, u32 mask)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	/* Allow all bits in the mask not already denied: */
Steve Dickson 83ba30
+	astate->allow |= mask & ~astate->deny;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+static inline void deny_bits(struct posix_ace_state *astate, u32 mask)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	/* Deny all bits in the mask not already allowed: */
Steve Dickson 83ba30
+	astate->deny |= mask & ~astate->allow;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+static int find_uid(struct posix_acl_state *state, struct posix_ace_state_array *a, uid_t uid)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	int i;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	for (i = 0; i < a->n; i++)
Steve Dickson 83ba30
+		if (a->aces[i].uid == uid)
Steve Dickson 83ba30
+			return i;
Steve Dickson 83ba30
+	/* Not found: */
Steve Dickson 83ba30
+	a->n++;
Steve Dickson 83ba30
+	a->aces[i].uid = uid;
Steve Dickson 83ba30
+	a->aces[i].perms.allow = state->everyone.allow;
Steve Dickson 83ba30
+	a->aces[i].perms.deny  = state->everyone.deny;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return i;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+static void deny_bits_array(struct posix_ace_state_array *a, u32 mask)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	int i;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	for (i=0; i < a->n; i++)
Steve Dickson 83ba30
+		deny_bits(&a->aces[i].perms, mask);
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+static void allow_bits_array(struct posix_ace_state_array *a, u32 mask)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	int i;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	for (i=0; i < a->n; i++)
Steve Dickson 83ba30
+		allow_bits(&a->aces[i].perms, mask);
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+static acl_tag_t acl_n4tp_get_whotype(struct nfs4_ace *ace)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	int nfs4type;
Steve Dickson 83ba30
+	int result;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_nfs4_get_who(ace, &nfs4type, NULL);
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		return -1;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	switch (nfs4type) {
Steve Dickson 83ba30
+		case NFS4_ACL_WHO_NAMED:
Steve Dickson 83ba30
+			return (ace->flag & NFS4_ACE_IDENTIFIER_GROUP ?
Steve Dickson 83ba30
+					ACL_GROUP : ACL_USER);
Steve Dickson 83ba30
+		case NFS4_ACL_WHO_OWNER:
Steve Dickson 83ba30
+			return ACL_USER_OBJ;
Steve Dickson 83ba30
+		case NFS4_ACL_WHO_GROUP:
Steve Dickson 83ba30
+			return ACL_GROUP_OBJ;
Steve Dickson 83ba30
+		case NFS4_ACL_WHO_EVERYONE:
Steve Dickson 83ba30
+			return ACL_OTHER;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+	errno = EINVAL;
Steve Dickson 83ba30
+	return -1;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+static int process_one_v4_ace(struct posix_acl_state *state,
Steve Dickson 83ba30
+				struct nfs4_ace *ace)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	u32 mask = ace->access_mask;
Steve Dickson 83ba30
+	uid_t id;
Steve Dickson 83ba30
+	int i;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (nfs4_init_name_mapping(NULL))
Steve Dickson 83ba30
+		return -1;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	switch (acl_n4tp_get_whotype(ace)) {
Steve Dickson 83ba30
+	case ACL_USER_OBJ:
Steve Dickson 83ba30
+		if (ace->type == NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE) {
Steve Dickson 83ba30
+			allow_bits(&state->owner, mask);
Steve Dickson 83ba30
+		} else {
Steve Dickson 83ba30
+			deny_bits(&state->owner, mask);
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+		break;
Steve Dickson 83ba30
+	case ACL_USER:
Steve Dickson 83ba30
+		if (nfs4_name_to_uid(ace->who, &id))
Steve Dickson 83ba30
+			return -1;
Steve Dickson 83ba30
+		i = find_uid(state, state->users, id);
Steve Dickson 83ba30
+		if (ace->type == NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE) {
Steve Dickson 83ba30
+			allow_bits(&state->users->aces[i].perms, mask);
Steve Dickson 83ba30
+			mask = state->users->aces[i].perms.allow;
Steve Dickson 83ba30
+			allow_bits(&state->owner, mask);
Steve Dickson 83ba30
+		} else {
Steve Dickson 83ba30
+			deny_bits(&state->users->aces[i].perms, mask);
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+		break;
Steve Dickson 83ba30
+	case ACL_GROUP_OBJ:
Steve Dickson 83ba30
+		if (ace->type == NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE) {
Steve Dickson 83ba30
+			allow_bits(&state->group, mask);
Steve Dickson 83ba30
+			mask = state->group.allow;
Steve Dickson 83ba30
+			allow_bits(&state->owner, mask);
Steve Dickson 83ba30
+			allow_bits(&state->everyone, mask);
Steve Dickson 83ba30
+			allow_bits_array(state->users, mask);
Steve Dickson 83ba30
+			allow_bits_array(state->groups, mask);
Steve Dickson 83ba30
+		} else {
Steve Dickson 83ba30
+			deny_bits(&state->group, mask);
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+		break;
Steve Dickson 83ba30
+	case ACL_GROUP:
Steve Dickson 83ba30
+		if (nfs4_name_to_gid(ace->who, &id))
Steve Dickson 83ba30
+			return -1;
Steve Dickson 83ba30
+		i = find_uid(state, state->groups, id);
Steve Dickson 83ba30
+		if (ace->type == NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE) {
Steve Dickson 83ba30
+			allow_bits(&state->groups->aces[i].perms, mask);
Steve Dickson 83ba30
+			mask = state->groups->aces[i].perms.allow;
Steve Dickson 83ba30
+			allow_bits(&state->owner, mask);
Steve Dickson 83ba30
+			allow_bits(&state->group, mask);
Steve Dickson 83ba30
+			allow_bits(&state->everyone, mask);
Steve Dickson 83ba30
+			allow_bits_array(state->users, mask);
Steve Dickson 83ba30
+			allow_bits_array(state->groups, mask);
Steve Dickson 83ba30
+		} else {
Steve Dickson 83ba30
+			deny_bits(&state->groups->aces[i].perms, mask);
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+		break;
Steve Dickson 83ba30
+	case ACL_OTHER:
Steve Dickson 83ba30
+		if (ace->type == NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE) {
Steve Dickson 83ba30
+			allow_bits(&state->owner, mask);
Steve Dickson 83ba30
+			allow_bits(&state->group, mask);
Steve Dickson 83ba30
+			allow_bits(&state->other, mask);
Steve Dickson 83ba30
+			allow_bits(&state->everyone, mask);
Steve Dickson 83ba30
+			allow_bits_array(state->users, mask);
Steve Dickson 83ba30
+			allow_bits_array(state->groups, mask);
Steve Dickson 83ba30
+		} else {
Steve Dickson 83ba30
+			deny_bits(&state->owner, mask);
Steve Dickson 83ba30
+			deny_bits(&state->group, mask);
Steve Dickson 83ba30
+			deny_bits(&state->other, mask);
Steve Dickson 83ba30
+			deny_bits(&state->everyone, mask);
Steve Dickson 83ba30
+			deny_bits_array(state->users, mask);
Steve Dickson 83ba30
+			deny_bits_array(state->groups, mask);
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+	return 0;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define FILE_OR_DIR_INHERIT (NFS4_ACE_FILE_INHERIT_ACE \
Steve Dickson 83ba30
+				| NFS4_ACE_DIRECTORY_INHERIT_ACE)
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* Strip or keep inheritance aces depending on type of posix acl requested */
Steve Dickson 83ba30
+static void acl_nfs4_check_inheritance(struct nfs4_acl *acl, u32 iflags)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	struct nfs4_ace * cur_ace;
Steve Dickson 83ba30
+	struct nfs4_ace * temp_ace;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	cur_ace = acl->ace_head.tqh_first;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	while (cur_ace) {
Steve Dickson 83ba30
+		/* get the next ace now in case we free the current ace */
Steve Dickson 83ba30
+		temp_ace = cur_ace;
Steve Dickson 83ba30
+		cur_ace = cur_ace->l_ace.tqe_next;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		if (iflags & NFS4_ACL_REQUEST_DEFAULT) {
Steve Dickson 83ba30
+			if (!(temp_ace->flag & FILE_OR_DIR_INHERIT))
Steve Dickson 83ba30
+				acl_nfs4_remove_ace(acl, temp_ace);
Steve Dickson 83ba30
+		} else {
Steve Dickson 83ba30
+			if (temp_ace->flag & NFS4_ACE_INHERIT_ONLY_ACE)
Steve Dickson 83ba30
+				acl_nfs4_remove_ace(acl, temp_ace);
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+acl_t acl_n4tp_acl_trans(struct nfs4_acl * nacl_p, acl_type_t ptype)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	struct posix_acl_state state;
Steve Dickson 83ba30
+	acl_t pacl;
Steve Dickson 83ba30
+	struct nfs4_acl * temp_acl;
Steve Dickson 83ba30
+	struct nfs4_ace * cur_ace;
Steve Dickson 83ba30
+	int ret;
Steve Dickson 83ba30
+	u32 iflags = NFS4_ACL_NOFLAGS;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (ptype == ACL_TYPE_DEFAULT) {
Steve Dickson 83ba30
+		if (nacl_p->is_directory)
Steve Dickson 83ba30
+			iflags |= NFS4_ACL_REQUEST_DEFAULT;
Steve Dickson 83ba30
+		else {
Steve Dickson 83ba30
+			errno = EINVAL;
Steve Dickson 83ba30
+			return NULL;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	/* Copy so we can delete bits without borking the original */
Steve Dickson 83ba30
+	temp_acl = acl_nfs4_copy_acl(nacl_p);
Steve Dickson 83ba30
+	if (temp_acl == NULL)
Steve Dickson 83ba30
+		return NULL;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	acl_nfs4_check_inheritance(temp_acl, iflags);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (ptype == ACL_TYPE_DEFAULT && temp_acl->naces == 0) {
Steve Dickson 83ba30
+		acl_nfs4_free(temp_acl);
Steve Dickson 83ba30
+		return acl_init(0);
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	ret = init_state(&state, temp_acl->naces);
Steve Dickson 83ba30
+	if (ret)
Steve Dickson 83ba30
+		goto free_failed;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	cur_ace = temp_acl->ace_head.tqh_first;
Steve Dickson 83ba30
+	while (cur_ace) {
Steve Dickson 83ba30
+		if (process_one_v4_ace(&state, cur_ace)) {
Steve Dickson 83ba30
+			free_state(&state);
Steve Dickson 83ba30
+			goto free_failed;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+		cur_ace = cur_ace->l_ace.tqe_next;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	acl_nfs4_free(temp_acl);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	pacl = posix_state_to_acl(&state, nacl_p->is_directory);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	free_state(&state);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	ret = acl_valid(pacl);
Steve Dickson 83ba30
+	if (ret < 0)
Steve Dickson 83ba30
+		goto free_failed;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return pacl;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+free_failed:
Steve Dickson 83ba30
+	acl_nfs4_free(temp_acl);
Steve Dickson 83ba30
+	return NULL;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
--- acl-2.2.39/libacl/acl_set_fd.c.orig	2006-06-20 02:51:25.000000000 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_set_fd.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -24,6 +24,11 @@
Steve Dickson 83ba30
 #include "libacl.h"
Steve Dickson 83ba30
 #include "__acl_to_xattr.h"
Steve Dickson 83ba30
 
Steve Dickson 83ba30
+#ifdef USE_NFSV4_TRANS
Steve Dickson 83ba30
+ #include "libacl_nfs4.h"
Steve Dickson 83ba30
+ #include <nfsidmap.h>
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
 #include "byteorder.h"
Steve Dickson 83ba30
 #include "acl_ea.h"
Steve Dickson 83ba30
 
Steve Dickson 83ba30
@@ -37,10 +42,42 @@ acl_set_fd(int fd, acl_t acl)
Steve Dickson 83ba30
 	const char *name = ACL_EA_ACCESS;
Steve Dickson 83ba30
 	size_t size;
Steve Dickson 83ba30
 	int error;
Steve Dickson 83ba30
+#ifdef USE_NFSV4_TRANS
Steve Dickson 83ba30
+	int retval;
Steve Dickson 83ba30
+	struct nfs4_acl * nacl;
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
 
Steve Dickson 83ba30
 	if (!acl_obj_p)
Steve Dickson 83ba30
 		return -1;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#ifdef USE_NFSV4_TRANS
Steve Dickson 83ba30
+	retval = fgetxattr(fd, ACL_NFS4_XATTR, NULL, 0);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if(retval == -1 && (errno == ENOATTR || errno == EOPNOTSUPP)) {
Steve Dickson 83ba30
+		ext_acl_p = __acl_to_xattr(acl_obj_p, &size);
Steve Dickson 83ba30
+	} else {
Steve Dickson 83ba30
+		char domain[NFS4_MAX_DOMAIN_LEN];
Steve Dickson 83ba30
+		nfs4_init_name_mapping(NULL);
Steve Dickson 83ba30
+		error = nfs4_get_default_domain(NULL, domain, sizeof(domain));
Steve Dickson 83ba30
+		if (error)
Steve Dickson 83ba30
+			return -1;
Steve Dickson 83ba30
+		nacl = acl_nfs4_new(0);
Steve Dickson 83ba30
+		if (acl == NULL) {
Steve Dickson 83ba30
+			errno = ENOMEM;
Steve Dickson 83ba30
+			return -1;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+		error = acl_ptn4_acl_trans(acl, nacl, ACL_TYPE_ACCESS, 0, domain);
Steve Dickson 83ba30
+		if (error)
Steve Dickson 83ba30
+			return -1;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		size = acl_nfs4_xattr_pack(nacl, &ext_acl_p);
Steve Dickson 83ba30
+		name = ACL_NFS4_XATTR;
Steve Dickson 83ba30
+		acl_nfs4_free(nacl);
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+#else
Steve Dickson 83ba30
 	ext_acl_p = __acl_to_xattr(acl_obj_p, &size);
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
 	if (!ext_acl_p)
Steve Dickson 83ba30
 		return -1;
Steve Dickson 83ba30
 	error = fsetxattr(fd, name, (char *)ext_acl_p, size, 0);
Steve Dickson 83ba30
--- acl-2.2.39/libacl/Makefile.orig	2006-06-20 02:51:25.000000000 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/Makefile	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -8,19 +8,35 @@ LTLDFLAGS += -Wl,--version-script,$(TOPD
Steve Dickson 83ba30
 include $(TOPDIR)/include/builddefs
Steve Dickson 83ba30
 
Steve Dickson 83ba30
 LTLIBRARY = libacl.la
Steve Dickson 83ba30
-LTLIBS = -lattr $(LIBMISC)
Steve Dickson 83ba30
+LTLIBS = -lattr -lnfsidmap $(LIBMISC)
Steve Dickson 83ba30
 LTDEPENDENCIES = $(LIBMISC)
Steve Dickson 83ba30
-LT_CURRENT = 2
Steve Dickson 83ba30
+LT_CURRENT = 3
Steve Dickson 83ba30
 LT_REVISION = 0
Steve Dickson 83ba30
-LT_AGE = 1
Steve Dickson 83ba30
+LT_AGE = 2
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+CFILES = $(POSIX_CFILES) $(LIBACL_CFILES) $(LIBACL_NFS4_CFILES) \
Steve Dickson 83ba30
+	$(INTERNAL_CFILES) perm_copy_fd.c perm_copy_file.c
Steve Dickson 83ba30
 
Steve Dickson 83ba30
-CFILES = $(POSIX_CFILES) $(LIBACL_CFILES) $(INTERNAL_CFILES) \
Steve Dickson 83ba30
-	 perm_copy_fd.c perm_copy_file.c
Steve Dickson 83ba30
 HFILES = libobj.h libacl.h byteorder.h __acl_from_xattr.h __acl_to_xattr.h \
Steve Dickson 83ba30
-	 perm_copy.h
Steve Dickson 83ba30
+	 perm_copy.h $(LIBACL_NFS4_HFILES)
Steve Dickson 83ba30
 
Steve Dickson 83ba30
 LCFLAGS = -include perm_copy.h
Steve Dickson 83ba30
 
Steve Dickson 83ba30
+LIBACL_NFS4_CFILES = \
Steve Dickson 83ba30
+	acl_nfs4_get_who.c \
Steve Dickson 83ba30
+	acl_n4tp_acl_trans.c       acl_nfs4_get_whotype.c \
Steve Dickson 83ba30
+	acl_nfs4_new.c \
Steve Dickson 83ba30
+	acl_nfs4_add_ace.c         acl_nfs4_remove_ace.c \
Steve Dickson 83ba30
+	acl_nfs4_add_pair.c \
Steve Dickson 83ba30
+	acl_nfs4_copy_acl.c        acl_nfs4_set_who.c \
Steve Dickson 83ba30
+	acl_nfs4_free.c            acl_nfs4_xattr_load.c \
Steve Dickson 83ba30
+	acl_nfs4_xattr_pack.c      acl_nfs4_xattr_size.c \
Steve Dickson 83ba30
+	acl_ptn4_acl_trans.c \
Steve Dickson 83ba30
+	acl_ptn4_get_mask.c        __posix_acl_from_nfs4_xattr.c \
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+LIBACL_NFS4_HFILES = ../include/libacl_nfs4.h ../include/nfs4.h
Steve Dickson 83ba30
+
Steve Dickson 83ba30
 POSIX_CFILES = \
Steve Dickson 83ba30
 	acl_add_perm.c acl_calc_mask.c acl_clear_perms.c acl_copy_entry.c \
Steve Dickson 83ba30
 	acl_copy_ext.c acl_copy_int.c acl_create_entry.c acl_delete_def_file.c \
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_nfs4_remove_ace.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,48 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  NFSv4 ACL Code
Steve Dickson 83ba30
+ *  Remove an ace from an NFS4 ACL
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2004 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions, the following disclaimer, and
Steve Dickson 83ba30
+ *     any and all other licensing or copyright notices included in
Steve Dickson 83ba30
+ *     any files in this distribution.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include "libacl_nfs4.h"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+void acl_nfs4_remove_ace(struct nfs4_acl * acl, struct nfs4_ace * ace)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	TAILQ_REMOVE(&acl->ace_head, ace, l_ace);
Steve Dickson 83ba30
+	free(ace->who);
Steve Dickson 83ba30
+	free(ace);
Steve Dickson 83ba30
+	acl->naces--;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_nfs4_set_who.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,92 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  NFSv4 ACL Code
Steve Dickson 83ba30
+ *  Write the who entry in the nfs4 ace. Who is a user supplied buffer
Steve Dickson 83ba30
+ *  containing a named who entry (null terminated string) if type is
Steve Dickson 83ba30
+ *  set to NFS4_ACL_WHO_NAMED. Otherwise, the who buffer is not used.
Steve Dickson 83ba30
+ *  The user supplied who buffer must be freed by the caller.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  This code allocates the who buffer used in the ace. This must be freed
Steve Dickson 83ba30
+ *  upon ace removal by the ace_remove or acl_free.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2002, 2003 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include "libacl_nfs4.h"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+int acl_nfs4_set_who(struct nfs4_ace* ace, int type, char* who)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	char* iwho = NULL;
Steve Dickson 83ba30
+	int wholen;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if(ace == NULL)
Steve Dickson 83ba30
+		goto inval_failed;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	switch(type)
Steve Dickson 83ba30
+	{
Steve Dickson 83ba30
+		case NFS4_ACL_WHO_NAMED:
Steve Dickson 83ba30
+			if(who == NULL)
Steve Dickson 83ba30
+				goto inval_failed;
Steve Dickson 83ba30
+			iwho = who;
Steve Dickson 83ba30
+			break;
Steve Dickson 83ba30
+		case NFS4_ACL_WHO_OWNER:
Steve Dickson 83ba30
+			iwho = NFS4_ACL_WHO_OWNER_STRING;
Steve Dickson 83ba30
+			break;
Steve Dickson 83ba30
+		case NFS4_ACL_WHO_GROUP:
Steve Dickson 83ba30
+			iwho = NFS4_ACL_WHO_GROUP_STRING;
Steve Dickson 83ba30
+			break;
Steve Dickson 83ba30
+		case NFS4_ACL_WHO_EVERYONE:
Steve Dickson 83ba30
+			iwho = NFS4_ACL_WHO_EVERYONE_STRING;
Steve Dickson 83ba30
+			break;
Steve Dickson 83ba30
+		default:
Steve Dickson 83ba30
+			goto inval_failed;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	wholen = strlen(iwho);
Steve Dickson 83ba30
+	if(wholen < 1)
Steve Dickson 83ba30
+		goto inval_failed;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	ace->who = (char *) malloc(sizeof(char) * (wholen + 1));
Steve Dickson 83ba30
+	if(ace->who == NULL) {
Steve Dickson 83ba30
+		errno = ENOMEM;
Steve Dickson 83ba30
+		goto failed;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	strcpy(ace->who, iwho);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return 0;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+inval_failed:
Steve Dickson 83ba30
+	errno = EINVAL;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+failed:
Steve Dickson 83ba30
+	return -1;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
--- acl-2.2.39/libacl/acl_set_file.c.orig	2006-06-20 02:51:25.000000000 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_set_file.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -26,9 +26,38 @@
Steve Dickson 83ba30
 #include "libacl.h"
Steve Dickson 83ba30
 #include "__acl_to_xattr.h"
Steve Dickson 83ba30
 
Steve Dickson 83ba30
+#ifdef USE_NFSV4_TRANS
Steve Dickson 83ba30
+ #include "libacl_nfs4.h"
Steve Dickson 83ba30
+ #include <nfsidmap.h>
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
 #include "byteorder.h"
Steve Dickson 83ba30
 #include "acl_ea.h"
Steve Dickson 83ba30
 
Steve Dickson 83ba30
+#ifdef USE_NFSV4_TRANS
Steve Dickson 83ba30
+static struct nfs4_acl *get_nfs4_acl(const char *path_p, int is_dir)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	struct nfs4_acl * acl = NULL;
Steve Dickson 83ba30
+	ssize_t ret;
Steve Dickson 83ba30
+	char *buf;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	ret = getxattr(path_p, ACL_NFS4_XATTR, NULL, 0);
Steve Dickson 83ba30
+	if (ret < 0)
Steve Dickson 83ba30
+		return NULL;
Steve Dickson 83ba30
+	buf = malloc(ret);
Steve Dickson 83ba30
+	if (buf == NULL)
Steve Dickson 83ba30
+		return NULL;
Steve Dickson 83ba30
+	ret = getxattr(path_p, ACL_NFS4_XATTR, buf, ret);
Steve Dickson 83ba30
+	if (ret < 0)
Steve Dickson 83ba30
+		goto out_free;
Steve Dickson 83ba30
+	acl = acl_nfs4_xattr_load(buf, ret, is_dir);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+out_free:
Steve Dickson 83ba30
+	free(buf);
Steve Dickson 83ba30
+	return acl;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
 
Steve Dickson 83ba30
 /* 23.4.22 */
Steve Dickson 83ba30
 int
Steve Dickson 83ba30
@@ -39,9 +68,15 @@ acl_set_file(const char *path_p, acl_typ
Steve Dickson 83ba30
 	const char *name;
Steve Dickson 83ba30
 	size_t size;
Steve Dickson 83ba30
 	int error;
Steve Dickson 83ba30
+	struct stat st;
Steve Dickson 83ba30
+#ifdef USE_NFSV4_TRANS
Steve Dickson 83ba30
+	struct nfs4_acl * nacl;
Steve Dickson 83ba30
+	int is_dir = NFS4_ACL_ISFILE;
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
 
Steve Dickson 83ba30
 	if (!acl_obj_p)
Steve Dickson 83ba30
 		return -1;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
 	switch (type) {
Steve Dickson 83ba30
 		case ACL_TYPE_ACCESS:
Steve Dickson 83ba30
 			name = ACL_EA_ACCESS;
Steve Dickson 83ba30
@@ -54,8 +89,41 @@ acl_set_file(const char *path_p, acl_typ
Steve Dickson 83ba30
 			return -1;
Steve Dickson 83ba30
 	}
Steve Dickson 83ba30
 
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#ifdef USE_NFSV4_TRANS
Steve Dickson 83ba30
+	if (stat(path_p, &st) != 0)
Steve Dickson 83ba30
+		return -1;
Steve Dickson 83ba30
+	if (S_ISDIR(st.st_mode))
Steve Dickson 83ba30
+		is_dir = NFS4_ACL_ISDIR;
Steve Dickson 83ba30
+	if (type == ACL_TYPE_DEFAULT && !is_dir) {
Steve Dickson 83ba30
+		errno = EACCES;
Steve Dickson 83ba30
+		return -1;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+	nacl = get_nfs4_acl(path_p, is_dir);
Steve Dickson 83ba30
+	if (nacl == NULL && (errno == ENOATTR || errno == EOPNOTSUPP))
Steve Dickson 83ba30
+		ext_acl_p = __acl_to_xattr(acl_obj_p, &size);
Steve Dickson 83ba30
+	else {
Steve Dickson 83ba30
+		char domain[NFS4_MAX_DOMAIN_LEN];
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		nfs4_init_name_mapping(NULL);
Steve Dickson 83ba30
+		error = nfs4_get_default_domain(NULL, domain, sizeof(domain));
Steve Dickson 83ba30
+		if (error) {
Steve Dickson 83ba30
+			acl_nfs4_free(nacl);
Steve Dickson 83ba30
+			return -1;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+		error = acl_ptn4_acl_trans(acl, nacl, type, is_dir, domain);
Steve Dickson 83ba30
+		if (error) {
Steve Dickson 83ba30
+			acl_nfs4_free(nacl);
Steve Dickson 83ba30
+			return -1;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		size = acl_nfs4_xattr_pack(nacl, &ext_acl_p);
Steve Dickson 83ba30
+		name = ACL_NFS4_XATTR;
Steve Dickson 83ba30
+		acl_nfs4_free(nacl);
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+#else
Steve Dickson 83ba30
+
Steve Dickson 83ba30
 	if (type == ACL_TYPE_DEFAULT) {
Steve Dickson 83ba30
-		struct stat st;
Steve Dickson 83ba30
 
Steve Dickson 83ba30
 		if (stat(path_p, &st) != 0)
Steve Dickson 83ba30
 			return -1;
Steve Dickson 83ba30
@@ -68,6 +136,8 @@ acl_set_file(const char *path_p, acl_typ
Steve Dickson 83ba30
 	}
Steve Dickson 83ba30
 
Steve Dickson 83ba30
 	ext_acl_p = __acl_to_xattr(acl_obj_p, &size);
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
 	if (!ext_acl_p)
Steve Dickson 83ba30
 		return -1;
Steve Dickson 83ba30
 	error = setxattr(path_p, name, (char *)ext_acl_p, size, 0);
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/__posix_acl_from_nfs4_xattr.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,60 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  NFSv4 ACL Code
Steve Dickson 83ba30
+ *  Convert NFSv4 xattr values to a posix ACL
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2002, 2003 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include <acl/libacl.h>
Steve Dickson 83ba30
+#include "libacl_nfs4.h"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* xattr_v is a char buffer filled with the nfsv4 xattr value.
Steve Dickson 83ba30
+ * xattr_size should be the byte count of the length of the xattr_v
Steve Dickson 83ba30
+ * data size. xattr_v may be larger than <xattr_size> bytes, but only
Steve Dickson 83ba30
+ * the first <xattr_size> bytes will be read. <type> is the posix acl
Steve Dickson 83ba30
+ * type requested. Currently either default, or access */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+acl_t __posix_acl_from_nfs4_xattr(char* xattr_v,
Steve Dickson 83ba30
+		int xattr_size, acl_type_t ptype, u32 is_dir)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	struct nfs4_acl *	nfsacl = NULL;
Steve Dickson 83ba30
+	acl_t pacl;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	nfsacl = acl_nfs4_xattr_load(xattr_v, xattr_size, is_dir);
Steve Dickson 83ba30
+	if(nfsacl == NULL) {
Steve Dickson 83ba30
+		return NULL;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	pacl = acl_n4tp_acl_trans(nfsacl, ptype);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return pacl;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_nfs4_xattr_load.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,191 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  NFSv4 ACL Code
Steve Dickson 83ba30
+ *  Convert NFSv4 xattr values to a posix ACL
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2002, 2003 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include <acl/libacl.h>
Steve Dickson 83ba30
+#include <netinet/in.h>
Steve Dickson 83ba30
+#include "libacl_nfs4.h"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+struct nfs4_acl * acl_nfs4_xattr_load(
Steve Dickson 83ba30
+		char *	xattr_v,
Steve Dickson 83ba30
+		int		xattr_size,
Steve Dickson 83ba30
+		u32		is_dir)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	struct nfs4_acl *	nacl_p;
Steve Dickson 83ba30
+	char* bufp = xattr_v;
Steve Dickson 83ba30
+	int bufs = xattr_size;
Steve Dickson 83ba30
+	u32 ace_n;
Steve Dickson 83ba30
+	u32	wholen;
Steve Dickson 83ba30
+	char* who;
Steve Dickson 83ba30
+	int d_ptr;
Steve Dickson 83ba30
+	u32 num_aces;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	u32 type, flag, access_mask;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if(xattr_size < sizeof(u32)) {
Steve Dickson 83ba30
+		errno = EINVAL;
Steve Dickson 83ba30
+		return NULL;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if((nacl_p = acl_nfs4_new(is_dir)) == NULL) {
Steve Dickson 83ba30
+		errno = ENOMEM;
Steve Dickson 83ba30
+		return NULL;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	/* Grab the number of aces in the acl */
Steve Dickson 83ba30
+	num_aces = (u32)ntohl(*((u32*)(bufp)));
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#ifdef LIBACL_NFS4_DEBUG
Steve Dickson 83ba30
+	printf(" Got number of aces: %d\n", nacl_p->naces);
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	d_ptr = sizeof(u32);
Steve Dickson 83ba30
+	bufp += d_ptr;
Steve Dickson 83ba30
+	bufs -= d_ptr;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	for(ace_n = 0; num_aces > ace_n ; ace_n++)
Steve Dickson 83ba30
+	{
Steve Dickson 83ba30
+#ifdef LIBACL_NFS4_DEBUG
Steve Dickson 83ba30
+		printf(" Getting Ace #%d of %d\n", ace_n, num_aces);
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+		/* Get the acl type */
Steve Dickson 83ba30
+		if(bufs <= 0) {
Steve Dickson 83ba30
+			errno = EINVAL;
Steve Dickson 83ba30
+			goto bad_xattr_val;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		type = (u32)ntohl(*((u32*)bufp));
Steve Dickson 83ba30
+#ifdef LIBACL_NFS4_DEBUG
Steve Dickson 83ba30
+		printf("  Type: %x\n", type);
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		d_ptr = sizeof(u32);
Steve Dickson 83ba30
+		bufp += d_ptr;
Steve Dickson 83ba30
+		bufs -= d_ptr;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		/* Get the acl flag */
Steve Dickson 83ba30
+		if(bufs <= 0) {
Steve Dickson 83ba30
+			errno = EINVAL;
Steve Dickson 83ba30
+			goto bad_xattr_val;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		flag = (u32)ntohl(*((u32*)bufp));
Steve Dickson 83ba30
+#ifdef LIBACL_NFS4_DEBUG
Steve Dickson 83ba30
+		printf("  Flag: %x\n", flag);
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		bufp += d_ptr;
Steve Dickson 83ba30
+		bufs -= d_ptr;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		/* Get the access mask */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		if(bufs <= 0) {
Steve Dickson 83ba30
+			errno = EINVAL;
Steve Dickson 83ba30
+			goto bad_xattr_val;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		access_mask = (u32)ntohl(*((u32*)bufp));
Steve Dickson 83ba30
+#ifdef LIBACL_NFS4_DEBUG
Steve Dickson 83ba30
+		printf("  Access Mask: %x\n", access_mask);
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		bufp += d_ptr;
Steve Dickson 83ba30
+		bufs -= d_ptr;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		/* Get the who string length*/
Steve Dickson 83ba30
+		if(bufs <= 0) {
Steve Dickson 83ba30
+			errno = EINVAL;
Steve Dickson 83ba30
+			goto bad_xattr_val;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		wholen = (u32)ntohl(*((u32*)bufp));
Steve Dickson 83ba30
+#ifdef LIBACL_NFS4_DEBUG
Steve Dickson 83ba30
+		printf("  Wholen: %d\n", wholen);
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		bufp += d_ptr;
Steve Dickson 83ba30
+		bufs -= d_ptr;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		/* Get the who string */
Steve Dickson 83ba30
+		if(bufs <= 0) {
Steve Dickson 83ba30
+			errno = EINVAL;
Steve Dickson 83ba30
+			goto bad_xattr_val;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		who = (char *) malloc((wholen+1) * sizeof(char));
Steve Dickson 83ba30
+		if(who == NULL)
Steve Dickson 83ba30
+		{
Steve Dickson 83ba30
+			errno = ENOMEM;
Steve Dickson 83ba30
+			goto bad_xattr_val;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		memcpy(who, bufp, wholen);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		who[wholen] = '\0';
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#ifdef LIBACL_NFS4_DEBUG
Steve Dickson 83ba30
+		printf("  Who: %s\n", who);
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		d_ptr = ((wholen / sizeof(u32))*sizeof(u32));
Steve Dickson 83ba30
+		if(wholen % sizeof(u32) != 0)
Steve Dickson 83ba30
+			d_ptr += sizeof(u32);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		bufp += d_ptr;
Steve Dickson 83ba30
+		bufs -= d_ptr;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		/* Make sure we aren't outside our domain */
Steve Dickson 83ba30
+		if(bufs < 0) {
Steve Dickson 83ba30
+			free(who);
Steve Dickson 83ba30
+			goto bad_xattr_val;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		if(acl_nfs4_add_ace(nacl_p, type, flag, access_mask, acl_nfs4_get_whotype(who), who) < 0) {
Steve Dickson 83ba30
+			free(who);
Steve Dickson 83ba30
+			goto bad_xattr_val;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		free(who);
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return nacl_p;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+bad_xattr_val:
Steve Dickson 83ba30
+	/* We bailed for some reason */
Steve Dickson 83ba30
+	acl_nfs4_free(nacl_p);
Steve Dickson 83ba30
+	return NULL;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_nfs4_xattr_pack.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,148 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  NFSv4 ACL Code
Steve Dickson 83ba30
+ *  Pack an NFS4 ACL into an XDR encoded buffer.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2002, 2003 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include <libacl_nfs4.h>
Steve Dickson 83ba30
+#include <netinet/in.h>
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+int acl_nfs4_xattr_pack(struct nfs4_acl * acl, char** bufp)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	struct nfs4_ace * ace;
Steve Dickson 83ba30
+	int buflen;
Steve Dickson 83ba30
+	int rbuflen;
Steve Dickson 83ba30
+	int num_aces;
Steve Dickson 83ba30
+	int ace_num;
Steve Dickson 83ba30
+	int wholen;
Steve Dickson 83ba30
+	int result;
Steve Dickson 83ba30
+	char* p;
Steve Dickson 83ba30
+	char* who;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if(acl == NULL || bufp == NULL)
Steve Dickson 83ba30
+	{
Steve Dickson 83ba30
+		errno = EINVAL;
Steve Dickson 83ba30
+		goto failed;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	buflen = acl_nfs4_xattr_size(acl);
Steve Dickson 83ba30
+	if(buflen < 0)
Steve Dickson 83ba30
+	{
Steve Dickson 83ba30
+		goto failed;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	*bufp = (char*) malloc(buflen);
Steve Dickson 83ba30
+	if(*bufp == NULL) {
Steve Dickson 83ba30
+		errno = ENOMEM;
Steve Dickson 83ba30
+		goto failed;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	p = *bufp;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	num_aces = acl->naces;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	*((u32*)p) = htonl(num_aces);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	rbuflen = sizeof(u32);
Steve Dickson 83ba30
+	p += sizeof(u32);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	ace = acl->ace_head.tqh_first;
Steve Dickson 83ba30
+	ace_num = 1;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	while(1)
Steve Dickson 83ba30
+	{
Steve Dickson 83ba30
+		if(ace == NULL)
Steve Dickson 83ba30
+		{
Steve Dickson 83ba30
+			if(ace_num > num_aces) {
Steve Dickson 83ba30
+				break;
Steve Dickson 83ba30
+			} else {
Steve Dickson 83ba30
+				errno = ENODATA;
Steve Dickson 83ba30
+				goto failed;
Steve Dickson 83ba30
+			}
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		*((u32*)p) = htonl(ace->type);
Steve Dickson 83ba30
+		p += sizeof(u32);
Steve Dickson 83ba30
+		rbuflen += sizeof(u32);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		*((u32*)p) = htonl(ace->flag);
Steve Dickson 83ba30
+		p += sizeof(u32);
Steve Dickson 83ba30
+		rbuflen += sizeof(u32);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		*((u32*)p) = htonl(ace->access_mask);
Steve Dickson 83ba30
+		p += sizeof(u32);
Steve Dickson 83ba30
+		rbuflen += sizeof(u32);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = acl_nfs4_get_who(ace, NULL, &who);
Steve Dickson 83ba30
+		if(result < 0) {
Steve Dickson 83ba30
+			goto free_failed;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		wholen = strlen(who);
Steve Dickson 83ba30
+		*((u32*)p) = htonl(wholen);
Steve Dickson 83ba30
+		rbuflen += sizeof(u32);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		p += sizeof(u32);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		memcpy(p, who, wholen);
Steve Dickson 83ba30
+		free(who);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		p += (wholen / NFS4_XDR_MOD) * NFS4_XDR_MOD;
Steve Dickson 83ba30
+		if(wholen % NFS4_XDR_MOD) {
Steve Dickson 83ba30
+			p += NFS4_XDR_MOD;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		rbuflen += (wholen / NFS4_XDR_MOD) * NFS4_XDR_MOD;
Steve Dickson 83ba30
+		if(wholen % NFS4_XDR_MOD) {
Steve Dickson 83ba30
+			rbuflen += NFS4_XDR_MOD;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		ace = ace->l_ace.tqe_next;
Steve Dickson 83ba30
+		ace_num++;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (buflen != rbuflen)
Steve Dickson 83ba30
+	{
Steve Dickson 83ba30
+		goto free_failed;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+	return buflen;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+free_failed:
Steve Dickson 83ba30
+	free(*bufp);
Steve Dickson 83ba30
+	*bufp = NULL;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+failed:
Steve Dickson 83ba30
+	return -1;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
--- acl-2.2.39/libacl/acl_extended_file.c.orig	2006-06-20 02:51:25.000000000 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_extended_file.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -22,6 +22,7 @@
Steve Dickson 83ba30
 #include <unistd.h>
Steve Dickson 83ba30
 #include <attr/xattr.h>
Steve Dickson 83ba30
 #include "libacl.h"
Steve Dickson 83ba30
+#include "libacl_nfs4.h"
Steve Dickson 83ba30
 
Steve Dickson 83ba30
 #include "byteorder.h"
Steve Dickson 83ba30
 #include "acl_ea.h"
Steve Dickson 83ba30
@@ -33,6 +34,34 @@ acl_extended_file(const char *path_p)
Steve Dickson 83ba30
 	int base_size = sizeof(acl_ea_header) + 3 * sizeof(acl_ea_entry);
Steve Dickson 83ba30
 	int retval;
Steve Dickson 83ba30
 
Steve Dickson 83ba30
+	/* XXX: Ugh: what's the easiest way to do this, taking
Steve Dickson 83ba30
+	 * into account default acl's, and that length alone won't do this?
Steve Dickson 83ba30
+	 * Also I'm a little uncomfortable with the amount of #ifdef
Steve Dickson 83ba30
+	 * NFS4 stuff that's going on.  We need a cleaner separation. */
Steve Dickson 83ba30
+#ifdef USE_NFSV4_TRANS
Steve Dickson 83ba30
+	retval = getxattr(path_p, ACL_NFS4_XATTR, NULL, 0);
Steve Dickson 83ba30
+	if (retval < 0 && errno != ENOATTR && errno != EOPNOTSUPP)
Steve Dickson 83ba30
+		return -1;
Steve Dickson 83ba30
+	if (retval >= 0) {
Steve Dickson 83ba30
+		struct nfs4_acl *nfsacl;
Steve Dickson 83ba30
+		char *ext_acl_p = alloca(retval);
Steve Dickson 83ba30
+		if (!ext_acl_p)
Steve Dickson 83ba30
+			return -1;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		retval = getxattr(path_p, ACL_NFS4_XATTR, ext_acl_p, retval);
Steve Dickson 83ba30
+		if (retval == -1)
Steve Dickson 83ba30
+			return -1;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		nfsacl = acl_nfs4_xattr_load(ext_acl_p, retval, NFS4_ACL_ISFILE);
Steve Dickson 83ba30
+		if (nfsacl) {
Steve Dickson 83ba30
+			int count = nfsacl->naces;
Steve Dickson 83ba30
+			acl_nfs4_free(nfsacl);
Steve Dickson 83ba30
+			return count > 6;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+		return 0;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
 	retval = getxattr(path_p, ACL_EA_ACCESS, NULL, 0);
Steve Dickson 83ba30
 	if (retval < 0 && errno != ENOATTR && errno != ENODATA)
Steve Dickson 83ba30
 		return -1;
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_ptn4_acl_trans.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,509 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  NFSv4 ACL Code
Steve Dickson 83ba30
+ *  Convert a posix ACL to an NFSv4 ACL
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2002, 2003 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *  J. Bruce Fields <bfields@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include <acl/libacl.h>
Steve Dickson 83ba30
+#include <nfsidmap.h>
Steve Dickson 83ba30
+#include "libacl_nfs4.h"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define FILE_OR_DIR_INHERIT (NFS4_ACE_FILE_INHERIT_ACE \
Steve Dickson 83ba30
+		| NFS4_ACE_DIRECTORY_INHERIT_ACE)
Steve Dickson 83ba30
+#define NFS4_INHERITANCE_FLAGS (FILE_OR_DIR_INHERIT | NFS4_ACE_INHERIT_ONLY_ACE)
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* Plan:
Steve Dickson 83ba30
+ * 1: if setting default, remove all purely inherited aces, and replace
Steve Dickson 83ba30
+ *    all dual-use aces by purely effective aces
Steve Dickson 83ba30
+ * 2: if setting effective, remove all purely effective aces, and replace
Steve Dickson 83ba30
+ *    all dual-use aces by purely inherited ones
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+static void purge_aces(struct nfs4_acl *nacl, acl_type_t type)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	struct nfs4_ace *p, *next;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	for (p = nacl->ace_head.tqh_first; p != NULL; p = next) {
Steve Dickson 83ba30
+		next = p->l_ace.tqe_next;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		if (!(p->flag & FILE_OR_DIR_INHERIT)) {
Steve Dickson 83ba30
+			/* purely effective */
Steve Dickson 83ba30
+			if (type == ACL_TYPE_ACCESS)
Steve Dickson 83ba30
+				acl_nfs4_remove_ace(nacl, p);
Steve Dickson 83ba30
+		} else if (p->flag & NFS4_ACE_INHERIT_ONLY_ACE) {
Steve Dickson 83ba30
+			/* purely inherited */
Steve Dickson 83ba30
+			if (type == ACL_TYPE_DEFAULT)
Steve Dickson 83ba30
+				acl_nfs4_remove_ace(nacl, p);
Steve Dickson 83ba30
+		} else {
Steve Dickson 83ba30
+			/* both effective and inherited */
Steve Dickson 83ba30
+			if (type == ACL_TYPE_DEFAULT) {
Steve Dickson 83ba30
+				/* Change to purely effective */
Steve Dickson 83ba30
+				p->flag &= ~NFS4_INHERITANCE_FLAGS;
Steve Dickson 83ba30
+			} else { /* ACL_TYPE_ACCESS */
Steve Dickson 83ba30
+				/* Change to purely inherited */
Steve Dickson 83ba30
+				p->flag |= NFS4_INHERITANCE_FLAGS;
Steve Dickson 83ba30
+			}
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+ 
Steve Dickson 83ba30
+int
Steve Dickson 83ba30
+acl_ptn4_acl_trans(acl_t pacl, struct nfs4_acl *acl, acl_type_t type, u32 is_dir, char *nfs_domain)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	int eflag;
Steve Dickson 83ba30
+	u32 mask, mask_mask = 0;
Steve Dickson 83ba30
+	int num_aces;
Steve Dickson 83ba30
+	int result, result2;
Steve Dickson 83ba30
+	u32 iflags = NFS4_ACL_NOFLAGS;
Steve Dickson 83ba30
+	int allocated = 0;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	acl_entry_t pace_p;
Steve Dickson 83ba30
+	acl_tag_t ace_type;
Steve Dickson 83ba30
+	acl_permset_t perms;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	char who_buf_static[NFS4_ACL_WHO_BUFFER_LEN_GUESS];
Steve Dickson 83ba30
+	char *who_buf = NULL;
Steve Dickson 83ba30
+	int who_buflen;
Steve Dickson 83ba30
+	int who_buflen_static = NFS4_ACL_WHO_BUFFER_LEN_GUESS;
Steve Dickson 83ba30
+	uid_t * uid_p;
Steve Dickson 83ba30
+	gid_t * gid_p;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	eflag = 0;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (type == ACL_TYPE_DEFAULT) {
Steve Dickson 83ba30
+		eflag = NFS4_INHERITANCE_FLAGS;
Steve Dickson 83ba30
+		iflags |= NFS4_ACL_REQUEST_DEFAULT;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	purge_aces(acl, type);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (is_dir & NFS4_ACL_ISDIR)
Steve Dickson 83ba30
+		iflags |= NFS4_ACL_ISDIR;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (pacl == NULL || (acl_valid(pacl) < 0 || acl_entries(pacl) == 0)) {
Steve Dickson 83ba30
+		errno = EINVAL;
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	/* Start Conversion */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	/* 3 aces minimum (mode bits) */
Steve Dickson 83ba30
+	num_aces = acl_entries(pacl);
Steve Dickson 83ba30
+	if (num_aces < 3) {
Steve Dickson 83ba30
+		errno = EINVAL;
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	/* Get the mask entry */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_get_entry(pacl, ACL_FIRST_ENTRY, &pace_p);
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	while (result > 0 && mask_mask == 0) {
Steve Dickson 83ba30
+		result = acl_get_tag_type(pace_p, &ace_type);
Steve Dickson 83ba30
+		if (result < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		if (ace_type == ACL_MASK) {
Steve Dickson 83ba30
+			result = acl_get_permset(pace_p, &perms;;
Steve Dickson 83ba30
+			if(result < 0)
Steve Dickson 83ba30
+				goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			result = acl_ptn4_get_mask(&mask_mask, perms, iflags);
Steve Dickson 83ba30
+			if(result < 0)
Steve Dickson 83ba30
+				goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			mask_mask = ~mask_mask;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = acl_get_entry(pacl, ACL_NEXT_ENTRY, &pace_p);
Steve Dickson 83ba30
+		if (result < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	/* Get the file owner entry */
Steve Dickson 83ba30
+	result = acl_get_entry(pacl, ACL_FIRST_ENTRY, &pace_p);
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_get_tag_type(pace_p, &ace_type);
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (ace_type != ACL_USER_OBJ) {
Steve Dickson 83ba30
+		errno = EINVAL;
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_get_permset(pace_p, &perms;;
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_ptn4_get_mask(&mask, perms, iflags | NFS4_ACL_OWNER);
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_nfs4_add_pair(acl, eflag, mask, NFS4_ACL_WHO_OWNER, NULL);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_get_entry(pacl, ACL_NEXT_ENTRY, &pace_p);
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result2 = acl_get_tag_type(pace_p, &ace_type);
Steve Dickson 83ba30
+	if (result2 < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	while (ace_type == ACL_USER && result > 0) {
Steve Dickson 83ba30
+		result = acl_get_permset(pace_p, &perms;;
Steve Dickson 83ba30
+		if (result < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = acl_ptn4_get_mask(&mask, perms, iflags);
Steve Dickson 83ba30
+		if (result < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		uid_p = acl_get_qualifier(pace_p);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		who_buf = who_buf_static;
Steve Dickson 83ba30
+		who_buflen = who_buflen_static;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = nfs4_init_name_mapping(NULL);
Steve Dickson 83ba30
+		result = nfs4_uid_to_name(*uid_p, nfs_domain, who_buf, who_buflen);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		while (result == -ENOBUFS) {
Steve Dickson 83ba30
+			if (who_buf != who_buf_static)
Steve Dickson 83ba30
+				free(who_buf);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			/* Increase the size by a full buflen unit */
Steve Dickson 83ba30
+			who_buflen += who_buflen_static;
Steve Dickson 83ba30
+			who_buf = malloc(who_buflen);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			if (who_buf == NULL) {
Steve Dickson 83ba30
+				result = -ENOMEM;
Steve Dickson 83ba30
+				break;
Steve Dickson 83ba30
+			}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			result = nfs4_init_name_mapping(NULL);
Steve Dickson 83ba30
+			result = nfs4_uid_to_name(*uid_p, nfs_domain, who_buf, who_buflen);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+		acl_free(uid_p);
Steve Dickson 83ba30
+		if (result < 0) {
Steve Dickson 83ba30
+			errno = -result;
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		if (who_buf == NULL)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = acl_nfs4_add_ace(acl, NFS4_ACE_ACCESS_DENIED_ACE_TYPE,
Steve Dickson 83ba30
+				eflag,  mask_mask, NFS4_ACL_WHO_NAMED, who_buf);
Steve Dickson 83ba30
+		if (result < 0) {
Steve Dickson 83ba30
+			if(who_buf != who_buf_static)
Steve Dickson 83ba30
+				free(who_buf);
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = acl_nfs4_add_pair(acl, eflag, mask, NFS4_ACL_WHO_NAMED,
Steve Dickson 83ba30
+				who_buf);
Steve Dickson 83ba30
+		if (who_buf != who_buf_static)
Steve Dickson 83ba30
+			free(who_buf);
Steve Dickson 83ba30
+		if (result < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = acl_get_entry(pacl, ACL_NEXT_ENTRY, &pace_p);
Steve Dickson 83ba30
+		if (result <= 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result2 = acl_get_tag_type(pace_p, &ace_type);
Steve Dickson 83ba30
+		if (result2 < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	/* In the case of groups, we apply allow ACEs first, then deny ACEs,
Steve Dickson 83ba30
+	 * since a user can be in more than one group.  */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	/* allow ACEs */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (num_aces > 3) {
Steve Dickson 83ba30
+		result2 = acl_get_tag_type(pace_p, &ace_type);
Steve Dickson 83ba30
+		if (result2 < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		if (ace_type != ACL_GROUP_OBJ) {
Steve Dickson 83ba30
+			errno = EINVAL;
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = acl_nfs4_add_ace(acl, NFS4_ACE_ACCESS_DENIED_ACE_TYPE,
Steve Dickson 83ba30
+				NFS4_ACE_IDENTIFIER_GROUP | eflag, mask_mask,
Steve Dickson 83ba30
+				NFS4_ACL_WHO_GROUP, NULL);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		if (result < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_get_permset(pace_p, &perms;;
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_ptn4_get_mask(&mask, perms, iflags);
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_nfs4_add_ace(acl, NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE,
Steve Dickson 83ba30
+			NFS4_ACE_IDENTIFIER_GROUP | eflag, mask, NFS4_ACL_WHO_GROUP, NULL);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_get_entry(pacl, ACL_NEXT_ENTRY, &pace_p);
Steve Dickson 83ba30
+	if (result <= 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result2 = acl_get_tag_type(pace_p, &ace_type);
Steve Dickson 83ba30
+	if (result2 < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	while (ace_type == ACL_GROUP && result > 0) {
Steve Dickson 83ba30
+		result = acl_get_permset(pace_p, &perms;;
Steve Dickson 83ba30
+		if (result < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = acl_ptn4_get_mask(&mask, perms, iflags);
Steve Dickson 83ba30
+		if (result < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		gid_p = acl_get_qualifier(pace_p);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		who_buf = who_buf_static;
Steve Dickson 83ba30
+		who_buflen = who_buflen_static;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = nfs4_gid_to_name(*gid_p, nfs_domain, who_buf, who_buflen);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		while (result == -ENOBUFS) {
Steve Dickson 83ba30
+			if (who_buf != who_buf_static)
Steve Dickson 83ba30
+				free(who_buf);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			/* Increase the size by a full buflen unit */
Steve Dickson 83ba30
+			who_buflen += who_buflen_static;
Steve Dickson 83ba30
+			who_buf = malloc(who_buflen);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			if (who_buf == NULL) {
Steve Dickson 83ba30
+				result = -ENOMEM;
Steve Dickson 83ba30
+				break;
Steve Dickson 83ba30
+			}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			result = nfs4_gid_to_name(*gid_p, nfs_domain, who_buf, who_buflen);
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		acl_free(gid_p);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		if (result < 0) {
Steve Dickson 83ba30
+			errno = -result;
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		if (who_buf == NULL)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = acl_nfs4_add_ace(acl, NFS4_ACE_ACCESS_DENIED_ACE_TYPE,
Steve Dickson 83ba30
+				NFS4_ACE_IDENTIFIER_GROUP | eflag, mask_mask,
Steve Dickson 83ba30
+				NFS4_ACL_WHO_NAMED, who_buf);
Steve Dickson 83ba30
+		if (result < 0) {
Steve Dickson 83ba30
+			if(who_buf != who_buf_static)
Steve Dickson 83ba30
+				free(who_buf);
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = acl_nfs4_add_ace(acl, NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE,
Steve Dickson 83ba30
+		    	NFS4_ACE_IDENTIFIER_GROUP | eflag, mask,
Steve Dickson 83ba30
+				NFS4_ACL_WHO_NAMED, who_buf);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		if (who_buf != who_buf_static)
Steve Dickson 83ba30
+			free(who_buf);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		if (result < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+		result = acl_get_entry(pacl, ACL_NEXT_ENTRY, &pace_p);
Steve Dickson 83ba30
+		if (result <= 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result2 = acl_get_tag_type(pace_p, &ace_type);
Steve Dickson 83ba30
+		if (result2 < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	/* deny ACEs */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_get_entry(pacl, ACL_FIRST_ENTRY, &pace_p);
Steve Dickson 83ba30
+	if (result <= 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result2 = acl_get_tag_type(pace_p, &ace_type);
Steve Dickson 83ba30
+	if (result2 < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	while (ace_type != ACL_GROUP_OBJ && result > 0) {
Steve Dickson 83ba30
+		result = acl_get_entry(pacl, ACL_NEXT_ENTRY, &pace_p);
Steve Dickson 83ba30
+		if(result <= 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result2 = acl_get_tag_type(pace_p, &ace_type);
Steve Dickson 83ba30
+		if(result2 < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_get_permset(pace_p, &perms;;
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_ptn4_get_mask(&mask, perms, iflags);
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_nfs4_add_ace(acl, NFS4_ACE_ACCESS_DENIED_ACE_TYPE,
Steve Dickson 83ba30
+			NFS4_ACE_IDENTIFIER_GROUP | eflag, ~mask, NFS4_ACL_WHO_GROUP,
Steve Dickson 83ba30
+			NULL);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_get_entry(pacl, ACL_NEXT_ENTRY, &pace_p);
Steve Dickson 83ba30
+	if (result <= 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result2 = acl_get_tag_type(pace_p, &ace_type);
Steve Dickson 83ba30
+	if (result2 < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	while (ace_type == ACL_GROUP && result > 0) {
Steve Dickson 83ba30
+		result = acl_get_permset(pace_p, &perms;;
Steve Dickson 83ba30
+		if (result < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = acl_ptn4_get_mask(&mask, perms, iflags);
Steve Dickson 83ba30
+		if (result < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		gid_p = acl_get_qualifier(pace_p);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		who_buf = who_buf_static;
Steve Dickson 83ba30
+		who_buflen = who_buflen_static;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = nfs4_gid_to_name(*gid_p, nfs_domain, who_buf, who_buflen);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		while (result == -ENOBUFS) {
Steve Dickson 83ba30
+			if (who_buf != who_buf_static)
Steve Dickson 83ba30
+				free(who_buf);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			/* Increase the size by a full buflen unit */
Steve Dickson 83ba30
+			who_buflen += who_buflen_static;
Steve Dickson 83ba30
+			who_buf = malloc(who_buflen);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			if (who_buf == NULL) {
Steve Dickson 83ba30
+				result = -ENOMEM;
Steve Dickson 83ba30
+				break;
Steve Dickson 83ba30
+			}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			result = nfs4_gid_to_name(*gid_p, nfs_domain, who_buf, who_buflen);
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		acl_free(gid_p);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		if (result < 0) {
Steve Dickson 83ba30
+			errno = -result;
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		if (who_buf == NULL)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = acl_nfs4_add_ace(acl, NFS4_ACE_ACCESS_DENIED_ACE_TYPE,
Steve Dickson 83ba30
+		    		NFS4_ACE_IDENTIFIER_GROUP | eflag, ~mask,
Steve Dickson 83ba30
+					NFS4_ACL_WHO_NAMED, who_buf);
Steve Dickson 83ba30
+		if (who_buf != who_buf_static)
Steve Dickson 83ba30
+			free(who_buf);
Steve Dickson 83ba30
+		if (result < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = acl_get_entry(pacl, ACL_NEXT_ENTRY, &pace_p);
Steve Dickson 83ba30
+		if (result <= 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result2 = acl_get_tag_type(pace_p, &ace_type);
Steve Dickson 83ba30
+		if (result2 < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (ace_type == ACL_MASK) {
Steve Dickson 83ba30
+		result = acl_get_entry(pacl, ACL_NEXT_ENTRY, &pace_p);
Steve Dickson 83ba30
+		if (result <= 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result2 = acl_get_tag_type(pace_p, &ace_type);
Steve Dickson 83ba30
+		if (result2 < 0)
Steve Dickson 83ba30
+			goto out;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (ace_type != ACL_OTHER) {
Steve Dickson 83ba30
+		errno = EINVAL;
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_get_permset(pace_p, &perms;;
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_ptn4_get_mask(&mask, perms, iflags);
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto out;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_nfs4_add_pair(acl, eflag, mask, NFS4_ACL_WHO_EVERYONE, NULL);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return result;
Steve Dickson 83ba30
+out:
Steve Dickson 83ba30
+	if (allocated)
Steve Dickson 83ba30
+		acl_nfs4_free(acl);
Steve Dickson 83ba30
+	return -1;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
--- acl-2.2.39/libacl/acl_get_fd.c.orig	2006-06-20 02:51:25.000000000 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_get_fd.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -28,6 +28,10 @@
Steve Dickson 83ba30
 #include "libacl.h"
Steve Dickson 83ba30
 #include "__acl_from_xattr.h"
Steve Dickson 83ba30
 
Steve Dickson 83ba30
+#ifdef USE_NFSV4_TRANS
Steve Dickson 83ba30
+ #include "libacl_nfs4.h"
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
 #include "byteorder.h"
Steve Dickson 83ba30
 #include "acl_ea.h"
Steve Dickson 83ba30
 
Steve Dickson 83ba30
@@ -38,31 +42,59 @@ acl_get_fd(int fd)
Steve Dickson 83ba30
 {
Steve Dickson 83ba30
 	const size_t size_guess = acl_ea_size(16);
Steve Dickson 83ba30
 	char *ext_acl_p = alloca(size_guess);
Steve Dickson 83ba30
+	char *name = ACL_EA_ACCESS;
Steve Dickson 83ba30
 	int retval;
Steve Dickson 83ba30
+	int nfsv4acls;
Steve Dickson 83ba30
 
Steve Dickson 83ba30
 	if (!ext_acl_p)
Steve Dickson 83ba30
 		return NULL;
Steve Dickson 83ba30
-	retval = fgetxattr(fd, ACL_EA_ACCESS, ext_acl_p, size_guess);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#ifdef USE_NFSV4_TRANS
Steve Dickson 83ba30
+	retval = fgetxattr(fd, ACL_NFS4_XATTR, ext_acl_p, size_guess);
Steve Dickson 83ba30
+	if(retval == -1 && (errno == ENOATTR || errno == EOPNOTSUPP)) {
Steve Dickson 83ba30
+		nfsv4acls = ACL_NFS4_NOT_USED;
Steve Dickson 83ba30
+		retval = fgetxattr(fd, name, ext_acl_p, size_guess);
Steve Dickson 83ba30
+	} else {
Steve Dickson 83ba30
+		nfsv4acls = ACL_NFS4_USED;
Steve Dickson 83ba30
+		name = ACL_NFS4_XATTR;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+#else
Steve Dickson 83ba30
+	retval = fgetxattr(fd, name, ext_acl_p, size_guess);
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
 	if (retval == -1 && errno == ERANGE) {
Steve Dickson 83ba30
-		retval = fgetxattr(fd, ACL_EA_ACCESS, NULL, 0);
Steve Dickson 83ba30
+		retval = fgetxattr(fd, name, NULL, 0);
Steve Dickson 83ba30
 		if (retval > 0) {
Steve Dickson 83ba30
 			ext_acl_p = alloca(retval);
Steve Dickson 83ba30
 			if (!ext_acl_p)
Steve Dickson 83ba30
 				return NULL;
Steve Dickson 83ba30
-			retval = fgetxattr(fd, ACL_EA_ACCESS, ext_acl_p,retval);
Steve Dickson 83ba30
+			retval = fgetxattr(fd, name, ext_acl_p, retval);
Steve Dickson 83ba30
 		}
Steve Dickson 83ba30
 	}
Steve Dickson 83ba30
 	if (retval > 0) {
Steve Dickson 83ba30
-		acl_t acl = __acl_from_xattr(ext_acl_p, retval);
Steve Dickson 83ba30
-		return acl;
Steve Dickson 83ba30
+#ifdef USE_NFSV4_TRANS
Steve Dickson 83ba30
+		if(nfsv4acls == ACL_NFS4_USED) {
Steve Dickson 83ba30
+			acl_t acl = __posix_acl_from_nfs4_xattr(ext_acl_p, retval,
Steve Dickson 83ba30
+					ACL_TYPE_ACCESS, NFS4_ACL_ISFILE);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			return acl;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+		else
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+		{
Steve Dickson 83ba30
+			acl_t acl = __acl_from_xattr(ext_acl_p, retval);
Steve Dickson 83ba30
+			return acl;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
 	} else if (retval == 0 || errno == ENOATTR || errno == ENODATA) {
Steve Dickson 83ba30
 		struct stat st;
Steve Dickson 83ba30
 
Steve Dickson 83ba30
-		if (fstat(fd, &st) == 0)
Steve Dickson 83ba30
-			return acl_from_mode(st.st_mode);
Steve Dickson 83ba30
-		else
Steve Dickson 83ba30
+		if (fstat(fd, &st) != 0) {
Steve Dickson 83ba30
 			return NULL;
Steve Dickson 83ba30
-	} else
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		return acl_from_mode(st.st_mode);
Steve Dickson 83ba30
+	} else {
Steve Dickson 83ba30
 		return NULL;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
 }
Steve Dickson 83ba30
 
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_nfs4_xattr_size.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,91 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  NFSv4 ACL Code
Steve Dickson 83ba30
+ *  Return the expected xattr XDR encoded size of the nfs acl. Used for
Steve Dickson 83ba30
+ *  figuring the size of the xattr buffer.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2002, 2003 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include <libacl_nfs4.h>
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+int acl_nfs4_xattr_size(struct nfs4_acl * acl)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	int size = 0;
Steve Dickson 83ba30
+	struct nfs4_ace * ace;
Steve Dickson 83ba30
+	int ace_num;
Steve Dickson 83ba30
+	int num_aces;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if(acl == NULL) {
Steve Dickson 83ba30
+		errno = EINVAL;
Steve Dickson 83ba30
+		goto failed;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	/* Space for number of aces */
Steve Dickson 83ba30
+	size += sizeof(u32);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	ace = acl->ace_head.tqh_first;
Steve Dickson 83ba30
+	ace_num = 1;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	num_aces = acl->naces;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	while(1)
Steve Dickson 83ba30
+	{
Steve Dickson 83ba30
+		if(ace == NULL) {
Steve Dickson 83ba30
+			if(ace_num > num_aces) {
Steve Dickson 83ba30
+				break;
Steve Dickson 83ba30
+			} else {
Steve Dickson 83ba30
+				errno = ENODATA;
Steve Dickson 83ba30
+				goto failed;
Steve Dickson 83ba30
+			}
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		/* space for type, flag, and mask */
Steve Dickson 83ba30
+		size += (3 * sizeof(u32));
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		/* space for strlen */
Steve Dickson 83ba30
+		size += sizeof(u32);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		/* space for the who string... xdr encoded */
Steve Dickson 83ba30
+		size += (strlen(ace->who) / NFS4_XDR_MOD) * NFS4_XDR_MOD * sizeof(char);
Steve Dickson 83ba30
+		if(strlen(ace->who) % NFS4_XDR_MOD) {
Steve Dickson 83ba30
+			size += NFS4_XDR_MOD;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		ace = ace->l_ace.tqe_next;
Steve Dickson 83ba30
+		ace_num++;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return size;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+failed:
Steve Dickson 83ba30
+	return -1;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_ptn4_get_mask.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,81 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  NFSv4 ACL Code
Steve Dickson 83ba30
+ *  Translate POSIX permissions to an NFSv4 mask
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2002, 2003 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include <acl/libacl.h>
Steve Dickson 83ba30
+#include <libacl_nfs4.h>
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+int acl_ptn4_get_mask(u32* mask, acl_permset_t perms, int iflags)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	int result;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	*mask = NFS4_ANYONE_MODE;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (perms == NULL) {
Steve Dickson 83ba30
+		errno = EINVAL;
Steve Dickson 83ba30
+		goto failed;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if (iflags & NFS4_ACL_OWNER)
Steve Dickson 83ba30
+		*mask |= NFS4_OWNER_MODE;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_get_perm(perms, ACL_READ);
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto failed;
Steve Dickson 83ba30
+	else if(result == 1)
Steve Dickson 83ba30
+		*mask |= NFS4_READ_MODE;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_get_perm(perms, ACL_WRITE);
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto failed;
Steve Dickson 83ba30
+	else if (result == 1) {
Steve Dickson 83ba30
+		*mask |= NFS4_WRITE_MODE;
Steve Dickson 83ba30
+		if (iflags & NFS4_ACL_ISDIR)
Steve Dickson 83ba30
+			*mask |= NFS4_ACE_DELETE_CHILD;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	result = acl_get_perm(perms, ACL_EXECUTE);
Steve Dickson 83ba30
+	if (result < 0)
Steve Dickson 83ba30
+		goto failed;
Steve Dickson 83ba30
+	else if (result == 1)
Steve Dickson 83ba30
+		*mask |= NFS4_EXECUTE_MODE;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return 0;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+failed:
Steve Dickson 83ba30
+	return -1;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
--- acl-2.2.39/libacl/acl_get_file.c.orig	2006-06-20 02:51:25.000000000 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_get_file.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -28,6 +28,10 @@
Steve Dickson 83ba30
 #include "libacl.h"
Steve Dickson 83ba30
 #include "__acl_from_xattr.h"
Steve Dickson 83ba30
 
Steve Dickson 83ba30
+#ifdef USE_NFSV4_TRANS
Steve Dickson 83ba30
+ #include "libacl_nfs4.h"
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
 #include "byteorder.h"
Steve Dickson 83ba30
 #include "acl_ea.h"
Steve Dickson 83ba30
 
Steve Dickson 83ba30
@@ -40,6 +44,8 @@ acl_get_file(const char *path_p, acl_typ
Steve Dickson 83ba30
 	char *ext_acl_p = alloca(size_guess);
Steve Dickson 83ba30
 	const char *name;
Steve Dickson 83ba30
 	int retval;
Steve Dickson 83ba30
+	int nfsv4acls;
Steve Dickson 83ba30
+	int iflags;
Steve Dickson 83ba30
 
Steve Dickson 83ba30
 	switch(type) {
Steve Dickson 83ba30
 		case ACL_TYPE_ACCESS:
Steve Dickson 83ba30
@@ -55,8 +61,20 @@ acl_get_file(const char *path_p, acl_typ
Steve Dickson 83ba30
 
Steve Dickson 83ba30
 	if (!ext_acl_p)
Steve Dickson 83ba30
 		return NULL;
Steve Dickson 83ba30
+#ifdef USE_NFSV4_TRANS
Steve Dickson 83ba30
+	retval = getxattr(path_p, ACL_NFS4_XATTR, ext_acl_p, size_guess);
Steve Dickson 83ba30
+	if((retval == -1) && (errno == ENOATTR || errno == EOPNOTSUPP)) {
Steve Dickson 83ba30
+		nfsv4acls = ACL_NFS4_NOT_USED;
Steve Dickson 83ba30
+		retval = getxattr(path_p, name, ext_acl_p, size_guess);
Steve Dickson 83ba30
+	} else {
Steve Dickson 83ba30
+		nfsv4acls = ACL_NFS4_USED;
Steve Dickson 83ba30
+		name = ACL_NFS4_XATTR;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+#else
Steve Dickson 83ba30
 	retval = getxattr(path_p, name, ext_acl_p, size_guess);
Steve Dickson 83ba30
-	if (retval == -1 && errno == ERANGE) {
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if ((retval == -1) && (errno == ERANGE)) {
Steve Dickson 83ba30
 		retval = getxattr(path_p, name, NULL, 0);
Steve Dickson 83ba30
 		if (retval > 0) {
Steve Dickson 83ba30
 			ext_acl_p = alloca(retval);
Steve Dickson 83ba30
@@ -66,9 +84,29 @@ acl_get_file(const char *path_p, acl_typ
Steve Dickson 83ba30
 		}
Steve Dickson 83ba30
 	}
Steve Dickson 83ba30
 	if (retval > 0) {
Steve Dickson 83ba30
-		acl_t acl = __acl_from_xattr(ext_acl_p, retval);
Steve Dickson 83ba30
-		return acl;
Steve Dickson 83ba30
-	} else if (retval == 0 || errno == ENOATTR || errno == ENODATA) {
Steve Dickson 83ba30
+#ifdef USE_NFSV4_TRANS
Steve Dickson 83ba30
+		if(nfsv4acls == ACL_NFS4_USED) {
Steve Dickson 83ba30
+			struct stat st;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			iflags = NFS4_ACL_ISFILE;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			if (stat(path_p, &st) != 0)
Steve Dickson 83ba30
+				return NULL;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			if (S_ISDIR(st.st_mode))
Steve Dickson 83ba30
+				iflags = NFS4_ACL_ISDIR;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+			acl_t acl = __posix_acl_from_nfs4_xattr(ext_acl_p, retval, type,
Steve Dickson 83ba30
+					iflags);
Steve Dickson 83ba30
+			return acl;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+		else
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+		{
Steve Dickson 83ba30
+			acl_t acl = __acl_from_xattr(ext_acl_p, retval);
Steve Dickson 83ba30
+			return acl;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+	} else if ((retval == 0) || (errno == ENOATTR) || (errno == ENODATA)) {
Steve Dickson 83ba30
 		struct stat st;
Steve Dickson 83ba30
 
Steve Dickson 83ba30
 		if (stat(path_p, &st) != 0)
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/libacl_nfs4.h	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,97 @@
Steve Dickson 83ba30
+#include <sys/types.h>
Steve Dickson 83ba30
+#include <pwd.h>
Steve Dickson 83ba30
+#include <grp.h>
Steve Dickson 83ba30
+#include <sys/acl.h>
Steve Dickson 83ba30
+#include <stdlib.h>
Steve Dickson 83ba30
+#include <sys/queue.h>
Steve Dickson 83ba30
+#include <nfs4.h>
Steve Dickson 83ba30
+#include <sys/errno.h>
Steve Dickson 83ba30
+#include <string.h>
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* mode bit translations: */
Steve Dickson 83ba30
+#define NFS4_READ_MODE NFS4_ACE_READ_DATA
Steve Dickson 83ba30
+#define NFS4_WRITE_MODE (NFS4_ACE_WRITE_DATA | NFS4_ACE_APPEND_DATA)
Steve Dickson 83ba30
+#define NFS4_EXECUTE_MODE NFS4_ACE_EXECUTE
Steve Dickson 83ba30
+#define NFS4_ANYONE_MODE (NFS4_ACE_READ_ATTRIBUTES | NFS4_ACE_READ_ACL | \
Steve Dickson 83ba30
+		NFS4_ACE_SYNCHRONIZE)
Steve Dickson 83ba30
+#define NFS4_OWNER_MODE (NFS4_ACE_WRITE_ATTRIBUTES | NFS4_ACE_WRITE_ACL)
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFS4_ACE_MASK_IGNORE (NFS4_ACE_DELETE | NFS4_ACE_WRITE_OWNER \
Steve Dickson 83ba30
+		| NFS4_ACE_READ_NAMED_ATTRS | NFS4_ACE_WRITE_NAMED_ATTRS)
Steve Dickson 83ba30
+/* XXX not sure about the following.  Note that e.g. DELETE_CHILD is wrong in
Steve Dickson 83ba30
+ * general (should only be ignored on files). */
Steve Dickson 83ba30
+#define MASK_EQUAL(mask1, mask2) \
Steve Dickson 83ba30
+	(((mask1) & NFS4_ACE_MASK_ALL & ~NFS4_ACE_MASK_IGNORE & \
Steve Dickson 83ba30
+	  					~NFS4_ACE_DELETE_CHILD) \
Steve Dickson 83ba30
+	 == ((mask2) & NFS4_ACE_MASK_ALL & ~NFS4_ACE_MASK_IGNORE & \
Steve Dickson 83ba30
+		 				~NFS4_ACE_DELETE_CHILD))
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* Maximum length of the ace->who attribute */
Steve Dickson 83ba30
+#define NFS4_ACL_WHO_LENGTH_MAX		2048
Steve Dickson 83ba30
+#define NFS4_ACL_WHO_BUFFER_LEN_GUESS	255
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* NFS4 acl xattr name */
Steve Dickson 83ba30
+#define ACL_NFS4_XATTR "system.nfs4_acl"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* Macro for finding empty tailqs */
Steve Dickson 83ba30
+#define TAILQ_IS_EMPTY(head) (head.tqh_first == NULL)
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* Flags to pass certain properties around */
Steve Dickson 83ba30
+#define NFS4_ACL_NOFLAGS			0x00
Steve Dickson 83ba30
+#define NFS4_ACL_ISFILE				0x00
Steve Dickson 83ba30
+#define NFS4_ACL_ISDIR				0x01
Steve Dickson 83ba30
+#define NFS4_ACL_OWNER				0x02
Steve Dickson 83ba30
+#define NFS4_ACL_REQUEST_DEFAULT	0x04
Steve Dickson 83ba30
+#define NFS4_ACL_RAW				0x01
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFS4_XDR_MOD				4
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+typedef u_int32_t u32;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+enum {	ACL_NFS4_NOT_USED = 0,
Steve Dickson 83ba30
+		ACL_NFS4_USED
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+struct ace_container {
Steve Dickson 83ba30
+	struct nfs4_ace *ace;
Steve Dickson 83ba30
+	TAILQ_ENTRY(ace_container) l_ace;
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+TAILQ_HEAD(ace_container_list_head, ace_container);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/**** Public functions ****/
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/** Manipulation functions **/
Steve Dickson 83ba30
+extern int				acl_nfs4_add_ace(struct nfs4_acl *, u32, u32, u32, int, char*);
Steve Dickson 83ba30
+extern int				acl_nfs4_add_pair(struct nfs4_acl *, int, u32, int, char*);
Steve Dickson 83ba30
+extern void				acl_nfs4_free(struct nfs4_acl *);
Steve Dickson 83ba30
+extern struct nfs4_acl *acl_nfs4_new(u32);
Steve Dickson 83ba30
+extern int				acl_nfs4_set_who(struct nfs4_ace*, int, char*);
Steve Dickson 83ba30
+extern struct nfs4_acl *acl_nfs4_copy_acl(struct nfs4_acl *);
Steve Dickson 83ba30
+extern struct nfs4_acl *acl_nfs4_xattr_load(char *, int, u32);
Steve Dickson 83ba30
+extern int				acl_nfs4_xattr_pack(struct nfs4_acl *, char**);
Steve Dickson 83ba30
+extern int				acl_nfs4_xattr_size(struct nfs4_acl *);
Steve Dickson 83ba30
+extern void				acl_nfs4_remove_ace(struct nfs4_acl * acl, struct nfs4_ace * ace);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/** Conversion functions **/
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* nfs4 -> posix */
Steve Dickson 83ba30
+extern acl_t		acl_n4tp_acl_trans(struct nfs4_acl *, acl_type_t);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* posix -> nfs4 */
Steve Dickson 83ba30
+extern int				acl_ptn4_get_mask(u32* mask, acl_permset_t perms,
Steve Dickson 83ba30
+								int iflags);
Steve Dickson 83ba30
+extern int acl_ptn4_acl_trans(acl_t, struct nfs4_acl *, acl_type_t, u32, char*);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/** Access Functions **/
Steve Dickson 83ba30
+extern inline int	acl_nfs4_get_whotype(char*);
Steve Dickson 83ba30
+extern int			acl_nfs4_get_who(struct nfs4_ace*, int*, char**);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/**** Private(?) functions ****/
Steve Dickson 83ba30
+acl_t		__posix_acl_from_nfs4_xattr(char*, int, acl_type_t, u32);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* These will change */
Steve Dickson 83ba30
+char * nfs4_get_who_from_uid(uid_t);
Steve Dickson 83ba30
+char * nfs4_get_who_from_gid(gid_t);
Steve Dickson 83ba30
+/* End change */
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_nfs4_new.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,58 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  Common NFSv4 ACL handling code.
Steve Dickson 83ba30
+ *  Create a new NFSv4 ACL
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2002, 2003 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Marius Aamodt Eriksen <marius@umich.edu>
Steve Dickson 83ba30
+ *  J. Bruce Fields <bfields@umich.edu>
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *  Jeff Sedlak <jsedlak@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include "libacl_nfs4.h"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+struct nfs4_acl *
Steve Dickson 83ba30
+acl_nfs4_new(u32 is_dir)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	struct nfs4_acl *acl;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if ((acl = malloc(sizeof(*acl))) == NULL)
Steve Dickson 83ba30
+		return NULL;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	acl->naces = 0;
Steve Dickson 83ba30
+	acl->is_directory = is_dir;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	TAILQ_INIT(&acl->ace_head);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return acl;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_nfs4_copy_acl.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,85 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  NFSv4 ACL Code
Steve Dickson 83ba30
+ *  Deep copy an NFS4 ACL
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2002, 2003 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include "libacl_nfs4.h"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+struct nfs4_acl * acl_nfs4_copy_acl(struct nfs4_acl * nacl)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	struct nfs4_acl * new_acl;
Steve Dickson 83ba30
+	struct nfs4_ace * ace;
Steve Dickson 83ba30
+	u32 nace;
Steve Dickson 83ba30
+	u32 num_aces;
Steve Dickson 83ba30
+	int result;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	if(nacl == NULL) {
Steve Dickson 83ba30
+		errno = EINVAL;
Steve Dickson 83ba30
+		goto failed;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	num_aces = nacl->naces;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	new_acl = acl_nfs4_new(nacl->is_directory);
Steve Dickson 83ba30
+	if(new_acl == NULL)
Steve Dickson 83ba30
+		goto failed;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	ace = nacl->ace_head.tqh_first;
Steve Dickson 83ba30
+	nace = 1;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	while(1)
Steve Dickson 83ba30
+	{
Steve Dickson 83ba30
+		if(ace == NULL) {
Steve Dickson 83ba30
+			if(nace > num_aces)
Steve Dickson 83ba30
+				break;
Steve Dickson 83ba30
+			else
Steve Dickson 83ba30
+				goto free_failed;
Steve Dickson 83ba30
+		}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		result = acl_nfs4_add_ace(new_acl, ace->type, ace->flag,
Steve Dickson 83ba30
+				ace->access_mask, acl_nfs4_get_whotype(ace->who), ace->who);
Steve Dickson 83ba30
+		if(result < 0)
Steve Dickson 83ba30
+			goto free_failed;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+		ace = ace->l_ace.tqe_next;
Steve Dickson 83ba30
+		nace++;
Steve Dickson 83ba30
+	}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	return new_acl;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+free_failed:
Steve Dickson 83ba30
+	acl_nfs4_free(new_acl);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+failed:
Steve Dickson 83ba30
+	return NULL;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/libacl/acl_nfs4_add_pair.c	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,60 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  Add a pair of aces to the acl. The ace masks are complements of each other
Steve Dickson 83ba30
+ *  This keeps us from walking off the end of the acl
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2004 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Marius Aamodt Eriksen <marius@umich.edu>
Steve Dickson 83ba30
+ *  J. Bruce Fields <bfields@umich.edu>
Steve Dickson 83ba30
+ *  Nathaniel Gallaher <ngallahe@umich.edu>
Steve Dickson 83ba30
+ *  Jeff Sedlak <jsedlak@umich.edu>
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Redistribution and use in source and binary forms, with or without
Steve Dickson 83ba30
+ *  modification, are permitted provided that the following conditions
Steve Dickson 83ba30
+ *  are met:
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  1. Redistributions of source code must retain the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions, the following disclaimer, and
Steve Dickson 83ba30
+ *     any and all other licensing or copyright notices included in
Steve Dickson 83ba30
+ *     any files in this distribution.
Steve Dickson 83ba30
+ *  2. Redistributions in binary form must reproduce the above copyright
Steve Dickson 83ba30
+ *     notice, this list of conditions and the following disclaimer in the
Steve Dickson 83ba30
+ *     documentation and/or other materials provided with the distribution.
Steve Dickson 83ba30
+ *  3. Neither the name of the University nor the names of its
Steve Dickson 83ba30
+ *     contributors may be used to endorse or promote products derived
Steve Dickson 83ba30
+ *     from this software without specific prior written permission.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
Steve Dickson 83ba30
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Steve Dickson 83ba30
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Steve Dickson 83ba30
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Steve Dickson 83ba30
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Steve Dickson 83ba30
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Steve Dickson 83ba30
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
Steve Dickson 83ba30
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Steve Dickson 83ba30
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Steve Dickson 83ba30
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Steve Dickson 83ba30
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include "libacl_nfs4.h"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+int
Steve Dickson 83ba30
+acl_nfs4_add_pair(struct nfs4_acl *acl, int eflag, u32 mask, int ownertype,
Steve Dickson 83ba30
+		char* owner)
Steve Dickson 83ba30
+{
Steve Dickson 83ba30
+	int error;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	error = acl_nfs4_add_ace(acl, NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE,
Steve Dickson 83ba30
+				 eflag, mask, ownertype, owner);
Steve Dickson 83ba30
+	if (error < 0)
Steve Dickson 83ba30
+		return error;
Steve Dickson 83ba30
+	error = acl_nfs4_add_ace(acl, NFS4_ACE_ACCESS_DENIED_ACE_TYPE,
Steve Dickson 83ba30
+				eflag, ~mask, ownertype, owner);
Steve Dickson 83ba30
+	return error;
Steve Dickson 83ba30
+}
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
--- acl-2.2.39/exports.orig	2006-06-20 02:51:25.000000000 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/exports	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -67,3 +67,33 @@ ACL_1.1 {
Steve Dickson 83ba30
 	perm_copy_fd;
Steve Dickson 83ba30
 	perm_copy_file;
Steve Dickson 83ba30
 } ACL_1.0;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+ACL_1.2 {
Steve Dickson 83ba30
+	global:
Steve Dickson 83ba30
+	acl_nfs4_add_ace;
Steve Dickson 83ba30
+	acl_nfs4_add_pair;
Steve Dickson 83ba30
+	acl_nfs4_free;
Steve Dickson 83ba30
+	acl_nfs4_new;
Steve Dickson 83ba30
+	acl_nfs4_set_dir;
Steve Dickson 83ba30
+	acl_nfs4_set_who;
Steve Dickson 83ba30
+	acl_nfs4_copy_acl;
Steve Dickson 83ba30
+	acl_nfs4_xattr_load;
Steve Dickson 83ba30
+	acl_nfs4_xattr_pack;
Steve Dickson 83ba30
+	acl_nfs4_xattr_size;
Steve Dickson 83ba30
+	acl_nfs4_remove_ace;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	acl_n4tp_acl_trans;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	acl_ptn4_get_mask;
Steve Dickson 83ba30
+	acl_ptn4_acl_trans;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	acl_nfs4_get_whotype;
Steve Dickson 83ba30
+	acl_nfs4_get_who;
Steve Dickson 83ba30
+	acl_nfs4_entries;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+	local:
Steve Dickson 83ba30
+	__posix_acl_from_nfs4_xattr;
Steve Dickson 83ba30
+	nfs4_get_who_from_uid;
Steve Dickson 83ba30
+	nfs4_get_who_from_gid;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+} ACL_1.1;
Steve Dickson 83ba30
--- acl-2.2.39/include/builddefs.in.orig	2007-08-22 11:59:37.000000000 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/include/builddefs.in	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -65,7 +65,7 @@ endif
Steve Dickson 83ba30
 
Steve Dickson 83ba30
 GCFLAGS = $(OPTIMIZER) $(DEBUG) -funsigned-char -fno-strict-aliasing -Wall \
Steve Dickson 83ba30
 	  -DVERSION=\"$(PKG_VERSION)\" -DLOCALEDIR=\"$(PKG_LOCALE_DIR)\"  \
Steve Dickson 83ba30
-	  -DPACKAGE=\"$(PKG_NAME)\" -I$(TOPDIR)/include
Steve Dickson 83ba30
+	  -DPACKAGE=\"$(PKG_NAME)\" -I$(TOPDIR)/include -DUSE_NFSV4_TRANS
Steve Dickson 83ba30
 
Steve Dickson 83ba30
 # Global, Platform, Local CFLAGS
Steve Dickson 83ba30
 CFLAGS += $(GCFLAGS) $(PCFLAGS) $(LCFLAGS)
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/include/nfs4.h	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,397 @@
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ *  NFSv4 protocol definitions.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Copyright (c) 2002 The Regents of the University of Michigan.
Steve Dickson 83ba30
+ *  All rights reserved.
Steve Dickson 83ba30
+ *
Steve Dickson 83ba30
+ *  Kendrick Smith <kmsmith@umich.edu>
Steve Dickson 83ba30
+ *  Andy Adamson   <andros@umich.edu>
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#include<sys/types.h>
Steve Dickson 83ba30
+#include<sys/queue.h>
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#ifndef _LINUX_NFS4_H
Steve Dickson 83ba30
+#define _LINUX_NFS4_H
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFS4_VERIFIER_SIZE	8
Steve Dickson 83ba30
+#define NFS4_FHSIZE		128
Steve Dickson 83ba30
+#define NFS4_MAXNAMLEN		NAME_MAX
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFS4_ACCESS_READ        0x0001
Steve Dickson 83ba30
+#define NFS4_ACCESS_LOOKUP      0x0002
Steve Dickson 83ba30
+#define NFS4_ACCESS_MODIFY      0x0004
Steve Dickson 83ba30
+#define NFS4_ACCESS_EXTEND      0x0008
Steve Dickson 83ba30
+#define NFS4_ACCESS_DELETE      0x0010
Steve Dickson 83ba30
+#define NFS4_ACCESS_EXECUTE     0x0020
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFS4_FH_PERISTENT		0x0000
Steve Dickson 83ba30
+#define NFS4_FH_NOEXPIRE_WITH_OPEN	0x0001
Steve Dickson 83ba30
+#define NFS4_FH_VOLATILE_ANY		0x0002
Steve Dickson 83ba30
+#define NFS4_FH_VOL_MIGRATION		0x0004
Steve Dickson 83ba30
+#define NFS4_FH_VOL_RENAME		0x0008
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFS4_OPEN_RESULT_CONFIRM 0x0002
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFS4_SHARE_ACCESS_READ	0x0001
Steve Dickson 83ba30
+#define NFS4_SHARE_ACCESS_WRITE	0x0002
Steve Dickson 83ba30
+#define NFS4_SHARE_ACCESS_BOTH	0x0003
Steve Dickson 83ba30
+#define NFS4_SHARE_DENY_READ	0x0001
Steve Dickson 83ba30
+#define NFS4_SHARE_DENY_WRITE	0x0002
Steve Dickson 83ba30
+#define NFS4_SHARE_DENY_BOTH	0x0003
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFS4_SET_TO_SERVER_TIME	0
Steve Dickson 83ba30
+#define NFS4_SET_TO_CLIENT_TIME	1
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE 0
Steve Dickson 83ba30
+#define NFS4_ACE_ACCESS_DENIED_ACE_TYPE  1
Steve Dickson 83ba30
+#define NFS4_ACE_SYSTEM_AUDIT_ACE_TYPE   2
Steve Dickson 83ba30
+#define NFS4_ACE_SYSTEM_ALARM_ACE_TYPE   3
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define ACL4_SUPPORT_ALLOW_ACL 0x01
Steve Dickson 83ba30
+#define ACL4_SUPPORT_DENY_ACL  0x02
Steve Dickson 83ba30
+#define ACL4_SUPPORT_AUDIT_ACL 0x04
Steve Dickson 83ba30
+#define ACL4_SUPPORT_ALARM_ACL 0x08
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFS4_ACE_FILE_INHERIT_ACE             0x00000001
Steve Dickson 83ba30
+#define NFS4_ACE_DIRECTORY_INHERIT_ACE        0x00000002
Steve Dickson 83ba30
+#define NFS4_ACE_NO_PROPAGATE_INHERIT_ACE     0x00000004
Steve Dickson 83ba30
+#define NFS4_ACE_INHERIT_ONLY_ACE             0x00000008
Steve Dickson 83ba30
+#define NFS4_ACE_SUCCESSFUL_ACCESS_ACE_FLAG   0x00000010
Steve Dickson 83ba30
+#define NFS4_ACE_FAILED_ACCESS_ACE_FLAG       0x00000020
Steve Dickson 83ba30
+#define NFS4_ACE_IDENTIFIER_GROUP             0x00000040
Steve Dickson 83ba30
+#define NFS4_ACE_OWNER                        0x00000080
Steve Dickson 83ba30
+#define NFS4_ACE_GROUP                        0x00000100
Steve Dickson 83ba30
+#define NFS4_ACE_EVERYONE                     0x00000200
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFS4_ACE_READ_DATA                    0x00000001
Steve Dickson 83ba30
+#define NFS4_ACE_LIST_DIRECTORY               0x00000001
Steve Dickson 83ba30
+#define NFS4_ACE_WRITE_DATA                   0x00000002
Steve Dickson 83ba30
+#define NFS4_ACE_ADD_FILE                     0x00000002
Steve Dickson 83ba30
+#define NFS4_ACE_APPEND_DATA                  0x00000004
Steve Dickson 83ba30
+#define NFS4_ACE_ADD_SUBDIRECTORY             0x00000004
Steve Dickson 83ba30
+#define NFS4_ACE_READ_NAMED_ATTRS             0x00000008
Steve Dickson 83ba30
+#define NFS4_ACE_WRITE_NAMED_ATTRS            0x00000010
Steve Dickson 83ba30
+#define NFS4_ACE_EXECUTE                      0x00000020
Steve Dickson 83ba30
+#define NFS4_ACE_DELETE_CHILD                 0x00000040
Steve Dickson 83ba30
+#define NFS4_ACE_READ_ATTRIBUTES              0x00000080
Steve Dickson 83ba30
+#define NFS4_ACE_WRITE_ATTRIBUTES             0x00000100
Steve Dickson 83ba30
+#define NFS4_ACE_DELETE                       0x00010000
Steve Dickson 83ba30
+#define NFS4_ACE_READ_ACL                     0x00020000
Steve Dickson 83ba30
+#define NFS4_ACE_WRITE_ACL                    0x00040000
Steve Dickson 83ba30
+#define NFS4_ACE_WRITE_OWNER                  0x00080000
Steve Dickson 83ba30
+#define NFS4_ACE_SYNCHRONIZE                  0x00100000
Steve Dickson 83ba30
+#define NFS4_ACE_GENERIC_READ                 0x00120081
Steve Dickson 83ba30
+#define NFS4_ACE_GENERIC_WRITE                0x00160106
Steve Dickson 83ba30
+#define NFS4_ACE_GENERIC_EXECUTE              0x001200A0
Steve Dickson 83ba30
+#define NFS4_ACE_MASK_ALL                     0x001F01FF
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+enum nfs4_acl_whotype {
Steve Dickson 83ba30
+	NFS4_ACL_WHO_NAMED = 0,
Steve Dickson 83ba30
+	NFS4_ACL_WHO_OWNER,
Steve Dickson 83ba30
+	NFS4_ACL_WHO_GROUP,
Steve Dickson 83ba30
+	NFS4_ACL_WHO_EVERYONE,
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFS4_ACL_WHO_OWNER_STRING		"OWNER@"
Steve Dickson 83ba30
+#define NFS4_ACL_WHO_GROUP_STRING		"GROUP@"
Steve Dickson 83ba30
+#define NFS4_ACL_WHO_EVERYONE_STRING	"EVERYONE@"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+struct nfs4_ace {
Steve Dickson 83ba30
+	u_int32_t	type;
Steve Dickson 83ba30
+	u_int32_t	flag;
Steve Dickson 83ba30
+	u_int32_t	access_mask;
Steve Dickson 83ba30
+	char*	who;
Steve Dickson 83ba30
+	TAILQ_ENTRY(nfs4_ace) l_ace;
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+TAILQ_HEAD(ace_list_head, nfs4_ace);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+struct nfs4_acl {
Steve Dickson 83ba30
+	u_int32_t		naces;
Steve Dickson 83ba30
+	u_int32_t		is_directory;
Steve Dickson 83ba30
+	struct ace_list_head	ace_head;
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier;
Steve Dickson 83ba30
+typedef struct { char data[16]; } nfs4_stateid;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+enum nfs_opnum4 {
Steve Dickson 83ba30
+	OP_ACCESS = 3,
Steve Dickson 83ba30
+	OP_CLOSE = 4,
Steve Dickson 83ba30
+	OP_COMMIT = 5,
Steve Dickson 83ba30
+	OP_CREATE = 6,
Steve Dickson 83ba30
+	OP_DELEGPURGE = 7,
Steve Dickson 83ba30
+	OP_DELEGRETURN = 8,
Steve Dickson 83ba30
+	OP_GETATTR = 9,
Steve Dickson 83ba30
+	OP_GETFH = 10,
Steve Dickson 83ba30
+	OP_LINK = 11,
Steve Dickson 83ba30
+	OP_LOCK = 12,
Steve Dickson 83ba30
+	OP_LOCKT = 13,
Steve Dickson 83ba30
+	OP_LOCKU = 14,
Steve Dickson 83ba30
+	OP_LOOKUP = 15,
Steve Dickson 83ba30
+	OP_LOOKUPP = 16,
Steve Dickson 83ba30
+	OP_NVERIFY = 17,
Steve Dickson 83ba30
+	OP_OPEN = 18,
Steve Dickson 83ba30
+	OP_OPENATTR = 19,
Steve Dickson 83ba30
+	OP_OPEN_CONFIRM = 20,
Steve Dickson 83ba30
+	OP_OPEN_DOWNGRADE = 21,
Steve Dickson 83ba30
+	OP_PUTFH = 22,
Steve Dickson 83ba30
+	OP_PUTPUBFH = 23,
Steve Dickson 83ba30
+	OP_PUTROOTFH = 24,
Steve Dickson 83ba30
+	OP_READ = 25,
Steve Dickson 83ba30
+	OP_READDIR = 26,
Steve Dickson 83ba30
+	OP_READLINK = 27,
Steve Dickson 83ba30
+	OP_REMOVE = 28,
Steve Dickson 83ba30
+	OP_RENAME = 29,
Steve Dickson 83ba30
+	OP_RENEW = 30,
Steve Dickson 83ba30
+	OP_RESTOREFH = 31,
Steve Dickson 83ba30
+	OP_SAVEFH = 32,
Steve Dickson 83ba30
+	OP_SECINFO = 33,
Steve Dickson 83ba30
+	OP_SETATTR = 34,
Steve Dickson 83ba30
+	OP_SETCLIENTID = 35,
Steve Dickson 83ba30
+	OP_SETCLIENTID_CONFIRM = 36,
Steve Dickson 83ba30
+	OP_VERIFY = 37,
Steve Dickson 83ba30
+	OP_WRITE = 38,
Steve Dickson 83ba30
+	OP_RELEASE_LOCKOWNER = 39,
Steve Dickson 83ba30
+	OP_ILLEGAL = 10044,
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+enum nfsstat4 {
Steve Dickson 83ba30
+	NFS4_OK = 0,
Steve Dickson 83ba30
+	NFS4ERR_PERM = 1,
Steve Dickson 83ba30
+	NFS4ERR_NOENT = 2,
Steve Dickson 83ba30
+	NFS4ERR_IO = 5,
Steve Dickson 83ba30
+	NFS4ERR_NXIO = 6,
Steve Dickson 83ba30
+	NFS4ERR_ACCESS = 13,
Steve Dickson 83ba30
+	NFS4ERR_EXIST = 17,
Steve Dickson 83ba30
+	NFS4ERR_XDEV = 18,
Steve Dickson 83ba30
+	/* Unused/reserved 19 */
Steve Dickson 83ba30
+	NFS4ERR_NOTDIR = 20,
Steve Dickson 83ba30
+	NFS4ERR_ISDIR = 21,
Steve Dickson 83ba30
+	NFS4ERR_INVAL = 22,
Steve Dickson 83ba30
+	NFS4ERR_FBIG = 27,
Steve Dickson 83ba30
+	NFS4ERR_NOSPC = 28,
Steve Dickson 83ba30
+	NFS4ERR_ROFS = 30,
Steve Dickson 83ba30
+	NFS4ERR_MLINK = 31,
Steve Dickson 83ba30
+	NFS4ERR_NAMETOOLONG = 63,
Steve Dickson 83ba30
+	NFS4ERR_NOTEMPTY = 66,
Steve Dickson 83ba30
+	NFS4ERR_DQUOT = 69,
Steve Dickson 83ba30
+	NFS4ERR_STALE = 70,
Steve Dickson 83ba30
+	NFS4ERR_BADHANDLE = 10001,
Steve Dickson 83ba30
+	NFS4ERR_BAD_COOKIE = 10003,
Steve Dickson 83ba30
+	NFS4ERR_NOTSUPP = 10004,
Steve Dickson 83ba30
+	NFS4ERR_TOOSMALL = 10005,
Steve Dickson 83ba30
+	NFS4ERR_SERVERFAULT = 10006,
Steve Dickson 83ba30
+	NFS4ERR_BADTYPE = 10007,
Steve Dickson 83ba30
+	NFS4ERR_DELAY = 10008,
Steve Dickson 83ba30
+	NFS4ERR_SAME = 10009,
Steve Dickson 83ba30
+	NFS4ERR_DENIED = 10010,
Steve Dickson 83ba30
+	NFS4ERR_EXPIRED = 10011,
Steve Dickson 83ba30
+	NFS4ERR_LOCKED = 10012,
Steve Dickson 83ba30
+	NFS4ERR_GRACE = 10013,
Steve Dickson 83ba30
+	NFS4ERR_FHEXPIRED = 10014,
Steve Dickson 83ba30
+	NFS4ERR_SHARE_DENIED = 10015,
Steve Dickson 83ba30
+	NFS4ERR_WRONGSEC = 10016,
Steve Dickson 83ba30
+	NFS4ERR_CLID_INUSE = 10017,
Steve Dickson 83ba30
+	NFS4ERR_RESOURCE = 10018,
Steve Dickson 83ba30
+	NFS4ERR_MOVED = 10019,
Steve Dickson 83ba30
+	NFS4ERR_NOFILEHANDLE = 10020,
Steve Dickson 83ba30
+	NFS4ERR_MINOR_VERS_MISMATCH = 10021,
Steve Dickson 83ba30
+	NFS4ERR_STALE_CLIENTID = 10022,
Steve Dickson 83ba30
+	NFS4ERR_STALE_STATEID = 10023,
Steve Dickson 83ba30
+	NFS4ERR_OLD_STATEID = 10024,
Steve Dickson 83ba30
+	NFS4ERR_BAD_STATEID = 10025,
Steve Dickson 83ba30
+	NFS4ERR_BAD_SEQID = 10026,
Steve Dickson 83ba30
+	NFS4ERR_NOT_SAME = 10027,
Steve Dickson 83ba30
+	NFS4ERR_LOCK_RANGE = 10028,
Steve Dickson 83ba30
+	NFS4ERR_SYMLINK = 10029,
Steve Dickson 83ba30
+	NFS4ERR_RESTOREFH = 10030,
Steve Dickson 83ba30
+	NFS4ERR_LEASE_MOVED = 10031,
Steve Dickson 83ba30
+	NFS4ERR_ATTRNOTSUPP = 10032,
Steve Dickson 83ba30
+	NFS4ERR_NO_GRACE = 10033,
Steve Dickson 83ba30
+	NFS4ERR_RECLAIM_BAD = 10034,
Steve Dickson 83ba30
+	NFS4ERR_RECLAIM_CONFLICT = 10035,
Steve Dickson 83ba30
+	NFS4ERR_BADXDR = 10036,
Steve Dickson 83ba30
+	NFS4ERR_LOCKS_HELD = 10037,
Steve Dickson 83ba30
+	NFS4ERR_OPENMODE = 10038,
Steve Dickson 83ba30
+	NFS4ERR_BADOWNER = 10039,
Steve Dickson 83ba30
+	NFS4ERR_BADCHAR = 10040,
Steve Dickson 83ba30
+	NFS4ERR_BADNAME = 10041,
Steve Dickson 83ba30
+	NFS4ERR_BAD_RANGE = 10042,
Steve Dickson 83ba30
+	NFS4ERR_LOCK_NOTSUPP = 10043,
Steve Dickson 83ba30
+	NFS4ERR_OP_ILLEGAL = 10044,
Steve Dickson 83ba30
+	NFS4ERR_DEADLOCK = 10045,
Steve Dickson 83ba30
+	NFS4ERR_FILE_OPEN = 10046,
Steve Dickson 83ba30
+	NFS4ERR_ADMIN_REVOKED = 10047,
Steve Dickson 83ba30
+	NFS4ERR_CB_PATH_DOWN = 10048
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ * Note: NF4BAD is not actually part of the protocol; it is just used
Steve Dickson 83ba30
+ * internally by nfsd.
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
+enum nfs_ftype4 {
Steve Dickson 83ba30
+	NF4BAD		= 0,
Steve Dickson 83ba30
+        NF4REG          = 1,    /* Regular File */
Steve Dickson 83ba30
+        NF4DIR          = 2,    /* Directory */
Steve Dickson 83ba30
+        NF4BLK          = 3,    /* Special File - block device */
Steve Dickson 83ba30
+        NF4CHR          = 4,    /* Special File - character device */
Steve Dickson 83ba30
+        NF4LNK          = 5,    /* Symbolic Link */
Steve Dickson 83ba30
+        NF4SOCK         = 6,    /* Special File - socket */
Steve Dickson 83ba30
+        NF4FIFO         = 7,    /* Special File - fifo */
Steve Dickson 83ba30
+        NF4ATTRDIR      = 8,    /* Attribute Directory */
Steve Dickson 83ba30
+        NF4NAMEDATTR    = 9     /* Named Attribute */
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+enum open_claim_type4 {
Steve Dickson 83ba30
+	NFS4_OPEN_CLAIM_NULL = 0,
Steve Dickson 83ba30
+	NFS4_OPEN_CLAIM_PREVIOUS = 1,
Steve Dickson 83ba30
+	NFS4_OPEN_CLAIM_DELEGATE_CUR = 2,
Steve Dickson 83ba30
+	NFS4_OPEN_CLAIM_DELEGATE_PREV = 3
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+enum opentype4 {
Steve Dickson 83ba30
+	NFS4_OPEN_NOCREATE = 0,
Steve Dickson 83ba30
+	NFS4_OPEN_CREATE = 1
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+enum createmode4 {
Steve Dickson 83ba30
+	NFS4_CREATE_UNCHECKED = 0,
Steve Dickson 83ba30
+	NFS4_CREATE_GUARDED = 1,
Steve Dickson 83ba30
+	NFS4_CREATE_EXCLUSIVE = 2
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+enum limit_by4 {
Steve Dickson 83ba30
+	NFS4_LIMIT_SIZE = 1,
Steve Dickson 83ba30
+	NFS4_LIMIT_BLOCKS = 2
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+enum open_delegation_type4 {
Steve Dickson 83ba30
+	NFS4_OPEN_DELEGATE_NONE = 0,
Steve Dickson 83ba30
+	NFS4_OPEN_DELEGATE_READ = 1,
Steve Dickson 83ba30
+	NFS4_OPEN_DELEGATE_WRITE = 2
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+enum lock_type4 {
Steve Dickson 83ba30
+	NFS4_UNLOCK_LT = 0,
Steve Dickson 83ba30
+	NFS4_READ_LT = 1,
Steve Dickson 83ba30
+	NFS4_WRITE_LT = 2,
Steve Dickson 83ba30
+	NFS4_READW_LT = 3,
Steve Dickson 83ba30
+	NFS4_WRITEW_LT = 4
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* Mandatory Attributes */
Steve Dickson 83ba30
+#define FATTR4_WORD0_SUPPORTED_ATTRS    (1UL << 0)
Steve Dickson 83ba30
+#define FATTR4_WORD0_TYPE               (1UL << 1)
Steve Dickson 83ba30
+#define FATTR4_WORD0_FH_EXPIRE_TYPE     (1UL << 2)
Steve Dickson 83ba30
+#define FATTR4_WORD0_CHANGE             (1UL << 3)
Steve Dickson 83ba30
+#define FATTR4_WORD0_SIZE               (1UL << 4)
Steve Dickson 83ba30
+#define FATTR4_WORD0_LINK_SUPPORT       (1UL << 5)
Steve Dickson 83ba30
+#define FATTR4_WORD0_SYMLINK_SUPPORT    (1UL << 6)
Steve Dickson 83ba30
+#define FATTR4_WORD0_NAMED_ATTR         (1UL << 7)
Steve Dickson 83ba30
+#define FATTR4_WORD0_FSID               (1UL << 8)
Steve Dickson 83ba30
+#define FATTR4_WORD0_UNIQUE_HANDLES     (1UL << 9)
Steve Dickson 83ba30
+#define FATTR4_WORD0_LEASE_TIME         (1UL << 10)
Steve Dickson 83ba30
+#define FATTR4_WORD0_RDATTR_ERROR       (1UL << 11)
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* Recommended Attributes */
Steve Dickson 83ba30
+#define FATTR4_WORD0_ACL                (1UL << 12)
Steve Dickson 83ba30
+#define FATTR4_WORD0_ACLSUPPORT         (1UL << 13)
Steve Dickson 83ba30
+#define FATTR4_WORD0_ARCHIVE            (1UL << 14)
Steve Dickson 83ba30
+#define FATTR4_WORD0_CANSETTIME         (1UL << 15)
Steve Dickson 83ba30
+#define FATTR4_WORD0_CASE_INSENSITIVE   (1UL << 16)
Steve Dickson 83ba30
+#define FATTR4_WORD0_CASE_PRESERVING    (1UL << 17)
Steve Dickson 83ba30
+#define FATTR4_WORD0_CHOWN_RESTRICTED   (1UL << 18)
Steve Dickson 83ba30
+#define FATTR4_WORD0_FILEHANDLE         (1UL << 19)
Steve Dickson 83ba30
+#define FATTR4_WORD0_FILEID             (1UL << 20)
Steve Dickson 83ba30
+#define FATTR4_WORD0_FILES_AVAIL        (1UL << 21)
Steve Dickson 83ba30
+#define FATTR4_WORD0_FILES_FREE         (1UL << 22)
Steve Dickson 83ba30
+#define FATTR4_WORD0_FILES_TOTAL        (1UL << 23)
Steve Dickson 83ba30
+#define FATTR4_WORD0_FS_LOCATIONS       (1UL << 24)
Steve Dickson 83ba30
+#define FATTR4_WORD0_HIDDEN             (1UL << 25)
Steve Dickson 83ba30
+#define FATTR4_WORD0_HOMOGENEOUS        (1UL << 26)
Steve Dickson 83ba30
+#define FATTR4_WORD0_MAXFILESIZE        (1UL << 27)
Steve Dickson 83ba30
+#define FATTR4_WORD0_MAXLINK            (1UL << 28)
Steve Dickson 83ba30
+#define FATTR4_WORD0_MAXNAME            (1UL << 29)
Steve Dickson 83ba30
+#define FATTR4_WORD0_MAXREAD            (1UL << 30)
Steve Dickson 83ba30
+#define FATTR4_WORD0_MAXWRITE           (1UL << 31)
Steve Dickson 83ba30
+#define FATTR4_WORD1_MIMETYPE           (1UL << 0)
Steve Dickson 83ba30
+#define FATTR4_WORD1_MODE               (1UL << 1)
Steve Dickson 83ba30
+#define FATTR4_WORD1_NO_TRUNC           (1UL << 2)
Steve Dickson 83ba30
+#define FATTR4_WORD1_NUMLINKS           (1UL << 3)
Steve Dickson 83ba30
+#define FATTR4_WORD1_OWNER              (1UL << 4)
Steve Dickson 83ba30
+#define FATTR4_WORD1_OWNER_GROUP        (1UL << 5)
Steve Dickson 83ba30
+#define FATTR4_WORD1_QUOTA_HARD         (1UL << 6)
Steve Dickson 83ba30
+#define FATTR4_WORD1_QUOTA_SOFT         (1UL << 7)
Steve Dickson 83ba30
+#define FATTR4_WORD1_QUOTA_USED         (1UL << 8)
Steve Dickson 83ba30
+#define FATTR4_WORD1_RAWDEV             (1UL << 9)
Steve Dickson 83ba30
+#define FATTR4_WORD1_SPACE_AVAIL        (1UL << 10)
Steve Dickson 83ba30
+#define FATTR4_WORD1_SPACE_FREE         (1UL << 11)
Steve Dickson 83ba30
+#define FATTR4_WORD1_SPACE_TOTAL        (1UL << 12)
Steve Dickson 83ba30
+#define FATTR4_WORD1_SPACE_USED         (1UL << 13)
Steve Dickson 83ba30
+#define FATTR4_WORD1_SYSTEM             (1UL << 14)
Steve Dickson 83ba30
+#define FATTR4_WORD1_TIME_ACCESS        (1UL << 15)
Steve Dickson 83ba30
+#define FATTR4_WORD1_TIME_ACCESS_SET    (1UL << 16)
Steve Dickson 83ba30
+#define FATTR4_WORD1_TIME_BACKUP        (1UL << 17)
Steve Dickson 83ba30
+#define FATTR4_WORD1_TIME_CREATE        (1UL << 18)
Steve Dickson 83ba30
+#define FATTR4_WORD1_TIME_DELTA         (1UL << 19)
Steve Dickson 83ba30
+#define FATTR4_WORD1_TIME_METADATA      (1UL << 20)
Steve Dickson 83ba30
+#define FATTR4_WORD1_TIME_MODIFY        (1UL << 21)
Steve Dickson 83ba30
+#define FATTR4_WORD1_TIME_MODIFY_SET    (1UL << 22)
Steve Dickson 83ba30
+#define FATTR4_WORD1_MOUNTED_ON_FILEID  (1UL << 23)
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFSPROC4_NULL 0
Steve Dickson 83ba30
+#define NFSPROC4_COMPOUND 1
Steve Dickson 83ba30
+#define NFS4_MINOR_VERSION 0
Steve Dickson 83ba30
+#define NFS4_DEBUG 1
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#ifdef __KERNEL__
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* Index of predefined Linux client operations */
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+enum {
Steve Dickson 83ba30
+	NFSPROC4_CLNT_NULL = 0,		/* Unused */
Steve Dickson 83ba30
+	NFSPROC4_CLNT_READ,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_WRITE,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_COMMIT,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_OPEN,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_OPEN_CONFIRM,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_OPEN_RECLAIM,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_OPEN_DOWNGRADE,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_CLOSE,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_SETATTR,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_FSINFO,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_RENEW,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_SETCLIENTID,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_SETCLIENTID_CONFIRM,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_LOCK,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_LOCKT,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_LOCKU,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_ACCESS,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_GETATTR,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_LOOKUP,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_LOOKUP_ROOT,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_REMOVE,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_RENAME,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_LINK,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_CREATE,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_PATHCONF,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_STATFS,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_READLINK,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_READDIR,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_SERVER_CAPS,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_DELEGRETURN,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_GETACL,
Steve Dickson 83ba30
+	NFSPROC4_CLNT_SETACL,
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+#endif
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/*
Steve Dickson 83ba30
+ * Local variables:
Steve Dickson 83ba30
+ *  c-basic-offset: 8
Steve Dickson 83ba30
+ * End:
Steve Dickson 83ba30
+ */
Steve Dickson 83ba30
--- /dev/null	2007-08-22 11:21:03.626521839 -0400
Steve Dickson 83ba30
+++ acl-2.2.39/include/libacl_nfs4.h	2007-08-22 12:02:13.000000000 -0400
Steve Dickson 83ba30
@@ -0,0 +1,97 @@
Steve Dickson 83ba30
+#include <sys/types.h>
Steve Dickson 83ba30
+#include <pwd.h>
Steve Dickson 83ba30
+#include <grp.h>
Steve Dickson 83ba30
+#include <sys/acl.h>
Steve Dickson 83ba30
+#include <stdlib.h>
Steve Dickson 83ba30
+#include <sys/queue.h>
Steve Dickson 83ba30
+#include <nfs4.h>
Steve Dickson 83ba30
+#include <sys/errno.h>
Steve Dickson 83ba30
+#include <string.h>
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* mode bit translations: */
Steve Dickson 83ba30
+#define NFS4_READ_MODE NFS4_ACE_READ_DATA
Steve Dickson 83ba30
+#define NFS4_WRITE_MODE (NFS4_ACE_WRITE_DATA | NFS4_ACE_APPEND_DATA)
Steve Dickson 83ba30
+#define NFS4_EXECUTE_MODE NFS4_ACE_EXECUTE
Steve Dickson 83ba30
+#define NFS4_ANYONE_MODE (NFS4_ACE_READ_ATTRIBUTES | NFS4_ACE_READ_ACL | \
Steve Dickson 83ba30
+		NFS4_ACE_SYNCHRONIZE)
Steve Dickson 83ba30
+#define NFS4_OWNER_MODE (NFS4_ACE_WRITE_ATTRIBUTES | NFS4_ACE_WRITE_ACL)
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFS4_ACE_MASK_IGNORE (NFS4_ACE_DELETE | NFS4_ACE_WRITE_OWNER \
Steve Dickson 83ba30
+		| NFS4_ACE_READ_NAMED_ATTRS | NFS4_ACE_WRITE_NAMED_ATTRS)
Steve Dickson 83ba30
+/* XXX not sure about the following.  Note that e.g. DELETE_CHILD is wrong in
Steve Dickson 83ba30
+ * general (should only be ignored on files). */
Steve Dickson 83ba30
+#define MASK_EQUAL(mask1, mask2) \
Steve Dickson 83ba30
+	(((mask1) & NFS4_ACE_MASK_ALL & ~NFS4_ACE_MASK_IGNORE & \
Steve Dickson 83ba30
+	  					~NFS4_ACE_DELETE_CHILD) \
Steve Dickson 83ba30
+	 == ((mask2) & NFS4_ACE_MASK_ALL & ~NFS4_ACE_MASK_IGNORE & \
Steve Dickson 83ba30
+		 				~NFS4_ACE_DELETE_CHILD))
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* Maximum length of the ace->who attribute */
Steve Dickson 83ba30
+#define NFS4_ACL_WHO_LENGTH_MAX		2048
Steve Dickson 83ba30
+#define NFS4_ACL_WHO_BUFFER_LEN_GUESS	255
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* NFS4 acl xattr name */
Steve Dickson 83ba30
+#define ACL_NFS4_XATTR "system.nfs4_acl"
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* Macro for finding empty tailqs */
Steve Dickson 83ba30
+#define TAILQ_IS_EMPTY(head) (head.tqh_first == NULL)
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* Flags to pass certain properties around */
Steve Dickson 83ba30
+#define NFS4_ACL_NOFLAGS			0x00
Steve Dickson 83ba30
+#define NFS4_ACL_ISFILE				0x00
Steve Dickson 83ba30
+#define NFS4_ACL_ISDIR				0x01
Steve Dickson 83ba30
+#define NFS4_ACL_OWNER				0x02
Steve Dickson 83ba30
+#define NFS4_ACL_REQUEST_DEFAULT	0x04
Steve Dickson 83ba30
+#define NFS4_ACL_RAW				0x01
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+#define NFS4_XDR_MOD				4
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+typedef u_int32_t u32;
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+enum {	ACL_NFS4_NOT_USED = 0,
Steve Dickson 83ba30
+		ACL_NFS4_USED
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+struct ace_container {
Steve Dickson 83ba30
+	struct nfs4_ace *ace;
Steve Dickson 83ba30
+	TAILQ_ENTRY(ace_container) l_ace;
Steve Dickson 83ba30
+};
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+TAILQ_HEAD(ace_container_list_head, ace_container);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/**** Public functions ****/
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/** Manipulation functions **/
Steve Dickson 83ba30
+extern int				acl_nfs4_add_ace(struct nfs4_acl *, u32, u32, u32, int, char*);
Steve Dickson 83ba30
+extern int				acl_nfs4_add_pair(struct nfs4_acl *, int, u32, int, char*);
Steve Dickson 83ba30
+extern void				acl_nfs4_free(struct nfs4_acl *);
Steve Dickson 83ba30
+extern struct nfs4_acl *acl_nfs4_new(u32);
Steve Dickson 83ba30
+extern int				acl_nfs4_set_who(struct nfs4_ace*, int, char*);
Steve Dickson 83ba30
+extern struct nfs4_acl *acl_nfs4_copy_acl(struct nfs4_acl *);
Steve Dickson 83ba30
+extern struct nfs4_acl *acl_nfs4_xattr_load(char *, int, u32);
Steve Dickson 83ba30
+extern int				acl_nfs4_xattr_pack(struct nfs4_acl *, char**);
Steve Dickson 83ba30
+extern int				acl_nfs4_xattr_size(struct nfs4_acl *);
Steve Dickson 83ba30
+extern void				acl_nfs4_remove_ace(struct nfs4_acl * acl, struct nfs4_ace * ace);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/** Conversion functions **/
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* nfs4 -> posix */
Steve Dickson 83ba30
+extern acl_t		acl_n4tp_acl_trans(struct nfs4_acl *, acl_type_t);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* posix -> nfs4 */
Steve Dickson 83ba30
+extern int				acl_ptn4_get_mask(u32* mask, acl_permset_t perms,
Steve Dickson 83ba30
+								int iflags);
Steve Dickson 83ba30
+extern int acl_ptn4_acl_trans(acl_t, struct nfs4_acl *, acl_type_t, u32, char*);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/** Access Functions **/
Steve Dickson 83ba30
+extern inline int	acl_nfs4_get_whotype(char*);
Steve Dickson 83ba30
+extern int			acl_nfs4_get_who(struct nfs4_ace*, int*, char**);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/**** Private(?) functions ****/
Steve Dickson 83ba30
+acl_t		__posix_acl_from_nfs4_xattr(char*, int, acl_type_t, u32);
Steve Dickson 83ba30
+
Steve Dickson 83ba30
+/* These will change */
Steve Dickson 83ba30
+char * nfs4_get_who_from_uid(uid_t);
Steve Dickson 83ba30
+char * nfs4_get_who_from_gid(gid_t);
Steve Dickson 83ba30
+/* End change */