Patch from David Meggy to make the swap default to the new version if no
[oweals/busybox.git] / archival / dpkg_deb.c
index 06a810cc1cf6f820feb907f0bd53a3d295930186..2d7383fd7988f62b2844ca8d27312dc8bed80b24 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");
+       llist_t *control_tar_llist = NULL;
 #endif
-#ifndef CONFIG_AR
-       char magic[7];
-#endif
-       
-       /* a .deb file is an ar archive that contain three files,
-        * data.tar.gz, control.tar.gz and debian
-        */
        
        /* 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->accept = add_to_list(NULL, "data.tar.gz");
+       ar_archive->sub_archive = tar_archive;
+       ar_archive->filter = filter_accept_list_reassign;
+
+#ifdef CONFIG_FEATURE_DEB_TAR_GZ
+       ar_archive->accept = llist_add_to(NULL, "data.tar.gz");
+# ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
+       control_tar_llist = llist_add_to(NULL, "control.tar.gz");
+# endif
+#endif
+
+#ifdef CONFIG_FEATURE_DEB_TAR_BZ2
+       ar_archive->accept = llist_add_to(ar_archive->accept, "data.tar.bz2");
+# ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
+       control_tar_llist = llist_add_to(control_tar_llist, "control.tar.bz2");
+# endif
+#endif
 
 #ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
        while ((opt = getopt(argc, argv, "cefXx")) != -1) {
@@ -55,54 +60,44 @@ 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 = llist_add_to(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();
+                               bb_show_usage();
                }
        }
 
        if (optind + 2 < argc)  {
-               show_usage();
+               bb_show_usage();
        }
 
-       tar_gz_archive->src_fd = ar_archive->src_fd = xopen(argv[optind++], O_RDONLY);
+       tar_archive->src_fd = ar_archive->src_fd = bb_xopen(argv[optind++], O_RDONLY);
 
        /* Workout where to extract the files */
        /* 2nd argument is a dir name */
        mkdir(argv[optind], 0777);
        chdir(argv[optind]);
 
-#ifdef CONFIG_AR
        unpack_ar_archive(ar_archive);
-#else
-       xread_all(ar_archive->src_fd, magic, 7);
-       if (strncmp(magic, "!<arch>", 7) != 0) {
-               error_msg_and_die("Invalid ar magic");
-       }
-       ar_archive->offset += 7;
-
-       while (get_header_ar(ar_archive) == EXIT_SUCCESS);
-#endif
 
        /* Cleanup */
        close (ar_archive->src_fd);