Blame libarchive/test/test_write_format_iso9660_zisofs.c

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