1310796Smm/*- 2310796Smm * Copyright (c) 2016 Martin Matuska 3310796Smm * All rights reserved. 4310796Smm * 5310796Smm * Redistribution and use in source and binary forms, with or without 6310796Smm * modification, are permitted provided that the following conditions 7310796Smm * are met: 8310796Smm * 1. Redistributions of source code must retain the above copyright 9310796Smm * notice, this list of conditions and the following disclaimer. 10310796Smm * 2. Redistributions in binary form must reproduce the above copyright 11310796Smm * notice, this list of conditions and the following disclaimer in the 12310796Smm * documentation and/or other materials provided with the distribution. 13310796Smm * 14310796Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15310796Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16310796Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17310796Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18310796Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19310796Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20310796Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21310796Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22310796Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23310796Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24310796Smm */ 25310796Smm#include "test.h" 26310796Smm__FBSDID("$FreeBSD: stable/10/contrib/libarchive/libarchive/test/test_acl_text.c 315433 2017-03-16 23:08:18Z mm $"); 27310796Smm 28310796Smm/* 29310796Smm * Test converting ACLs to text, both wide and non-wide 30310796Smm * 31310796Smm * This should work on all systems, regardless of whether local 32310796Smm * filesystems support ACLs or not. 33310796Smm */ 34310796Smm 35310796Smmstatic struct archive_test_acl_t acls0[] = { 36310796Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 37310796Smm ARCHIVE_ENTRY_ACL_EXECUTE | 38310796Smm ARCHIVE_ENTRY_ACL_READ | 39310796Smm ARCHIVE_ENTRY_ACL_WRITE, 40310796Smm ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" }, 41310796Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 42310796Smm ARCHIVE_ENTRY_ACL_EXECUTE | 43310796Smm ARCHIVE_ENTRY_ACL_READ, 44310796Smm ARCHIVE_ENTRY_ACL_USER, 100, "user100" }, 45310796Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0, 46310796Smm ARCHIVE_ENTRY_ACL_USER, 1000, "user1000" }, 47310796Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 48310796Smm ARCHIVE_ENTRY_ACL_EXECUTE | 49310796Smm ARCHIVE_ENTRY_ACL_READ, 50310796Smm ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" }, 51310796Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 52310796Smm ARCHIVE_ENTRY_ACL_EXECUTE | 53310796Smm ARCHIVE_ENTRY_ACL_READ | 54310796Smm ARCHIVE_ENTRY_ACL_WRITE, 55310796Smm ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" }, 56310796Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 57310796Smm ARCHIVE_ENTRY_ACL_READ | 58310796Smm ARCHIVE_ENTRY_ACL_EXECUTE, 59310796Smm ARCHIVE_ENTRY_ACL_OTHER, -1, "" }, 60310796Smm { ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 61310796Smm ARCHIVE_ENTRY_ACL_EXECUTE | 62310796Smm ARCHIVE_ENTRY_ACL_READ, 63310796Smm ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" }, 64310796Smm { ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 65310796Smm ARCHIVE_ENTRY_ACL_EXECUTE | 66310796Smm ARCHIVE_ENTRY_ACL_READ, 67310796Smm ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" }, 68310796Smm { ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0, 69310796Smm ARCHIVE_ENTRY_ACL_OTHER, -1, "" }, 70310796Smm { ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 71310796Smm ARCHIVE_ENTRY_ACL_EXECUTE | 72310796Smm ARCHIVE_ENTRY_ACL_READ, 73310796Smm ARCHIVE_ENTRY_ACL_USER, 101, "user101"}, 74310796Smm { ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 75310796Smm ARCHIVE_ENTRY_ACL_EXECUTE, 76310796Smm ARCHIVE_ENTRY_ACL_GROUP, 79, "group79" }, 77310796Smm}; 78310796Smm 79310796Smmstatic struct archive_test_acl_t acls1[] = { 80310796Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 81310796Smm ARCHIVE_ENTRY_ACL_READ_DATA | 82310796Smm ARCHIVE_ENTRY_ACL_WRITE_DATA | 83310796Smm ARCHIVE_ENTRY_ACL_APPEND_DATA | 84310796Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 85310796Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 86310796Smm ARCHIVE_ENTRY_ACL_READ_ACL | 87310796Smm ARCHIVE_ENTRY_ACL_WRITE_OWNER, 88310796Smm ARCHIVE_ENTRY_ACL_USER, 77, "user77" }, 89310796Smm { ARCHIVE_ENTRY_ACL_TYPE_DENY, 90310796Smm ARCHIVE_ENTRY_ACL_WRITE_DATA | 91310796Smm ARCHIVE_ENTRY_ACL_APPEND_DATA | 92310796Smm ARCHIVE_ENTRY_ACL_DELETE_CHILD | 93310796Smm ARCHIVE_ENTRY_ACL_DELETE | 94310796Smm ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT | 95310796Smm ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT | 96310796Smm ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY | 97310796Smm ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT, 98310796Smm ARCHIVE_ENTRY_ACL_USER, 101, "user101" }, 99310796Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 100310796Smm ARCHIVE_ENTRY_ACL_READ_DATA | 101310796Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 102310796Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 103310796Smm ARCHIVE_ENTRY_ACL_READ_ACL | 104310796Smm ARCHIVE_ENTRY_ACL_ENTRY_INHERITED, 105310796Smm ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" }, 106310796Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 107310796Smm ARCHIVE_ENTRY_ACL_READ_DATA | 108310796Smm ARCHIVE_ENTRY_ACL_WRITE_DATA | 109310796Smm ARCHIVE_ENTRY_ACL_EXECUTE | 110310796Smm ARCHIVE_ENTRY_ACL_APPEND_DATA | 111310796Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 112310796Smm ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES | 113310796Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 114310796Smm ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS | 115310796Smm ARCHIVE_ENTRY_ACL_READ_ACL | 116310796Smm ARCHIVE_ENTRY_ACL_WRITE_ACL | 117310796Smm ARCHIVE_ENTRY_ACL_WRITE_OWNER, 118310796Smm ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" }, 119310796Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 120310796Smm ARCHIVE_ENTRY_ACL_READ_DATA | 121310796Smm ARCHIVE_ENTRY_ACL_WRITE_DATA | 122310796Smm ARCHIVE_ENTRY_ACL_APPEND_DATA | 123310796Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 124310796Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 125310796Smm ARCHIVE_ENTRY_ACL_READ_ACL, 126310796Smm ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" }, 127310796Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 128310796Smm ARCHIVE_ENTRY_ACL_READ_DATA | 129310796Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 130310796Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 131310796Smm ARCHIVE_ENTRY_ACL_READ_ACL | 132310796Smm ARCHIVE_ENTRY_ACL_SYNCHRONIZE, 133310796Smm ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" }, 134310796Smm}; 135310796Smm 136310796Smmconst char* acltext[] = { 137310796Smm "user::rwx\n" 138310796Smm "group::r-x\n" 139310796Smm "other::r-x\n" 140310796Smm "user:user100:r-x\n" 141310796Smm "user:user1000:---\n" 142310796Smm "group:group78:rwx\n" 143310796Smm "default:user::r-x\n" 144310796Smm "default:group::r-x\n" 145310796Smm "default:other::---\n" 146310796Smm "default:user:user101:r-x\n" 147310796Smm "default:group:group79:--x", 148310796Smm 149310796Smm "user::rwx\n" 150310796Smm "group::r-x\n" 151310796Smm "other::r-x\n" 152310796Smm "user:user100:r-x:100\n" 153310796Smm "user:user1000:---:1000\n" 154310796Smm "group:group78:rwx:78\n" 155310796Smm "default:user::r-x\n" 156310796Smm "default:group::r-x\n" 157310796Smm "default:other::---\n" 158310796Smm "default:user:user101:r-x:101\n" 159310796Smm "default:group:group79:--x:79", 160310796Smm 161310796Smm "u::rwx\n" 162310796Smm "g::r-x\n" 163310796Smm "o::r-x\n" 164310796Smm "u:user100:r-x:100\n" 165310796Smm "u:user1000:---:1000\n" 166310796Smm "g:group78:rwx:78\n" 167310796Smm "d:user::r-x\n" 168310796Smm "d:group::r-x\n" 169310796Smm "d:other::---\n" 170310796Smm "d:user:user101:r-x:101\n" 171310796Smm "d:group:group79:--x:79", 172310796Smm 173310796Smm "user::rwx\n" 174310796Smm "group::r-x\n" 175310796Smm "other::r-x\n" 176310796Smm "user:user100:r-x\n" 177310796Smm "user:user1000:---\n" 178310796Smm "group:group78:rwx", 179310796Smm 180310796Smm "user::rwx," 181310796Smm "group::r-x," 182310796Smm "other::r-x," 183310796Smm "user:user100:r-x," 184310796Smm "user:user1000:---," 185310796Smm "group:group78:rwx", 186310796Smm 187310796Smm "user::rwx\n" 188310796Smm "group::r-x\n" 189310796Smm "other::r-x\n" 190310796Smm "user:user100:r-x:100\n" 191310796Smm "user:user1000:---:1000\n" 192310796Smm "group:group78:rwx:78", 193310796Smm 194310796Smm "user::r-x\n" 195310796Smm "group::r-x\n" 196310796Smm "other::---\n" 197310796Smm "user:user101:r-x\n" 198310796Smm "group:group79:--x", 199310796Smm 200310796Smm "user::r-x\n" 201310796Smm "group::r-x\n" 202310796Smm "other::---\n" 203310796Smm "user:user101:r-x:101\n" 204310796Smm "group:group79:--x:79", 205310796Smm 206310796Smm "default:user::r-x\n" 207310796Smm "default:group::r-x\n" 208310796Smm "default:other::---\n" 209310796Smm "default:user:user101:r-x\n" 210310796Smm "default:group:group79:--x", 211310796Smm 212310796Smm "user:user77:rw-p--a-R-c-o-:-------:allow\n" 213310796Smm "user:user101:-w-pdD--------:fdin---:deny\n" 214310796Smm "group:group78:r-----a-R-c---:------I:allow\n" 215310796Smm "owner@:rwxp--aARWcCo-:-------:allow\n" 216310796Smm "group@:rw-p--a-R-c---:-------:allow\n" 217310796Smm "everyone@:r-----a-R-c--s:-------:allow", 218310796Smm 219310796Smm "user:user77:rw-p--a-R-c-o-:-------:allow:77\n" 220310796Smm "user:user101:-w-pdD--------:fdin---:deny:101\n" 221310796Smm "group:group78:r-----a-R-c---:------I:allow:78\n" 222310796Smm "owner@:rwxp--aARWcCo-:-------:allow\n" 223310796Smm "group@:rw-p--a-R-c---:-------:allow\n" 224313927Smm "everyone@:r-----a-R-c--s:-------:allow", 225313927Smm 226313927Smm "user:user77:rwpaRco::allow:77\n" 227313927Smm "user:user101:wpdD:fdin:deny:101\n" 228313927Smm "group:group78:raRc:I:allow:78\n" 229313927Smm "owner@:rwxpaARWcCo::allow\n" 230313927Smm "group@:rwpaRc::allow\n" 231313927Smm "everyone@:raRcs::allow" 232310796Smm}; 233310796Smm 234310796Smmstatic wchar_t * 235310796Smmconvert_s_to_ws(const char *s) 236310796Smm{ 237310796Smm size_t len; 238310796Smm wchar_t *ws = NULL; 239310796Smm 240310796Smm if (s != NULL) { 241310796Smm len = strlen(s) + 1; 242310796Smm ws = malloc(len * sizeof(wchar_t)); 243310796Smm assert(mbstowcs(ws, s, len) != (size_t)-1); 244310796Smm } 245310796Smm 246310796Smm return (ws); 247310796Smm} 248310796Smm 249310796Smmstatic void 250310796Smmcompare_acl_text(struct archive_entry *ae, int flags, const char *s) 251310796Smm{ 252313571Smm char *text; 253313571Smm wchar_t *wtext; 254310796Smm wchar_t *ws; 255310796Smm ssize_t slen; 256310796Smm 257310796Smm ws = convert_s_to_ws(s); 258310796Smm 259310796Smm text = archive_entry_acl_to_text(ae, &slen, flags); 260310796Smm assertEqualString(text, s); 261310796Smm if (text != NULL) 262310796Smm assertEqualInt(strlen(text), slen); 263310796Smm wtext = archive_entry_acl_to_text_w(ae, &slen, flags); 264310796Smm assertEqualWString(wtext, ws); 265310796Smm if (wtext != NULL) { 266310796Smm assertEqualInt(wcslen(wtext), slen); 267310796Smm } 268313571Smm free(text); 269313571Smm free(wtext); 270313571Smm free(ws); 271310796Smm} 272310796Smm 273310796SmmDEFINE_TEST(test_acl_from_text) 274310796Smm{ 275310796Smm struct archive_entry *ae; 276310796Smm wchar_t *ws = NULL; 277310796Smm 278310796Smm /* Create an empty archive_entry. */ 279310796Smm assert((ae = archive_entry_new()) != NULL); 280310796Smm 281310796Smm /* 1a. Read POSIX.1e access ACLs from text */ 282310796Smm assertEqualInt(ARCHIVE_OK, 283310796Smm archive_entry_acl_from_text(ae, acltext[5], 284310796Smm ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); 285315433Smm assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]), 286310796Smm ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0755); 287310796Smm assertEqualInt(6, archive_entry_acl_reset(ae, 288310796Smm ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); 289310796Smm 290310796Smm /* 1b. Now read POSIX.1e default ACLs and append them */ 291310796Smm assertEqualInt(ARCHIVE_OK, 292310796Smm archive_entry_acl_from_text(ae, acltext[7], 293310796Smm ARCHIVE_ENTRY_ACL_TYPE_DEFAULT)); 294315433Smm assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]), 295310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755); 296310796Smm assertEqualInt(11, archive_entry_acl_reset(ae, 297310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E)); 298310796Smm archive_entry_acl_clear(ae); 299310796Smm 300310796Smm /* 1a and 1b with wide strings */ 301310796Smm ws = convert_s_to_ws(acltext[5]); 302310796Smm 303310796Smm assertEqualInt(ARCHIVE_OK, 304310796Smm archive_entry_acl_from_text_w(ae, ws, 305310796Smm ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); 306315433Smm assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]), 307310796Smm ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0755); 308310796Smm assertEqualInt(6, archive_entry_acl_reset(ae, 309310796Smm ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); 310310796Smm 311310796Smm free(ws); 312310796Smm ws = convert_s_to_ws(acltext[7]); 313310796Smm 314310796Smm assertEqualInt(ARCHIVE_OK, 315310796Smm archive_entry_acl_from_text_w(ae, ws, 316310796Smm ARCHIVE_ENTRY_ACL_TYPE_DEFAULT)); 317315433Smm assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]), 318310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755); 319310796Smm assertEqualInt(11, archive_entry_acl_reset(ae, 320310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E)); 321310796Smm archive_entry_acl_clear(ae); 322310796Smm 323310796Smm /* 2. Read POSIX.1e default ACLs from text */ 324310796Smm assertEqualInt(ARCHIVE_OK, 325310796Smm archive_entry_acl_from_text(ae, acltext[7], 326310796Smm ARCHIVE_ENTRY_ACL_TYPE_DEFAULT)); 327315433Smm assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]), 328310796Smm ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0); 329310796Smm assertEqualInt(5, archive_entry_acl_reset(ae, 330310796Smm ARCHIVE_ENTRY_ACL_TYPE_DEFAULT)); 331310796Smm archive_entry_acl_clear(ae); 332310796Smm 333310796Smm /* ws is still acltext[7] */ 334310796Smm assertEqualInt(ARCHIVE_OK, 335310796Smm archive_entry_acl_from_text_w(ae, ws, 336310796Smm ARCHIVE_ENTRY_ACL_TYPE_DEFAULT)); 337315433Smm assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]), 338310796Smm ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0); 339310796Smm assertEqualInt(5, archive_entry_acl_reset(ae, 340310796Smm ARCHIVE_ENTRY_ACL_TYPE_DEFAULT)); 341310796Smm archive_entry_acl_clear(ae); 342310796Smm 343310796Smm /* 3. Read POSIX.1e access and default ACLs from text */ 344310796Smm assertEqualInt(ARCHIVE_OK, 345310796Smm archive_entry_acl_from_text(ae, acltext[1], 346310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E)); 347315433Smm assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]), 348310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755); 349310796Smm assertEqualInt(11, archive_entry_acl_reset(ae, 350310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E)); 351310796Smm archive_entry_acl_clear(ae); 352310796Smm 353310796Smm free(ws); 354310796Smm ws = convert_s_to_ws(acltext[1]); 355310796Smm assertEqualInt(ARCHIVE_OK, 356310796Smm archive_entry_acl_from_text_w(ae, ws, 357310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E)); 358315433Smm assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]), 359310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755); 360310796Smm assertEqualInt(11, archive_entry_acl_reset(ae, 361310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E)); 362310796Smm archive_entry_acl_clear(ae); 363310796Smm 364310796Smm /* 4. Read POSIX.1e access and default ACLs from text (short form) */ 365310796Smm assertEqualInt(ARCHIVE_OK, 366310796Smm archive_entry_acl_from_text(ae, acltext[2], 367310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E)); 368315433Smm assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]), 369310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755); 370310796Smm assertEqualInt(11, archive_entry_acl_reset(ae, 371310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E)); 372310796Smm archive_entry_acl_clear(ae); 373310796Smm 374310796Smm free(ws); 375310796Smm ws = convert_s_to_ws(acltext[2]); 376310796Smm assertEqualInt(ARCHIVE_OK, 377310796Smm archive_entry_acl_from_text_w(ae, ws, 378310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E)); 379315433Smm assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]), 380310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755); 381310796Smm assertEqualInt(11, archive_entry_acl_reset(ae, 382310796Smm ARCHIVE_ENTRY_ACL_TYPE_POSIX1E)); 383310796Smm archive_entry_acl_clear(ae); 384310796Smm 385310796Smm /* 5. Read NFSv4 ACLs from text */ 386310796Smm assertEqualInt(ARCHIVE_OK, 387310796Smm archive_entry_acl_from_text(ae, acltext[10], 388310796Smm ARCHIVE_ENTRY_ACL_TYPE_NFS4)); 389315433Smm assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]), 390310796Smm ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0); 391310796Smm assertEqualInt(6, archive_entry_acl_reset(ae, 392310796Smm ARCHIVE_ENTRY_ACL_TYPE_NFS4)); 393310796Smm archive_entry_acl_clear(ae); 394310796Smm 395310796Smm free(ws); 396310796Smm ws = convert_s_to_ws(acltext[10]); 397310796Smm 398310796Smm assertEqualInt(ARCHIVE_OK, 399310796Smm archive_entry_acl_from_text_w(ae, ws, 400310796Smm ARCHIVE_ENTRY_ACL_TYPE_NFS4)); 401315433Smm assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]), 402310796Smm ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0); 403310796Smm assertEqualInt(6, archive_entry_acl_reset(ae, 404310796Smm ARCHIVE_ENTRY_ACL_TYPE_NFS4)); 405310796Smm archive_entry_acl_clear(ae); 406313571Smm 407313571Smm free(ws); 408313571Smm archive_entry_free(ae); 409310796Smm} 410310796Smm 411310796SmmDEFINE_TEST(test_acl_to_text) 412310796Smm{ 413310796Smm struct archive_entry *ae; 414310796Smm 415310796Smm /* Create an empty archive_entry. */ 416310796Smm assert((ae = archive_entry_new()) != NULL); 417310796Smm 418310796Smm /* Write POSIX.1e ACLs */ 419315433Smm assertEntrySetAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0])); 420310796Smm 421310796Smm /* No flags should give output like getfacl(1) on linux */ 422310796Smm compare_acl_text(ae, 0, acltext[0]); 423310796Smm 424310796Smm /* This should give the same output as previous test */ 425310796Smm compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS | 426310796Smm ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, acltext[0]); 427310796Smm 428310796Smm /* This should give the same output as previous two tests */ 429310796Smm compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS | 430310796Smm ARCHIVE_ENTRY_ACL_TYPE_DEFAULT | 431310796Smm ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT, acltext[0]); 432310796Smm 433310796Smm /* POSIX.1e access and default ACLs with appended ID */ 434310796Smm compare_acl_text(ae, ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[1]); 435310796Smm 436310796Smm /* POSIX.1e access acls only, like getfacl(1) on FreeBSD */ 437310796Smm compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS, acltext[3]); 438310796Smm 439310796Smm /* POSIX.1e access acls separated with comma */ 440310796Smm compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS | 441310796Smm ARCHIVE_ENTRY_ACL_STYLE_SEPARATOR_COMMA, 442310796Smm acltext[4]); 443310796Smm 444310796Smm /* POSIX.1e access acls with appended user or group ID */ 445310796Smm compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS | 446310796Smm ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[5]); 447310796Smm 448310796Smm /* POSIX.1e default acls */ 449310796Smm compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, acltext[6]); 450310796Smm 451310796Smm /* POSIX.1e default acls with appended user or group ID */ 452310796Smm compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT | 453310796Smm ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[7]); 454310796Smm 455310796Smm /* POSIX.1e default acls prefixed with default: */ 456310796Smm compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT | 457310796Smm ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT, acltext[8]); 458310796Smm 459310796Smm /* Write NFSv4 ACLs */ 460315433Smm assertEntrySetAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0])); 461310796Smm 462310796Smm /* NFSv4 ACLs like getfacl(1) on FreeBSD */ 463310796Smm compare_acl_text(ae, 0, acltext[9]); 464310796Smm 465310796Smm /* NFSv4 ACLs like "getfacl -i" on FreeBSD */ 466310796Smm compare_acl_text(ae, ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[10]); 467313571Smm 468313927Smm /* NFSv4 ACLs like "getfacl -i" on FreeBSD with stripped minus chars */ 469313927Smm compare_acl_text(ae, ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID | 470313927Smm ARCHIVE_ENTRY_ACL_STYLE_COMPACT, acltext[11]); 471313927Smm 472313571Smm archive_entry_free(ae); 473310796Smm} 474