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 315432 2017-03-16 23:07:35Z 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. */ 241315432Smm assertEntrySetAcls(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. */ 245315432Smm assertEntrySetAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0])); 246228753Smm assertA(0 == archive_write_header(a, ae)); 247228753Smm 248228753Smm /* A more extensive set of ACLs. */ 249315432Smm assertEntrySetAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0])); 250228753Smm assertA(0 == archive_write_header(a, ae)); 251228753Smm 252228753Smm /* 253228753Smm * Check that clearing ACLs gets rid of them all by repeating 254228753Smm * the first test. 255228753Smm */ 256315432Smm assertEntrySetAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0])); 257228753Smm assertA(0 == archive_write_header(a, ae)); 258228753Smm archive_entry_free(ae); 259228753Smm 260228753Smm /* Close out the archive. */ 261232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 262232153Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 263228753Smm 264228753Smm /* Write out the data we generated to a file for manual inspection. */ 265228753Smm assert(NULL != (f = fopen("testout", "wb"))); 266228753Smm assertEqualInt(used, (size_t)fwrite(buff, 1, (unsigned int)used, f)); 267228753Smm fclose(f); 268228753Smm 269228753Smm /* Write out the reference data to a file for manual inspection. */ 270313570Smm extract_reference_file("test_acl_pax_posix1e.tar"); 271313570Smm reference = slurpfile(&reference_size, "test_acl_pax_posix1e.tar"); 272228753Smm 273228753Smm /* Assert that the generated data matches the built-in reference data.*/ 274313570Smm failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_posix1e.tar' reference file."); 275232153Smm assertEqualMem(buff, reference, reference_size); 276313570Smm failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_posix1e.tar' reference file."); 277232153Smm assertEqualInt((int)used, reference_size); 278232153Smm free(reference); 279228753Smm 280228753Smm /* Read back each entry and check that the ACL data is right. */ 281228753Smm assert(NULL != (a = archive_read_new())); 282228753Smm assertA(0 == archive_read_support_format_all(a)); 283232153Smm assertA(0 == archive_read_support_filter_all(a)); 284228753Smm assertA(0 == archive_read_open_memory(a, buff, used)); 285228753Smm 286228753Smm /* First item has no ACLs */ 287228753Smm assertA(0 == archive_read_next_header(a, &ae)); 288228753Smm failure("Basic ACLs shouldn't be stored as extended ACLs"); 289228753Smm assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); 290228753Smm failure("Basic ACLs should set mode to 0142, not %04o", 291228753Smm archive_entry_mode(ae)&0777); 292228753Smm assert((archive_entry_mode(ae) & 0777) == 0142); 293228753Smm 294228753Smm /* Second item has a few ACLs */ 295228753Smm assertA(0 == archive_read_next_header(a, &ae)); 296228753Smm failure("One extended ACL should flag all ACLs to be returned."); 297228753Smm assert(4 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); 298315432Smm assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]), 299313570Smm ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0142); 300228753Smm failure("Basic ACLs should set mode to 0142, not %04o", 301228753Smm archive_entry_mode(ae)&0777); 302228753Smm assert((archive_entry_mode(ae) & 0777) == 0142); 303228753Smm 304228753Smm /* Third item has pretty extensive ACLs */ 305228753Smm assertA(0 == archive_read_next_header(a, &ae)); 306313570Smm assertEqualInt(6, archive_entry_acl_reset(ae, 307313570Smm ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); 308315432Smm assertEntryCompareAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]), 309313570Smm ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0543); 310228753Smm failure("Basic ACLs should set mode to 0543, not %04o", 311228753Smm archive_entry_mode(ae)&0777); 312228753Smm assert((archive_entry_mode(ae) & 0777) == 0543); 313228753Smm 314228753Smm /* Fourth item has no ACLs */ 315228753Smm assertA(0 == archive_read_next_header(a, &ae)); 316228753Smm failure("Basic ACLs shouldn't be stored as extended ACLs"); 317228753Smm assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); 318228753Smm failure("Basic ACLs should set mode to 0142, not %04o", 319228753Smm archive_entry_mode(ae)&0777); 320228753Smm assert((archive_entry_mode(ae) & 0777) == 0142); 321228753Smm 322228753Smm /* Close the archive. */ 323232153Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 324232153Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 325228753Smm} 326313570Smm 327313570SmmDEFINE_TEST(test_acl_pax_nfs4) 328313570Smm{ 329313570Smm struct archive *a; 330313570Smm struct archive_entry *ae; 331313570Smm size_t used; 332313570Smm FILE *f; 333313570Smm void *reference; 334313570Smm size_t reference_size; 335313570Smm 336313570Smm /* Write an archive to memory. */ 337313570Smm assert(NULL != (a = archive_write_new())); 338313570Smm assertA(0 == archive_write_set_format_pax(a)); 339313570Smm assertA(0 == archive_write_add_filter_none(a)); 340313570Smm assertA(0 == archive_write_set_bytes_per_block(a, 1)); 341313570Smm assertA(0 == archive_write_set_bytes_in_last_block(a, 1)); 342313570Smm assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used)); 343313570Smm 344313570Smm /* Write a series of files to the archive with different ACL info. */ 345313570Smm 346313570Smm /* Create a simple archive_entry. */ 347313570Smm assert((ae = archive_entry_new()) != NULL); 348313570Smm archive_entry_set_pathname(ae, "file"); 349313570Smm archive_entry_set_mode(ae, S_IFREG | 0777); 350313570Smm 351313570Smm /* NFS4 ACLs mirroring 0754 file mode */ 352315432Smm assertEntrySetAcls(ae, acls3, sizeof(acls3)/sizeof(acls3[0])); 353313570Smm assertA(0 == archive_write_header(a, ae)); 354313570Smm 355313570Smm /* A more extensive set of NFS4 ACLs. */ 356315432Smm assertEntrySetAcls(ae, acls4, sizeof(acls4)/sizeof(acls4[0])); 357313570Smm assertA(0 == archive_write_header(a, ae)); 358313570Smm 359313570Smm /* Set with special (audit, alarm) NFS4 ACLs. */ 360315432Smm assertEntrySetAcls(ae, acls5, sizeof(acls5)/sizeof(acls5[0])); 361313570Smm assertA(0 == archive_write_header(a, ae)); 362313570Smm 363313570Smm archive_entry_free(ae); 364313570Smm 365313570Smm /* Close out the archive. */ 366313570Smm assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); 367313570Smm assertEqualInt(ARCHIVE_OK, archive_write_free(a)); 368313570Smm 369313570Smm /* Write out the data we generated to a file for manual inspection. */ 370313570Smm assert(NULL != (f = fopen("testout", "wb"))); 371313570Smm assertEqualInt(used, (size_t)fwrite(buff, 1, (unsigned int)used, f)); 372313570Smm fclose(f); 373313570Smm 374313570Smm /* Write out the reference data to a file for manual inspection. */ 375313570Smm extract_reference_file("test_acl_pax_nfs4.tar"); 376313570Smm reference = slurpfile(&reference_size, "test_acl_pax_nfs4.tar"); 377313570Smm 378313570Smm /* Assert that the generated data matches the built-in reference data.*/ 379313570Smm failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_nfs4.tar' reference file."); 380313570Smm assertEqualMem(buff, reference, reference_size); 381313570Smm failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_nfs4.tar' reference file."); 382313570Smm assertEqualInt((int)used, reference_size); 383313570Smm free(reference); 384313570Smm 385313570Smm /* Read back each entry and check that the ACL data is right. */ 386313570Smm assert(NULL != (a = archive_read_new())); 387313570Smm assertA(0 == archive_read_support_format_all(a)); 388313570Smm assertA(0 == archive_read_support_filter_all(a)); 389313570Smm assertA(0 == archive_read_open_memory(a, buff, used)); 390313570Smm 391313570Smm /* First item has NFS4 ACLs mirroring file mode */ 392313570Smm assertA(0 == archive_read_next_header(a, &ae)); 393313570Smm assertEqualInt(3, archive_entry_acl_reset(ae, 394313570Smm ARCHIVE_ENTRY_ACL_TYPE_ALLOW)); 395315432Smm assertEntryCompareAcls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]), 396313570Smm ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 0); 397313570Smm 398313570Smm /* Second item has has more fine-grained NFS4 ACLs */ 399313570Smm assertA(0 == archive_read_next_header(a, &ae)); 400313570Smm assertEqualInt(6, archive_entry_acl_reset(ae, 401313570Smm ARCHIVE_ENTRY_ACL_TYPE_NFS4)); 402315432Smm assertEntryCompareAcls(ae, acls4, sizeof(acls4)/sizeof(acls4[0]), 403313570Smm ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0); 404313570Smm 405313570Smm /* Third item has has audit and alarm NFS4 ACLs */ 406313570Smm assertA(0 == archive_read_next_header(a, &ae)); 407313570Smm assertEqualInt(6, archive_entry_acl_reset(ae, 408313570Smm ARCHIVE_ENTRY_ACL_TYPE_NFS4)); 409315432Smm assertEntryCompareAcls(ae, acls5, sizeof(acls5)/sizeof(acls5[0]), 410313570Smm ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0); 411313570Smm 412313570Smm /* Close the archive. */ 413313570Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 414313570Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 415313570Smm} 416