Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 9 Aug 2008 18:04:55 GMT
From:      Edward Tomasz Napierala <trasz@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 147003 for review
Message-ID:  <200808091804.m79I4t03027903@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=147003

Change 147003 by trasz@trasz_traszkan on 2008/08/09 18:04:38

	Add ACL_TEXT_APPEND_ID.  This is mostly useful for tar(1).

Affected files ...

.. //depot/projects/soc2008/trasz_nfs4acl/bin/getfacl/getfacl.1#6 edit
.. //depot/projects/soc2008/trasz_nfs4acl/bin/getfacl/getfacl.c#10 edit
.. //depot/projects/soc2008/trasz_nfs4acl/lib/libc/posix1e/acl_to_text_nfs4.c#9 edit
.. //depot/projects/soc2008/trasz_nfs4acl/sys/sys/acl.h#17 edit

Differences ...

==== //depot/projects/soc2008/trasz_nfs4acl/bin/getfacl/getfacl.1#6 (text+ko) ====

@@ -38,7 +38,7 @@
 .Nd get ACL information
 .Sh SYNOPSIS
 .Nm
-.Op Fl dhnqv
+.Op Fl dhinqv
 .Op Ar
 .Sh DESCRIPTION
 The
@@ -65,9 +65,13 @@
 .It Fl h
 If the target of the operation is a symbolic link, return the ACL from
 the symbolic link itself rather than following the link.
+.It Fl i
+For NFS4 ACLs, append numerical ID at the end of each entry containing
+user or group name.
 .It Fl n
 Display user and group IDs numerically rather than converting to
 a user or group name.
+For POSIX.1e ACLs, this option does nothing.
 .It Fl q
 Do not write commented information about file name and ownership.
 This is

==== //depot/projects/soc2008/trasz_nfs4acl/bin/getfacl/getfacl.c#10 (text+ko) ====

@@ -175,7 +175,8 @@
 }
 
 static int
-print_acl(char *path, acl_type_t type, int hflag, int nflag, int qflag, int vflag)
+print_acl(char *path, acl_type_t type, int hflag, int iflag, int nflag,
+    int qflag, int vflag)
 {
 	struct stat	sb;
 	acl_t	acl;
@@ -222,12 +223,15 @@
 		}
 	}
 
-	if (vflag)
-		flags |= ACL_TEXT_VERBOSE;
+	if (iflag)
+		flags |= ACL_TEXT_APPEND_ID;
 
 	if (nflag)
 		flags |= ACL_TEXT_NUMERIC_IDS;
 
+	if (vflag)
+		flags |= ACL_TEXT_VERBOSE;
+
 	acl_text = acl_to_text_np(acl, 0, flags);
 	if (!acl_text) {
 		warn("%s: acl_to_text_np() failed", path);
@@ -243,7 +247,8 @@
 }
 
 static int
-print_acl_from_stdin(acl_type_t type, int hflag, int nflag, int qflag, int vflag)
+print_acl_from_stdin(acl_type_t type, int hflag, int iflag, int nflag,
+    int qflag, int vflag)
 {
 	char	*p, pathname[PATH_MAX];
 	int	carried_error = 0;
@@ -251,7 +256,8 @@
 	while (fgets(pathname, (int)sizeof(pathname), stdin)) {
 		if ((p = strchr(pathname, '\n')) != NULL)
 			*p = '\0';
-		if (print_acl(pathname, type, hflag, nflag, qflag, vflag) == -1) {
+		if (print_acl(pathname, type, hflag, iflag, nflag,
+		    qflag, vflag) == -1) {
 			carried_error = -1;
 		}
 	}
@@ -265,13 +271,14 @@
 	acl_type_t	type = ACL_TYPE_ACCESS;
 	int	carried_error = 0;
 	int	ch, error, i;
-	int	hflag, qflag, nflag, vflag;
+	int	hflag, iflag, qflag, nflag, vflag;
 
 	hflag = 0;
+	iflag = 0;
 	qflag = 0;
 	nflag = 0;
 	vflag = 0;
-	while ((ch = getopt(argc, argv, "dhnqv")) != -1)
+	while ((ch = getopt(argc, argv, "dhinqv")) != -1)
 		switch(ch) {
 		case 'd':
 			type = ACL_TYPE_DEFAULT;
@@ -279,6 +286,9 @@
 		case 'h':
 			hflag = 1;
 			break;
+		case 'i':
+			iflag = 1;
+			break;
 		case 'n':
 			nflag = 1;
 			break;
@@ -296,19 +306,20 @@
 	argv += optind;
 
 	if (argc == 0) {
-		error = print_acl_from_stdin(type, hflag, nflag, qflag, vflag);
+		error = print_acl_from_stdin(type, hflag, iflag, nflag,
+		    qflag, vflag);
 		return(error ? 1 : 0);
 	}
 
 	for (i = 0; i < argc; i++) {
 		if (!strcmp(argv[i], "-")) {
-			error = print_acl_from_stdin(type, hflag, nflag, qflag,
-			    vflag);
+			error = print_acl_from_stdin(type, hflag, iflag, nflag,
+			    qflag, vflag);
 			if (error == -1)
 				carried_error = -1;
 		} else {
-			error = print_acl(argv[i], type, hflag, nflag, qflag,
-			    vflag);
+			error = print_acl(argv[i], type, hflag, iflag, nflag,
+			    qflag, vflag);
 			if (error == -1)
 				carried_error = -1;
 		}

==== //depot/projects/soc2008/trasz_nfs4acl/lib/libc/posix1e/acl_to_text_nfs4.c#9 (text+ko) ====

@@ -137,6 +137,32 @@
 }
 
 static int
+format_additional_id(char *str, size_t size, const acl_entry_t entry)
+{
+	int error;
+	acl_tag_t tag;
+	id_t *id;
+
+	error = acl_get_tag_type(entry, &tag);
+	assert(!error);
+
+	switch (tag) {
+	case ACL_USER_OBJ:
+	case ACL_GROUP_OBJ:
+	case ACL_EVERYONE:
+		str[0] = '\0';
+		break;
+
+	default:
+		id = (id_t *)acl_get_qualifier(entry);
+		assert(id);
+		snprintf(str, size, ":%d", (unsigned int)*id);
+	}
+
+	return (0);
+}
+
+static int
 format_entry(char *str, size_t size, const acl_entry_t entry, int flags)
 {
 	size_t off = 0, padding_length, maximum_who_field_length = 18;
@@ -182,7 +208,16 @@
 	error = format_extended(buf, sizeof(buf), entry);
 	if (error)
 		return (error);
-	off += snprintf(str + off, size - off, "%s\n", buf);
+	off += snprintf(str + off, size - off, "%s", buf);
+
+	if (flags & ACL_TEXT_APPEND_ID) {
+		error = format_additional_id(buf, sizeof(buf), entry);
+		if (error)
+			return (error);
+		off += snprintf(str + off, size - off, "%s", buf);
+	}
+
+	off += snprintf(str + off, size - off, "\n");
 
 	/* Make sure we didn't truncate anything. */
 	assert (off < size);

==== //depot/projects/soc2008/trasz_nfs4acl/sys/sys/acl.h#17 (text+ko) ====

@@ -231,6 +231,7 @@
  */
 #define ACL_TEXT_VERBOSE	0x01
 #define ACL_TEXT_NUMERIC_IDS	0x02
+#define ACL_TEXT_APPEND_ID	0x04
 
 #ifdef _KERNEL
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200808091804.m79I4t03027903>