enable .tar.bz2 for dpkg-deb
authorGlenn L McGrath <bug1@ihug.co.nz>
Tue, 5 Nov 2002 01:52:23 +0000 (01:52 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Tue, 5 Nov 2002 01:52:23 +0000 (01:52 -0000)
archival/config.in
archival/dpkg_deb.c
archival/libunarchive/Makefile.in
archival/libunarchive/filter_accept_all.c
archival/libunarchive/filter_accept_list.c
archival/libunarchive/filter_accept_reject_list.c
include/unarchive.h

index 3ec03fd8cce4b2ee45169d40d3033ae432389023..05e6dcae4618ae5cb048ad8c3f726ef88f8f32bf 100644 (file)
@@ -15,7 +15,12 @@ bool 'cpio'      CONFIG_CPIO
 bool 'dpkg'        CONFIG_DPKG
 bool 'dpkg_deb'            CONFIG_DPKG_DEB
 if [ "$CONFIG_DPKG_DEB" = "y" ] ; then
-    bool '  -x support only'   CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
+    bool '  extract only (-x)' CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
+fi
+if [ "$CONFIG_DPKG" = "y" ] || [ "$CONFIG_DPKG_DEB" = "y" ] ; then
+    comment 'Common dpkg/dpkg-deb options'
+    bool '  gzip debian packages (normal)'      CONFIG_FEATURE_DEB_TAR_GZ
+    bool '  bzip2 debian packages'              CONFIG_FEATURE_DEB_TAR_BZ2
 fi
 bool 'gunzip'      CONFIG_GUNZIP
 if [ "$CONFIG_GUNZIP" = "y" ]; then
index 06a810cc1cf6f820feb907f0bd53a3d295930186..c4673955332994b5b21bd3c45e85b3b45bc9ea35 100644 (file)
 extern int dpkg_deb_main(int argc, char **argv)
 {
        archive_handle_t *ar_archive;
-       archive_handle_t *tar_gz_archive;
+       archive_handle_t *tar_archive;
        int opt = 0;
 #ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
-       const llist_t *control_tar_gz_llist = add_to_list(NULL, "control.tar.gz");
+       const llist_t *control_tar_llist = NULL;
 #endif
 #ifndef CONFIG_AR
        char magic[7];
@@ -38,14 +38,26 @@ extern int dpkg_deb_main(int argc, char **argv)
         */
        
        /* Setup the tar archive handle */
-       tar_gz_archive = init_handle();
+       tar_archive = init_handle();
 
        /* Setup an ar archive handle that refers to the gzip sub archive */    
        ar_archive = init_handle();
-       ar_archive->action_data_subarchive = get_header_tar_gz;
-       ar_archive->sub_archive = tar_gz_archive;
-       ar_archive->filter = filter_accept_list;
+       ar_archive->sub_archive = tar_archive;
+       ar_archive->filter = filter_accept_list_reassign;
+
+#ifdef CONFIG_FEATURE_DEB_TAR_GZ
        ar_archive->accept = add_to_list(NULL, "data.tar.gz");
+# ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
+       control_tar_llist = add_to_list(NULL, "control.tar.gz");
+# endif
+#endif
+
+#ifdef CONFIG_FEATURE_DEB_TAR_BZ2
+       ar_archive->accept = add_to_list(ar_archive->accept, "data.tar.bz2");
+# ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
+       control_tar_llist = add_to_list(control_tar_llist, "control.tar.bz2");
+# endif
+#endif
 
 #ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
        while ((opt = getopt(argc, argv, "cefXx")) != -1) {
@@ -55,26 +67,26 @@ extern int dpkg_deb_main(int argc, char **argv)
                switch (opt) {
 #ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
                        case 'c':
-                               tar_gz_archive->action_header = header_verbose_list;
+                               tar_archive->action_header = header_verbose_list;
                                break;
                        case 'e':
-                               ar_archive->accept = control_tar_gz_llist;
-                               tar_gz_archive->action_data = data_extract_all;
+                               ar_archive->accept = control_tar_llist;
+                               tar_archive->action_data = data_extract_all;
                                break;
                        case 'f':
                                /* Print the entire control file
                                 * it should accept a second argument which specifies a 
                                 * specific field to print */
-                               ar_archive->accept = control_tar_gz_llist;
-                               tar_gz_archive->accept = add_to_list(NULL, "./control");;
-                               tar_gz_archive->filter = filter_accept_list;
-                               tar_gz_archive->action_data = data_extract_to_stdout;
+                               ar_archive->accept = control_tar_llist;
+                               tar_archive->accept = add_to_list(NULL, "./control");;
+                               tar_archive->filter = filter_accept_list;
+                               tar_archive->action_data = data_extract_to_stdout;
                                break;
                        case 'X':
-                               tar_gz_archive->action_header = header_list;
+                               tar_archive->action_header = header_list;
 #endif
                        case 'x':
-                               tar_gz_archive->action_data = data_extract_all;
+                               tar_archive->action_data = data_extract_all;
                                break;
                        default:
                                show_usage();
@@ -85,7 +97,7 @@ extern int dpkg_deb_main(int argc, char **argv)
                show_usage();
        }
 
-       tar_gz_archive->src_fd = ar_archive->src_fd = xopen(argv[optind++], O_RDONLY);
+       tar_archive->src_fd = ar_archive->src_fd = xopen(argv[optind++], O_RDONLY);
 
        /* Workout where to extract the files */
        /* 2nd argument is a dir name */
index e406f750ead58dce183c2ca9abe45a1e987c1bff..469004d5f28502e4ea1ed8c94c27c540d23d22f0 100644 (file)
@@ -31,6 +31,7 @@ LIBUNARCHIVE-y:= \
 \
        filter_accept_all.o \
        filter_accept_list.o \
+       filter_accept_list_reassign.o \
        filter_accept_reject_list.o \
 \
        get_header_ar.o \
index d7bccb5cdfa0cf950d5c7ff55ed1885b1d065d74..baf9e4b71734cbabf4bb294446e6dfe81ff21b21 100644 (file)
@@ -22,7 +22,7 @@
 #include "unarchive.h"
 
 /* Accept any non-null name, its not really a filter at all */
-extern char filter_accept_all(const archive_handle_t *archive_handle)
+extern char filter_accept_all(archive_handle_t *archive_handle)
 {
        if (archive_handle->file_header->name) {
                return(EXIT_SUCCESS);
index 5ff3ad2dd36c89c41dea2a4075be8f76ecab97f7..e1c4827bf2dc0f858fe0e0fc989e4a6c0b95ffa3 100644 (file)
@@ -24,7 +24,7 @@
 /*
  * Accept names that are in the accept list, ignoring reject list.
  */
-extern char filter_accept_list(const archive_handle_t *archive_handle)
+extern char filter_accept_list(archive_handle_t *archive_handle)
 {
        if (find_list_entry(archive_handle->accept, archive_handle->file_header->name)) {
                return(EXIT_SUCCESS);
index 48e9ed8eac83892e0667579f6f58b53de1f17da8..657f7a0bde4ea6023d396bdfe9d06b024ff8bfee 100644 (file)
@@ -24,7 +24,7 @@
 /*
  * Accept names that are in the accept list and not in the reject list
  */
-extern char filter_accept_reject_list(const archive_handle_t *archive_handle)
+extern char filter_accept_reject_list(archive_handle_t *archive_handle)
 {
        const char *key = archive_handle->file_header->name;
        const llist_t *accept_entry = find_list_entry(archive_handle->accept, key);
index a1010aae850cf450b8435458b79bb5d59605dc33..18bf089fb99c61d4cdaddc3791ecc4d815a9867d 100644 (file)
@@ -28,7 +28,7 @@ typedef struct llist_s {
 
 typedef struct archive_handle_s {
        /* define if the header and data compenent should processed */
-       char (*filter)(const struct archive_handle_s *);
+       char (*filter)(struct archive_handle_s *);
        const llist_t *accept;
        const llist_t *reject;
        const llist_t *passed;  /* List of files that have successfully been worked on */
@@ -41,6 +41,8 @@ typedef struct archive_handle_s {
 
        /* process the data componenet, e.g. extract to filesystem */
        void (*action_data)(struct archive_handle_s *);
+       
+       /* How to process any sub archive, e.g. get_header_tar_gz */
        char (*action_data_subarchive)(struct archive_handle_s *);
 
        /* Contains the handle to a sub archive */
@@ -68,9 +70,10 @@ typedef struct archive_handle_s {
 
 extern archive_handle_t *init_handle(void);
 
-extern char filter_accept_all(const archive_handle_t *archive_handle);
-extern char filter_accept_list(const archive_handle_t *archive_handle);
-extern char filter_accept_reject_list(const archive_handle_t *archive_handle);
+extern char filter_accept_all(archive_handle_t *archive_handle);
+extern char filter_accept_list(archive_handle_t *archive_handle);
+extern char filter_accept_list_reassign(archive_handle_t *archive_handle);
+extern char filter_accept_reject_list(archive_handle_t *archive_handle);
 
 extern void unpack_ar_archive(archive_handle_t *ar_archive);