Blame libarchive/test/test_write_format_iso9660_zisofs.c

Packit Service 1d0348
/*-
Packit Service 1d0348
 * Copyright (c) 2009-2011 Michihiro NAKAJIMA
Packit Service 1d0348
 * All rights reserved.
Packit Service 1d0348
 *
Packit Service 1d0348
 * Redistribution and use in source and binary forms, with or without
Packit Service 1d0348
 * modification, are permitted provided that the following conditions
Packit Service 1d0348
 * are met:
Packit Service 1d0348
 * 1. Redistributions of source code must retain the above copyright
Packit Service 1d0348
 *    notice, this list of conditions and the following disclaimer.
Packit Service 1d0348
 * 2. Redistributions in binary form must reproduce the above copyright
Packit Service 1d0348
 *    notice, this list of conditions and the following disclaimer in the
Packit Service 1d0348
 *    documentation and/or other materials provided with the distribution.
Packit Service 1d0348
 *
Packit Service 1d0348
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
Packit Service 1d0348
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
Packit Service 1d0348
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
Packit Service 1d0348
 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
Packit Service 1d0348
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
Packit Service 1d0348
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 1d0348
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 1d0348
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 1d0348
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
Packit Service 1d0348
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 1d0348
 */
Packit Service 1d0348
#include "test.h"
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
 * Check that a "zisofs" ISO 9660 image is correctly created.
Packit Service 1d0348
 */
Packit Service 1d0348
Packit Service 1d0348
static const unsigned char primary_id[] = {
Packit Service 1d0348
    0x01, 0x43, 0x44, 0x30, 0x30, 0x31, 0x01, 0x00
Packit Service 1d0348
};
Packit Service 1d0348
static const unsigned char volumesize[] = {
Packit Service 1d0348
    0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23
Packit Service 1d0348
};
Packit Service 1d0348
static const unsigned char volumesize2[] = {
Packit Service 1d0348
    0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36
Packit Service 1d0348
};
Packit Service 1d0348
static const unsigned char volumesize3[] = {
Packit Service 1d0348
    0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28
Packit Service 1d0348
};
Packit Service 1d0348
static const unsigned char volumeidu16[] = {
Packit Service 1d0348
    0x00, 0x43, 0x00, 0x44, 0x00, 0x52, 0x00, 0x4f,
Packit Service 1d0348
    0x00, 0x4d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
Packit Service 1d0348
    0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
Packit Service 1d0348
    0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20
Packit Service 1d0348
};
Packit Service 1d0348
static const unsigned char supplementary_id[] = {
Packit Service 1d0348
    0x02, 0x43, 0x44, 0x30, 0x30, 0x31, 0x01, 0x00
Packit Service 1d0348
};
Packit Service 1d0348
static const unsigned char terminator_id[] = {
Packit Service 1d0348
    0xff, 0x43, 0x44, 0x30, 0x30, 0x31, 0x01, 0x00
Packit Service 1d0348
};
Packit Service 1d0348
Packit Service 1d0348
static const unsigned char zisofs_magic[8] = {
Packit Service 1d0348
    0x37, 0xE4, 0x53, 0x96, 0xC9, 0xDB, 0xD6, 0x07
Packit Service 1d0348
};
Packit Service 1d0348
Packit Service 1d0348
static const unsigned char zisofs_data[24] = {
Packit Service 1d0348
    0x37, 0xe4, 0x53, 0x96, 0xc9, 0xdb, 0xd6, 0x07,
Packit Service 1d0348
    0x00, 0x80, 0x00, 0x00, 0x04, 0x0f, 0x00, 0x00,
Packit Service 1d0348
    0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00
Packit Service 1d0348
};
Packit Service 1d0348
Packit Service 1d0348
static const unsigned char boot_id[] = {
Packit Service 1d0348
    0x00, 0x43, 0x44, 0x30, 0x30, 0x31, 0x01, 0x45,
Packit Service 1d0348
    0x4c, 0x20, 0x54, 0x4f, 0x52, 0x49, 0x54, 0x4f,
Packit Service 1d0348
    0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
Packit Service 1d0348
    0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x00,
Packit Service 1d0348
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit Service 1d0348
};
Packit Service 1d0348
Packit Service 1d0348
static const unsigned char boot_catalog[] = {
Packit Service 1d0348
    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit Service 1d0348
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit Service 1d0348
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit Service 1d0348
    0x00, 0x00, 0x00, 0x00, 0xaa, 0x55, 0x55, 0xaa,
Packit Service 1d0348
    0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
Packit Service 1d0348
    0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit Service 1d0348
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit Service 1d0348
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
Packit Service 1d0348
};
Packit Service 1d0348
Packit Service 1d0348
static const unsigned char el_torito_signature[] = {
Packit Service 1d0348
    "ER\355\001\012T\207\001RRIP_1991ATHE ROCK RIDGE "
Packit Service 1d0348
    "INTERCHANGE PROTOCOL PROVIDES SUPPORT FOR POSIX "
Packit Service 1d0348
    "FILE SYSTEM SEMANTICSPLEASE CONTACT DISC PUBLISHER "
Packit Service 1d0348
    "FOR SPECIFICATION SOURCE.  SEE PUBLISHER IDENTIFIER "
Packit Service 1d0348
    "IN PRIMARY VOLUME DESCRIPTOR FOR CONTACT INFORMATION."
Packit Service 1d0348
};
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
test_write_format_iso9660_zisofs_1(void)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char buff2[1024];
Packit Service 1d0348
	unsigned char nullb[1024];
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	unsigned char *buff;
Packit Service 1d0348
	size_t buffsize = 36 * 2048;
Packit Service 1d0348
	size_t used;
Packit Service 1d0348
	unsigned int i;
Packit Service 1d0348
	int r;
Packit Service 1d0348
Packit Service 1d0348
	memset(nullb, 0, sizeof(nullb));
Packit Service 1d0348
	buff = malloc(buffsize);
Packit Service 1d0348
	assert(buff != NULL);
Packit Service 1d0348
	if (buff == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
Packit Service 1d0348
	/* ISO9660 format: Create a new archive in memory. */
Packit Service 1d0348
	assert((a = archive_write_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_write_set_format_iso9660(a));
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_write_add_filter_none(a));
Packit Service 1d0348
	r = archive_write_set_option(a, NULL, "zisofs", "1");
Packit Service 1d0348
	if (r == ARCHIVE_FATAL) {
Packit Service 1d0348
		skipping("zisofs option not supported on this platform");
Packit Service 1d0348
		assertEqualInt(ARCHIVE_OK, archive_write_free(a));
Packit Service 1d0348
		free(buff);
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_write_set_option(a, NULL, "pad", NULL));
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_write_open_memory(a, buff, buffsize, &used));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * "file1" has a bunch of attributes and 256K bytes of null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	archive_entry_set_atime(ae, 2, 20);
Packit Service 1d0348
	archive_entry_set_birthtime(ae, 3, 30);
Packit Service 1d0348
	archive_entry_set_ctime(ae, 4, 40);
Packit Service 1d0348
	archive_entry_set_mtime(ae, 5, 50);
Packit Service 1d0348
	archive_entry_copy_pathname(ae, "file1");
Packit Service 1d0348
	archive_entry_set_mode(ae, S_IFREG | 0755);
Packit Service 1d0348
	archive_entry_set_size(ae, 256*1024);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_write_data(a, nullb, 1024));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * "file2" has a bunch of attributes and 2048 bytes of null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	archive_entry_set_atime(ae, 2, 20);
Packit Service 1d0348
	archive_entry_set_birthtime(ae, 3, 30);
Packit Service 1d0348
	archive_entry_set_ctime(ae, 4, 40);
Packit Service 1d0348
	archive_entry_set_mtime(ae, 5, 50);
Packit Service 1d0348
	archive_entry_copy_pathname(ae, "file2");
Packit Service 1d0348
	archive_entry_set_mode(ae, S_IFREG | 0755);
Packit Service 1d0348
	archive_entry_set_size(ae, 2048);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_write_data(a, nullb, 1024));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * "file3" has a bunch of attributes and 2049 bytes of null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	archive_entry_set_atime(ae, 2, 20);
Packit Service 1d0348
	archive_entry_set_birthtime(ae, 3, 30);
Packit Service 1d0348
	archive_entry_set_ctime(ae, 4, 40);
Packit Service 1d0348
	archive_entry_set_mtime(ae, 5, 50);
Packit Service 1d0348
	archive_entry_copy_pathname(ae, "file3");
Packit Service 1d0348
	archive_entry_set_mode(ae, S_IFREG | 0755);
Packit Service 1d0348
	archive_entry_set_size(ae, 2049);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_write_data(a, nullb, 1024));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * "file4" has a bunch of attributes and 24 bytes of zisofs data
Packit Service 1d0348
	 * which is compressed from 32K bytes null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	archive_entry_set_atime(ae, 2, 20);
Packit Service 1d0348
	archive_entry_set_birthtime(ae, 3, 30);
Packit Service 1d0348
	archive_entry_set_ctime(ae, 4, 40);
Packit Service 1d0348
	archive_entry_set_mtime(ae, 5, 50);
Packit Service 1d0348
	archive_entry_copy_pathname(ae, "file4");
Packit Service 1d0348
	archive_entry_set_mode(ae, S_IFREG | 0755);
Packit Service 1d0348
	archive_entry_set_size(ae, 24);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
	assertEqualIntA(a, 24, archive_write_data(a, zisofs_data, 24));
Packit Service 1d0348
Packit Service 1d0348
	/* Close out the archive. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a));
Packit Service 1d0348
Packit Service 1d0348
	failure("The ISO image size should be 71680 bytes.");
Packit Service 1d0348
	assertEqualInt(used, 2048 * 35);
Packit Service 1d0348
Packit Service 1d0348
	/* Check System Area. */
Packit Service 1d0348
	for (i = 0; i < 2048 * 16; i++) {
Packit Service 1d0348
		failure("System Area should be all nulls.");
Packit Service 1d0348
		assertEqualInt(buff[i], 0);
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* Primary Volume. */
Packit Service 1d0348
	failure("Primary Volume Descriptor should be in 16 Logical Sector.");
Packit Service 1d0348
	assertEqualMem(buff+2048*16, primary_id, 8);
Packit Service 1d0348
	assertEqualMem(buff+2048*16+0x28,
Packit Service 1d0348
	    "CDROM                           ", 32);
Packit Service 1d0348
	assertEqualMem(buff+2048*16+0x50, volumesize, 8);
Packit Service 1d0348
Packit Service 1d0348
	/* Supplementary Volume. */
Packit Service 1d0348
	failure("Supplementary Volume(Joliet) Descriptor "
Packit Service 1d0348
	    "should be in 17 Logical Sector.");
Packit Service 1d0348
	assertEqualMem(buff+2048*17, supplementary_id, 8);
Packit Service 1d0348
	assertEqualMem(buff+2048*17+0x28, volumeidu16, 32);
Packit Service 1d0348
	assertEqualMem(buff+2048*17+0x50, volumesize, 8);
Packit Service 1d0348
	failure("Date and Time of Primary Volume and "
Packit Service 1d0348
	    "Date and Time of Supplementary Volume "
Packit Service 1d0348
	    "must be the same.");
Packit Service 1d0348
	assertEqualMem(buff+2048*16+0x32d, buff+2048*17+0x32d, 0x44);
Packit Service 1d0348
Packit Service 1d0348
	/* Terminator. */
Packit Service 1d0348
	failure("Volume Descriptor Set Terminator "
Packit Service 1d0348
	    "should be in 18 Logical Sector.");
Packit Service 1d0348
	assertEqualMem(buff+2048*18, terminator_id, 8);
Packit Service 1d0348
	for (i = 8; i < 2048; i++) {
Packit Service 1d0348
		failure("Body of Volume Descriptor Set Terminator "
Packit Service 1d0348
		    "should be all nulls.");
Packit Service 1d0348
		assertEqualInt(buff[2048*18+i], 0);
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* "file1"  Contents is zisofs data. */
Packit Service 1d0348
	failure("file1 image should be zisofs'ed.");
Packit Service 1d0348
	assertEqualMem(buff+2048*31, zisofs_magic, 8);
Packit Service 1d0348
	/* "file2"  Contents is not zisofs data. */
Packit Service 1d0348
	failure("file2 image should not be zisofs'ed.");
Packit Service 1d0348
	assertEqualMem(buff+2048*32, nullb, 8);
Packit Service 1d0348
	/* "file3"  Contents is zisofs data. */
Packit Service 1d0348
	failure("file3 image should be zisofs'ed.");
Packit Service 1d0348
	assertEqualMem(buff+2048*33, zisofs_magic, 8);
Packit Service 1d0348
	/* "file4"  Contents is zisofs data. */
Packit Service 1d0348
	failure("file4 image should be zisofs'ed.");
Packit Service 1d0348
	assertEqualMem(buff+2048*34, zisofs_magic, 8);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read ISO image.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_support_format_all(a));
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_support_filter_all(a));
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read Root Directory
Packit Service 1d0348
	 * Root Directory entry must be in ISO image.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
Packit Service 1d0348
	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualString(".", archive_entry_pathname(ae));
Packit Service 1d0348
	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualInt(2048, archive_entry_size(ae));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read "file1" which has 256K bytes null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(2, archive_entry_atime(ae));
Packit Service 1d0348
	/* assertEqualInt(3, archive_entry_birthtime(ae)); */
Packit Service 1d0348
	assertEqualInt(4, archive_entry_ctime(ae));
Packit Service 1d0348
	assertEqualInt(5, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualString("file1", archive_entry_pathname(ae));
Packit Service 1d0348
	assert((S_IFREG | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualInt(256*1024, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_read_data(a, buff2, 1024));
Packit Service 1d0348
	assertEqualMem(buff2, nullb, 1024);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read "file2" which has 2048 bytes null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(2, archive_entry_atime(ae));
Packit Service 1d0348
	/* assertEqualInt(3, archive_entry_birthtime(ae)); */
Packit Service 1d0348
	assertEqualInt(4, archive_entry_ctime(ae));
Packit Service 1d0348
	assertEqualInt(5, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualString("file2", archive_entry_pathname(ae));
Packit Service 1d0348
	assert((S_IFREG | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualInt(2048, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_read_data(a, buff2, 1024));
Packit Service 1d0348
	assertEqualMem(buff2, nullb, 1024);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read "file3" which has 2049 bytes null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(2, archive_entry_atime(ae));
Packit Service 1d0348
	/* assertEqualInt(3, archive_entry_birthtime(ae)); */
Packit Service 1d0348
	assertEqualInt(4, archive_entry_ctime(ae));
Packit Service 1d0348
	assertEqualInt(5, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualString("file3", archive_entry_pathname(ae));
Packit Service 1d0348
	assert((S_IFREG | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualInt(2049, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_read_data(a, buff2, 1024));
Packit Service 1d0348
	assertEqualMem(buff2, nullb, 1024);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read "file4" which has 32K bytes null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(2, archive_entry_atime(ae));
Packit Service 1d0348
	/* assertEqualInt(3, archive_entry_birthtime(ae)); */
Packit Service 1d0348
	assertEqualInt(4, archive_entry_ctime(ae));
Packit Service 1d0348
	assertEqualInt(5, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualString("file4", archive_entry_pathname(ae));
Packit Service 1d0348
	assert((S_IFREG | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualInt(32768, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_read_data(a, buff2, 1024));
Packit Service 1d0348
	assertEqualMem(buff2, nullb, 1024);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Verify the end of the archive.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
Packit Service 1d0348
	free(buff);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
test_write_format_iso9660_zisofs_2(void)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char buff2[1024];
Packit Service 1d0348
	unsigned char data[1024];
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	unsigned char *buff;
Packit Service 1d0348
	size_t buffsize = 60 * 2048;
Packit Service 1d0348
	size_t used;
Packit Service 1d0348
	unsigned int i;
Packit Service 1d0348
	int r;
Packit Service 1d0348
Packit Service 1d0348
	buff = malloc(buffsize);
Packit Service 1d0348
	assert(buff != NULL);
Packit Service 1d0348
	if (buff == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
Packit Service 1d0348
	/* ISO9660 format: Create a new archive in memory. */
Packit Service 1d0348
	assert((a = archive_write_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_write_set_format_iso9660(a));
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_write_add_filter_none(a));
Packit Service 1d0348
	r = archive_write_set_option(a, NULL, "zisofs", "1");
Packit Service 1d0348
	if (r == ARCHIVE_FATAL) {
Packit Service 1d0348
		skipping("zisofs option not supported on this platform");
Packit Service 1d0348
		assertEqualInt(ARCHIVE_OK, archive_write_free(a));
Packit Service 1d0348
		free(buff);
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_write_set_option(a, NULL, "pad", NULL));
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_write_open_memory(a, buff, buffsize, &used));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * "file1" has a bunch of attributes and 256K bytes of random data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	archive_entry_set_atime(ae, 2, 20);
Packit Service 1d0348
	archive_entry_set_birthtime(ae, 3, 30);
Packit Service 1d0348
	archive_entry_set_ctime(ae, 4, 40);
Packit Service 1d0348
	archive_entry_set_mtime(ae, 5, 50);
Packit Service 1d0348
	archive_entry_copy_pathname(ae, "file1");
Packit Service 1d0348
	archive_entry_set_mode(ae, S_IFREG | 0755);
Packit Service 1d0348
	archive_entry_set_size(ae, 256*1024);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
	for (i = 0; i < 256; i++) {
Packit Service 1d0348
		int j;
Packit Service 1d0348
		if (i == 0) {
Packit Service 1d0348
			for (j = 0; j < (int)sizeof(data); j++)
Packit Service 1d0348
				data[j] = (i^j) & 0xff;
Packit Service 1d0348
		} else {
Packit Service 1d0348
			for (j = 0; j < (int)sizeof(data); j++)
Packit Service 1d0348
				data[j] ^= i+j;
Packit Service 1d0348
		}
Packit Service 1d0348
		assertEqualIntA(a, 1024, archive_write_data(a, data, 1024));
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * "file2" has a bunch of attributes and 2048 bytes data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	archive_entry_set_atime(ae, 2, 20);
Packit Service 1d0348
	archive_entry_set_birthtime(ae, 3, 30);
Packit Service 1d0348
	archive_entry_set_ctime(ae, 4, 40);
Packit Service 1d0348
	archive_entry_set_mtime(ae, 5, 50);
Packit Service 1d0348
	archive_entry_copy_pathname(ae, "file2");
Packit Service 1d0348
	archive_entry_set_mode(ae, S_IFREG | 0755);
Packit Service 1d0348
	archive_entry_set_size(ae, 2048);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
	memset(data, 'a', sizeof(data));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_write_data(a, data, 1024));
Packit Service 1d0348
	memset(data, 'b', sizeof(data));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_write_data(a, data, 1024));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * "file3" has a bunch of attributes and 1024 bytes of 'Z'
Packit Service 1d0348
	 *  + 1025 bytes of null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	archive_entry_set_atime(ae, 2, 20);
Packit Service 1d0348
	archive_entry_set_birthtime(ae, 3, 30);
Packit Service 1d0348
	archive_entry_set_ctime(ae, 4, 40);
Packit Service 1d0348
	archive_entry_set_mtime(ae, 5, 50);
Packit Service 1d0348
	archive_entry_copy_pathname(ae, "file3");
Packit Service 1d0348
	archive_entry_set_mode(ae, S_IFREG | 0755);
Packit Service 1d0348
	archive_entry_set_size(ae, 2049);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
	memset(data, 'Z', sizeof(data));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_write_data(a, data, 1024));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * "file4" has a bunch of attributes and 24 bytes of zisofs data
Packit Service 1d0348
	 * which is compressed from 32K bytes null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	archive_entry_set_atime(ae, 2, 20);
Packit Service 1d0348
	archive_entry_set_birthtime(ae, 3, 30);
Packit Service 1d0348
	archive_entry_set_ctime(ae, 4, 40);
Packit Service 1d0348
	archive_entry_set_mtime(ae, 5, 50);
Packit Service 1d0348
	archive_entry_copy_pathname(ae, "file4");
Packit Service 1d0348
	archive_entry_set_mode(ae, S_IFREG | 0755);
Packit Service 1d0348
	archive_entry_set_size(ae, 24);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
	assertEqualIntA(a, 24, archive_write_data(a, zisofs_data, 24));
Packit Service 1d0348
Packit Service 1d0348
	/* Close out the archive. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a));
Packit Service 1d0348
Packit Service 1d0348
	failure("The ISO image size should be 110592 bytes.");
Packit Service 1d0348
	assertEqualInt(used, 2048 * 54);
Packit Service 1d0348
Packit Service 1d0348
	/* Check System Area. */
Packit Service 1d0348
	for (i = 0; i < 2048 * 16; i++) {
Packit Service 1d0348
		failure("System Area should be all nulls.");
Packit Service 1d0348
		assertEqualInt(buff[i], 0);
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* Primary Volume. */
Packit Service 1d0348
	failure("Primary Volume Descriptor should be in 16 Logical Sector.");
Packit Service 1d0348
	assertEqualMem(buff+2048*16, primary_id, 8);
Packit Service 1d0348
	assertEqualMem(buff+2048*16+0x28,
Packit Service 1d0348
	    "CDROM                           ", 32);
Packit Service 1d0348
	assertEqualMem(buff+2048*16+0x50, volumesize2, 8);
Packit Service 1d0348
Packit Service 1d0348
	/* Supplementary Volume. */
Packit Service 1d0348
	failure("Supplementary Volume(Joliet) Descriptor "
Packit Service 1d0348
	    "should be in 17 Logical Sector.");
Packit Service 1d0348
	assertEqualMem(buff+2048*17, supplementary_id, 8);
Packit Service 1d0348
	assertEqualMem(buff+2048*17+0x28, volumeidu16, 32);
Packit Service 1d0348
	assertEqualMem(buff+2048*17+0x50, volumesize2, 8);
Packit Service 1d0348
	failure("Date and Time of Primary Volume and "
Packit Service 1d0348
	    "Date and Time of Supplementary Volume "
Packit Service 1d0348
	    "must be the same.");
Packit Service 1d0348
	assertEqualMem(buff+2048*16+0x32d, buff+2048*17+0x32d, 0x44);
Packit Service 1d0348
Packit Service 1d0348
	/* Terminator. */
Packit Service 1d0348
	failure("Volume Descriptor Set Terminator "
Packit Service 1d0348
	    "should be in 18 Logical Sector.");
Packit Service 1d0348
	assertEqualMem(buff+2048*18, terminator_id, 8);
Packit Service 1d0348
	for (i = 8; i < 2048; i++) {
Packit Service 1d0348
		failure("Body of Volume Descriptor Set Terminator "
Packit Service 1d0348
		    "should be all nulls.");
Packit Service 1d0348
		assertEqualInt(buff[2048*18+i], 0);
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* "file1"  Contents is zisofs data. */
Packit Service 1d0348
	failure("file1 image should be zisofs'ed.");
Packit Service 1d0348
	assertEqualMem(buff+2048*31, zisofs_magic, 8);
Packit Service 1d0348
	/* "file2"  Contents is not zisofs data. */
Packit Service 1d0348
	memset(data, 'a', sizeof(data));
Packit Service 1d0348
	failure("file2 image should not be zisofs'ed.");
Packit Service 1d0348
	assertEqualMem(buff+2048*51, data, 1024);
Packit Service 1d0348
	memset(data, 'b', sizeof(data));
Packit Service 1d0348
	failure("file2 image should not be zisofs'ed.");
Packit Service 1d0348
	assertEqualMem(buff+2048*51+1024, data, 1024);
Packit Service 1d0348
	/* "file3"  Contents is zisofs data. */
Packit Service 1d0348
	failure("file3 image should be zisofs'ed.");
Packit Service 1d0348
	assertEqualMem(buff+2048*52, zisofs_magic, 8);
Packit Service 1d0348
	/* "file4"  Contents is zisofs data. */
Packit Service 1d0348
	failure("file4 image should be zisofs'ed.");
Packit Service 1d0348
	assertEqualMem(buff+2048*53, zisofs_magic, 8);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read ISO image.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_support_format_all(a));
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_support_filter_all(a));
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read Root Directory
Packit Service 1d0348
	 * Root Directory entry must be in ISO image.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
Packit Service 1d0348
	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualString(".", archive_entry_pathname(ae));
Packit Service 1d0348
	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualInt(2048, archive_entry_size(ae));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read "file1" which has 256K bytes random data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(2, archive_entry_atime(ae));
Packit Service 1d0348
	assertEqualInt(4, archive_entry_ctime(ae));
Packit Service 1d0348
	assertEqualInt(5, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualString("file1", archive_entry_pathname(ae));
Packit Service 1d0348
	assert((S_IFREG | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualInt(256*1024, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_read_data(a, buff2, 1024));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read "file2" which has 2048 bytes data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(2, archive_entry_atime(ae));
Packit Service 1d0348
	assertEqualInt(4, archive_entry_ctime(ae));
Packit Service 1d0348
	assertEqualInt(5, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualString("file2", archive_entry_pathname(ae));
Packit Service 1d0348
	assert((S_IFREG | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualInt(2048, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_read_data(a, buff2, 1024));
Packit Service 1d0348
	memset(data, 'a', sizeof(data));
Packit Service 1d0348
	assertEqualMem(buff2, data, 1024);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read "file3" which has 2049 bytes data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(2, archive_entry_atime(ae));
Packit Service 1d0348
	assertEqualInt(4, archive_entry_ctime(ae));
Packit Service 1d0348
	assertEqualInt(5, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualString("file3", archive_entry_pathname(ae));
Packit Service 1d0348
	assert((S_IFREG | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualInt(2049, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_read_data(a, buff2, 1024));
Packit Service 1d0348
	memset(data, 'Z', sizeof(data));
Packit Service 1d0348
	assertEqualMem(buff2, data, 1024);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read "file4" which has 32K bytes null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(2, archive_entry_atime(ae));
Packit Service 1d0348
	assertEqualInt(4, archive_entry_ctime(ae));
Packit Service 1d0348
	assertEqualInt(5, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualString("file4", archive_entry_pathname(ae));
Packit Service 1d0348
	assert((S_IFREG | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualInt(32768, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_read_data(a, buff2, 1024));
Packit Service 1d0348
	memset(data, 0, sizeof(data));
Packit Service 1d0348
	assertEqualMem(buff2, data, 1024);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Verify the end of the archive.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
Packit Service 1d0348
	free(buff);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
 * Make a bootable ISO image with "zisofs" option.
Packit Service 1d0348
 */
Packit Service 1d0348
static void
Packit Service 1d0348
test_write_format_iso9660_zisofs_3(void)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char buff2[1024];
Packit Service 1d0348
	unsigned char nullb[2048];
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	unsigned char *buff;
Packit Service 1d0348
	size_t buffsize = 50 * 2048;
Packit Service 1d0348
	size_t used;
Packit Service 1d0348
	unsigned int i;
Packit Service 1d0348
	int r;
Packit Service 1d0348
Packit Service 1d0348
	memset(nullb, 0, sizeof(nullb));
Packit Service 1d0348
	buff = malloc(buffsize);
Packit Service 1d0348
	assert(buff != NULL);
Packit Service 1d0348
	if (buff == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
Packit Service 1d0348
	/* ISO9660 format: Create a new archive in memory. */
Packit Service 1d0348
	assert((a = archive_write_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_write_set_format_iso9660(a));
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_write_add_filter_none(a));
Packit Service 1d0348
	r = archive_write_set_option(a, NULL, "zisofs", "1");
Packit Service 1d0348
	if (r == ARCHIVE_FATAL) {
Packit Service 1d0348
		skipping("zisofs option not supported on this platform");
Packit Service 1d0348
		assertEqualInt(ARCHIVE_OK, archive_write_free(a));
Packit Service 1d0348
		free(buff);
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_write_set_option(a, NULL, "boot", "boot.img"));
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_write_set_option(a, NULL, "pad", NULL));
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_write_open_memory(a, buff, buffsize, &used));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * "file1" has a bunch of attributes and 256K bytes of null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	archive_entry_set_atime(ae, 2, 20);
Packit Service 1d0348
	archive_entry_set_birthtime(ae, 3, 30);
Packit Service 1d0348
	archive_entry_set_ctime(ae, 4, 40);
Packit Service 1d0348
	archive_entry_set_mtime(ae, 5, 50);
Packit Service 1d0348
	archive_entry_copy_pathname(ae, "boot.img");
Packit Service 1d0348
	archive_entry_set_mode(ae, S_IFREG | 0755);
Packit Service 1d0348
	archive_entry_set_size(ae, 10*1024);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_write_data(a, nullb, 1024));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * "file2" has a bunch of attributes and 2048 bytes of null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	archive_entry_set_atime(ae, 2, 20);
Packit Service 1d0348
	archive_entry_set_birthtime(ae, 3, 30);
Packit Service 1d0348
	archive_entry_set_ctime(ae, 4, 40);
Packit Service 1d0348
	archive_entry_set_mtime(ae, 5, 50);
Packit Service 1d0348
	archive_entry_copy_pathname(ae, "file2");
Packit Service 1d0348
	archive_entry_set_mode(ae, S_IFREG | 0755);
Packit Service 1d0348
	archive_entry_set_size(ae, 2048);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_write_data(a, nullb, 1024));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * "file3" has a bunch of attributes and 2049 bytes of null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	archive_entry_set_atime(ae, 2, 20);
Packit Service 1d0348
	archive_entry_set_birthtime(ae, 3, 30);
Packit Service 1d0348
	archive_entry_set_ctime(ae, 4, 40);
Packit Service 1d0348
	archive_entry_set_mtime(ae, 5, 50);
Packit Service 1d0348
	archive_entry_copy_pathname(ae, "file3");
Packit Service 1d0348
	archive_entry_set_mode(ae, S_IFREG | 0755);
Packit Service 1d0348
	archive_entry_set_size(ae, 2049);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_write_data(a, nullb, 1024));
Packit Service 1d0348
Packit Service 1d0348
	/* Close out the archive. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a));
Packit Service 1d0348
Packit Service 1d0348
	failure("The ISO image size should be 81920 bytes.");
Packit Service 1d0348
	assertEqualInt(used, 2048 * 40);
Packit Service 1d0348
Packit Service 1d0348
	/* Check System Area. */
Packit Service 1d0348
	for (i = 0; i < 2048 * 16; i++) {
Packit Service 1d0348
		failure("System Area should be all nulls.");
Packit Service 1d0348
		assertEqualInt(buff[i], 0);
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* Primary Volume. */
Packit Service 1d0348
	failure("Primary Volume Descriptor should be in 16 Logical Sector.");
Packit Service 1d0348
	assertEqualMem(buff+2048*16, primary_id, 8);
Packit Service 1d0348
	assertEqualMem(buff+2048*16+0x28,
Packit Service 1d0348
	    "CDROM                           ", 32);
Packit Service 1d0348
	assertEqualMem(buff+2048*16+0x50, volumesize3, 8);
Packit Service 1d0348
Packit Service 1d0348
	/* Boot Volume. */
Packit Service 1d0348
	failure("Boot Volume Descriptor should be in 17 Logical Sector.");
Packit Service 1d0348
	assertEqualMem(buff+2048*17, boot_id, sizeof(boot_id));
Packit Service 1d0348
	for (i = 0x27; i <= 0x46; i++) {
Packit Service 1d0348
		failure("Unused area must be all nulls.");
Packit Service 1d0348
		assert(buff[2048*17+i] == 0);
Packit Service 1d0348
	}
Packit Service 1d0348
	/* First sector of Boot Catalog. */
Packit Service 1d0348
	assert(buff[2048*17+0x47] == 0x20);
Packit Service 1d0348
	assert(buff[2048*17+0x48] == 0x00);
Packit Service 1d0348
	assert(buff[2048*17+0x49] == 0x00);
Packit Service 1d0348
	assert(buff[2048*17+0x4a] == 0x00);
Packit Service 1d0348
	for (i = 0x4a; i <= 0x7ff; i++) {
Packit Service 1d0348
		failure("Unused area must be all nulls.");
Packit Service 1d0348
		assert(buff[2048*17+i] == 0);
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* Supplementary Volume. */
Packit Service 1d0348
	failure("Supplementary Volume(Joliet) Descriptor "
Packit Service 1d0348
	    "should be in 18 Logical Sector.");
Packit Service 1d0348
	assertEqualMem(buff+2048*18, supplementary_id, 8);
Packit Service 1d0348
	assertEqualMem(buff+2048*18+0x28, volumeidu16, 32);
Packit Service 1d0348
	assertEqualMem(buff+2048*18+0x50, volumesize3, 8);
Packit Service 1d0348
	failure("Date and Time of Primary Volume and "
Packit Service 1d0348
	    "Date and Time of Supplementary Volume "
Packit Service 1d0348
	    "must be the same.");
Packit Service 1d0348
	assertEqualMem(buff+2048*16+0x32d, buff+2048*18+0x32d, 0x44);
Packit Service 1d0348
Packit Service 1d0348
	/* Terminator. */
Packit Service 1d0348
	failure("Volume Descriptor Set Terminator "
Packit Service 1d0348
	    "should be in 19 Logical Sector.");
Packit Service 1d0348
	assertEqualMem(buff+2048*19, terminator_id, 8);
Packit Service 1d0348
	for (i = 8; i < 2048; i++) {
Packit Service 1d0348
		failure("Body of Volume Descriptor Set Terminator "
Packit Service 1d0348
		    "should be all nulls.");
Packit Service 1d0348
		assertEqualInt(buff[2048*19+i], 0);
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* Check signature of El-Torito. */
Packit Service 1d0348
	assertEqualMem(buff+2048*31, el_torito_signature, 237);
Packit Service 1d0348
	assertEqualMem(buff+2048*31+237, nullb, 2048-237);
Packit Service 1d0348
Packit Service 1d0348
	/* Check contents of "boot.catalog". */
Packit Service 1d0348
	assertEqualMem(buff+2048*32, boot_catalog, 64);
Packit Service 1d0348
	assertEqualMem(buff+2048*32+64, nullb, 2048-64);
Packit Service 1d0348
Packit Service 1d0348
	/* Check contents of "boot.img". */
Packit Service 1d0348
	failure("boot.img image should not be zisofs'ed.");
Packit Service 1d0348
	assertEqualMem(buff+2048*33, nullb, 2048);
Packit Service 1d0348
	for (i = 2048*34; i < 2048*38; i += 2048) {
Packit Service 1d0348
		assertEqualMem(buff+i, nullb, 2048);
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* "file2"  Contents is not zisofs data. */
Packit Service 1d0348
	failure("file2 image should not be zisofs'ed.");
Packit Service 1d0348
	assertEqualMem(buff+2048*38, nullb, 8);
Packit Service 1d0348
	/* "file3"  Contents is zisofs data. */
Packit Service 1d0348
	failure("file3 image should be zisofs'ed.");
Packit Service 1d0348
	assertEqualMem(buff+2048*39, zisofs_magic, 8);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read ISO image.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_support_format_all(a));
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_support_filter_all(a));
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read Root Directory
Packit Service 1d0348
	 * Root Directory entry must be in ISO image.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
Packit Service 1d0348
	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualString(".", archive_entry_pathname(ae));
Packit Service 1d0348
	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualInt(2048, archive_entry_size(ae));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read "boot.catalog".
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualString("boot.catalog", archive_entry_pathname(ae));
Packit Service 1d0348
#if !defined(_WIN32) && !defined(__CYGWIN__)
Packit Service 1d0348
	assert((S_IFREG | 0444) == archive_entry_mode(ae));
Packit Service 1d0348
#else
Packit Service 1d0348
	/* On Windows and CYGWIN, always set all exec bit ON by default. */ 
Packit Service 1d0348
	assert((S_IFREG | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
#endif
Packit Service 1d0348
	assertEqualInt(1, archive_entry_nlink(ae));
Packit Service 1d0348
	assertEqualInt(2*1024, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_read_data(a, buff2, 1024));
Packit Service 1d0348
	assertEqualMem(buff2, boot_catalog, 64);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read "boot.img".
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(2, archive_entry_atime(ae));
Packit Service 1d0348
	assertEqualInt(3, archive_entry_birthtime(ae));
Packit Service 1d0348
	assertEqualInt(4, archive_entry_ctime(ae));
Packit Service 1d0348
	assertEqualInt(5, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualString("boot.img", archive_entry_pathname(ae));
Packit Service 1d0348
	assert((S_IFREG | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualInt(1, archive_entry_nlink(ae));
Packit Service 1d0348
	assertEqualInt(10*1024, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_read_data(a, buff2, 1024));
Packit Service 1d0348
	assertEqualMem(buff2, nullb, 1024);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read "file2" which has 2048 bytes null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(2, archive_entry_atime(ae));
Packit Service 1d0348
	assertEqualInt(4, archive_entry_ctime(ae));
Packit Service 1d0348
	assertEqualInt(5, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualString("file2", archive_entry_pathname(ae));
Packit Service 1d0348
	assert((S_IFREG | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualInt(2048, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_read_data(a, buff2, 1024));
Packit Service 1d0348
	assertEqualMem(buff2, nullb, 1024);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read "file3" which has 2049 bytes null data.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, 0, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualInt(2, archive_entry_atime(ae));
Packit Service 1d0348
	assertEqualInt(4, archive_entry_ctime(ae));
Packit Service 1d0348
	assertEqualInt(5, archive_entry_mtime(ae));
Packit Service 1d0348
	assertEqualString("file3", archive_entry_pathname(ae));
Packit Service 1d0348
	assert((S_IFREG | 0555) == archive_entry_mode(ae));
Packit Service 1d0348
	assertEqualInt(2049, archive_entry_size(ae));
Packit Service 1d0348
	assertEqualIntA(a, 1024, archive_read_data(a, buff2, 1024));
Packit Service 1d0348
	assertEqualMem(buff2, nullb, 1024);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Verify the end of the archive.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
Packit Service 1d0348
	free(buff);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
DEFINE_TEST(test_write_format_iso9660_zisofs)
Packit Service 1d0348
{
Packit Service 1d0348
	test_write_format_iso9660_zisofs_1();
Packit Service 1d0348
	test_write_format_iso9660_zisofs_2();
Packit Service 1d0348
	test_write_format_iso9660_zisofs_3();
Packit Service 1d0348
}