]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Lookup uname/gname when pulling metadata off disk.
authorTim Kientzle <kientzle@gmail.com>
Wed, 1 Apr 2009 22:51:28 +0000 (18:51 -0400)
committerTim Kientzle <kientzle@gmail.com>
Wed, 1 Apr 2009 22:51:28 +0000 (18:51 -0400)
Add a basic test for read_disk_entry_from file to verify this.

SVN-Revision: 903

Makefile.am
libarchive/archive_read_disk_entry_from_file.c
libarchive/test/CMakeLists.txt
libarchive/test/test_read_disk_entry_from_file.c [new file with mode: 0644]

index 30cb82e14007de262062a78c437806d053e9678b..13b43c8cff4c4b545e519e43ccf5ce0d2693db72 100644 (file)
@@ -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                   \
index 9e3766177f0aa6182279903e154d7faaa6daa1ed..6e12517b5e587a960c17303cef067422d6b40a1d 100644 (file)
@@ -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()? */
index dd2836950b1752eae9577b68c5003a6bca2427ba..2495eb9d8b43e1c1880b903cc7374a3e3bc0eadd 100644 (file)
@@ -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 (file)
index 0000000..8b3b6d7
--- /dev/null
@@ -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));
+}