Magellan Linux

Annotation of /trunk/mkinitrd-magellan/busybox/archival/dpkg_deb.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1123 - (hide annotations) (download)
Wed Aug 18 21:56:57 2010 UTC (13 years, 9 months ago) by niro
File MIME type: text/plain
File size: 2955 byte(s)
-updated to busybox-1.17.1
1 niro 532 /* vi: set sw=4 ts=4: */
2     /*
3     * dpkg-deb packs, unpacks and provides information about Debian archives.
4     *
5     * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
6     */
7 niro 816 #include "libbb.h"
8 niro 532 #include "unarchive.h"
9    
10     #define DPKG_DEB_OPT_CONTENTS 1
11     #define DPKG_DEB_OPT_CONTROL 2
12     #define DPKG_DEB_OPT_FIELD 4
13     #define DPKG_DEB_OPT_EXTRACT 8
14     #define DPKG_DEB_OPT_EXTRACT_VERBOSE 16
15    
16 niro 816 int dpkg_deb_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
17 niro 532 int dpkg_deb_main(int argc, char **argv)
18     {
19     archive_handle_t *ar_archive;
20     archive_handle_t *tar_archive;
21     llist_t *control_tar_llist = NULL;
22     unsigned opt;
23 niro 816 const char *extract_dir;
24     int need_args;
25 niro 532
26     /* Setup the tar archive handle */
27     tar_archive = init_handle();
28    
29     /* Setup an ar archive handle that refers to the gzip sub archive */
30     ar_archive = init_handle();
31 niro 984 ar_archive->dpkg__sub_archive = tar_archive;
32 niro 532 ar_archive->filter = filter_accept_list_reassign;
33    
34 niro 816 #if ENABLE_FEATURE_SEAMLESS_GZ
35 niro 1123 llist_add_to(&ar_archive->accept, (char*)"data.tar.gz");
36 niro 816 llist_add_to(&control_tar_llist, (char*)"control.tar.gz");
37 niro 532 #endif
38 niro 816 #if ENABLE_FEATURE_SEAMLESS_BZ2
39 niro 1123 llist_add_to(&ar_archive->accept, (char*)"data.tar.bz2");
40 niro 816 llist_add_to(&control_tar_llist, (char*)"control.tar.bz2");
41 niro 532 #endif
42 niro 1123 #if ENABLE_FEATURE_SEAMLESS_LZMA
43     llist_add_to(&ar_archive->accept, (char*)"data.tar.lzma");
44     llist_add_to(&control_tar_llist, (char*)"control.tar.lzma");
45     #endif
46 niro 532
47 niro 816 opt_complementary = "c--efXx:e--cfXx:f--ceXx:X--cefx:x--cefX";
48     opt = getopt32(argv, "cefXx");
49     argv += optind;
50     argc -= optind;
51 niro 532
52     if (opt & DPKG_DEB_OPT_CONTENTS) {
53     tar_archive->action_header = header_verbose_list;
54     }
55 niro 816 extract_dir = NULL;
56     need_args = 1;
57 niro 532 if (opt & DPKG_DEB_OPT_CONTROL) {
58     ar_archive->accept = control_tar_llist;
59     tar_archive->action_data = data_extract_all;
60 niro 816 if (1 == argc) {
61 niro 532 extract_dir = "./DEBIAN";
62     } else {
63 niro 816 need_args++;
64 niro 532 }
65     }
66     if (opt & DPKG_DEB_OPT_FIELD) {
67     /* Print the entire control file
68     * it should accept a second argument which specifies a
69     * specific field to print */
70     ar_archive->accept = control_tar_llist;
71 niro 816 llist_add_to(&(tar_archive->accept), (char*)"./control");
72 niro 532 tar_archive->filter = filter_accept_list;
73     tar_archive->action_data = data_extract_to_stdout;
74     }
75     if (opt & DPKG_DEB_OPT_EXTRACT) {
76     tar_archive->action_header = header_list;
77     }
78     if (opt & (DPKG_DEB_OPT_EXTRACT_VERBOSE | DPKG_DEB_OPT_EXTRACT)) {
79     tar_archive->action_data = data_extract_all;
80 niro 816 need_args = 2;
81 niro 532 }
82    
83 niro 816 if (need_args != argc) {
84 niro 532 bb_show_usage();
85     }
86    
87 niro 816 tar_archive->src_fd = ar_archive->src_fd = xopen(argv[0], O_RDONLY);
88 niro 532
89 niro 816 /* Work out where to extract the files */
90 niro 532 /* 2nd argument is a dir name */
91 niro 816 if (argv[1]) {
92     extract_dir = argv[1];
93 niro 532 }
94     if (extract_dir) {
95     mkdir(extract_dir, 0777); /* bb_make_directory(extract_dir, 0777, 0) */
96     xchdir(extract_dir);
97     }
98 niro 816
99     /* Do it */
100 niro 532 unpack_ar_archive(ar_archive);
101    
102     /* Cleanup */
103 niro 816 if (ENABLE_FEATURE_CLEAN_UP)
104     close(ar_archive->src_fd);
105 niro 532
106     return EXIT_SUCCESS;
107     }