Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (hide annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 8 months ago) by niro
File MIME type: text/plain
File size: 2627 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd

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     #include "busybox.h"
8     #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     int dpkg_deb_main(int argc, char **argv)
17     {
18     archive_handle_t *ar_archive;
19     archive_handle_t *tar_archive;
20     llist_t *control_tar_llist = NULL;
21     unsigned opt;
22     char *extract_dir = NULL;
23     short argcount = 1;
24    
25     /* Setup the tar archive handle */
26     tar_archive = init_handle();
27    
28     /* Setup an ar archive handle that refers to the gzip sub archive */
29     ar_archive = init_handle();
30     ar_archive->sub_archive = tar_archive;
31     ar_archive->filter = filter_accept_list_reassign;
32    
33     #ifdef CONFIG_FEATURE_DEB_TAR_GZ
34     llist_add_to(&(ar_archive->accept), "data.tar.gz");
35     llist_add_to(&control_tar_llist, "control.tar.gz");
36     #endif
37    
38     #ifdef CONFIG_FEATURE_DEB_TAR_BZ2
39     llist_add_to(&(ar_archive->accept), "data.tar.bz2");
40     llist_add_to(&control_tar_llist, "control.tar.bz2");
41     #endif
42    
43     opt_complementary = "?c--efXx:e--cfXx:f--ceXx:X--cefx:x--cefX";
44     opt = getopt32(argc, argv, "cefXx");
45    
46     if (opt & DPKG_DEB_OPT_CONTENTS) {
47     tar_archive->action_header = header_verbose_list;
48     }
49     if (opt & DPKG_DEB_OPT_CONTROL) {
50     ar_archive->accept = control_tar_llist;
51     tar_archive->action_data = data_extract_all;
52     if (optind + 1 == argc) {
53     extract_dir = "./DEBIAN";
54     } else {
55     argcount++;
56     }
57     }
58     if (opt & DPKG_DEB_OPT_FIELD) {
59     /* Print the entire control file
60     * it should accept a second argument which specifies a
61     * specific field to print */
62     ar_archive->accept = control_tar_llist;
63     llist_add_to(&(tar_archive->accept), "./control");
64     tar_archive->filter = filter_accept_list;
65     tar_archive->action_data = data_extract_to_stdout;
66     }
67     if (opt & DPKG_DEB_OPT_EXTRACT) {
68     tar_archive->action_header = header_list;
69     }
70     if (opt & (DPKG_DEB_OPT_EXTRACT_VERBOSE | DPKG_DEB_OPT_EXTRACT)) {
71     tar_archive->action_data = data_extract_all;
72     argcount = 2;
73     }
74    
75     if ((optind + argcount) != argc) {
76     bb_show_usage();
77     }
78    
79     tar_archive->src_fd = ar_archive->src_fd = xopen(argv[optind++], O_RDONLY);
80    
81     /* Workout where to extract the files */
82     /* 2nd argument is a dir name */
83     if (argv[optind]) {
84     extract_dir = argv[optind];
85     }
86     if (extract_dir) {
87     mkdir(extract_dir, 0777); /* bb_make_directory(extract_dir, 0777, 0) */
88     xchdir(extract_dir);
89     }
90     unpack_ar_archive(ar_archive);
91    
92     /* Cleanup */
93     close(ar_archive->src_fd);
94    
95     return EXIT_SUCCESS;
96     }