Blame libarchive/test/test_read_disk_directory_traversals.c

Packit Service 1d0348
/*-
Packit Service 1d0348
 * Copyright (c) 2010-2012 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
__FBSDID("$FreeBSD$");
Packit Service 1d0348
Packit Service 1d0348
#include <limits.h>
Packit Service 1d0348
#if defined(_WIN32) && !defined(__CYGWIN__)
Packit Service 1d0348
# if !defined(__BORLANDC__)
Packit Service 1d0348
#  define getcwd _getcwd
Packit Service 1d0348
# endif
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
 * Test if the current filesystem is mounted with noatime option.
Packit Service 1d0348
 */
Packit Service 1d0348
static int
Packit Service 1d0348
atimeIsUpdated(void)
Packit Service 1d0348
{
Packit Service 1d0348
	const char *fn = "fs_noatime";
Packit Service 1d0348
	struct stat st;
Packit Service 1d0348
Packit Service 1d0348
	if (!assertMakeFile(fn, 0666, "a"))
Packit Service 1d0348
		return (0);
Packit Service 1d0348
	if (!assertUtimes(fn, 1, 0, 1, 0))
Packit Service 1d0348
		return (0);
Packit Service 1d0348
	/* Test the file contents in order to update its atime. */
Packit Service 1d0348
	if (!assertTextFileContents("a", fn))
Packit Service 1d0348
		return (0);
Packit Service 1d0348
	if (stat(fn, &st) != 0)
Packit Service 1d0348
		return (0);
Packit Service 1d0348
	/* Is atime updated? */
Packit Service 1d0348
	if (st.st_atime > 1)
Packit Service 1d0348
		return (1);
Packit Service 1d0348
	return (0);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
test_basic(void)
Packit Service 1d0348
{
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	const void *p;
Packit Service 1d0348
	char *initial_cwd, *cwd;
Packit Service 1d0348
	size_t size;
Packit Service 1d0348
	int64_t offset;
Packit Service 1d0348
	int file_count;
Packit Service 1d0348
#if defined(_WIN32) && !defined(__CYGWIN__)
Packit Service 1d0348
	wchar_t *wcwd, *wp, *fullpath;
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
	assertMakeDir("dir1", 0755);
Packit Service 1d0348
	assertMakeFile("dir1/file1", 0644, "0123456789");
Packit Service 1d0348
	assertMakeFile("dir1/file2", 0644, "hello world");
Packit Service 1d0348
	assertMakeDir("dir1/sub1", 0755);
Packit Service 1d0348
	assertMakeFile("dir1/sub1/file1", 0644, "0123456789");
Packit Service 1d0348
	assertMakeDir("dir1/sub2", 0755);
Packit Service 1d0348
	assertMakeFile("dir1/sub2/file1", 0644, "0123456789");
Packit Service 1d0348
	assertMakeFile("dir1/sub2/file2", 0644, "0123456789");
Packit Service 1d0348
	assertMakeDir("dir1/sub2/sub1", 0755);
Packit Service 1d0348
	assertMakeDir("dir1/sub2/sub2", 0755);
Packit Service 1d0348
	assertMakeDir("dir1/sub2/sub3", 0755);
Packit Service 1d0348
	assertMakeFile("dir1/sub2/sub3/file", 0644, "xyz");
Packit Service 1d0348
	file_count = 12;
Packit Service 1d0348
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	assert((a = archive_read_disk_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "dir1"));
Packit Service 1d0348
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae), "dir1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
			assertEqualInt(1, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "dir1/file1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 10);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 10);
Packit Service 1d0348
			assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "dir1/file2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 11);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 11);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "hello world", 11);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 11);
Packit Service 1d0348
			assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "dir1/sub1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
			assertEqualInt(1, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "dir1/sub1/file1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 10);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 10);
Packit Service 1d0348
			assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "dir1/sub2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
			assertEqualInt(1, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "dir1/sub2/file1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 10);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 10);
Packit Service 1d0348
			assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "dir1/sub2/file2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 10);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 10);
Packit Service 1d0348
			assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "dir1/sub2/sub1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
			assertEqualInt(1, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "dir1/sub2/sub2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
			assertEqualInt(1, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "dir1/sub2/sub3") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
			assertEqualInt(1, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "dir1/sub2/sub3/file") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 3);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 3);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "xyz", 3);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 3);
Packit Service 1d0348
			assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
		if (archive_entry_filetype(ae) == AE_IFDIR) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test that call archive_read_disk_open_w, wchar_t version.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open_w(a, L"dir1"));
Packit Service 1d0348
Packit Service 1d0348
	file_count = 12;
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
		if (wcscmp(archive_entry_pathname_w(ae), L"dir1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
			assertEqualInt(1, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (wcscmp(archive_entry_pathname_w(ae),
Packit Service 1d0348
		    L"dir1/file1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 10);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 10);
Packit Service 1d0348
			assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (wcscmp(archive_entry_pathname_w(ae),
Packit Service 1d0348
		    L"dir1/file2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 11);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 11);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "hello world", 11);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 11);
Packit Service 1d0348
			assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (wcscmp(archive_entry_pathname_w(ae),
Packit Service 1d0348
		    L"dir1/sub1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
			assertEqualInt(1, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (wcscmp(archive_entry_pathname_w(ae),
Packit Service 1d0348
		    L"dir1/sub1/file1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 10);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 10);
Packit Service 1d0348
			assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (wcscmp(archive_entry_pathname_w(ae),
Packit Service 1d0348
		    L"dir1/sub2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
			assertEqualInt(1, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (wcscmp(archive_entry_pathname_w(ae),
Packit Service 1d0348
		    L"dir1/sub2/file1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 10);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 10);
Packit Service 1d0348
			assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (wcscmp(archive_entry_pathname_w(ae),
Packit Service 1d0348
		    L"dir1/sub2/file2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 10);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 10);
Packit Service 1d0348
			assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (wcscmp(archive_entry_pathname_w(ae),
Packit Service 1d0348
		    L"dir1/sub2/sub1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
			assertEqualInt(1, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (wcscmp(archive_entry_pathname_w(ae),
Packit Service 1d0348
		    L"dir1/sub2/sub2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
			assertEqualInt(1, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (wcscmp(archive_entry_pathname_w(ae),
Packit Service 1d0348
		    L"dir1/sub2/sub3") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
			assertEqualInt(1, archive_read_disk_can_descend(a));
Packit Service 1d0348
		} else if (wcscmp(archive_entry_pathname_w(ae),
Packit Service 1d0348
		    L"dir1/sub2/sub3/file") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 3);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 3);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "xyz", 3);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 3);
Packit Service 1d0348
			assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
		if (archive_entry_filetype(ae) == AE_IFDIR) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test that call archive_read_disk_open with a regular file.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "dir1/file1"));
Packit Service 1d0348
Packit Service 1d0348
	/* dir1/file1 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
	assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
	assertEqualString(archive_entry_pathname(ae), "dir1/file1");
Packit Service 1d0348
	assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
	assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
	    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
	assertEqualInt((int)size, 10);
Packit Service 1d0348
	assertEqualInt((int)offset, 0);
Packit Service 1d0348
	assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
#if defined(_WIN32) && !defined(__CYGWIN__)
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test for wildcard '*' or '?'
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "dir1/*1"));
Packit Service 1d0348
Packit Service 1d0348
	/* dir1/file1 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
	assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
	assertEqualString(archive_entry_pathname(ae), "dir1/file1");
Packit Service 1d0348
	assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
	assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
	    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
	assertEqualInt((int)size, 10);
Packit Service 1d0348
	assertEqualInt((int)offset, 0);
Packit Service 1d0348
	assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
Packit Service 1d0348
	/* dir1/sub1 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
	assertEqualInt(1, archive_read_disk_can_descend(a));
Packit Service 1d0348
	assertEqualString(archive_entry_pathname(ae), "dir1/sub1");
Packit Service 1d0348
	assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
Packit Service 1d0348
	/* Descend into the current object */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_descend(a));
Packit Service 1d0348
Packit Service 1d0348
	/* dir1/sub1/file1 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
	assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
	assertEqualString(archive_entry_pathname(ae), "dir1/sub1/file1");
Packit Service 1d0348
	assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
	assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
	    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
	assertEqualInt((int)size, 10);
Packit Service 1d0348
	assertEqualInt((int)offset, 0);
Packit Service 1d0348
	assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test for a full-path beginning with "//?/"
Packit Service 1d0348
	 */
Packit Service 1d0348
	wcwd = _wgetcwd(NULL, 0);
Packit Service 1d0348
	fullpath = malloc(sizeof(wchar_t) * (wcslen(wcwd) + 32));
Packit Service 1d0348
	wcscpy(fullpath, L"//?/");
Packit Service 1d0348
	wcscat(fullpath, wcwd);
Packit Service 1d0348
	wcscat(fullpath, L"/dir1/file1");
Packit Service 1d0348
	free(wcwd);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open_w(a, fullpath));
Packit Service 1d0348
	while ((wcwd = wcschr(fullpath, L'\\')) != NULL)
Packit Service 1d0348
		*wcwd = L'/';
Packit Service 1d0348
Packit Service 1d0348
	/* dir1/file1 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
	assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
	assertEqualWString(archive_entry_pathname_w(ae), fullpath);
Packit Service 1d0348
	assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
	assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
	    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
	assertEqualInt((int)size, 10);
Packit Service 1d0348
	assertEqualInt((int)offset, 0);
Packit Service 1d0348
	assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
	free(fullpath);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test for wild card '*' or '?' with "//?/" prefix.
Packit Service 1d0348
	 */
Packit Service 1d0348
	wcwd = _wgetcwd(NULL, 0);
Packit Service 1d0348
	fullpath = malloc(sizeof(wchar_t) * (wcslen(wcwd) + 32));
Packit Service 1d0348
	wcscpy(fullpath, L"//?/");
Packit Service 1d0348
	wcscat(fullpath, wcwd);
Packit Service 1d0348
	wcscat(fullpath, L"/dir1/*1");
Packit Service 1d0348
	free(wcwd);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open_w(a, fullpath));
Packit Service 1d0348
	while ((wcwd = wcschr(fullpath, L'\\')) != NULL)
Packit Service 1d0348
		*wcwd = L'/';
Packit Service 1d0348
Packit Service 1d0348
	/* dir1/file1 */
Packit Service 1d0348
	wp = wcsrchr(fullpath, L'/');
Packit Service 1d0348
	wcscpy(wp+1, L"file1");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
	assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
	assertEqualWString(archive_entry_pathname_w(ae), fullpath);
Packit Service 1d0348
	assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
	assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
	    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
	assertEqualInt((int)size, 10);
Packit Service 1d0348
	assertEqualInt((int)offset, 0);
Packit Service 1d0348
	assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
Packit Service 1d0348
	/* dir1/sub1 */
Packit Service 1d0348
	wcscpy(wp+1, L"sub1");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
	assertEqualInt(1, archive_read_disk_can_descend(a));
Packit Service 1d0348
	assertEqualWString(archive_entry_pathname_w(ae), fullpath);
Packit Service 1d0348
	assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
Packit Service 1d0348
	/* Descend into the current object */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_descend(a));
Packit Service 1d0348
Packit Service 1d0348
	/* dir1/sub1/file1 */
Packit Service 1d0348
	wcscpy(wp+1, L"sub1/file1");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
	assertEqualInt(0, archive_read_disk_can_descend(a));
Packit Service 1d0348
	assertEqualWString(archive_entry_pathname_w(ae), fullpath);
Packit Service 1d0348
	assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
	assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
	    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
	assertEqualInt((int)size, 10);
Packit Service 1d0348
	assertEqualInt((int)offset, 0);
Packit Service 1d0348
	assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
	free(fullpath);
Packit Service 1d0348
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * We should be on the initial directory where we performed
Packit Service 1d0348
	 * archive_read_disk_new() after we perform archive_read_free()
Packit Service 1d0348
	 * even if we broke off the directory traversals.
Packit Service 1d0348
	 */
Packit Service 1d0348
Packit Service 1d0348
	/* Save current working directory. */
Packit Service 1d0348
#ifdef PATH_MAX
Packit Service 1d0348
	initial_cwd = getcwd(NULL, PATH_MAX);/* Solaris getcwd needs the size. */
Packit Service 1d0348
#else
Packit Service 1d0348
	initial_cwd = getcwd(NULL, 0);
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "dir1"));
Packit Service 1d0348
Packit Service 1d0348
	/* Step in a deep directory. */
Packit Service 1d0348
	file_count = 12;
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
		    archive_read_next_header2(a, ae));
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "dir1/sub1/file1") == 0)
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * We are on an another directory at this time.
Packit Service 1d0348
			 */
Packit Service 1d0348
			break;
Packit Service 1d0348
		if (archive_entry_filetype(ae) == AE_IFDIR) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* Destroy the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
Packit Service 1d0348
	/* We should be on the initial working directory. */
Packit Service 1d0348
	failure(
Packit Service 1d0348
	    "Current working directory does not return to the initial"
Packit Service 1d0348
	    "directory");
Packit Service 1d0348
#ifdef PATH_MAX
Packit Service 1d0348
	cwd = getcwd(NULL, PATH_MAX);/* Solaris getcwd needs the size. */
Packit Service 1d0348
#else
Packit Service 1d0348
	cwd = getcwd(NULL, 0);
Packit Service 1d0348
#endif
Packit Service 1d0348
	assertEqualString(initial_cwd, cwd);
Packit Service 1d0348
	free(initial_cwd);
Packit Service 1d0348
	free(cwd);
Packit Service 1d0348
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
test_symlink_hybrid(void)
Packit Service 1d0348
{
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	const void *p;
Packit Service 1d0348
	size_t size;
Packit Service 1d0348
	int64_t offset;
Packit Service 1d0348
	int file_count;
Packit Service 1d0348
Packit Service 1d0348
	if (!canSymlink()) {
Packit Service 1d0348
		skipping("Can't test symlinks on this filesystem");
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Create a sample archive.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertMakeDir("h", 0755);
Packit Service 1d0348
	assertChdir("h");
Packit Service 1d0348
	assertMakeDir("d1", 0755);
Packit Service 1d0348
	assertMakeSymlink("ld1", "d1");
Packit Service 1d0348
	assertMakeFile("d1/file1", 0644, "d1/file1");
Packit Service 1d0348
	assertMakeFile("d1/file2", 0644, "d1/file2");
Packit Service 1d0348
	assertMakeSymlink("d1/link1", "file1");
Packit Service 1d0348
	assertMakeSymlink("d1/linkX", "fileX");
Packit Service 1d0348
	assertMakeSymlink("link2", "d1/file2");
Packit Service 1d0348
	assertMakeSymlink("linkY", "d1/fileY");
Packit Service 1d0348
	assertChdir("..");
Packit Service 1d0348
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	assert((a = archive_read_disk_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
	    archive_read_disk_set_symlink_hybrid(a));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Specified file is a symbolic link file.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "h/ld1"));
Packit Service 1d0348
	file_count = 5;
Packit Service 1d0348
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae), "h/ld1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "h/ld1/file1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d1/file1", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "h/ld1/file2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d1/file2", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "h/ld1/link1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "h/ld1/linkX") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
Packit Service 1d0348
		}
Packit Service 1d0348
		if (archive_entry_filetype(ae) == AE_IFDIR) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Specified file is a directory and it has symbolic files.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "h"));
Packit Service 1d0348
	file_count = 9;
Packit Service 1d0348
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae), "h") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "h/d1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "h/d1/file1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d1/file1", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "h/d1/file2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d1/file2", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "h/ld1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "h/d1/link1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "h/d1/linkX") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "h/link2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "h/linkY") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
Packit Service 1d0348
		}
Packit Service 1d0348
		if (archive_entry_filetype(ae) == AE_IFDIR) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
	/* Destroy the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
test_symlink_logical(void)
Packit Service 1d0348
{
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	const void *p;
Packit Service 1d0348
	size_t size;
Packit Service 1d0348
	int64_t offset;
Packit Service 1d0348
	int file_count;
Packit Service 1d0348
Packit Service 1d0348
	if (!canSymlink()) {
Packit Service 1d0348
		skipping("Can't test symlinks on this filesystem");
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Create a sample archive.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertMakeDir("l", 0755);
Packit Service 1d0348
	assertChdir("l");
Packit Service 1d0348
	assertMakeDir("d1", 0755);
Packit Service 1d0348
	assertMakeSymlink("ld1", "d1");
Packit Service 1d0348
	assertMakeFile("d1/file1", 0644, "d1/file1");
Packit Service 1d0348
	assertMakeFile("d1/file2", 0644, "d1/file2");
Packit Service 1d0348
	assertMakeSymlink("d1/link1", "file1");
Packit Service 1d0348
	assertMakeSymlink("d1/linkX", "fileX");
Packit Service 1d0348
	assertMakeSymlink("link2", "d1/file2");
Packit Service 1d0348
	assertMakeSymlink("linkY", "d1/fileY");
Packit Service 1d0348
	assertChdir("..");
Packit Service 1d0348
Packit Service 1d0348
	/* Note: this test uses archive_read_next_header()
Packit Service 1d0348
	   instead of archive_read_next_header2() */
Packit Service 1d0348
	assert((a = archive_read_disk_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
	    archive_read_disk_set_symlink_logical(a));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Specified file is a symbolic link file.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "l/ld1"));
Packit Service 1d0348
	file_count = 5;
Packit Service 1d0348
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae), "l/ld1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l/ld1/file1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d1/file1", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l/ld1/file2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d1/file2", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l/ld1/link1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d1/file1", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l/ld1/linkX") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
Packit Service 1d0348
		}
Packit Service 1d0348
		if (archive_entry_filetype(ae) == AE_IFDIR) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Specified file is a directory and it has symbolic files.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "l"));
Packit Service 1d0348
	file_count = 13;
Packit Service 1d0348
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae), "l") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "l/d1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l/d1/file1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d1/file1", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l/d1/file2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d1/file2", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l/d1/link1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d1/file1", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l/d1/linkX") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "l/ld1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l/ld1/file1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d1/file1", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l/ld1/file2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d1/file2", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l/ld1/link1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d1/file1", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l/ld1/linkX") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l/link2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d1/file2", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l/linkY") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
Packit Service 1d0348
		}
Packit Service 1d0348
		if (archive_entry_filetype(ae) == AE_IFDIR) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
	/* Destroy the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
test_symlink_logical_loop(void)
Packit Service 1d0348
{
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	const void *p;
Packit Service 1d0348
	size_t size;
Packit Service 1d0348
	int64_t offset;
Packit Service 1d0348
	int file_count;
Packit Service 1d0348
Packit Service 1d0348
	if (!canSymlink()) {
Packit Service 1d0348
		skipping("Can't test symlinks on this filesystem");
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Create a sample archive.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertMakeDir("l2", 0755);
Packit Service 1d0348
	assertChdir("l2");
Packit Service 1d0348
	assertMakeDir("d1", 0755);
Packit Service 1d0348
	assertMakeDir("d1/d2", 0755);
Packit Service 1d0348
	assertMakeDir("d1/d2/d3", 0755);
Packit Service 1d0348
	assertMakeDir("d2", 0755);
Packit Service 1d0348
	assertMakeFile("d2/file1", 0644, "d2/file1");
Packit Service 1d0348
	assertMakeSymlink("d1/d2/ld1", "../../d1");
Packit Service 1d0348
	assertMakeSymlink("d1/d2/ld2", "../../d2");
Packit Service 1d0348
	assertChdir("..");
Packit Service 1d0348
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	assert((a = archive_read_disk_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
	    archive_read_disk_set_symlink_logical(a));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Specified file is a symbolic link file.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "l2/d1"));
Packit Service 1d0348
	file_count = 6;
Packit Service 1d0348
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae), "l2/d1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "l2/d1/d2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "l2/d1/d2/d3") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "l2/d1/d2/ld1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFLNK);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "l2/d1/d2/ld2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae),
Packit Service 1d0348
		    "l2/d1/d2/ld2/file1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 8);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 8);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "d2/file1", 8);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 8);
Packit Service 1d0348
		}
Packit Service 1d0348
		if (archive_entry_filetype(ae) == AE_IFDIR) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
	/* Destroy the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
test_restore_atime(void)
Packit Service 1d0348
{
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	const void *p;
Packit Service 1d0348
	size_t size;
Packit Service 1d0348
	int64_t offset;
Packit Service 1d0348
	int file_count;
Packit Service 1d0348
Packit Service 1d0348
	if (!atimeIsUpdated()) {
Packit Service 1d0348
		skipping("Can't test restoring atime on this filesystem");
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	assertMakeDir("at", 0755);
Packit Service 1d0348
	assertMakeFile("at/f1", 0644, "0123456789");
Packit Service 1d0348
	assertMakeFile("at/f2", 0644, "hello world");
Packit Service 1d0348
	assertMakeFile("at/fe", 0644, NULL);
Packit Service 1d0348
	assertUtimes("at/f1", 886600, 0, 886600, 0);
Packit Service 1d0348
	assertUtimes("at/f2", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("at/fe", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("at", 886622, 0, 886622, 0);
Packit Service 1d0348
	file_count = 4;
Packit Service 1d0348
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	assert((a = archive_read_disk_new()) != NULL);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test1: Traversals without archive_read_disk_set_atime_restored().
Packit Service 1d0348
	 */
Packit Service 1d0348
	failure("Directory traversals should work as well");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "at"));
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae), "at") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "at/f1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 10);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 10);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "at/f2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 11);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 11);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "hello world", 11);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 11);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "at/fe") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 0);
Packit Service 1d0348
		}
Packit Service 1d0348
		if (archive_entry_filetype(ae) == AE_IFDIR) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	failure("There must be no entry");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	/* On FreeBSD (and likely other systems), atime on
Packit Service 1d0348
	   dirs does not change when it is read. */
Packit Service 1d0348
	/* failure("Atime should be restored"); */
Packit Service 1d0348
	/* assertFileAtimeRecent("at"); */
Packit Service 1d0348
	failure("Atime should be restored");
Packit Service 1d0348
	assertFileAtimeRecent("at/f1");
Packit Service 1d0348
	failure("Atime should be restored");
Packit Service 1d0348
	assertFileAtimeRecent("at/f2");
Packit Service 1d0348
	failure("The atime of a empty file should not be changed");
Packit Service 1d0348
	assertFileAtime("at/fe", 886611, 0);
Packit Service 1d0348
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test2: Traversals with archive_read_disk_set_atime_restored().
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertUtimes("at/f1", 886600, 0, 886600, 0);
Packit Service 1d0348
	assertUtimes("at/f2", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("at/fe", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("at", 886622, 0, 886622, 0);
Packit Service 1d0348
	file_count = 4;
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_set_atime_restored(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "at"));
Packit Service 1d0348
Packit Service 1d0348
	failure("Directory traversals should work as well");
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae), "at") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "at/f1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 10);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 10);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "at/f2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 11);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 11);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "hello world", 11);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 11);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "at/fe") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 0);
Packit Service 1d0348
		}
Packit Service 1d0348
		if (archive_entry_filetype(ae) == AE_IFDIR) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	failure("There must be no entry");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	failure("Atime should be restored");
Packit Service 1d0348
	assertFileAtime("at", 886622, 0);
Packit Service 1d0348
	failure("Atime should be restored");
Packit Service 1d0348
	assertFileAtime("at/f1", 886600, 0);
Packit Service 1d0348
	failure("Atime should be restored");
Packit Service 1d0348
	assertFileAtime("at/f2", 886611, 0);
Packit Service 1d0348
	failure("The atime of a empty file should not be changed");
Packit Service 1d0348
	assertFileAtime("at/fe", 886611, 0);
Packit Service 1d0348
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test3: Traversals with archive_read_disk_set_atime_restored() but
Packit Service 1d0348
	 * no data read as a listing.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertUtimes("at/f1", 886600, 0, 886600, 0);
Packit Service 1d0348
	assertUtimes("at/f2", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("at/fe", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("at", 886622, 0, 886622, 0);
Packit Service 1d0348
	file_count = 4;
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_set_atime_restored(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "at"));
Packit Service 1d0348
Packit Service 1d0348
	failure("Directory traversals should work as well");
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae), "at") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "at/f1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "at/f2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 11);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "at/fe") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 0);
Packit Service 1d0348
		}
Packit Service 1d0348
		if (archive_entry_filetype(ae) == AE_IFDIR) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	failure("There must be no entry");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	failure("Atime should be restored");
Packit Service 1d0348
	assertFileAtime("at", 886622, 0);
Packit Service 1d0348
	failure("Atime should be restored");
Packit Service 1d0348
	assertFileAtime("at/f1", 886600, 0);
Packit Service 1d0348
	failure("Atime should be restored");
Packit Service 1d0348
	assertFileAtime("at/f2", 886611, 0);
Packit Service 1d0348
	failure("The atime of a empty file should not be changed");
Packit Service 1d0348
	assertFileAtime("at/fe", 886611, 0);
Packit Service 1d0348
Packit Service 1d0348
	if (!canNodump()) {
Packit Service 1d0348
		/* Destroy the disk object. */
Packit Service 1d0348
		assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
		archive_entry_free(ae);
Packit Service 1d0348
		skipping("Can't test atime with nodump on this filesystem");
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test4: Traversals with ARCHIVE_READDISK_RESTORE_ATIME and
Packit Service 1d0348
	 * ARCHIVE_READDISK_HONOR_NODUMP
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertSetNodump("at/f1");
Packit Service 1d0348
	assertSetNodump("at/f2");
Packit Service 1d0348
	assertUtimes("at/f1", 886600, 0, 886600, 0);
Packit Service 1d0348
	assertUtimes("at/f2", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("at/fe", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("at", 886622, 0, 886622, 0);
Packit Service 1d0348
	file_count = 2;
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_set_behavior(a,
Packit Service 1d0348
		ARCHIVE_READDISK_RESTORE_ATIME | ARCHIVE_READDISK_HONOR_NODUMP));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "at"));
Packit Service 1d0348
Packit Service 1d0348
	failure("Directory traversals should work as well");
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae), "at") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "at/fe") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 0);
Packit Service 1d0348
		}
Packit Service 1d0348
		if (archive_entry_filetype(ae) == AE_IFDIR) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	failure("There must be no entry");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	failure("Atime should be restored");
Packit Service 1d0348
	assertFileAtime("at", 886622, 0);
Packit Service 1d0348
	failure("Atime should be restored");
Packit Service 1d0348
	assertFileAtime("at/f1", 886600, 0);
Packit Service 1d0348
	failure("Atime should be restored");
Packit Service 1d0348
	assertFileAtime("at/f2", 886611, 0);
Packit Service 1d0348
	failure("The atime of a empty file should not be changed");
Packit Service 1d0348
	assertFileAtime("at/fe", 886611, 0);
Packit Service 1d0348
Packit Service 1d0348
	/* Destroy the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static int
Packit Service 1d0348
metadata_filter(struct archive *a, void *data, struct archive_entry *ae)
Packit Service 1d0348
{
Packit Service 1d0348
	(void)data; /* UNUSED */
Packit Service 1d0348
Packit Service 1d0348
	failure("CTime should be set");
Packit Service 1d0348
	assertEqualInt(8, archive_entry_ctime_is_set(ae));
Packit Service 1d0348
	failure("MTime should be set");
Packit Service 1d0348
	assertEqualInt(16, archive_entry_mtime_is_set(ae));
Packit Service 1d0348
Packit Service 1d0348
	if (archive_entry_mtime(ae) < 886611)
Packit Service 1d0348
		return (0);
Packit Service 1d0348
	if (archive_read_disk_can_descend(a)) {
Packit Service 1d0348
		/* Descend into the current object */
Packit Service 1d0348
		failure("archive_read_disk_can_descend should work"
Packit Service 1d0348
			" in metadata filter");
Packit Service 1d0348
		assertEqualIntA(a, 1, archive_read_disk_can_descend(a));
Packit Service 1d0348
		failure("archive_read_disk_descend should work"
Packit Service 1d0348
			" in metadata filter");
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_descend(a));
Packit Service 1d0348
	}
Packit Service 1d0348
	return (1);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
test_callbacks(void)
Packit Service 1d0348
{
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive *m;
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	const void *p;
Packit Service 1d0348
	size_t size;
Packit Service 1d0348
	int64_t offset;
Packit Service 1d0348
	int file_count;
Packit Service 1d0348
Packit Service 1d0348
	assertMakeDir("cb", 0755);
Packit Service 1d0348
	assertMakeFile("cb/f1", 0644, "0123456789");
Packit Service 1d0348
	assertMakeFile("cb/f2", 0644, "hello world");
Packit Service 1d0348
	assertMakeFile("cb/fe", 0644, NULL);
Packit Service 1d0348
	assertUtimes("cb/f1", 886600, 0, 886600, 0);
Packit Service 1d0348
	assertUtimes("cb/f2", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("cb/fe", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("cb", 886622, 0, 886622, 0);
Packit Service 1d0348
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	assert((a = archive_read_disk_new()) != NULL);
Packit Service 1d0348
	if (a == NULL) {
Packit Service 1d0348
		archive_entry_free(ae);
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
	assert((m = archive_match_new()) != NULL);
Packit Service 1d0348
	if (m == NULL) {
Packit Service 1d0348
		archive_entry_free(ae);
Packit Service 1d0348
		archive_read_free(a);
Packit Service 1d0348
		archive_match_free(m);
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test1: Traversals with a name filter.
Packit Service 1d0348
	 */
Packit Service 1d0348
	file_count = 3;
Packit Service 1d0348
	assertEqualIntA(m, ARCHIVE_OK,
Packit Service 1d0348
	    archive_match_exclude_pattern(m, "cb/f2"));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
	    archive_read_disk_set_matching(a, m, NULL, NULL));
Packit Service 1d0348
	failure("Directory traversals should work as well");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "cb"));
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		archive_entry_clear(ae);
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
		failure("File 'cb/f2' should be exclueded");
Packit Service 1d0348
		assert(strcmp(archive_entry_pathname(ae), "cb/f2") != 0);
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae), "cb") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "cb/f1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 10);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 10);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "cb/fe") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 0);
Packit Service 1d0348
		}
Packit Service 1d0348
		if (archive_read_disk_can_descend(a)) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	failure("There should be no entry");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
Packit Service 1d0348
	/* Reset name filter */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
	    archive_read_disk_set_matching(a, NULL, NULL, NULL));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test2: Traversals with a metadata filter.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertUtimes("cb/f1", 886600, 0, 886600, 0);
Packit Service 1d0348
	assertUtimes("cb/f2", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("cb/fe", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("cb", 886622, 0, 886622, 0);
Packit Service 1d0348
	file_count = 3;
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
	    archive_read_disk_set_metadata_filter_callback(a, metadata_filter,
Packit Service 1d0348
		    NULL));
Packit Service 1d0348
	failure("Directory traversals should work as well");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "cb"));
Packit Service 1d0348
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		archive_entry_clear(ae);
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
		failure("File 'cb/f1' should be excluded");
Packit Service 1d0348
		assert(strcmp(archive_entry_pathname(ae), "cb/f1") != 0);
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae), "cb") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "cb/f2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 11);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 11);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "hello world", 11);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 11);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "cb/fe") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 0);
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	failure("There should be no entry");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Destroy the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_match_free(m));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
test_nodump(void)
Packit Service 1d0348
{
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	const void *p;
Packit Service 1d0348
	size_t size;
Packit Service 1d0348
	int64_t offset;
Packit Service 1d0348
	int file_count;
Packit Service 1d0348
Packit Service 1d0348
	if (!canNodump()) {
Packit Service 1d0348
		skipping("Can't test nodump on this filesystem");
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	assertMakeDir("nd", 0755);
Packit Service 1d0348
	assertMakeFile("nd/f1", 0644, "0123456789");
Packit Service 1d0348
	assertMakeFile("nd/f2", 0644, "hello world");
Packit Service 1d0348
	assertMakeFile("nd/fe", 0644, NULL);
Packit Service 1d0348
	assertSetNodump("nd/f2");
Packit Service 1d0348
	assertUtimes("nd/f1", 886600, 0, 886600, 0);
Packit Service 1d0348
	assertUtimes("nd/f2", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("nd/fe", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("nd", 886622, 0, 886622, 0);
Packit Service 1d0348
Packit Service 1d0348
	assert((ae = archive_entry_new()) != NULL);
Packit Service 1d0348
	assert((a = archive_read_disk_new()) != NULL);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test1: Traversals without ARCHIVE_READDISK_HONOR_NODUMP
Packit Service 1d0348
	 */
Packit Service 1d0348
	failure("Directory traversals should work as well");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "nd"));
Packit Service 1d0348
Packit Service 1d0348
	file_count = 4;
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		archive_entry_clear(ae);
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae), "nd") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "nd/f1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 10);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 10);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "nd/f2") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 11);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 11);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "hello world", 11);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 11);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "nd/fe") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 0);
Packit Service 1d0348
		}
Packit Service 1d0348
		if (archive_read_disk_can_descend(a)) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	failure("There should be no entry");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Close the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test2: Traversals with ARCHIVE_READDISK_HONOR_NODUMP
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertUtimes("nd/f1", 886600, 0, 886600, 0);
Packit Service 1d0348
	assertUtimes("nd/f2", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("nd/fe", 886611, 0, 886611, 0);
Packit Service 1d0348
	assertUtimes("nd", 886622, 0, 886622, 0);
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_set_behavior(a,
Packit Service 1d0348
		ARCHIVE_READDISK_RESTORE_ATIME | ARCHIVE_READDISK_HONOR_NODUMP));
Packit Service 1d0348
	failure("Directory traversals should work as well");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "nd"));
Packit Service 1d0348
Packit Service 1d0348
	file_count = 3;
Packit Service 1d0348
	while (file_count--) {
Packit Service 1d0348
		archive_entry_clear(ae);
Packit Service 1d0348
		assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
Packit Service 1d0348
		failure("File 'nd/f2' should be exclueded");
Packit Service 1d0348
		assert(strcmp(archive_entry_pathname(ae), "nd/f2") != 0);
Packit Service 1d0348
		if (strcmp(archive_entry_pathname(ae), "nd") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "nd/f1") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 10);
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 10);
Packit Service 1d0348
			assertEqualInt((int)offset, 0);
Packit Service 1d0348
			assertEqualMem(p, "0123456789", 10);
Packit Service 1d0348
			assertEqualInt(ARCHIVE_EOF,
Packit Service 1d0348
			    archive_read_data_block(a, &p, &size, &offset));
Packit Service 1d0348
			assertEqualInt((int)size, 0);
Packit Service 1d0348
			assertEqualInt((int)offset, 10);
Packit Service 1d0348
		} else if (strcmp(archive_entry_pathname(ae), "nd/fe") == 0) {
Packit Service 1d0348
			assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
Packit Service 1d0348
			assertEqualInt(archive_entry_size(ae), 0);
Packit Service 1d0348
		}
Packit Service 1d0348
		if (archive_read_disk_can_descend(a)) {
Packit Service 1d0348
			/* Descend into the current object */
Packit Service 1d0348
			assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
			    archive_read_disk_descend(a));
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
	/* There is no entry. */
Packit Service 1d0348
	failure("There should be no entry");
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	failure("Atime should be restored");
Packit Service 1d0348
	assertFileAtime("nd/f2", 886611, 0);
Packit Service 1d0348
Packit Service 1d0348
	/* Destroy the disk object. */
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
DEFINE_TEST(test_read_disk_directory_traversals)
Packit Service 1d0348
{
Packit Service 1d0348
	/* Basic test. */
Packit Service 1d0348
	test_basic();
Packit Service 1d0348
	/* Test hybrid mode; follow symlink initially, then not. */
Packit Service 1d0348
	test_symlink_hybrid();
Packit Service 1d0348
	/* Test logical mode; follow all symlinks. */
Packit Service 1d0348
	test_symlink_logical();
Packit Service 1d0348
	/* Test logical mode; prevent loop in symlinks. */
Packit Service 1d0348
	test_symlink_logical_loop();
Packit Service 1d0348
	/* Test to restore atime. */
Packit Service 1d0348
	test_restore_atime();
Packit Service 1d0348
	/* Test callbacks. */
Packit Service 1d0348
	test_callbacks();
Packit Service 1d0348
	/* Test nodump. */
Packit Service 1d0348
	test_nodump();
Packit Service 1d0348
}