Merge branch 'master' of github.com:libarchive/libarchive
diff --git a/libarchive/archive_acl.c b/libarchive/archive_acl.c
index 1e9ddbb..00f66c1 100644
--- a/libarchive/archive_acl.c
+++ b/libarchive/archive_acl.c
@@ -83,6 +83,50 @@
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 @@
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 @@
*(*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 @@
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 @@
*(*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:
diff --git a/libarchive/archive_read_disk_entry_from_file.c b/libarchive/archive_read_disk_entry_from_file.c
index 8fb969a..f2f9f0a 100644
--- a/libarchive/archive_read_disk_entry_from_file.c
+++ b/libarchive/archive_read_disk_entry_from_file.c
@@ -618,9 +618,9 @@
/*
* 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 @@
/*
* 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},
diff --git a/libarchive/archive_write_disk_acl.c b/libarchive/archive_write_disk_acl.c
index 311aebf..2018a5a 100644
--- a/libarchive/archive_write_disk_acl.c
+++ b/libarchive/archive_write_disk_acl.c
@@ -119,9 +119,9 @@
/*
* 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 @@
/*
* 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},