]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
NFSv4 ACL maps: make const and deduplicate a bit
authorMartin Matuska <martin@matuska.org>
Sun, 12 Feb 2017 12:53:27 +0000 (13:53 +0100)
committerMartin Matuska <martin@matuska.org>
Sun, 12 Feb 2017 12:54:53 +0000 (13:54 +0100)
libarchive/archive_acl.c
libarchive/archive_read_disk_entry_from_file.c
libarchive/archive_write_disk_acl.c

index 1e9ddbb24119b7080cf21e7ec2af9060790b2774..00f66c1b5070ec96854335580673b2c6465e6b62 100644 (file)
@@ -83,6 +83,50 @@ static void  append_entry(char **p, const char *prefix, int type,
                    int tag, int flags, const char *name, int perm, int id);
 static void    append_id(char **p, int id);
 
+static const struct {
+       const int perm;
+       const char c;
+       const wchar_t wc;
+} nfsv4_acl_perm_map[] = {
+       { ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_LIST_DIRECTORY, 'r',
+           L'r' },
+       { ARCHIVE_ENTRY_ACL_WRITE_DATA | ARCHIVE_ENTRY_ACL_ADD_FILE, 'w',
+           L'w' },
+       { ARCHIVE_ENTRY_ACL_EXECUTE, 'x', L'x' },
+       { ARCHIVE_ENTRY_ACL_APPEND_DATA | ARCHIVE_ENTRY_ACL_ADD_SUBDIRECTORY,
+           'p', L'p' },
+       { ARCHIVE_ENTRY_ACL_DELETE, 'd', L'd' },
+       { ARCHIVE_ENTRY_ACL_DELETE_CHILD, 'D', L'D' },
+       { ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES, 'a', L'a' },
+       { ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES, 'A', L'A' },
+       { ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS, 'R', L'R' },
+       { ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS, 'W', L'W' },
+       { ARCHIVE_ENTRY_ACL_READ_ACL, 'c', L'c' },
+       { ARCHIVE_ENTRY_ACL_WRITE_ACL, 'C', L'C' },
+       { ARCHIVE_ENTRY_ACL_WRITE_OWNER, 'o', L'o' },
+       { ARCHIVE_ENTRY_ACL_SYNCHRONIZE, 's', L's' }
+};
+
+static const int nfsv4_acl_perm_map_size = (int)(sizeof(nfsv4_acl_perm_map) /
+    sizeof(nfsv4_acl_perm_map[0]));
+
+static const struct {
+       const int perm;
+       const char c;
+       const wchar_t wc;
+} nfsv4_acl_flag_map[] = {
+       { ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT, 'f', L'f' },
+       { ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT, 'd', L'd' },
+       { ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY, 'i', L'i' },
+       { ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT, 'n', L'n' },
+       { ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS, 'S', L'S' },
+       { ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS, 'F', L'F' },
+       { ARCHIVE_ENTRY_ACL_ENTRY_INHERITED, 'I', L'I' }
+};
+
+static const int nfsv4_acl_flag_map_size = (int)(sizeof(nfsv4_acl_flag_map) /
+    sizeof(nfsv4_acl_flag_map[0]));
+
 void
 archive_acl_clear(struct archive_acl *acl)
 {
@@ -741,6 +785,8 @@ static void
 append_entry_w(wchar_t **wp, const wchar_t *prefix, int type,
     int tag, int flags, const wchar_t *wname, int perm, int id)
 {
+       int i;
+
        if (prefix != NULL) {
                wcscpy(*wp, prefix);
                *wp += wcslen(*wp);
@@ -810,46 +856,20 @@ append_entry_w(wchar_t **wp, const wchar_t *prefix, int type,
                *(*wp)++ = (perm & 0222) ? L'w' : L'-';
                *(*wp)++ = (perm & 0111) ? L'x' : L'-';
        } else {
-               /* NFS4 ACL perms */
-               *(*wp)++ = (perm & (ARCHIVE_ENTRY_ACL_READ_DATA |
-                   ARCHIVE_ENTRY_ACL_LIST_DIRECTORY)) ? L'r' : L'-';
-               *(*wp)++ = (perm & (ARCHIVE_ENTRY_ACL_WRITE_DATA |
-                   ARCHIVE_ENTRY_ACL_ADD_FILE)) ? L'w' : L'-';
-               *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_EXECUTE) ? L'x' : L'-';
-               *(*wp)++ = (perm & (ARCHIVE_ENTRY_ACL_APPEND_DATA |
-                   ARCHIVE_ENTRY_ACL_ADD_SUBDIRECTORY)) ? L'p' : L'-';
-               *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_DELETE) ? L'd' : L'-';
-               *(*wp)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_DELETE_CHILD) ? L'D' : L'-';
-               *(*wp)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES) ? L'a' : L'-';
-               *(*wp)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES) ? L'A' : L'-';
-               *(*wp)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS) ? L'R' : L'-';
-               *(*wp)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS) ? L'W' : L'-';
-               *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_READ_ACL) ? L'c' : L'-';
-               *(*wp)++ = (perm & ARCHIVE_ENTRY_ACL_WRITE_ACL) ? L'C' : L'-';
-               *(*wp)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_WRITE_OWNER) ? L'o' : L'-';
-               *(*wp)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_SYNCHRONIZE) ? L's' : L'-';
+               /* NFSv4 ACL perms */
+               for (i = 0; i < nfsv4_acl_perm_map_size; i++) {
+                       if (perm & nfsv4_acl_perm_map[i].perm)
+                               *(*wp)++ = nfsv4_acl_perm_map[i].wc;
+                       else
+                               *(*wp)++ = L'-';
+               }
                *(*wp)++ = L':';
-               *(*wp)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT) ? L'f' : L'-';
-               *(*wp)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT) ? L'd' : L'-';
-               *(*wp)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY) ? L'i' : L'-';
-               *(*wp)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT) ? L'n' : L'-';
-               *(*wp)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS) ? L'S' : L'-';
-               *(*wp)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS) ? L'F' : L'-';
-               *(*wp)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_ENTRY_INHERITED) ? L'I' : L'-';
+               for (i = 0; i < nfsv4_acl_flag_map_size; i++) {
+                       if (perm & nfsv4_acl_flag_map[i].perm)
+                               *(*wp)++ = nfsv4_acl_flag_map[i].wc;
+                       else
+                               *(*wp)++ = L'-';
+               }
                *(*wp)++ = L':';
                switch (type) {
                case ARCHIVE_ENTRY_ACL_TYPE_ALLOW:
@@ -998,6 +1018,8 @@ static void
 append_entry(char **p, const char *prefix, int type,
     int tag, int flags, const char *name, int perm, int id)
 {
+       int i;
+
        if (prefix != NULL) {
                strcpy(*p, prefix);
                *p += strlen(*p);
@@ -1067,47 +1089,20 @@ append_entry(char **p, const char *prefix, int type,
                *(*p)++ = (perm & 0222) ? 'w' : '-';
                *(*p)++ = (perm & 0111) ? 'x' : '-';
        } else {
-               /* NFS4 ACL perms */
-               *(*p)++ = (perm & (ARCHIVE_ENTRY_ACL_READ_DATA |
-                   ARCHIVE_ENTRY_ACL_LIST_DIRECTORY)) ? 'r' : '-';
-               *(*p)++ = (perm & (ARCHIVE_ENTRY_ACL_WRITE_DATA |
-                   ARCHIVE_ENTRY_ACL_ADD_FILE)) ? 'w' : '-';
-               *(*p)++ = (perm & (ARCHIVE_ENTRY_ACL_EXECUTE)) ? 'x' : '-';
-               *(*p)++ = (perm & (ARCHIVE_ENTRY_ACL_APPEND_DATA |
-                   ARCHIVE_ENTRY_ACL_ADD_SUBDIRECTORY)) ? 'p' : '-';
-               *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_DELETE) ? 'd' : '-';
-               *(*p)++ = (perm & ARCHIVE_ENTRY_ACL_DELETE_CHILD) ? 'D' : '-';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES) ? 'a' : '-';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES) ? 'A' : '-';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS) ? 'R' : '-';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS) ? 'W' : '-';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_READ_ACL) ? 'c' : '-';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_WRITE_ACL) ? 'C' : '-';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_WRITE_OWNER) ? 'o' : '-';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_SYNCHRONIZE) ? 's' : '-';
+               /* NFSv4 ACL perms */
+               for (i = 0; i < nfsv4_acl_perm_map_size; i++) {
+                       if (perm & nfsv4_acl_perm_map[i].perm)
+                               *(*p)++ = nfsv4_acl_perm_map[i].c;
+                       else
+                               *(*p)++ = '-';
+               }
                *(*p)++ = ':';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT) ? 'f' : '-';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT) ? 'd' : '-';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY) ? 'i' : '-';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT) ? 'n' : '-';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS) ? 'S' : '-';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS) ? 'F' : '-';
-               *(*p)++ = (perm &
-                   ARCHIVE_ENTRY_ACL_ENTRY_INHERITED) ? 'I' : '-';
+               for (i = 0; i < nfsv4_acl_flag_map_size; i++) {
+                       if (perm & nfsv4_acl_flag_map[i].perm)
+                               *(*p)++ = nfsv4_acl_flag_map[i].c;
+                       else
+                               *(*p)++ = '-';
+               }
                *(*p)++ = ':';
                switch (type) {
                case ARCHIVE_ENTRY_ACL_TYPE_ALLOW:
index 8fb969a65434d70943a571015c07993bf46f0516..f2f9f0a7d99f899c1d6aeda14c3acfd81e49723b 100644 (file)
@@ -618,9 +618,9 @@ setup_acls(struct archive_read_disk *a,
 /*
  * Translate system ACL permissions into libarchive internal structure
  */
-static struct {
-       int archive_perm;
-       int platform_perm;
+static const struct {
+       const int archive_perm;
+       const int platform_perm;
 } acl_perm_map[] = {
 #if HAVE_SUN_ACL       /* Solaris NFSv4 ACL permissions */
        {ARCHIVE_ENTRY_ACL_EXECUTE, ACE_EXECUTE},
@@ -687,9 +687,9 @@ static struct {
 /*
  * Translate system NFSv4 inheritance flags into libarchive internal structure
  */
-static struct {
-       int archive_inherit;
-       int platform_inherit;
+static const struct {
+       const int archive_inherit;
+       const int platform_inherit;
 } acl_inherit_map[] = {
 #if HAVE_SUN_ACL       /* Solaris ACL inheritance flags */
        {ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT, ACE_FILE_INHERIT_ACE},
index 311aebf0331f27fb6372b6f4c3ea2bf3266df655..2018a5a66c4dbd58ad5eca8aebb66d0643c3606d 100644 (file)
@@ -119,9 +119,9 @@ archive_write_disk_set_acls(struct archive *a, int fd, const char *name,
 /*
  * Translate system ACL permissions into libarchive internal structure
  */
-static struct {
-       int archive_perm;
-       int platform_perm;
+static const struct {
+       const int archive_perm;
+       const int platform_perm;
 } acl_perm_map[] = {
 #if HAVE_SUN_ACL       /* Solaris NFSv4 ACL permissions */
        {ARCHIVE_ENTRY_ACL_EXECUTE, ACE_EXECUTE},
@@ -188,9 +188,9 @@ static struct {
 /*
  * Translate system NFSv4 inheritance flags into libarchive internal structure
  */
-static struct {
-       int archive_inherit;
-       int platform_inherit;
+static const struct {
+       const int archive_inherit;
+       const int platform_inherit;
 } acl_inherit_map[] = {
 #if HAVE_SUN_ACL       /* Solaris NFSv4 inheritance flags */
        {ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT, ACE_FILE_INHERIT_ACE},