Blame libarchive/test/test_read_format_isorr_new_bz2.c

Packit 08bd4c
/*-
Packit 08bd4c
 * Copyright (c) 2003-2007 Tim Kientzle
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
__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isorr_new_bz2.c 201247 2009-12-30 05:59:21Z kientzle $");
Packit 08bd4c
Packit 08bd4c
Packit 08bd4c
/*
Packit 08bd4c
PLEASE use latest cdrtools at least mkisofs version is 2.01.01a63 or later.
Packit 08bd4c
Old version mkisofs made wrong "SL" System Use Entry of RRIP.
Packit 08bd4c
Packit 08bd4c
Execute the following command to rebuild the data for this program:
Packit 08bd4c
   tail -n +34 test_read_format_isorr_new_bz2.c | /bin/sh
Packit 08bd4c
Packit 08bd4c
rm -rf /tmp/iso
Packit 08bd4c
mkdir /tmp/iso
Packit 08bd4c
mkdir /tmp/iso/dir
Packit 08bd4c
echo "hello" >/tmp/iso/file
Packit 08bd4c
dd if=/dev/zero count=1 bs=12345678 >>/tmp/iso/file
Packit 08bd4c
ln /tmp/iso/file /tmp/iso/hardlink
Packit 08bd4c
(cd /tmp/iso; ln -s file symlink)
Packit 08bd4c
(cd /tmp/iso; ln -s /tmp/ symlink2)
Packit 08bd4c
(cd /tmp/iso; ln -s /tmp/../ symlink3)
Packit 08bd4c
(cd /tmp/iso; ln -s .././../tmp/ symlink4)
Packit 08bd4c
(cd /tmp/iso; ln -s .///file symlink5)
Packit 08bd4c
(cd /tmp/iso; ln -s /tmp//../ symlink6)
Packit 08bd4c
TZ=utc touch -afhm -t 197001020000.01 /tmp/iso /tmp/iso/file /tmp/iso/dir
Packit 08bd4c
TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink
Packit 08bd4c
F=test_read_format_iso_rockridge_new.iso.Z
Packit 08bd4c
mkhybrid -R -uid 1 -gid 2 /tmp/iso | compress > $F
Packit 08bd4c
uuencode $F $F > $F.uu
Packit 08bd4c
exit 1
Packit 08bd4c
 */
Packit 08bd4c
Packit 08bd4c
DEFINE_TEST(test_read_format_isorr_new_bz2)
Packit 08bd4c
{
Packit 08bd4c
	const char *refname = "test_read_format_iso_rockridge_new.iso.Z";
Packit 08bd4c
	struct archive_entry *ae;
Packit 08bd4c
	struct archive *a;
Packit 08bd4c
	const void *p;
Packit 08bd4c
	size_t size;
Packit 08bd4c
	int64_t offset;
Packit 08bd4c
	int i;
Packit 08bd4c
Packit 08bd4c
	extract_reference_file(refname);
Packit 08bd4c
	assert((a = archive_read_new()) != NULL);
Packit 08bd4c
	assertEqualInt(0, archive_read_support_filter_all(a));
Packit 08bd4c
	assertEqualInt(0, archive_read_support_format_all(a));
Packit 08bd4c
	assertEqualInt(ARCHIVE_OK,
Packit 08bd4c
	    archive_read_open_filename(a, refname, 10240));
Packit 08bd4c
Packit 08bd4c
	/* Retrieve each of the 8 files on the ISO image and
Packit 08bd4c
	 * verify that each one is what we expect. */
Packit 08bd4c
	for (i = 0; i < 10; ++i) {
Packit 08bd4c
		assertEqualInt(0, archive_read_next_header(a, &ae);;
Packit 08bd4c
		
Packit 08bd4c
		assertEqualInt(archive_entry_is_encrypted(ae), 0);
Packit 08bd4c
		assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED);
Packit 08bd4c
Packit 08bd4c
		if (strcmp(".", archive_entry_pathname(ae)) == 0) {
Packit 08bd4c
			/* '.' root directory. */
Packit 08bd4c
			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
Packit 08bd4c
			assertEqualInt(2048, archive_entry_size(ae));
Packit 08bd4c
			/* Now, we read timestamp recorded by RRIP "TF". */
Packit 08bd4c
			assertEqualInt(86401, archive_entry_mtime(ae));
Packit 08bd4c
			assertEqualInt(0, archive_entry_mtime_nsec(ae));
Packit 08bd4c
			/* Now, we read links recorded by RRIP "PX". */
Packit 08bd4c
			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
Packit 08bd4c
			assertEqualInt(1, archive_entry_uid(ae));
Packit 08bd4c
			assertEqualIntA(a, ARCHIVE_EOF,
Packit 08bd4c
			    archive_read_data_block(a, &p, &size, &offset));
Packit 08bd4c
			assertEqualInt((int)size, 0);
Packit 08bd4c
		} else if (strcmp("dir", archive_entry_pathname(ae)) == 0) {
Packit 08bd4c
			/* A directory. */
Packit 08bd4c
			assertEqualString("dir", archive_entry_pathname(ae));
Packit 08bd4c
			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
Packit 08bd4c
			assertEqualInt(2048, archive_entry_size(ae));
Packit 08bd4c
			assertEqualInt(86401, archive_entry_mtime(ae));
Packit 08bd4c
			assertEqualInt(86401, archive_entry_atime(ae));
Packit 08bd4c
			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
Packit 08bd4c
			assertEqualInt(1, archive_entry_uid(ae));
Packit 08bd4c
			assertEqualInt(2, archive_entry_gid(ae));
Packit 08bd4c
		} else if (strcmp("file", archive_entry_pathname(ae)) == 0) {
Packit 08bd4c
			/* A regular file. */
Packit 08bd4c
			assertEqualString("file", archive_entry_pathname(ae));
Packit 08bd4c
			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
Packit 08bd4c
			assertEqualInt(12345684, archive_entry_size(ae));
Packit 08bd4c
			assertEqualInt(0,
Packit 08bd4c
			    archive_read_data_block(a, &p, &size, &offset));
Packit 08bd4c
			assertEqualInt(0, offset);
Packit 08bd4c
			assertEqualMem(p, "hello\n", 6);
Packit 08bd4c
			assertEqualInt(86401, archive_entry_mtime(ae));
Packit 08bd4c
			assertEqualInt(86401, archive_entry_atime(ae));
Packit 08bd4c
			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
Packit 08bd4c
			assertEqualInt(1, archive_entry_uid(ae));
Packit 08bd4c
			assertEqualInt(2, archive_entry_gid(ae));
Packit 08bd4c
		} else if (strcmp("hardlink", archive_entry_pathname(ae)) == 0) {
Packit 08bd4c
			/* A hardlink to the regular file. */
Packit 08bd4c
			/* Note: If "hardlink" gets returned before "file",
Packit 08bd4c
			 * then "hardlink" will get returned as a regular file
Packit 08bd4c
			 * and "file" will get returned as the hardlink.
Packit 08bd4c
			 * This test should tolerate that, since it's a
Packit 08bd4c
			 * perfectly permissible thing for libarchive to do. */
Packit 08bd4c
			assertEqualString("hardlink", archive_entry_pathname(ae));
Packit 08bd4c
			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
Packit 08bd4c
			assertEqualString("file", archive_entry_hardlink(ae));
Packit 08bd4c
			assertEqualInt(0, archive_entry_size_is_set(ae));
Packit 08bd4c
			assertEqualInt(0, archive_entry_size(ae));
Packit 08bd4c
			assertEqualInt(86401, archive_entry_mtime(ae));
Packit 08bd4c
			assertEqualInt(86401, archive_entry_atime(ae));
Packit 08bd4c
			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
Packit 08bd4c
			assertEqualInt(1, archive_entry_uid(ae));
Packit 08bd4c
			assertEqualInt(2, archive_entry_gid(ae));
Packit 08bd4c
		} else if (strcmp("symlink", archive_entry_pathname(ae)) == 0) {
Packit 08bd4c
			/* A symlink to the regular file. */
Packit 08bd4c
			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
Packit 08bd4c
			assertEqualString("file", archive_entry_symlink(ae));
Packit 08bd4c
			assertEqualInt(0, archive_entry_size(ae));
Packit 08bd4c
			assertEqualInt(172802, archive_entry_mtime(ae));
Packit 08bd4c
			assertEqualInt(172802, archive_entry_atime(ae));
Packit 08bd4c
			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
Packit 08bd4c
			assertEqualInt(1, archive_entry_uid(ae));
Packit 08bd4c
			assertEqualInt(2, archive_entry_gid(ae));
Packit 08bd4c
		} else if (strcmp("symlink2", archive_entry_pathname(ae)) == 0) {
Packit 08bd4c
			/* A symlink to /tmp/ (an absolute path) */
Packit 08bd4c
			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
Packit 08bd4c
			assertEqualString("/tmp/", archive_entry_symlink(ae));
Packit 08bd4c
			assertEqualInt(0, archive_entry_size(ae));
Packit 08bd4c
			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
Packit 08bd4c
			assertEqualInt(1, archive_entry_uid(ae));
Packit 08bd4c
			assertEqualInt(2, archive_entry_gid(ae));
Packit 08bd4c
		} else if (strcmp("symlink3", archive_entry_pathname(ae)) == 0) {
Packit 08bd4c
			/* A symlink to /tmp/../ (with a ".." component) */
Packit 08bd4c
			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
Packit 08bd4c
			assertEqualString("/tmp/../", archive_entry_symlink(ae));
Packit 08bd4c
			assertEqualInt(0, archive_entry_size(ae));
Packit 08bd4c
			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
Packit 08bd4c
			assertEqualInt(1, archive_entry_uid(ae));
Packit 08bd4c
			assertEqualInt(2, archive_entry_gid(ae));
Packit 08bd4c
		} else if (strcmp("symlink4", archive_entry_pathname(ae)) == 0) {
Packit 08bd4c
			/* A symlink to a path with ".." and "." components */
Packit 08bd4c
			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
Packit 08bd4c
			assertEqualString(".././../tmp/",
Packit 08bd4c
			    archive_entry_symlink(ae));
Packit 08bd4c
			assertEqualInt(0, archive_entry_size(ae));
Packit 08bd4c
			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
Packit 08bd4c
			assertEqualInt(1, archive_entry_uid(ae));
Packit 08bd4c
			assertEqualInt(2, archive_entry_gid(ae));
Packit 08bd4c
		} else if (strcmp("symlink5", archive_entry_pathname(ae)) == 0) {
Packit 08bd4c
			/* A symlink to the regular file with "/" components. */
Packit 08bd4c
			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
Packit 08bd4c
			assertEqualString(".///file", archive_entry_symlink(ae));
Packit 08bd4c
			assertEqualInt(0, archive_entry_size(ae));
Packit 08bd4c
			assertEqualInt(172802, archive_entry_mtime(ae));
Packit 08bd4c
			assertEqualInt(172802, archive_entry_atime(ae));
Packit 08bd4c
			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
Packit 08bd4c
			assertEqualInt(1, archive_entry_uid(ae));
Packit 08bd4c
			assertEqualInt(2, archive_entry_gid(ae));
Packit 08bd4c
		} else if (strcmp("symlink6", archive_entry_pathname(ae)) == 0) {
Packit 08bd4c
			/* A symlink to /tmp//../
Packit 08bd4c
			 * (with "/" and ".." components) */
Packit 08bd4c
			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
Packit 08bd4c
			assertEqualString("/tmp//../", archive_entry_symlink(ae));
Packit 08bd4c
			assertEqualInt(0, archive_entry_size(ae));
Packit 08bd4c
			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
Packit 08bd4c
			assertEqualInt(1, archive_entry_uid(ae));
Packit 08bd4c
			assertEqualInt(2, archive_entry_gid(ae));
Packit 08bd4c
		} else {
Packit 08bd4c
			failure("Saw a file that shouldn't have been there");
Packit 08bd4c
			assertEqualString(archive_entry_pathname(ae), "");
Packit 08bd4c
		}
Packit 08bd4c
	}
Packit 08bd4c
Packit 08bd4c
	/* End of archive. */
Packit 08bd4c
	assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae);;
Packit 08bd4c
Packit 08bd4c
	/* Verify archive format. */
Packit 08bd4c
	assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_COMPRESS);
Packit 08bd4c
	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE);
Packit 08bd4c
Packit 08bd4c
	/* Close the archive. */
Packit 08bd4c
	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
Packit 08bd4c
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit 08bd4c
}
Packit 08bd4c
Packit 08bd4c