diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2001-04-11 02:12:08 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2001-04-11 02:12:08 +0000 |
commit | d22e560ad6a3fe8bfbd23519935a1942cd510758 (patch) | |
tree | ed446649c33a8564e6a21236232be3873aea2c22 /archival/dpkg_deb.c | |
parent | 9d53c8ab74ecb2be62ebf4c61350b842787cc6b9 (diff) | |
download | busybox-w32-d22e560ad6a3fe8bfbd23519935a1942cd510758.tar.gz busybox-w32-d22e560ad6a3fe8bfbd23519935a1942cd510758.tar.bz2 busybox-w32-d22e560ad6a3fe8bfbd23519935a1942cd510758.zip |
Move deb_extract() to libbb, dpkg now independent of dpkg-deb
Diffstat (limited to 'archival/dpkg_deb.c')
-rw-r--r-- | archival/dpkg_deb.c | 109 |
1 files changed, 7 insertions, 102 deletions
diff --git a/archival/dpkg_deb.c b/archival/dpkg_deb.c index 9f78e642c..450b04b8e 100644 --- a/archival/dpkg_deb.c +++ b/archival/dpkg_deb.c | |||
@@ -14,113 +14,18 @@ | |||
14 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 14 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | /* | ||
18 | * Merge this applet into dpkg when dpkg becomes more stable | ||
19 | */ | ||
20 | |||
21 | #include <stdio.h> | ||
22 | #include <stdlib.h> | 17 | #include <stdlib.h> |
23 | #include <fcntl.h> | 18 | #include <getopt.h> |
24 | #include <unistd.h> | ||
25 | #include <string.h> | ||
26 | #include <stdlib.h> | ||
27 | #include <signal.h> | ||
28 | #include "busybox.h" | 19 | #include "busybox.h" |
29 | 20 | ||
30 | /* From gunzip.c */ | ||
31 | extern int gz_open(FILE *compressed_file, int *pid); | ||
32 | extern void gz_close(int gunzip_pid); | ||
33 | |||
34 | extern int tar_unzip_init(int tarFd); | ||
35 | extern int readTarFile(int tarFd, int extractFlag, int listFlag, | ||
36 | int tostdoutFlag, int verboseFlag, char** extractList, char** excludeList); | ||
37 | |||
38 | static const int dpkg_deb_contents = 1; | ||
39 | static const int dpkg_deb_control = 2; | ||
40 | // const int dpkg_deb_info = 4; | ||
41 | static const int dpkg_deb_extract = 8; | ||
42 | static const int dpkg_deb_verbose_extract = 16; | ||
43 | static const int dpkg_deb_list = 32; | ||
44 | |||
45 | extern int deb_extract(int optflags, const char *dir_name, const char *deb_filename) | ||
46 | { | ||
47 | char **extract_list = NULL; | ||
48 | ar_headers_t *ar_headers = NULL; | ||
49 | char ar_filename[15]; | ||
50 | int extract_flag = FALSE; | ||
51 | int list_flag = FALSE; | ||
52 | int verbose_flag = FALSE; | ||
53 | int extract_to_stdout = FALSE; | ||
54 | int srcFd = 0; | ||
55 | int status; | ||
56 | pid_t pid; | ||
57 | FILE *comp_file = NULL; | ||
58 | |||
59 | if (dpkg_deb_contents == (dpkg_deb_contents & optflags)) { | ||
60 | strcpy(ar_filename, "data.tar.gz"); | ||
61 | verbose_flag = TRUE; | ||
62 | list_flag = TRUE; | ||
63 | } | ||
64 | if (dpkg_deb_list == (dpkg_deb_list & optflags)) { | ||
65 | strcpy(ar_filename, "data.tar.gz"); | ||
66 | list_flag = TRUE; | ||
67 | } | ||
68 | if (dpkg_deb_control == (dpkg_deb_control & optflags)) { | ||
69 | strcpy(ar_filename, "control.tar.gz"); | ||
70 | extract_flag = TRUE; | ||
71 | } | ||
72 | if (dpkg_deb_extract == (dpkg_deb_extract & optflags)) { | ||
73 | strcpy(ar_filename, "data.tar.gz"); | ||
74 | extract_flag = TRUE; | ||
75 | } | ||
76 | if (dpkg_deb_verbose_extract == (dpkg_deb_verbose_extract & optflags)) { | ||
77 | strcpy(ar_filename, "data.tar.gz"); | ||
78 | extract_flag = TRUE; | ||
79 | list_flag = TRUE; | ||
80 | } | ||
81 | |||
82 | ar_headers = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); | ||
83 | srcFd = open(deb_filename, O_RDONLY); | ||
84 | |||
85 | *ar_headers = get_ar_headers(srcFd); | ||
86 | if (ar_headers->next == NULL) { | ||
87 | error_msg_and_die("Couldnt find %s in %s", ar_filename, deb_filename); | ||
88 | } | ||
89 | |||
90 | while (ar_headers->next != NULL) { | ||
91 | if (strcmp(ar_headers->name, ar_filename) == 0) { | ||
92 | break; | ||
93 | } | ||
94 | ar_headers = ar_headers->next; | ||
95 | } | ||
96 | lseek(srcFd, ar_headers->offset, SEEK_SET); | ||
97 | /* Uncompress the file */ | ||
98 | comp_file = fdopen(srcFd, "r"); | ||
99 | if ((srcFd = gz_open(comp_file, &pid)) == EXIT_FAILURE) { | ||
100 | error_msg_and_die("Couldnt unzip file"); | ||
101 | } | ||
102 | if ( dir_name != NULL) { | ||
103 | if (is_directory(dir_name, TRUE, NULL)==FALSE) { | ||
104 | mkdir(dir_name, 0755); | ||
105 | } | ||
106 | if (chdir(dir_name)==-1) { | ||
107 | error_msg_and_die("Cannot change to dir %s", dir_name); | ||
108 | } | ||
109 | } | ||
110 | status = readTarFile(srcFd, extract_flag, list_flag, | ||
111 | extract_to_stdout, verbose_flag, NULL, extract_list); | ||
112 | |||
113 | /* we are deliberately terminating the child so we can safely ignore this */ | ||
114 | signal(SIGTERM, SIG_IGN); | ||
115 | gz_close(pid); | ||
116 | close(srcFd); | ||
117 | fclose(comp_file); | ||
118 | |||
119 | return status; | ||
120 | } | ||
121 | |||
122 | extern int dpkg_deb_main(int argc, char **argv) | 21 | extern int dpkg_deb_main(int argc, char **argv) |
123 | { | 22 | { |
23 | const int dpkg_deb_contents = 1; | ||
24 | const int dpkg_deb_control = 2; | ||
25 | // const int dpkg_deb_info = 4; | ||
26 | const int dpkg_deb_extract = 8; | ||
27 | const int dpkg_deb_verbose_extract = 16; | ||
28 | const int dpkg_deb_list = 32; | ||
124 | char *target_dir = NULL; | 29 | char *target_dir = NULL; |
125 | int opt = 0; | 30 | int opt = 0; |
126 | int optflag = 0; | 31 | int optflag = 0; |