Blame libarchive/test/test_read_format_isorr_new_bz2.c

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