From: Tim Kientzle Date: Wed, 1 Apr 2009 22:51:28 +0000 (-0400) Subject: Lookup uname/gname when pulling metadata off disk. X-Git-Tag: v2.7.0~38 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7aede267ffcfdfaaaa4ec1f60db32b7bd11cfe74;p=thirdparty%2Flibarchive.git Lookup uname/gname when pulling metadata off disk. Add a basic test for read_disk_entry_from file to verify this. SVN-Revision: 903 --- diff --git a/Makefile.am b/Makefile.am index 30cb82e14..13b43c8cf 100644 --- a/Makefile.am +++ b/Makefile.am @@ -230,6 +230,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_read_compress_program.c \ libarchive/test/test_read_data_large.c \ libarchive/test/test_read_disk.c \ + libarchive/test/test_read_disk_entry_from_file.c \ libarchive/test/test_read_extract.c \ libarchive/test/test_read_file_nonexistent.c \ libarchive/test/test_read_format_ar.c \ diff --git a/libarchive/archive_read_disk_entry_from_file.c b/libarchive/archive_read_disk_entry_from_file.c index 9e3766177..6e12517b5 100644 --- a/libarchive/archive_read_disk_entry_from_file.c +++ b/libarchive/archive_read_disk_entry_from_file.c @@ -87,7 +87,7 @@ archive_read_disk_entry_from_file(struct archive *_a, int fd, const struct stat *st) { struct archive_read_disk *a = (struct archive_read_disk *)_a; - const char *path; + const char *path, *name; struct stat s; int initial_fd = fd; int r, r1; @@ -131,6 +131,14 @@ archive_read_disk_entry_from_file(struct archive *_a, } archive_entry_copy_stat(entry, st); + /* Lookup uname/gname */ + name = archive_read_disk_uname(_a, archive_entry_uid(entry)); + if (name != NULL) + archive_entry_copy_uname(entry, name); + name = archive_read_disk_gname(_a, archive_entry_gid(entry)); + if (name != NULL) + archive_entry_copy_gname(entry, name); + #ifdef HAVE_STRUCT_STAT_ST_FLAGS /* On FreeBSD, we get flags for free with the stat. */ /* TODO: Does this belong in copy_stat()? */ diff --git a/libarchive/test/CMakeLists.txt b/libarchive/test/CMakeLists.txt index dd2836950..2495eb9d8 100644 --- a/libarchive/test/CMakeLists.txt +++ b/libarchive/test/CMakeLists.txt @@ -37,6 +37,7 @@ IF(ENABLE_TEST) test_read_compress_program.c test_read_data_large.c test_read_disk.c + test_read_disk_entry_from_file.c test_read_extract.c test_read_file_nonexistent.c test_read_format_ar.c @@ -74,7 +75,9 @@ IF(ENABLE_TEST) test_write_compress.c test_write_compress_bzip2.c test_write_compress_gzip.c + test_write_compress_lzma.c test_write_compress_program.c + test_write_compress_xz.c test_write_disk.c test_write_disk_failures.c test_write_disk_hardlink.c diff --git a/libarchive/test/test_read_disk_entry_from_file.c b/libarchive/test/test_read_disk_entry_from_file.c new file mode 100644 index 000000000..8b3b6d79c --- /dev/null +++ b/libarchive/test/test_read_disk_entry_from_file.c @@ -0,0 +1,80 @@ +/*- + * Copyright (c) 2003-2009 Tim Kientzle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" +__FBSDID("$FreeBSD$"); + +static const char * +gname_lookup(void *d, gid_t g) +{ + (void)d; /* UNUSED */ + (void)g; /* UNUSED */ + return ("FOOGROUP"); +} + +static const char * +uname_lookup(void *d, uid_t u) +{ + (void)d; /* UNUSED */ + (void)u; /* UNUSED */ + return ("FOO"); +} + +DEFINE_TEST(test_read_disk_entry_from_file) +{ + struct archive *a; + struct archive_entry *entry; + int fd; + + assert((a = archive_read_disk_new()) != NULL); + + assertEqualInt(ARCHIVE_OK, archive_read_disk_set_uname_lookup(a, + NULL, &uname_lookup, NULL)); + assertEqualInt(ARCHIVE_OK, archive_read_disk_set_gname_lookup(a, + NULL, &gname_lookup, NULL)); + assertEqualString(archive_read_disk_uname(a, 0), "FOO"); + assertEqualString(archive_read_disk_gname(a, 0), "FOOGROUP"); + + /* Create a file on disk. */ + fd = open("foo", O_WRONLY | O_CREAT, 0777); + assert(fd >= 0); + assertEqualInt(4, write(fd, "1234", 4)); + close(fd); + + /* Use archive_read_disk_entry_from_file to get information about it. */ + entry = archive_entry_new(); + assert(entry != NULL); + archive_entry_copy_pathname(entry, "foo"); + assertEqualInt(ARCHIVE_OK, + archive_read_disk_entry_from_file(a, entry, -1, NULL)); + + /* Verify the information we got back. */ + assertEqualString(archive_entry_uname(entry), "FOO"); + assertEqualString(archive_entry_gname(entry), "FOOGROUP"); + assertEqualInt(archive_entry_size(entry), 4); + + /* Destroy the archive. */ + archive_entry_free(entry); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +}