test_acl_pax.c revision 313570
1228753Smm/*- 2228753Smm * Copyright (c) 2003-2007 Tim Kientzle 3313570Smm * Copyright (c) 2016 Martin Matuska 4228753Smm * All rights reserved. 5228753Smm * 6228753Smm * Redistribution and use in source and binary forms, with or without 7228753Smm * modification, are permitted provided that the following conditions 8228753Smm * are met: 9228753Smm * 1. Redistributions of source code must retain the above copyright 10228753Smm * notice, this list of conditions and the following disclaimer. 11228753Smm * 2. Redistributions in binary form must reproduce the above copyright 12228753Smm * notice, this list of conditions and the following disclaimer in the 13228753Smm * documentation and/or other materials provided with the distribution. 14228753Smm * 15228753Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 16228753Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17228753Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18228753Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 19228753Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20228753Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21228753Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22228753Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23228753Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24228753Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25228753Smm */ 26228753Smm#include "test.h" 27228763Smm__FBSDID("$FreeBSD: stable/11/contrib/libarchive/libarchive/test/test_acl_pax.c 313570 2017-02-11 00:54:16Z mm $"); 28228753Smm 29228753Smm/* 30228753Smm * Exercise the system-independent portion of the ACL support. 31313570Smm * Check that pax archive can save and restore POSIX.1e ACL data. 32228753Smm * 33228753Smm * This should work on all systems, regardless of whether local 34228753Smm * filesystems support ACLs or not. 35228753Smm */ 36228753Smm 37228753Smmstatic unsigned char buff[16384]; 38228753Smm 39313570Smmstatic struct archive_test_acl_t acls0[] = { 40228753Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE, 41228753Smm ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" }, 42228753Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, 43228753Smm ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" }, 44228753Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE, 45228753Smm ARCHIVE_ENTRY_ACL_OTHER, 0, "" }, 46228753Smm}; 47228753Smm 48313570Smmstatic struct archive_test_acl_t acls1[] = { 49228753Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE, 50228753Smm ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" }, 51228753Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, 52228753Smm ARCHIVE_ENTRY_ACL_USER, 77, "user77" }, 53228753Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, 54228753Smm ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" }, 55228753Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE, 56228753Smm ARCHIVE_ENTRY_ACL_OTHER, -1, "" }, 57228753Smm}; 58228753Smm 59313570Smmstatic struct archive_test_acl_t acls2[] = { 60228753Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE | ARCHIVE_ENTRY_ACL_READ, 61228753Smm ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" }, 62228753Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, 63228753Smm ARCHIVE_ENTRY_ACL_USER, 77, "user77" }, 64228753Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0, 65228753Smm ARCHIVE_ENTRY_ACL_USER, 78, "user78" }, 66228753Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ, 67228753Smm ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" }, 68228753Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0007, 69228753Smm ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" }, 70228753Smm { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE | ARCHIVE_ENTRY_ACL_EXECUTE, 71228753Smm ARCHIVE_ENTRY_ACL_OTHER, -1, "" }, 72228753Smm}; 73228753Smm 74313570Smmstatic struct archive_test_acl_t acls3[] = { 75313570Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 76313570Smm ARCHIVE_ENTRY_ACL_READ_DATA | 77313570Smm ARCHIVE_ENTRY_ACL_WRITE_DATA | 78313570Smm ARCHIVE_ENTRY_ACL_EXECUTE | 79313570Smm ARCHIVE_ENTRY_ACL_APPEND_DATA | 80313570Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 81313570Smm ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES | 82313570Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 83313570Smm ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS | 84313570Smm ARCHIVE_ENTRY_ACL_READ_ACL | 85313570Smm ARCHIVE_ENTRY_ACL_WRITE_ACL | 86313570Smm ARCHIVE_ENTRY_ACL_WRITE_OWNER | 87313570Smm ARCHIVE_ENTRY_ACL_SYNCHRONIZE, 88313570Smm ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" }, 89313570Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 90313570Smm ARCHIVE_ENTRY_ACL_READ_DATA | 91313570Smm ARCHIVE_ENTRY_ACL_WRITE_DATA | 92313570Smm ARCHIVE_ENTRY_ACL_APPEND_DATA | 93313570Smm ARCHIVE_ENTRY_ACL_READ_ACL | 94313570Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 95313570Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 96313570Smm ARCHIVE_ENTRY_ACL_READ_ACL | 97313570Smm ARCHIVE_ENTRY_ACL_SYNCHRONIZE, 98313570Smm ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" }, 99313570Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 100313570Smm ARCHIVE_ENTRY_ACL_READ_DATA | 101313570Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 102313570Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 103313570Smm ARCHIVE_ENTRY_ACL_READ_ACL | 104313570Smm ARCHIVE_ENTRY_ACL_SYNCHRONIZE, 105313570Smm ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" }, 106313570Smm}; 107228753Smm 108313570Smmstatic struct archive_test_acl_t acls4[] = { 109313570Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 110313570Smm ARCHIVE_ENTRY_ACL_READ_DATA | 111313570Smm ARCHIVE_ENTRY_ACL_WRITE_DATA | 112313570Smm ARCHIVE_ENTRY_ACL_APPEND_DATA | 113313570Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 114313570Smm ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES | 115313570Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 116313570Smm ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS | 117313570Smm ARCHIVE_ENTRY_ACL_READ_ACL | 118313570Smm ARCHIVE_ENTRY_ACL_WRITE_ACL | 119313570Smm ARCHIVE_ENTRY_ACL_WRITE_OWNER | 120313570Smm ARCHIVE_ENTRY_ACL_SYNCHRONIZE, 121313570Smm ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" }, 122313570Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 123313570Smm ARCHIVE_ENTRY_ACL_READ_DATA | 124313570Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 125313570Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 126313570Smm ARCHIVE_ENTRY_ACL_READ_ACL | 127313570Smm ARCHIVE_ENTRY_ACL_SYNCHRONIZE | 128313570Smm ARCHIVE_ENTRY_ACL_ENTRY_INHERITED, 129313570Smm ARCHIVE_ENTRY_ACL_USER, 77, "user77" }, 130313570Smm { ARCHIVE_ENTRY_ACL_TYPE_DENY, 131313570Smm ARCHIVE_ENTRY_ACL_READ_DATA | 132313570Smm ARCHIVE_ENTRY_ACL_WRITE_DATA | 133313570Smm ARCHIVE_ENTRY_ACL_EXECUTE, 134313570Smm ARCHIVE_ENTRY_ACL_USER, 78, "user78" }, 135313570Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 136313570Smm ARCHIVE_ENTRY_ACL_READ_DATA | 137313570Smm ARCHIVE_ENTRY_ACL_WRITE_DATA | 138313570Smm ARCHIVE_ENTRY_ACL_APPEND_DATA | 139313570Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 140313570Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 141313570Smm ARCHIVE_ENTRY_ACL_READ_ACL | 142313570Smm ARCHIVE_ENTRY_ACL_SYNCHRONIZE, 143313570Smm ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" }, 144313570Smm { ARCHIVE_ENTRY_ACL_TYPE_DENY, 145313570Smm ARCHIVE_ENTRY_ACL_WRITE_DATA | 146313570Smm ARCHIVE_ENTRY_ACL_APPEND_DATA | 147313570Smm ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES | 148313570Smm ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS | 149313570Smm ARCHIVE_ENTRY_ACL_WRITE_ACL | 150313570Smm ARCHIVE_ENTRY_ACL_WRITE_OWNER, 151313570Smm ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" }, 152313570Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 153313570Smm ARCHIVE_ENTRY_ACL_READ_DATA | 154313570Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 155313570Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 156313570Smm ARCHIVE_ENTRY_ACL_READ_ACL | 157313570Smm ARCHIVE_ENTRY_ACL_SYNCHRONIZE, 158313570Smm ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" }, 159313570Smm}; 160228753Smm 161313570Smmstatic struct archive_test_acl_t acls5[] = { 162313570Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 163313570Smm ARCHIVE_ENTRY_ACL_READ_DATA | 164313570Smm ARCHIVE_ENTRY_ACL_WRITE_DATA | 165313570Smm ARCHIVE_ENTRY_ACL_EXECUTE | 166313570Smm ARCHIVE_ENTRY_ACL_APPEND_DATA | 167313570Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 168313570Smm ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES | 169313570Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 170313570Smm ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS | 171313570Smm ARCHIVE_ENTRY_ACL_READ_ACL | 172313570Smm ARCHIVE_ENTRY_ACL_WRITE_ACL | 173313570Smm ARCHIVE_ENTRY_ACL_WRITE_OWNER | 174313570Smm ARCHIVE_ENTRY_ACL_SYNCHRONIZE, 175313570Smm ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" }, 176313570Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 177313570Smm ARCHIVE_ENTRY_ACL_READ_DATA | 178313570Smm ARCHIVE_ENTRY_ACL_WRITE_DATA | 179313570Smm ARCHIVE_ENTRY_ACL_APPEND_DATA | 180313570Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 181313570Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 182313570Smm ARCHIVE_ENTRY_ACL_READ_ACL | 183313570Smm ARCHIVE_ENTRY_ACL_WRITE_OWNER | 184313570Smm ARCHIVE_ENTRY_ACL_SYNCHRONIZE, 185313570Smm ARCHIVE_ENTRY_ACL_USER, 77, "user77" }, 186313570Smm { ARCHIVE_ENTRY_ACL_TYPE_AUDIT, 187313570Smm ARCHIVE_ENTRY_ACL_WRITE_DATA | 188313570Smm ARCHIVE_ENTRY_ACL_APPEND_DATA | 189313570Smm ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS, 190313570Smm ARCHIVE_ENTRY_ACL_USER, 77, "user77" }, 191313570Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 192313570Smm ARCHIVE_ENTRY_ACL_READ_DATA | 193313570Smm ARCHIVE_ENTRY_ACL_WRITE_DATA | 194313570Smm ARCHIVE_ENTRY_ACL_APPEND_DATA | 195313570Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 196313570Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 197313570Smm ARCHIVE_ENTRY_ACL_READ_ACL | 198313570Smm ARCHIVE_ENTRY_ACL_SYNCHRONIZE, 199313570Smm ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" }, 200313570Smm { ARCHIVE_ENTRY_ACL_TYPE_ALARM, 201313570Smm ARCHIVE_ENTRY_ACL_READ_DATA | 202313570Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 203313570Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 204313570Smm ARCHIVE_ENTRY_ACL_READ_ACL | 205313570Smm ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS, 206313570Smm ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" }, 207313570Smm { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 208313570Smm ARCHIVE_ENTRY_ACL_READ_DATA | 209313570Smm ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES | 210313570Smm ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | 211313570Smm ARCHIVE_ENTRY_ACL_READ_ACL | 212313570Smm ARCHIVE_ENTRY_ACL_SYNCHRONIZE, 213313570Smm ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" }, 214313570Smm}; 215228753Smm 216313570SmmDEFINE_TEST(test_acl_pax_posix1e) 217228753Smm{ 218228753Smm struct archive *a; 219228753Smm struct archive_entry *ae; 220228753Smm size_t used; 221228753Smm FILE *f; 222232153Smm void *reference; 223232153Smm size_t reference_size; 224228753Smm 225228753Smm /* Write an archive to memory. */ 226228753Smm assert(NULL != (a = archive_write_new())); 227228753Smm assertA(0 == archive_write_set_format_pax(a)); 228248616Smm assertA(0 == archive_write_add_filter_none(a)); 229228753Smm assertA(0 == archive_write_set_bytes_per_block(a, 1)); 230228753Smm assertA(0 == archive_write_set_bytes_in_last_block(a, 1)); 231228753Smm assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); 232228753Smm 233228753Smm /* Write a series of files to the archive with different ACL info. */ 234228753Smm 235228753Smm /* Create a simple archive_entry. */ 236228753Smm assert((ae = archive_entry_new()) != NULL); 237228753Smm archive_entry_set_pathname(ae, "file"); 238228753Smm archive_entry_set_mode(ae, S_IFREG | 0777); 239228753Smm 240228753Smm /* Basic owner/owning group should just update mode bits. */ 241313570Smm archive_test_set_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0])); 242228753Smm assertA(0 == archive_write_header(a, ae)); 243228753Smm 244228753Smm /* With any extended ACL entry, we should read back a full set. */ 245313570Smm archive_test_set_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0])); 246228753Smm assertA(0 == archive_write_header(a, ae)); 247228753Smm 248228753Smm 249228753Smm /* A more extensive set of ACLs. */ 250313570Smm archive_test_set_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0])); 251228753Smm assertA(0 == archive_write_header(a, ae)); 252228753Smm 253228753Smm /* 254228753Smm * Check that clearing ACLs gets rid of them all by repeating 255228753Smm * the first test. 256228753Smm */ 257313570Smm archive_test_set_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0])); 258228753Smm assertA(0 == archive_write_header(a, ae)); 259228753Smm archive_entry_free(ae); 260228753Smm 261228753Smm /* Close out the archive. */ 262232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 263232153Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 264228753Smm 265228753Smm /* Write out the data we generated to a file for manual inspection. */ 266228753Smm assert(NULL != (f = fopen("testout", "wb"))); 267228753Smm assertEqualInt(used, (size_t)fwrite(buff, 1, (unsigned int)used, f)); 268228753Smm fclose(f); 269228753Smm 270228753Smm /* Write out the reference data to a file for manual inspection. */ 271313570Smm extract_reference_file("test_acl_pax_posix1e.tar"); 272313570Smm reference = slurpfile(&reference_size, "test_acl_pax_posix1e.tar"); 273228753Smm 274228753Smm /* Assert that the generated data matches the built-in reference data.*/ 275313570Smm failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_posix1e.tar' reference file."); 276232153Smm assertEqualMem(buff, reference, reference_size); 277313570Smm failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_posix1e.tar' reference file."); 278232153Smm assertEqualInt((int)used, reference_size); 279232153Smm free(reference); 280228753Smm 281228753Smm /* Read back each entry and check that the ACL data is right. */ 282228753Smm assert(NULL != (a = archive_read_new())); 283228753Smm assertA(0 == archive_read_support_format_all(a)); 284232153Smm assertA(0 == archive_read_support_filter_all(a)); 285228753Smm assertA(0 == archive_read_open_memory(a, buff, used)); 286228753Smm 287228753Smm /* First item has no ACLs */ 288228753Smm assertA(0 == archive_read_next_header(a, &ae)); 289228753Smm failure("Basic ACLs shouldn't be stored as extended ACLs"); 290228753Smm assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); 291228753Smm failure("Basic ACLs should set mode to 0142, not %04o", 292228753Smm archive_entry_mode(ae)&0777); 293228753Smm assert((archive_entry_mode(ae) & 0777) == 0142); 294228753Smm 295228753Smm /* Second item has a few ACLs */ 296228753Smm assertA(0 == archive_read_next_header(a, &ae)); 297228753Smm failure("One extended ACL should flag all ACLs to be returned."); 298228753Smm assert(4 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); 299313570Smm archive_test_compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]), 300313570Smm ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0142); 301228753Smm failure("Basic ACLs should set mode to 0142, not %04o", 302228753Smm archive_entry_mode(ae)&0777); 303228753Smm assert((archive_entry_mode(ae) & 0777) == 0142); 304228753Smm 305228753Smm /* Third item has pretty extensive ACLs */ 306228753Smm assertA(0 == archive_read_next_header(a, &ae)); 307313570Smm assertEqualInt(6, archive_entry_acl_reset(ae, 308313570Smm ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); 309313570Smm archive_test_compare_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]), 310313570Smm ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0543); 311228753Smm failure("Basic ACLs should set mode to 0543, not %04o", 312228753Smm archive_entry_mode(ae)&0777); 313228753Smm assert((archive_entry_mode(ae) & 0777) == 0543); 314228753Smm 315228753Smm /* Fourth item has no ACLs */ 316228753Smm assertA(0 == archive_read_next_header(a, &ae)); 317228753Smm failure("Basic ACLs shouldn't be stored as extended ACLs"); 318228753Smm assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); 319228753Smm failure("Basic ACLs should set mode to 0142, not %04o", 320228753Smm archive_entry_mode(ae)&0777); 321228753Smm assert((archive_entry_mode(ae) & 0777) == 0142); 322228753Smm 323228753Smm /* Close the archive. */ 324232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 325232153Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 326228753Smm} 327313570Smm 328313570SmmDEFINE_TEST(test_acl_pax_nfs4) 329313570Smm{ 330313570Smm struct archive *a; 331313570Smm struct archive_entry *ae; 332313570Smm size_t used; 333313570Smm FILE *f; 334313570Smm void *reference; 335313570Smm size_t reference_size; 336313570Smm 337313570Smm /* Write an archive to memory. */ 338313570Smm assert(NULL != (a = archive_write_new())); 339313570Smm assertA(0 == archive_write_set_format_pax(a)); 340313570Smm assertA(0 == archive_write_add_filter_none(a)); 341313570Smm assertA(0 == archive_write_set_bytes_per_block(a, 1)); 342313570Smm assertA(0 == archive_write_set_bytes_in_last_block(a, 1)); 343313570Smm assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); 344313570Smm 345313570Smm /* Write a series of files to the archive with different ACL info. */ 346313570Smm 347313570Smm /* Create a simple archive_entry. */ 348313570Smm assert((ae = archive_entry_new()) != NULL); 349313570Smm archive_entry_set_pathname(ae, "file"); 350313570Smm archive_entry_set_mode(ae, S_IFREG | 0777); 351313570Smm 352313570Smm /* NFS4 ACLs mirroring 0754 file mode */ 353313570Smm archive_test_set_acls(ae, acls3, sizeof(acls3)/sizeof(acls3[0])); 354313570Smm assertA(0 == archive_write_header(a, ae)); 355313570Smm 356313570Smm /* A more extensive set of NFS4 ACLs. */ 357313570Smm archive_test_set_acls(ae, acls4, sizeof(acls4)/sizeof(acls4[0])); 358313570Smm assertA(0 == archive_write_header(a, ae)); 359313570Smm 360313570Smm /* Set with special (audit, alarm) NFS4 ACLs. */ 361313570Smm archive_test_set_acls(ae, acls5, sizeof(acls5)/sizeof(acls5[0])); 362313570Smm assertA(0 == archive_write_header(a, ae)); 363313570Smm 364313570Smm archive_entry_free(ae); 365313570Smm 366313570Smm /* Close out the archive. */ 367313570Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 368313570Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 369313570Smm 370313570Smm /* Write out the data we generated to a file for manual inspection. */ 371313570Smm assert(NULL != (f = fopen("testout", "wb"))); 372313570Smm assertEqualInt(used, (size_t)fwrite(buff, 1, (unsigned int)used, f)); 373313570Smm fclose(f); 374313570Smm 375313570Smm /* Write out the reference data to a file for manual inspection. */ 376313570Smm extract_reference_file("test_acl_pax_nfs4.tar"); 377313570Smm reference = slurpfile(&reference_size, "test_acl_pax_nfs4.tar"); 378313570Smm 379313570Smm /* Assert that the generated data matches the built-in reference data.*/ 380313570Smm failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_nfs4.tar' reference file."); 381313570Smm assertEqualMem(buff, reference, reference_size); 382313570Smm failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_nfs4.tar' reference file."); 383313570Smm assertEqualInt((int)used, reference_size); 384313570Smm free(reference); 385313570Smm 386313570Smm /* Read back each entry and check that the ACL data is right. */ 387313570Smm assert(NULL != (a = archive_read_new())); 388313570Smm assertA(0 == archive_read_support_format_all(a)); 389313570Smm assertA(0 == archive_read_support_filter_all(a)); 390313570Smm assertA(0 == archive_read_open_memory(a, buff, used)); 391313570Smm 392313570Smm /* First item has NFS4 ACLs mirroring file mode */ 393313570Smm assertA(0 == archive_read_next_header(a, &ae)); 394313570Smm assertEqualInt(3, archive_entry_acl_reset(ae, 395313570Smm ARCHIVE_ENTRY_ACL_TYPE_ALLOW)); 396313570Smm archive_test_compare_acls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]), 397313570Smm ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 0); 398313570Smm 399313570Smm /* Second item has has more fine-grained NFS4 ACLs */ 400313570Smm assertA(0 == archive_read_next_header(a, &ae)); 401313570Smm assertEqualInt(6, archive_entry_acl_reset(ae, 402313570Smm ARCHIVE_ENTRY_ACL_TYPE_NFS4)); 403313570Smm archive_test_compare_acls(ae, acls4, sizeof(acls4)/sizeof(acls4[0]), 404313570Smm ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0); 405313570Smm 406313570Smm /* Third item has has audit and alarm NFS4 ACLs */ 407313570Smm assertA(0 == archive_read_next_header(a, &ae)); 408313570Smm assertEqualInt(6, archive_entry_acl_reset(ae, 409313570Smm ARCHIVE_ENTRY_ACL_TYPE_NFS4)); 410313570Smm archive_test_compare_acls(ae, acls5, sizeof(acls5)/sizeof(acls5[0]), 411313570Smm ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0); 412313570Smm 413313570Smm /* Close the archive. */ 414313570Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 415313570Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 416313570Smm} 417