Blame libarchive/test/test_entry.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_entry.c 201247 2009-12-30 05:59:21Z kientzle $");
Packit Service 1d0348
Packit Service 1d0348
#include <locale.h>
Packit Service 1d0348
Packit Service 1d0348
#ifndef HAVE_WCSCPY
Packit Service 1d0348
static wchar_t * wcscpy(wchar_t *s1, const wchar_t *s2)
Packit Service 1d0348
{
Packit Service 1d0348
	wchar_t *dest = s1;
Packit Service 1d0348
	while ((*s1 = *s2) != L'\0')
Packit Service 1d0348
		++s1, ++s2;
Packit Service 1d0348
	return dest;
Packit Service 1d0348
}
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
 * Most of these tests are system-independent, though a few depend on
Packit Service 1d0348
 * features of the local system.  Such tests are conditionalized on
Packit Service 1d0348
 * the platform name.  On unsupported platforms, only the
Packit Service 1d0348
 * system-independent features will be tested.
Packit Service 1d0348
 *
Packit Service 1d0348
 * No, I don't want to use config.h in the test files because I want
Packit Service 1d0348
 * the tests to also serve as a check on the correctness of config.h.
Packit Service 1d0348
 * A mis-configured library build should cause tests to fail.
Packit Service 1d0348
 */
Packit Service 1d0348
Packit Service 1d0348
DEFINE_TEST(test_entry)
Packit Service 1d0348
{
Packit Service 1d0348
	char buff[128];
Packit Service 1d0348
	wchar_t wbuff[128];
Packit Service 1d0348
	struct stat st;
Packit Service 1d0348
	struct archive_entry *e, *e2;
Packit Service 1d0348
	const struct stat *pst;
Packit Service 1d0348
	unsigned long set, clear; /* For fflag testing. */
Packit Service 1d0348
	int type, permset, tag, qual; /* For ACL testing. */
Packit Service 1d0348
	const char *name; /* For ACL testing. */
Packit Service 1d0348
	const char *xname; /* For xattr tests. */
Packit Service 1d0348
	const void *xval; /* For xattr tests. */
Packit Service 1d0348
	size_t xsize; /* For xattr tests. */
Packit Service 1d0348
	wchar_t wc;
Packit Service 1d0348
	long l;
Packit Service 1d0348
	int i;
Packit Service 1d0348
Packit Service 1d0348
	assert((e = archive_entry_new()) != NULL);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Verify that the AE_IF* defines match S_IF* defines
Packit Service 1d0348
	 * on this platform. See comments in archive_entry.h.
Packit Service 1d0348
	 */
Packit Service 1d0348
#ifdef S_IFREG
Packit Service 1d0348
	assertEqualInt(S_IFREG, AE_IFREG);
Packit Service 1d0348
#endif
Packit Service 1d0348
#ifdef S_IFLNK
Packit Service 1d0348
	assertEqualInt(S_IFLNK, AE_IFLNK);
Packit Service 1d0348
#endif
Packit Service 1d0348
#ifdef S_IFSOCK
Packit Service 1d0348
	assertEqualInt(S_IFSOCK, AE_IFSOCK);
Packit Service 1d0348
#endif
Packit Service 1d0348
#ifdef S_IFCHR
Packit Service 1d0348
	assertEqualInt(S_IFCHR, AE_IFCHR);
Packit Service 1d0348
#endif
Packit Service 1d0348
/* Work around MinGW, which defines S_IFBLK wrong. */
Packit Service 1d0348
/* sourceforge.net/tracker/?func=detail&atid=102435&aid=1942809&group_id=2435 */
Packit Service 1d0348
#if defined(S_IFBLK) && !defined(_WIN32)
Packit Service 1d0348
	assertEqualInt(S_IFBLK, AE_IFBLK);
Packit Service 1d0348
#endif
Packit Service 1d0348
#ifdef S_IFDIR
Packit Service 1d0348
	assertEqualInt(S_IFDIR, AE_IFDIR);
Packit Service 1d0348
#endif
Packit Service 1d0348
#ifdef S_IFIFO
Packit Service 1d0348
	assertEqualInt(S_IFIFO, AE_IFIFO);
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Basic set/read tests for all fields.
Packit Service 1d0348
	 * We should be able to set any field and read
Packit Service 1d0348
	 * back the same value.
Packit Service 1d0348
	 *
Packit Service 1d0348
	 * For methods that "copy" a string, we should be able
Packit Service 1d0348
	 * to overwrite the original passed-in string without
Packit Service 1d0348
	 * changing the value in the entry.
Packit Service 1d0348
	 *
Packit Service 1d0348
	 * The following tests are ordered alphabetically by the
Packit Service 1d0348
	 * name of the field.
Packit Service 1d0348
	 */
Packit Service 1d0348
Packit Service 1d0348
	/* atime */
Packit Service 1d0348
	archive_entry_set_atime(e, 13579, 24680);
Packit Service 1d0348
	assertEqualInt(archive_entry_atime(e), 13579);
Packit Service 1d0348
	assertEqualInt(archive_entry_atime_nsec(e), 24680);
Packit Service 1d0348
	archive_entry_set_atime(e, 13580, 1000000001L);
Packit Service 1d0348
	assertEqualInt(archive_entry_atime(e), 13581);
Packit Service 1d0348
	assertEqualInt(archive_entry_atime_nsec(e), 1);
Packit Service 1d0348
	archive_entry_set_atime(e, 13580, -7);
Packit Service 1d0348
	assertEqualInt(archive_entry_atime(e), 13579);
Packit Service 1d0348
	assertEqualInt(archive_entry_atime_nsec(e), 999999993);
Packit Service 1d0348
	archive_entry_unset_atime(e);
Packit Service 1d0348
	assertEqualInt(archive_entry_atime(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_atime_nsec(e), 0);
Packit Service 1d0348
	assert(!archive_entry_atime_is_set(e));
Packit Service 1d0348
Packit Service 1d0348
	/* birthtime */
Packit Service 1d0348
	archive_entry_set_birthtime(e, 17579, 24990);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime(e), 17579);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime_nsec(e), 24990);
Packit Service 1d0348
	archive_entry_set_birthtime(e, 17580, 1234567890L);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime(e), 17581);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime_nsec(e), 234567890);
Packit Service 1d0348
	archive_entry_set_birthtime(e, 17581, -24990);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime(e), 17580);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime_nsec(e), 999975010);
Packit Service 1d0348
	archive_entry_unset_birthtime(e);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime_nsec(e), 0);
Packit Service 1d0348
	assert(!archive_entry_birthtime_is_set(e));
Packit Service 1d0348
Packit Service 1d0348
	/* ctime */
Packit Service 1d0348
	archive_entry_set_ctime(e, 13580, 24681);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime(e), 13580);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime_nsec(e), 24681);
Packit Service 1d0348
	archive_entry_set_ctime(e, 13581, 2008182348L);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime(e), 13583);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime_nsec(e), 8182348);
Packit Service 1d0348
	archive_entry_set_ctime(e, 13582, -24681);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime(e), 13581);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime_nsec(e), 999975319);
Packit Service 1d0348
	archive_entry_unset_ctime(e);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime_nsec(e), 0);
Packit Service 1d0348
	assert(!archive_entry_ctime_is_set(e));
Packit Service 1d0348
Packit Service 1d0348
	/* dev */
Packit Service 1d0348
	assert(!archive_entry_dev_is_set(e));
Packit Service 1d0348
	archive_entry_set_dev(e, 235);
Packit Service 1d0348
	assert(archive_entry_dev_is_set(e));
Packit Service 1d0348
	assertEqualInt(archive_entry_dev(e), 235);
Packit Service 1d0348
	/* devmajor/devminor are tested specially below. */
Packit Service 1d0348
Packit Service 1d0348
	/* filetype */
Packit Service 1d0348
	archive_entry_set_filetype(e, AE_IFREG);
Packit Service 1d0348
	assertEqualInt(archive_entry_filetype(e), AE_IFREG);
Packit Service 1d0348
Packit Service 1d0348
	/* fflags are tested specially below */
Packit Service 1d0348
Packit Service 1d0348
	/* gid */
Packit Service 1d0348
	archive_entry_set_gid(e, 204);
Packit Service 1d0348
	assertEqualInt(archive_entry_gid(e), 204);
Packit Service 1d0348
Packit Service 1d0348
	/* gname */
Packit Service 1d0348
	archive_entry_set_gname(e, "group");
Packit Service 1d0348
	assertEqualString(archive_entry_gname(e), "group");
Packit Service 1d0348
	wcscpy(wbuff, L"wgroup");
Packit Service 1d0348
	archive_entry_copy_gname_w(e, wbuff);
Packit Service 1d0348
	assertEqualWString(archive_entry_gname_w(e), L"wgroup");
Packit Service 1d0348
	memset(wbuff, 0, sizeof(wbuff));
Packit Service 1d0348
	assertEqualWString(archive_entry_gname_w(e), L"wgroup");
Packit Service 1d0348
Packit Service 1d0348
	/* hardlink */
Packit Service 1d0348
	archive_entry_set_hardlink(e, "hardlinkname");
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e), "hardlinkname");
Packit Service 1d0348
	strcpy(buff, "hardlinkname2");
Packit Service 1d0348
	archive_entry_copy_hardlink(e, buff);
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e), "hardlinkname2");
Packit Service 1d0348
	memset(buff, 0, sizeof(buff));
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e), "hardlinkname2");
Packit Service 1d0348
	archive_entry_copy_hardlink(e, NULL);
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e), NULL);
Packit Service 1d0348
	assertEqualWString(archive_entry_hardlink_w(e), NULL);
Packit Service 1d0348
	wcscpy(wbuff, L"whardlink");
Packit Service 1d0348
	archive_entry_copy_hardlink_w(e, wbuff);
Packit Service 1d0348
	assertEqualWString(archive_entry_hardlink_w(e), L"whardlink");
Packit Service 1d0348
	memset(wbuff, 0, sizeof(wbuff));
Packit Service 1d0348
	assertEqualWString(archive_entry_hardlink_w(e), L"whardlink");
Packit Service 1d0348
	archive_entry_copy_hardlink_w(e, NULL);
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e), NULL);
Packit Service 1d0348
	assertEqualWString(archive_entry_hardlink_w(e), NULL);
Packit Service 1d0348
Packit Service 1d0348
	/* ino */
Packit Service 1d0348
	assert(!archive_entry_ino_is_set(e));
Packit Service 1d0348
	archive_entry_set_ino(e, 8593);
Packit Service 1d0348
	assert(archive_entry_ino_is_set(e));
Packit Service 1d0348
	assertEqualInt(archive_entry_ino(e), 8593);
Packit Service 1d0348
	assertEqualInt(archive_entry_ino64(e), 8593);
Packit Service 1d0348
	archive_entry_set_ino64(e, 8594);
Packit Service 1d0348
	assert(archive_entry_ino_is_set(e));
Packit Service 1d0348
	assertEqualInt(archive_entry_ino(e), 8594);
Packit Service 1d0348
	assertEqualInt(archive_entry_ino64(e), 8594);
Packit Service 1d0348
Packit Service 1d0348
	/* link */
Packit Service 1d0348
	archive_entry_set_hardlink(e, "hardlinkname");
Packit Service 1d0348
	archive_entry_set_symlink(e, NULL);
Packit Service 1d0348
	archive_entry_set_link(e, "link");
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e), "link");
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e), NULL);
Packit Service 1d0348
	archive_entry_copy_link(e, "link2");
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e), "link2");
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e), NULL);
Packit Service 1d0348
	archive_entry_copy_link_w(e, L"link3");
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e), "link3");
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e), NULL);
Packit Service 1d0348
	archive_entry_set_hardlink(e, NULL);
Packit Service 1d0348
	archive_entry_set_symlink(e, "symlink");
Packit Service 1d0348
	archive_entry_set_link(e, "link");
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e), NULL);
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e), "link");
Packit Service 1d0348
	archive_entry_copy_link(e, "link2");
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e), NULL);
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e), "link2");
Packit Service 1d0348
	archive_entry_copy_link_w(e, L"link3");
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e), NULL);
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e), "link3");
Packit Service 1d0348
	/* Arbitrarily override symlink if both hardlink and symlink set. */
Packit Service 1d0348
	archive_entry_set_hardlink(e, "hardlink");
Packit Service 1d0348
	archive_entry_set_symlink(e, "symlink");
Packit Service 1d0348
	archive_entry_set_link(e, "link");
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e), "hardlink");
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e), "link");
Packit Service 1d0348
Packit Service 1d0348
	/* mode */
Packit Service 1d0348
	archive_entry_set_mode(e, 0123456);
Packit Service 1d0348
	assertEqualInt(archive_entry_mode(e), 0123456);
Packit Service 1d0348
Packit Service 1d0348
	/* mtime */
Packit Service 1d0348
	archive_entry_set_mtime(e, 13581, 24682);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime(e), 13581);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime_nsec(e), 24682);
Packit Service 1d0348
	archive_entry_set_mtime(e, 13582, 1358297468);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime(e), 13583);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime_nsec(e), 358297468);
Packit Service 1d0348
	archive_entry_set_mtime(e, 13583, -24682);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime(e), 13582);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime_nsec(e), 999975318);
Packit Service 1d0348
	archive_entry_unset_mtime(e);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime_nsec(e), 0);
Packit Service 1d0348
	assert(!archive_entry_mtime_is_set(e));
Packit Service 1d0348
Packit Service 1d0348
	/* nlink */
Packit Service 1d0348
	archive_entry_set_nlink(e, 736);
Packit Service 1d0348
	assertEqualInt(archive_entry_nlink(e), 736);
Packit Service 1d0348
Packit Service 1d0348
	/* pathname */
Packit Service 1d0348
	archive_entry_set_pathname(e, "path");
Packit Service 1d0348
	assertEqualString(archive_entry_pathname(e), "path");
Packit Service 1d0348
	archive_entry_set_pathname(e, "path");
Packit Service 1d0348
	assertEqualString(archive_entry_pathname(e), "path");
Packit Service 1d0348
	strcpy(buff, "path2");
Packit Service 1d0348
	archive_entry_copy_pathname(e, buff);
Packit Service 1d0348
	assertEqualString(archive_entry_pathname(e), "path2");
Packit Service 1d0348
	memset(buff, 0, sizeof(buff));
Packit Service 1d0348
	assertEqualString(archive_entry_pathname(e), "path2");
Packit Service 1d0348
	wcscpy(wbuff, L"wpath");
Packit Service 1d0348
	archive_entry_copy_pathname_w(e, wbuff);
Packit Service 1d0348
	assertEqualWString(archive_entry_pathname_w(e), L"wpath");
Packit Service 1d0348
	memset(wbuff, 0, sizeof(wbuff));
Packit Service 1d0348
	assertEqualWString(archive_entry_pathname_w(e), L"wpath");
Packit Service 1d0348
Packit Service 1d0348
	/* rdev */
Packit Service 1d0348
	archive_entry_set_rdev(e, 532);
Packit Service 1d0348
	assertEqualInt(archive_entry_rdev(e), 532);
Packit Service 1d0348
	/* rdevmajor/rdevminor are tested specially below. */
Packit Service 1d0348
Packit Service 1d0348
	/* size */
Packit Service 1d0348
	archive_entry_set_size(e, 987654321);
Packit Service 1d0348
	assertEqualInt(archive_entry_size(e), 987654321);
Packit Service 1d0348
	archive_entry_unset_size(e);
Packit Service 1d0348
	assertEqualInt(archive_entry_size(e), 0);
Packit Service 1d0348
	assert(!archive_entry_size_is_set(e));
Packit Service 1d0348
Packit Service 1d0348
	/* sourcepath */
Packit Service 1d0348
	archive_entry_copy_sourcepath(e, "path1");
Packit Service 1d0348
	assertEqualString(archive_entry_sourcepath(e), "path1");
Packit Service 1d0348
Packit Service 1d0348
	/* symlink */
Packit Service 1d0348
	archive_entry_set_symlink(e, "symlinkname");
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e), "symlinkname");
Packit Service 1d0348
	strcpy(buff, "symlinkname2");
Packit Service 1d0348
	archive_entry_copy_symlink(e, buff);
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e), "symlinkname2");
Packit Service 1d0348
	memset(buff, 0, sizeof(buff));
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e), "symlinkname2");
Packit Service 1d0348
	archive_entry_copy_symlink_w(e, NULL);
Packit Service 1d0348
	assertEqualWString(archive_entry_symlink_w(e), NULL);
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e), NULL);
Packit Service 1d0348
	archive_entry_copy_symlink_w(e, L"wsymlink");
Packit Service 1d0348
	assertEqualWString(archive_entry_symlink_w(e), L"wsymlink");
Packit Service 1d0348
	archive_entry_copy_symlink(e, NULL);
Packit Service 1d0348
	assertEqualWString(archive_entry_symlink_w(e), NULL);
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e), NULL);
Packit Service 1d0348
Packit Service 1d0348
	/* uid */
Packit Service 1d0348
	archive_entry_set_uid(e, 83);
Packit Service 1d0348
	assertEqualInt(archive_entry_uid(e), 83);
Packit Service 1d0348
Packit Service 1d0348
	/* uname */
Packit Service 1d0348
	archive_entry_set_uname(e, "user");
Packit Service 1d0348
	assertEqualString(archive_entry_uname(e), "user");
Packit Service 1d0348
	wcscpy(wbuff, L"wuser");
Packit Service 1d0348
	archive_entry_copy_gname_w(e, wbuff);
Packit Service 1d0348
	assertEqualWString(archive_entry_gname_w(e), L"wuser");
Packit Service 1d0348
	memset(wbuff, 0, sizeof(wbuff));
Packit Service 1d0348
	assertEqualWString(archive_entry_gname_w(e), L"wuser");
Packit Service 1d0348
Packit Service 1d0348
	/* Test fflags interface. */
Packit Service 1d0348
	archive_entry_set_fflags(e, 0x55, 0xAA);
Packit Service 1d0348
	archive_entry_fflags(e, &set, &clear);
Packit Service 1d0348
	failure("Testing set/get of fflags data.");
Packit Service 1d0348
	assertEqualInt(set, 0x55);
Packit Service 1d0348
	failure("Testing set/get of fflags data.");
Packit Service 1d0348
	assertEqualInt(clear, 0xAA);
Packit Service 1d0348
#ifdef __FreeBSD__
Packit Service 1d0348
	/* Converting fflags bitmap to string is currently system-dependent. */
Packit Service 1d0348
	/* TODO: Make this system-independent. */
Packit Service 1d0348
	assertEqualString(archive_entry_fflags_text(e),
Packit Service 1d0348
	    "uappnd,nouchg,nodump,noopaque,uunlnk");
Packit Service 1d0348
	/* Test archive_entry_copy_fflags_text_w() */
Packit Service 1d0348
	archive_entry_copy_fflags_text_w(e, L" ,nouappnd, nouchg, dump,uunlnk");
Packit Service 1d0348
	archive_entry_fflags(e, &set, &clear);
Packit Service 1d0348
	assertEqualInt(16, set);
Packit Service 1d0348
	assertEqualInt(7, clear);
Packit Service 1d0348
	/* Test archive_entry_copy_fflags_text() */
Packit Service 1d0348
	archive_entry_copy_fflags_text(e, " ,nouappnd, nouchg, dump,uunlnk");
Packit Service 1d0348
	archive_entry_fflags(e, &set, &clear);
Packit Service 1d0348
	assertEqualInt(16, set);
Packit Service 1d0348
	assertEqualInt(7, clear);
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
	/* See test_acl_basic.c for tests of ACL set/get consistency. */
Packit Service 1d0348
Packit Service 1d0348
	/* Test xattrs set/get consistency. */
Packit Service 1d0348
	archive_entry_xattr_add_entry(e, "xattr1", "xattrvalue1", 12);
Packit Service 1d0348
	assertEqualInt(1, archive_entry_xattr_reset(e));
Packit Service 1d0348
	assertEqualInt(0, archive_entry_xattr_next(e, &xname, &xval, &xsize));
Packit Service 1d0348
	assertEqualString(xname, "xattr1");
Packit Service 1d0348
	assertEqualString(xval, "xattrvalue1");
Packit Service 1d0348
	assertEqualInt((int)xsize, 12);
Packit Service 1d0348
	assertEqualInt(1, archive_entry_xattr_count(e));
Packit Service 1d0348
	assertEqualInt(ARCHIVE_WARN,
Packit Service 1d0348
	    archive_entry_xattr_next(e, &xname, &xval, &xsize));
Packit Service 1d0348
	assertEqualString(xname, NULL);
Packit Service 1d0348
	assertEqualString(xval, NULL);
Packit Service 1d0348
	assertEqualInt((int)xsize, 0);
Packit Service 1d0348
	archive_entry_xattr_clear(e);
Packit Service 1d0348
	assertEqualInt(0, archive_entry_xattr_reset(e));
Packit Service 1d0348
	assertEqualInt(ARCHIVE_WARN,
Packit Service 1d0348
	    archive_entry_xattr_next(e, &xname, &xval, &xsize));
Packit Service 1d0348
	assertEqualString(xname, NULL);
Packit Service 1d0348
	assertEqualString(xval, NULL);
Packit Service 1d0348
	assertEqualInt((int)xsize, 0);
Packit Service 1d0348
	archive_entry_xattr_add_entry(e, "xattr1", "xattrvalue1", 12);
Packit Service 1d0348
	assertEqualInt(1, archive_entry_xattr_reset(e));
Packit Service 1d0348
	archive_entry_xattr_add_entry(e, "xattr2", "xattrvalue2", 12);
Packit Service 1d0348
	assertEqualInt(2, archive_entry_xattr_reset(e));
Packit Service 1d0348
	assertEqualInt(0, archive_entry_xattr_next(e, &xname, &xval, &xsize));
Packit Service 1d0348
	assertEqualInt(0, archive_entry_xattr_next(e, &xname, &xval, &xsize));
Packit Service 1d0348
	assertEqualInt(ARCHIVE_WARN,
Packit Service 1d0348
	    archive_entry_xattr_next(e, &xname, &xval, &xsize));
Packit Service 1d0348
	assertEqualString(xname, NULL);
Packit Service 1d0348
	assertEqualString(xval, NULL);
Packit Service 1d0348
	assertEqualInt((int)xsize, 0);
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test clone() implementation.
Packit Service 1d0348
	 */
Packit Service 1d0348
Packit Service 1d0348
	/* Set values in 'e' */
Packit Service 1d0348
	archive_entry_clear(e);
Packit Service 1d0348
	archive_entry_set_atime(e, 13579, 24680);
Packit Service 1d0348
	archive_entry_set_birthtime(e, 13779, 24990);
Packit Service 1d0348
	archive_entry_set_ctime(e, 13580, 24681);
Packit Service 1d0348
	archive_entry_set_dev(e, 235);
Packit Service 1d0348
	archive_entry_set_fflags(e, 0x55, 0xAA);
Packit Service 1d0348
	archive_entry_set_gid(e, 204);
Packit Service 1d0348
	archive_entry_set_gname(e, "group");
Packit Service 1d0348
	archive_entry_set_hardlink(e, "hardlinkname");
Packit Service 1d0348
	archive_entry_set_ino(e, 8593);
Packit Service 1d0348
	archive_entry_set_mode(e, 0123456);
Packit Service 1d0348
	archive_entry_set_mtime(e, 13581, 24682);
Packit Service 1d0348
	archive_entry_set_nlink(e, 736);
Packit Service 1d0348
	archive_entry_set_pathname(e, "path");
Packit Service 1d0348
	archive_entry_set_rdev(e, 532);
Packit Service 1d0348
	archive_entry_set_size(e, 987654321);
Packit Service 1d0348
	archive_entry_copy_sourcepath(e, "source");
Packit Service 1d0348
	archive_entry_set_symlink(e, "symlinkname");
Packit Service 1d0348
	archive_entry_set_uid(e, 83);
Packit Service 1d0348
	archive_entry_set_uname(e, "user");
Packit Service 1d0348
	/* Add an ACL entry. */
Packit Service 1d0348
	archive_entry_acl_add_entry(e, ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ, ARCHIVE_ENTRY_ACL_USER, 77, "user77");
Packit Service 1d0348
	/* Add an extended attribute. */
Packit Service 1d0348
	archive_entry_xattr_add_entry(e, "xattr1", "xattrvalue", 11);
Packit Service 1d0348
Packit Service 1d0348
	/* Make a clone. */
Packit Service 1d0348
	e2 = archive_entry_clone(e);
Packit Service 1d0348
Packit Service 1d0348
	/* Clone should have same contents. */
Packit Service 1d0348
	assertEqualInt(archive_entry_atime(e2), 13579);
Packit Service 1d0348
	assertEqualInt(archive_entry_atime_nsec(e2), 24680);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime(e2), 13779);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime_nsec(e2), 24990);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime(e2), 13580);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime_nsec(e2), 24681);
Packit Service 1d0348
	assertEqualInt(archive_entry_dev(e2), 235);
Packit Service 1d0348
	archive_entry_fflags(e, &set, &clear);
Packit Service 1d0348
	assertEqualInt(clear, 0xAA);
Packit Service 1d0348
	assertEqualInt(set, 0x55);
Packit Service 1d0348
	assertEqualInt(archive_entry_gid(e2), 204);
Packit Service 1d0348
	assertEqualString(archive_entry_gname(e2), "group");
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e2), "hardlinkname");
Packit Service 1d0348
	assertEqualInt(archive_entry_ino(e2), 8593);
Packit Service 1d0348
	assertEqualInt(archive_entry_mode(e2), 0123456);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime(e2), 13581);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime_nsec(e2), 24682);
Packit Service 1d0348
	assertEqualInt(archive_entry_nlink(e2), 736);
Packit Service 1d0348
	assertEqualString(archive_entry_pathname(e2), "path");
Packit Service 1d0348
	assertEqualInt(archive_entry_rdev(e2), 532);
Packit Service 1d0348
	assertEqualInt(archive_entry_size(e2), 987654321);
Packit Service 1d0348
	assertEqualString(archive_entry_sourcepath(e2), "source");
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e2), "symlinkname");
Packit Service 1d0348
	assertEqualInt(archive_entry_uid(e2), 83);
Packit Service 1d0348
	assertEqualString(archive_entry_uname(e2), "user");
Packit Service 1d0348
Packit Service 1d0348
	/* Verify ACL was copied. */
Packit Service 1d0348
	assertEqualInt(4, archive_entry_acl_reset(e2,
Packit Service 1d0348
			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
Packit Service 1d0348
	/* First three are standard permission bits. */
Packit Service 1d0348
	assertEqualInt(0, archive_entry_acl_next(e2,
Packit Service 1d0348
			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
Packit Service 1d0348
			   &type, &permset, &tag, &qual, &name));
Packit Service 1d0348
	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
Packit Service 1d0348
	assertEqualInt(permset, 4);
Packit Service 1d0348
	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_USER_OBJ);
Packit Service 1d0348
	assertEqualInt(qual, -1);
Packit Service 1d0348
	assertEqualString(name, NULL);
Packit Service 1d0348
	assertEqualInt(0, archive_entry_acl_next(e2,
Packit Service 1d0348
			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
Packit Service 1d0348
			   &type, &permset, &tag, &qual, &name));
Packit Service 1d0348
	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
Packit Service 1d0348
	assertEqualInt(permset, 5);
Packit Service 1d0348
	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_GROUP_OBJ);
Packit Service 1d0348
	assertEqualInt(qual, -1);
Packit Service 1d0348
	assertEqualString(name, NULL);
Packit Service 1d0348
	assertEqualInt(0, archive_entry_acl_next(e2,
Packit Service 1d0348
			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
Packit Service 1d0348
			   &type, &permset, &tag, &qual, &name));
Packit Service 1d0348
	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
Packit Service 1d0348
	assertEqualInt(permset, 6);
Packit Service 1d0348
	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_OTHER);
Packit Service 1d0348
	assertEqualInt(qual, -1);
Packit Service 1d0348
	assertEqualString(name, NULL);
Packit Service 1d0348
	/* Fourth is custom one. */
Packit Service 1d0348
	assertEqualInt(0, archive_entry_acl_next(e2,
Packit Service 1d0348
			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
Packit Service 1d0348
			   &type, &permset, &tag, &qual, &name));
Packit Service 1d0348
	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
Packit Service 1d0348
	assertEqualInt(permset, ARCHIVE_ENTRY_ACL_READ);
Packit Service 1d0348
	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_USER);
Packit Service 1d0348
	assertEqualInt(qual, 77);
Packit Service 1d0348
	assertEqualString(name, "user77");
Packit Service 1d0348
Packit Service 1d0348
	/* Verify xattr was copied. */
Packit Service 1d0348
	assertEqualInt(1, archive_entry_xattr_reset(e2));
Packit Service 1d0348
	assertEqualInt(0, archive_entry_xattr_next(e2, &xname, &xval, &xsize));
Packit Service 1d0348
	assertEqualString(xname, "xattr1");
Packit Service 1d0348
	assertEqualString(xval, "xattrvalue");
Packit Service 1d0348
	assertEqualInt((int)xsize, 11);
Packit Service 1d0348
	assertEqualInt(ARCHIVE_WARN,
Packit Service 1d0348
	    archive_entry_xattr_next(e2, &xname, &xval, &xsize));
Packit Service 1d0348
	assertEqualString(xname, NULL);
Packit Service 1d0348
	assertEqualString(xval, NULL);
Packit Service 1d0348
	assertEqualInt((int)xsize, 0);
Packit Service 1d0348
Packit Service 1d0348
	/* Change the original */
Packit Service 1d0348
	archive_entry_set_atime(e, 13580, 24690);
Packit Service 1d0348
	archive_entry_set_birthtime(e, 13980, 24999);
Packit Service 1d0348
	archive_entry_set_ctime(e, 13590, 24691);
Packit Service 1d0348
	archive_entry_set_dev(e, 245);
Packit Service 1d0348
	archive_entry_set_fflags(e, 0x85, 0xDA);
Packit Service 1d0348
	archive_entry_set_filetype(e, AE_IFLNK);
Packit Service 1d0348
	archive_entry_set_gid(e, 214);
Packit Service 1d0348
	archive_entry_set_gname(e, "grouper");
Packit Service 1d0348
	archive_entry_set_hardlink(e, "hardlinkpath");
Packit Service 1d0348
	archive_entry_set_ino(e, 8763);
Packit Service 1d0348
	archive_entry_set_mode(e, 0123654);
Packit Service 1d0348
	archive_entry_set_mtime(e, 18351, 28642);
Packit Service 1d0348
	archive_entry_set_nlink(e, 73);
Packit Service 1d0348
	archive_entry_set_pathname(e, "pathest");
Packit Service 1d0348
	archive_entry_set_rdev(e, 132);
Packit Service 1d0348
	archive_entry_set_size(e, 987456321);
Packit Service 1d0348
	archive_entry_copy_sourcepath(e, "source2");
Packit Service 1d0348
	archive_entry_set_symlink(e, "symlinkpath");
Packit Service 1d0348
	archive_entry_set_uid(e, 93);
Packit Service 1d0348
	archive_entry_set_uname(e, "username");
Packit Service 1d0348
	archive_entry_acl_clear(e);
Packit Service 1d0348
	archive_entry_xattr_clear(e);
Packit Service 1d0348
Packit Service 1d0348
	/* Clone should still have same contents. */
Packit Service 1d0348
	assertEqualInt(archive_entry_atime(e2), 13579);
Packit Service 1d0348
	assertEqualInt(archive_entry_atime_nsec(e2), 24680);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime(e2), 13779);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime_nsec(e2), 24990);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime(e2), 13580);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime_nsec(e2), 24681);
Packit Service 1d0348
	assertEqualInt(archive_entry_dev(e2), 235);
Packit Service 1d0348
	archive_entry_fflags(e2, &set, &clear);
Packit Service 1d0348
	assertEqualInt(clear, 0xAA);
Packit Service 1d0348
	assertEqualInt(set, 0x55);
Packit Service 1d0348
	assertEqualInt(archive_entry_gid(e2), 204);
Packit Service 1d0348
	assertEqualString(archive_entry_gname(e2), "group");
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e2), "hardlinkname");
Packit Service 1d0348
	assertEqualInt(archive_entry_ino(e2), 8593);
Packit Service 1d0348
	assertEqualInt(archive_entry_mode(e2), 0123456);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime(e2), 13581);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime_nsec(e2), 24682);
Packit Service 1d0348
	assertEqualInt(archive_entry_nlink(e2), 736);
Packit Service 1d0348
	assertEqualString(archive_entry_pathname(e2), "path");
Packit Service 1d0348
	assertEqualInt(archive_entry_rdev(e2), 532);
Packit Service 1d0348
	assertEqualInt(archive_entry_size(e2), 987654321);
Packit Service 1d0348
	assertEqualString(archive_entry_sourcepath(e2), "source");
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e2), "symlinkname");
Packit Service 1d0348
	assertEqualInt(archive_entry_uid(e2), 83);
Packit Service 1d0348
	assertEqualString(archive_entry_uname(e2), "user");
Packit Service 1d0348
Packit Service 1d0348
	/* Verify ACL was unchanged. */
Packit Service 1d0348
	assertEqualInt(4, archive_entry_acl_reset(e2,
Packit Service 1d0348
			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
Packit Service 1d0348
	/* First three are standard permission bits. */
Packit Service 1d0348
	assertEqualInt(0, archive_entry_acl_next(e2,
Packit Service 1d0348
			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
Packit Service 1d0348
			   &type, &permset, &tag, &qual, &name));
Packit Service 1d0348
	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
Packit Service 1d0348
	assertEqualInt(permset, 4);
Packit Service 1d0348
	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_USER_OBJ);
Packit Service 1d0348
	assertEqualInt(qual, -1);
Packit Service 1d0348
	assertEqualString(name, NULL);
Packit Service 1d0348
	assertEqualInt(0, archive_entry_acl_next(e2,
Packit Service 1d0348
			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
Packit Service 1d0348
			   &type, &permset, &tag, &qual, &name));
Packit Service 1d0348
	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
Packit Service 1d0348
	assertEqualInt(permset, 5);
Packit Service 1d0348
	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_GROUP_OBJ);
Packit Service 1d0348
	assertEqualInt(qual, -1);
Packit Service 1d0348
	assertEqualString(name, NULL);
Packit Service 1d0348
	assertEqualInt(0, archive_entry_acl_next(e2,
Packit Service 1d0348
			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
Packit Service 1d0348
			   &type, &permset, &tag, &qual, &name));
Packit Service 1d0348
	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
Packit Service 1d0348
	assertEqualInt(permset, 6);
Packit Service 1d0348
	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_OTHER);
Packit Service 1d0348
	assertEqualInt(qual, -1);
Packit Service 1d0348
	assertEqualString(name, NULL);
Packit Service 1d0348
	/* Fourth is custom one. */
Packit Service 1d0348
	assertEqualInt(0, archive_entry_acl_next(e2,
Packit Service 1d0348
			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
Packit Service 1d0348
			   &type, &permset, &tag, &qual, &name));
Packit Service 1d0348
	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
Packit Service 1d0348
	assertEqualInt(permset, ARCHIVE_ENTRY_ACL_READ);
Packit Service 1d0348
	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_USER);
Packit Service 1d0348
	assertEqualInt(qual, 77);
Packit Service 1d0348
	assertEqualString(name, "user77");
Packit Service 1d0348
	assertEqualInt(1, archive_entry_acl_next(e2,
Packit Service 1d0348
			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
Packit Service 1d0348
			   &type, &permset, &tag, &qual, &name));
Packit Service 1d0348
	assertEqualInt(type, 0);
Packit Service 1d0348
	assertEqualInt(permset, 0);
Packit Service 1d0348
	assertEqualInt(tag, 0);
Packit Service 1d0348
	assertEqualInt(qual, -1);
Packit Service 1d0348
	assertEqualString(name, NULL);
Packit Service 1d0348
Packit Service 1d0348
	/* Verify xattr was unchanged. */
Packit Service 1d0348
	assertEqualInt(1, archive_entry_xattr_reset(e2));
Packit Service 1d0348
Packit Service 1d0348
	/* Release clone. */
Packit Service 1d0348
	archive_entry_free(e2);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test clear() implementation.
Packit Service 1d0348
	 */
Packit Service 1d0348
	archive_entry_clear(e);
Packit Service 1d0348
	assertEqualInt(archive_entry_atime(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_atime_nsec(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime_nsec(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime_nsec(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_dev(e), 0);
Packit Service 1d0348
	archive_entry_fflags(e, &set, &clear);
Packit Service 1d0348
	assertEqualInt(clear, 0);
Packit Service 1d0348
	assertEqualInt(set, 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_filetype(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_gid(e), 0);
Packit Service 1d0348
	assertEqualString(archive_entry_gname(e), NULL);
Packit Service 1d0348
	assertEqualString(archive_entry_hardlink(e), NULL);
Packit Service 1d0348
	assertEqualInt(archive_entry_ino(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_mode(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime_nsec(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_nlink(e), 0);
Packit Service 1d0348
	assertEqualString(archive_entry_pathname(e), NULL);
Packit Service 1d0348
	assertEqualInt(archive_entry_rdev(e), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_size(e), 0);
Packit Service 1d0348
	assertEqualString(archive_entry_symlink(e), NULL);
Packit Service 1d0348
	assertEqualInt(archive_entry_uid(e), 0);
Packit Service 1d0348
	assertEqualString(archive_entry_uname(e), NULL);
Packit Service 1d0348
	/* ACLs should be cleared. */
Packit Service 1d0348
	assertEqualInt(archive_entry_acl_count(e, ARCHIVE_ENTRY_ACL_TYPE_ACCESS), 0);
Packit Service 1d0348
	assertEqualInt(archive_entry_acl_count(e, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT), 0);
Packit Service 1d0348
	/* Extended attributes should be cleared. */
Packit Service 1d0348
	assertEqualInt(archive_entry_xattr_count(e), 0);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test archive_entry_copy_stat().
Packit Service 1d0348
	 */
Packit Service 1d0348
	memset(&st, 0, sizeof(st));
Packit Service 1d0348
	/* Set all of the standard 'struct stat' fields. */
Packit Service 1d0348
	st.st_atime = 456789;
Packit Service 1d0348
	st.st_ctime = 345678;
Packit Service 1d0348
	st.st_dev = 123;
Packit Service 1d0348
	st.st_gid = 34;
Packit Service 1d0348
	st.st_ino = 234;
Packit Service 1d0348
	st.st_mode = 077777;
Packit Service 1d0348
	st.st_mtime = 234567;
Packit Service 1d0348
	st.st_nlink = 345;
Packit Service 1d0348
	st.st_size = 123456789;
Packit Service 1d0348
	st.st_uid = 23;
Packit Service 1d0348
#ifdef __FreeBSD__
Packit Service 1d0348
	/* On FreeBSD, high-res timestamp data should come through. */
Packit Service 1d0348
	st.st_atimespec.tv_nsec = 6543210;
Packit Service 1d0348
	st.st_ctimespec.tv_nsec = 5432109;
Packit Service 1d0348
	st.st_mtimespec.tv_nsec = 3210987;
Packit Service 1d0348
	st.st_birthtimespec.tv_nsec = 7459386;
Packit Service 1d0348
#endif
Packit Service 1d0348
	/* Copy them into the entry. */
Packit Service 1d0348
	archive_entry_copy_stat(e, &st);
Packit Service 1d0348
	/* Read each one back separately and compare. */
Packit Service 1d0348
	assertEqualInt(archive_entry_atime(e), 456789);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime(e), 345678);
Packit Service 1d0348
	assertEqualInt(archive_entry_dev(e), 123);
Packit Service 1d0348
	assertEqualInt(archive_entry_gid(e), 34);
Packit Service 1d0348
	assertEqualInt(archive_entry_ino(e), 234);
Packit Service 1d0348
	assertEqualInt(archive_entry_mode(e), 077777);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime(e), 234567);
Packit Service 1d0348
	assertEqualInt(archive_entry_nlink(e), 345);
Packit Service 1d0348
	assertEqualInt(archive_entry_size(e), 123456789);
Packit Service 1d0348
	assertEqualInt(archive_entry_uid(e), 23);
Packit Service 1d0348
#if __FreeBSD__
Packit Service 1d0348
	/* On FreeBSD, high-res timestamp data should come through. */
Packit Service 1d0348
	assertEqualInt(archive_entry_atime_nsec(e), 6543210);
Packit Service 1d0348
	assertEqualInt(archive_entry_ctime_nsec(e), 5432109);
Packit Service 1d0348
	assertEqualInt(archive_entry_mtime_nsec(e), 3210987);
Packit Service 1d0348
	assertEqualInt(archive_entry_birthtime_nsec(e), 7459386);
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test archive_entry_stat().
Packit Service 1d0348
	 */
Packit Service 1d0348
	/* First, clear out any existing stat data. */
Packit Service 1d0348
	memset(&st, 0, sizeof(st));
Packit Service 1d0348
	archive_entry_copy_stat(e, &st);
Packit Service 1d0348
	/* Set a bunch of fields individually. */
Packit Service 1d0348
	archive_entry_set_atime(e, 456789, 321);
Packit Service 1d0348
	archive_entry_set_ctime(e, 345678, 432);
Packit Service 1d0348
	archive_entry_set_dev(e, 123);
Packit Service 1d0348
	archive_entry_set_gid(e, 34);
Packit Service 1d0348
	archive_entry_set_ino(e, 234);
Packit Service 1d0348
	archive_entry_set_mode(e, 012345);
Packit Service 1d0348
	archive_entry_set_mode(e, 012345);
Packit Service 1d0348
	archive_entry_set_mtime(e, 234567, 543);
Packit Service 1d0348
	archive_entry_set_nlink(e, 345);
Packit Service 1d0348
	archive_entry_set_size(e, 123456789);
Packit Service 1d0348
	archive_entry_set_uid(e, 23);
Packit Service 1d0348
	/* Retrieve a stat structure. */
Packit Service 1d0348
	assert((pst = archive_entry_stat(e)) != NULL);
Packit Service 1d0348
	if (pst == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
	/* Check that the values match. */
Packit Service 1d0348
	assertEqualInt(pst->st_atime, 456789);
Packit Service 1d0348
	assertEqualInt(pst->st_ctime, 345678);
Packit Service 1d0348
	assertEqualInt(pst->st_dev, 123);
Packit Service 1d0348
	assertEqualInt(pst->st_gid, 34);
Packit Service 1d0348
	assertEqualInt(pst->st_ino, 234);
Packit Service 1d0348
	assertEqualInt(pst->st_mode, 012345);
Packit Service 1d0348
	assertEqualInt(pst->st_mtime, 234567);
Packit Service 1d0348
	assertEqualInt(pst->st_nlink, 345);
Packit Service 1d0348
	assertEqualInt(pst->st_size, 123456789);
Packit Service 1d0348
	assertEqualInt(pst->st_uid, 23);
Packit Service 1d0348
#ifdef __FreeBSD__
Packit Service 1d0348
	/* On FreeBSD, high-res timestamp data should come through. */
Packit Service 1d0348
	assertEqualInt(pst->st_atimespec.tv_nsec, 321);
Packit Service 1d0348
	assertEqualInt(pst->st_ctimespec.tv_nsec, 432);
Packit Service 1d0348
	assertEqualInt(pst->st_mtimespec.tv_nsec, 543);
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
	/* Changing any one value should update struct stat. */
Packit Service 1d0348
	archive_entry_set_atime(e, 456788, 0);
Packit Service 1d0348
	assert((pst = archive_entry_stat(e)) != NULL);
Packit Service 1d0348
	if (pst == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
	assertEqualInt(pst->st_atime, 456788);
Packit Service 1d0348
	archive_entry_set_ctime(e, 345677, 431);
Packit Service 1d0348
	assert((pst = archive_entry_stat(e)) != NULL);
Packit Service 1d0348
	if (pst == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
	assertEqualInt(pst->st_ctime, 345677);
Packit Service 1d0348
	archive_entry_set_dev(e, 122);
Packit Service 1d0348
	assert((pst = archive_entry_stat(e)) != NULL);
Packit Service 1d0348
	if (pst == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
	assertEqualInt(pst->st_dev, 122);
Packit Service 1d0348
	archive_entry_set_gid(e, 33);
Packit Service 1d0348
	assert((pst = archive_entry_stat(e)) != NULL);
Packit Service 1d0348
	if (pst == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
	assertEqualInt(pst->st_gid, 33);
Packit Service 1d0348
	archive_entry_set_ino(e, 233);
Packit Service 1d0348
	assert((pst = archive_entry_stat(e)) != NULL);
Packit Service 1d0348
	if (pst == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
	assertEqualInt(pst->st_ino, 233);
Packit Service 1d0348
	archive_entry_set_mode(e, 012344);
Packit Service 1d0348
	assert((pst = archive_entry_stat(e)) != NULL);
Packit Service 1d0348
	if (pst == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
	assertEqualInt(pst->st_mode, 012344);
Packit Service 1d0348
	archive_entry_set_mtime(e, 234566, 542);
Packit Service 1d0348
	assert((pst = archive_entry_stat(e)) != NULL);
Packit Service 1d0348
	if (pst == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
	assertEqualInt(pst->st_mtime, 234566);
Packit Service 1d0348
	archive_entry_set_nlink(e, 344);
Packit Service 1d0348
	assert((pst = archive_entry_stat(e)) != NULL);
Packit Service 1d0348
	if (pst == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
	assertEqualInt(pst->st_nlink, 344);
Packit Service 1d0348
	archive_entry_set_size(e, 123456788);
Packit Service 1d0348
	assert((pst = archive_entry_stat(e)) != NULL);
Packit Service 1d0348
	if (pst == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
	assertEqualInt(pst->st_size, 123456788);
Packit Service 1d0348
	archive_entry_set_uid(e, 22);
Packit Service 1d0348
	assert((pst = archive_entry_stat(e)) != NULL);
Packit Service 1d0348
	if (pst == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
	assertEqualInt(pst->st_uid, 22);
Packit Service 1d0348
	/* We don't need to check high-res fields here. */
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Test dev/major/minor interfaces.  Setting 'dev' or 'rdev'
Packit Service 1d0348
	 * should change the corresponding major/minor values, and
Packit Service 1d0348
	 * vice versa.
Packit Service 1d0348
	 *
Packit Service 1d0348
	 * The test here is system-specific because it assumes that
Packit Service 1d0348
	 * makedev(), major(), and minor() are defined in sys/stat.h.
Packit Service 1d0348
	 * I'm not too worried about it, though, because the code is
Packit Service 1d0348
	 * simple.  If it works on FreeBSD, it's unlikely to be broken
Packit Service 1d0348
	 * anywhere else.  Note: The functionality is present on every
Packit Service 1d0348
	 * platform even if these tests only run some places;
Packit Service 1d0348
	 * libarchive's more extensive configuration logic should find
Packit Service 1d0348
	 * the necessary definitions on every platform.
Packit Service 1d0348
	 */
Packit Service 1d0348
#if __FreeBSD__
Packit Service 1d0348
	archive_entry_set_dev(e, 0x12345678);
Packit Service 1d0348
	assertEqualInt(archive_entry_devmajor(e), major(0x12345678));
Packit Service 1d0348
	assertEqualInt(archive_entry_devminor(e), minor(0x12345678));
Packit Service 1d0348
	assertEqualInt(archive_entry_dev(e), 0x12345678);
Packit Service 1d0348
	archive_entry_set_devmajor(e, 0xfe);
Packit Service 1d0348
	archive_entry_set_devminor(e, 0xdcba98);
Packit Service 1d0348
	assertEqualInt(archive_entry_devmajor(e), 0xfe);
Packit Service 1d0348
	assertEqualInt(archive_entry_devminor(e), 0xdcba98);
Packit Service 1d0348
	assertEqualInt(archive_entry_dev(e), makedev(0xfe, 0xdcba98));
Packit Service 1d0348
	archive_entry_set_rdev(e, 0x12345678);
Packit Service 1d0348
	assertEqualInt(archive_entry_rdevmajor(e), major(0x12345678));
Packit Service 1d0348
	assertEqualInt(archive_entry_rdevminor(e), minor(0x12345678));
Packit Service 1d0348
	assertEqualInt(archive_entry_rdev(e), 0x12345678);
Packit Service 1d0348
	archive_entry_set_rdevmajor(e, 0xfe);
Packit Service 1d0348
	archive_entry_set_rdevminor(e, 0xdcba98);
Packit Service 1d0348
	assertEqualInt(archive_entry_rdevmajor(e), 0xfe);
Packit Service 1d0348
	assertEqualInt(archive_entry_rdevminor(e), 0xdcba98);
Packit Service 1d0348
	assertEqualInt(archive_entry_rdev(e), makedev(0xfe, 0xdcba98));
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Exercise the character-conversion logic, if we can.
Packit Service 1d0348
	 */
Packit Service 1d0348
	if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
Packit Service 1d0348
		skipping("Can't exercise charset-conversion logic without"
Packit Service 1d0348
			" a suitable locale.");
Packit Service 1d0348
	} else {
Packit Service 1d0348
		/* A filename that cannot be converted to wide characters. */
Packit Service 1d0348
		archive_entry_copy_pathname(e, "abc\314\214mno\374xyz");
Packit Service 1d0348
		failure("Converting invalid chars to Unicode should fail.");
Packit Service 1d0348
		assert(NULL == archive_entry_pathname_w(e));
Packit Service 1d0348
		/*
Packit Service 1d0348
		  failure("Converting invalid chars to UTF-8 should fail.");
Packit Service 1d0348
		  assert(NULL == archive_entry_pathname_utf8(e));
Packit Service 1d0348
		*/
Packit Service 1d0348
Packit Service 1d0348
		/* A group name that cannot be converted. */
Packit Service 1d0348
		archive_entry_copy_gname(e, "abc\314\214mno\374xyz");
Packit Service 1d0348
		failure("Converting invalid chars to Unicode should fail.");
Packit Service 1d0348
		assert(NULL == archive_entry_gname_w(e));
Packit Service 1d0348
Packit Service 1d0348
		/* A user name that cannot be converted. */
Packit Service 1d0348
		archive_entry_copy_uname(e, "abc\314\214mno\374xyz");
Packit Service 1d0348
		failure("Converting invalid chars to Unicode should fail.");
Packit Service 1d0348
		assert(NULL == archive_entry_uname_w(e));
Packit Service 1d0348
Packit Service 1d0348
		/* A hardlink target that cannot be converted. */
Packit Service 1d0348
		archive_entry_copy_hardlink(e, "abc\314\214mno\374xyz");
Packit Service 1d0348
		failure("Converting invalid chars to Unicode should fail.");
Packit Service 1d0348
		assert(NULL == archive_entry_hardlink_w(e));
Packit Service 1d0348
Packit Service 1d0348
		/* A symlink target that cannot be converted. */
Packit Service 1d0348
		archive_entry_copy_symlink(e, "abc\314\214mno\374xyz");
Packit Service 1d0348
		failure("Converting invalid chars to Unicode should fail.");
Packit Service 1d0348
		assert(NULL == archive_entry_symlink_w(e));
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	l = 0x12345678L;
Packit Service 1d0348
	wc = (wchar_t)l; /* Wide character too big for UTF-8. */
Packit Service 1d0348
	if (NULL == setlocale(LC_ALL, "C") || (long)wc != l) {
Packit Service 1d0348
		skipping("Testing charset conversion failure requires 32-bit wchar_t and support for \"C\" locale.");
Packit Service 1d0348
	} else {
Packit Service 1d0348
		/*
Packit Service 1d0348
		 * Build the string L"xxx\U12345678yyy\u5678zzz" without
Packit Service 1d0348
		 * using wcscpy or C99 \u#### syntax.
Packit Service 1d0348
		 */
Packit Service 1d0348
		name = "xxxAyyyBzzz";
Packit Service 1d0348
		for (i = 0; i < (int)strlen(name); ++i)
Packit Service 1d0348
			wbuff[i] = name[i];
Packit Service 1d0348
		wbuff[3] = (wchar_t)0x12345678;
Packit Service 1d0348
		wbuff[7] = (wchar_t)0x5678;
Packit Service 1d0348
		/* A Unicode filename that cannot be converted to UTF-8. */
Packit Service 1d0348
		archive_entry_copy_pathname_w(e, wbuff);
Packit Service 1d0348
		failure("Converting wide characters from Unicode should fail.");
Packit Service 1d0348
		assertEqualString(NULL, archive_entry_pathname(e));
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* Release the experimental entry. */
Packit Service 1d0348
	archive_entry_free(e);
Packit Service 1d0348
}