Skip to content

Commit

Permalink
Lookup uname/gname when pulling metadata off disk.
Browse files Browse the repository at this point in the history
Add a basic test for read_disk_entry_from file to verify this.

SVN-Revision: 903
  • Loading branch information
kientzle committed Apr 1, 2009
1 parent 47b438f commit 7aede26
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 1 deletion.
1 change: 1 addition & 0 deletions Makefile.am
Expand Up @@ -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 \
Expand Down
10 changes: 9 additions & 1 deletion libarchive/archive_read_disk_entry_from_file.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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()? */
Expand Down
3 changes: 3 additions & 0 deletions libarchive/test/CMakeLists.txt
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
80 changes: 80 additions & 0 deletions 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));
}

0 comments on commit 7aede26

Please sign in to comment.