]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
More format supports in archive_read_support_format_by_code and archive_read_set_format 1405/head
authorYichao Yu <yyc1992@gmail.com>
Sun, 28 Jun 2020 16:34:24 +0000 (12:34 -0400)
committerYichao Yu <yyc1992@gmail.com>
Sun, 28 Jun 2020 16:52:45 +0000 (12:52 -0400)
libarchive/archive_read_set_format.c
libarchive/archive_read_support_format_by_code.c
libarchive/archive_read_support_format_empty.c
libarchive/test/test_archive_read_next_header_empty.c
libarchive/test/test_archive_read_support.c
libarchive/test/test_read_format_raw.c
libarchive/test/test_write_format_warc.c

index 1d3e49d16477ea2b8721ecaee8be0fc020e76ac0..796dcdcced11d0ae00d1ad6ea5cca3127d417543 100644 (file)
@@ -61,6 +61,9 @@ archive_read_set_format(struct archive *_a, int code)
     case ARCHIVE_FORMAT_CPIO:
       strcpy(str, "cpio");
       break;
+    case ARCHIVE_FORMAT_EMPTY:
+      strcpy(str, "empty");
+      break;
     case ARCHIVE_FORMAT_ISO9660:
       strcpy(str, "iso9660");
       break;
@@ -76,9 +79,15 @@ archive_read_set_format(struct archive *_a, int code)
     case ARCHIVE_FORMAT_RAR_V5:
       strcpy(str, "rar5");
       break;
+    case ARCHIVE_FORMAT_RAW:
+      strcpy(str, "raw");
+      break;
     case ARCHIVE_FORMAT_TAR:
       strcpy(str, "tar");
       break;
+    case ARCHIVE_FORMAT_WARC:
+      strcpy(str, "warc");
+      break;
     case ARCHIVE_FORMAT_XAR:
       strcpy(str, "xar");
       break;
index 034353d78f63980eef97969baafcf6d6405ec79f..bbae601c0c49f5e280eaa84389f1612a89255d37 100644 (file)
@@ -48,6 +48,9 @@ archive_read_support_format_by_code(struct archive *a, int format_code)
        case ARCHIVE_FORMAT_CPIO:
                return archive_read_support_format_cpio(a);
                break;
+       case ARCHIVE_FORMAT_EMPTY:
+               return archive_read_support_format_empty(a);
+               break;
        case ARCHIVE_FORMAT_ISO9660:
                return archive_read_support_format_iso9660(a);
                break;
@@ -63,9 +66,15 @@ archive_read_support_format_by_code(struct archive *a, int format_code)
        case ARCHIVE_FORMAT_RAR_V5:
                return archive_read_support_format_rar5(a);
                break;
+       case ARCHIVE_FORMAT_RAW:
+               return archive_read_support_format_raw(a);
+               break;
        case ARCHIVE_FORMAT_TAR:
                return archive_read_support_format_tar(a);
                break;
+       case ARCHIVE_FORMAT_WARC:
+               return archive_read_support_format_warc(a);
+               break;
        case ARCHIVE_FORMAT_XAR:
                return archive_read_support_format_xar(a);
                break;
index c641eb9b150e9ee548e64408252b6fced9b06e2c..53fb6cc4743b5e1753e51ab398629ea6ccc02eb8 100644 (file)
@@ -47,7 +47,7 @@ archive_read_support_format_empty(struct archive *_a)
 
        r = __archive_read_register_format(a,
            NULL,
-           NULL,
+           "empty",
            archive_read_format_empty_bid,
            NULL,
            archive_read_format_empty_read_header,
index f650bccce89b1fa6524604f1b6be144860b02aca..f43cbd9342886cca337daa51f9b10fb276a5181a 100644 (file)
@@ -44,14 +44,9 @@ test_empty_file1(void)
 }
 
 static void
-test_empty_file2(void)
+test_empty_file2_check(struct archive* a)
 {
-       struct archive* a = archive_read_new();
        struct archive_entry* e;
-
-       /* Try opening an empty file with raw and empty handlers. */
-       assertEqualInt(ARCHIVE_OK, archive_read_support_format_raw(a));
-       assertEqualInt(ARCHIVE_OK, archive_read_support_format_empty(a));
        assertEqualInt(0, archive_errno(a));
        assertEqualString(NULL, archive_error_string(a));
 
@@ -66,6 +61,25 @@ test_empty_file2(void)
        archive_read_free(a);
 }
 
+static void
+test_empty_file2(void)
+{
+       struct archive* a = archive_read_new();
+
+       /* Try opening an empty file with raw and empty handlers. */
+       assertEqualInt(ARCHIVE_OK, archive_read_support_format_raw(a));
+       assertEqualInt(ARCHIVE_OK, archive_read_support_format_empty(a));
+       test_empty_file2_check(a);
+
+       a = archive_read_new();
+       assertEqualInt(ARCHIVE_OK, archive_read_support_format_by_code(a, ARCHIVE_FORMAT_EMPTY));
+       test_empty_file2_check(a);
+
+       a = archive_read_new();
+       assertEqualInt(ARCHIVE_OK, archive_read_set_format(a, ARCHIVE_FORMAT_EMPTY));
+       test_empty_file2_check(a);
+}
+
 static void
 test_empty_tarfile(void)
 {
index 1619b0729e94d7d232a4d2047641530b16aefee6..6d213c409bf25b02e3d0c39ca51fbf29bd8db2c8 100644 (file)
@@ -35,6 +35,17 @@ typedef struct archive *constructor(void);
 typedef int enabler(struct archive *);
 typedef int destructor(struct archive *);
 
+static int format_code = 0;
+static int format_code_enabler(struct archive *a)
+{
+       return archive_read_support_format_by_code(a, format_code);
+}
+
+static int format_code_setter(struct archive *a)
+{
+       return archive_read_set_format(a, format_code);
+}
+
 static void
 test_success(constructor new_, enabler enable_, destructor free_)
 {
@@ -85,6 +96,42 @@ DEFINE_TEST(test_archive_read_support)
        test_filter_or_format(archive_read_support_format_xar);
        test_filter_or_format(archive_read_support_format_zip);
 
+       int format_codes[] = {
+           ARCHIVE_FORMAT_CPIO,
+           ARCHIVE_FORMAT_CPIO_POSIX,
+           ARCHIVE_FORMAT_CPIO_BIN_LE,
+           ARCHIVE_FORMAT_CPIO_BIN_BE,
+           ARCHIVE_FORMAT_CPIO_SVR4_NOCRC,
+           ARCHIVE_FORMAT_CPIO_SVR4_CRC,
+           ARCHIVE_FORMAT_CPIO_AFIO_LARGE,
+           ARCHIVE_FORMAT_TAR,
+           ARCHIVE_FORMAT_TAR_USTAR,
+           ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE,
+           ARCHIVE_FORMAT_TAR_PAX_RESTRICTED,
+           ARCHIVE_FORMAT_TAR_GNUTAR,
+           ARCHIVE_FORMAT_ISO9660,
+           ARCHIVE_FORMAT_ISO9660_ROCKRIDGE,
+           ARCHIVE_FORMAT_ZIP,
+           ARCHIVE_FORMAT_EMPTY,
+           ARCHIVE_FORMAT_AR,
+           ARCHIVE_FORMAT_AR_GNU,
+           ARCHIVE_FORMAT_AR_BSD,
+           ARCHIVE_FORMAT_MTREE,
+           ARCHIVE_FORMAT_RAW,
+           ARCHIVE_FORMAT_XAR,
+           ARCHIVE_FORMAT_LHA,
+           ARCHIVE_FORMAT_CAB,
+           ARCHIVE_FORMAT_RAR,
+           ARCHIVE_FORMAT_7ZIP,
+           ARCHIVE_FORMAT_WARC,
+           ARCHIVE_FORMAT_RAR_V5,
+       };
+       for (unsigned i = 0; i < sizeof(format_codes) / sizeof(int); i++) {
+               format_code = format_codes[i];
+               test_filter_or_format(format_code_enabler);
+               test_filter_or_format(format_code_setter);
+       }
+
        test_filter_or_format(archive_read_support_filter_all);
        test_filter_or_format(archive_read_support_filter_bzip2);
        test_filter_or_format(archive_read_support_filter_compress);
index 3961723b48a1c5bd01a85d64842f16ed2bf8ccbf..457db009727b83567425f062ae2630dfc0c7bf60 100644 (file)
@@ -72,7 +72,7 @@ DEFINE_TEST(test_read_format_raw)
        extract_reference_file(reffile2);
        assert((a = archive_read_new()) != NULL);
        assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
-       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_raw(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_by_code(a, ARCHIVE_FORMAT_RAW));
        assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
        assertEqualIntA(a, ARCHIVE_OK,
            archive_read_open_filename(a, reffile2, 1));
@@ -100,8 +100,7 @@ DEFINE_TEST(test_read_format_raw)
        extract_reference_file(reffile3);
        assert((a = archive_read_new()) != NULL);
        assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
-       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_raw(a));
-       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_set_format(a, ARCHIVE_FORMAT_RAW));
        assertEqualIntA(a, ARCHIVE_OK,
            archive_read_open_filename(a, reffile3, 1));
 
index 60d1898fa1688d2b313366923d3b3eabd38cc474..3a4c2da1edf19e8ba6f583a0e0e7532814a5e7b9 100644 (file)
 #include "test.h"
 __FBSDID("$FreeBSD$");
 
+static void test_read(struct archive *a, char *buff, size_t used, char *filedata)
+{
+       struct archive_entry *ae;
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_none(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
+
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualIntA(a, 9, archive_read_data(a, filedata, 10));
+       assertEqualMem(filedata, "12345678", 9);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+       assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
 DEFINE_TEST(test_write_format_warc)
 {
        char filedata[64];
@@ -62,14 +75,15 @@ DEFINE_TEST(test_write_format_warc)
         */
        assert((a = archive_read_new()) != NULL);
        assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_warc(a));
-       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_none(a));
-       assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used));
+       test_read(a, buff, used, filedata);
 
-       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
-       assertEqualIntA(a, 9, archive_read_data(a, filedata, 10));
-       assertEqualMem(filedata, "12345678", 9);
-       assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
-       assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_by_code(a, ARCHIVE_FORMAT_WARC));
+       test_read(a, buff, used, filedata);
+
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_set_format(a, ARCHIVE_FORMAT_WARC));
+       test_read(a, buff, used, filedata);
 
        /* Create a new archive */
        assert((a = archive_write_new()) != NULL);