Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (show 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 /* 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 }