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 /libbb | |
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 'libbb')
-rw-r--r-- | libbb/deb_extract.c | 122 | ||||
-rw-r--r-- | libbb/libbb.h | 2 |
2 files changed, 123 insertions, 1 deletions
diff --git a/libbb/deb_extract.c b/libbb/deb_extract.c new file mode 100644 index 000000000..358c4d0a8 --- /dev/null +++ b/libbb/deb_extract.c | |||
@@ -0,0 +1,122 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * Copyright (C) tons of folks. Tracking down who wrote what | ||
4 | * isn't something I'm going to worry about... If you wrote something | ||
5 | * here, please feel free to acknowledge your work. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | * Based in part on code from sash, Copyright (c) 1999 by David I. Bell | ||
22 | * Permission has been granted to redistribute this code under the GPL. | ||
23 | * | ||
24 | */ | ||
25 | |||
26 | #include <fcntl.h> | ||
27 | #include <unistd.h> | ||
28 | #include <stdlib.h> | ||
29 | #include <signal.h> | ||
30 | #include "libbb.h" | ||
31 | |||
32 | /* From gunzip.c */ | ||
33 | extern int gz_open(FILE *compressed_file, int *pid); | ||
34 | extern void gz_close(int gunzip_pid); | ||
35 | |||
36 | extern int tar_unzip_init(int tarFd); | ||
37 | extern int readTarFile(int tarFd, int extractFlag, int listFlag, | ||
38 | int tostdoutFlag, int verboseFlag, char** extractList, char** excludeList); | ||
39 | |||
40 | extern int deb_extract(int optflags, const char *dir_name, const char *deb_filename) | ||
41 | { | ||
42 | const int dpkg_deb_contents = 1; | ||
43 | const int dpkg_deb_control = 2; | ||
44 | // const int dpkg_deb_info = 4; | ||
45 | const int dpkg_deb_extract = 8; | ||
46 | const int dpkg_deb_verbose_extract = 16; | ||
47 | const int dpkg_deb_list = 32; | ||
48 | |||
49 | char **extract_list = NULL; | ||
50 | ar_headers_t *ar_headers = NULL; | ||
51 | char ar_filename[15]; | ||
52 | int extract_flag = FALSE; | ||
53 | int list_flag = FALSE; | ||
54 | int verbose_flag = FALSE; | ||
55 | int extract_to_stdout = FALSE; | ||
56 | int srcFd = 0; | ||
57 | int status; | ||
58 | pid_t pid; | ||
59 | FILE *comp_file = NULL; | ||
60 | |||
61 | if (dpkg_deb_contents == (dpkg_deb_contents & optflags)) { | ||
62 | strcpy(ar_filename, "data.tar.gz"); | ||
63 | verbose_flag = TRUE; | ||
64 | list_flag = TRUE; | ||
65 | } | ||
66 | if (dpkg_deb_list == (dpkg_deb_list & optflags)) { | ||
67 | strcpy(ar_filename, "data.tar.gz"); | ||
68 | list_flag = TRUE; | ||
69 | } | ||
70 | if (dpkg_deb_control == (dpkg_deb_control & optflags)) { | ||
71 | strcpy(ar_filename, "control.tar.gz"); | ||
72 | extract_flag = TRUE; | ||
73 | } | ||
74 | if (dpkg_deb_extract == (dpkg_deb_extract & optflags)) { | ||
75 | strcpy(ar_filename, "data.tar.gz"); | ||
76 | extract_flag = TRUE; | ||
77 | } | ||
78 | if (dpkg_deb_verbose_extract == (dpkg_deb_verbose_extract & optflags)) { | ||
79 | strcpy(ar_filename, "data.tar.gz"); | ||
80 | extract_flag = TRUE; | ||
81 | list_flag = TRUE; | ||
82 | } | ||
83 | |||
84 | ar_headers = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); | ||
85 | srcFd = open(deb_filename, O_RDONLY); | ||
86 | |||
87 | *ar_headers = get_ar_headers(srcFd); | ||
88 | if (ar_headers->next == NULL) { | ||
89 | error_msg_and_die("Couldnt find %s in %s", ar_filename, deb_filename); | ||
90 | } | ||
91 | |||
92 | while (ar_headers->next != NULL) { | ||
93 | if (strcmp(ar_headers->name, ar_filename) == 0) { | ||
94 | break; | ||
95 | } | ||
96 | ar_headers = ar_headers->next; | ||
97 | } | ||
98 | lseek(srcFd, ar_headers->offset, SEEK_SET); | ||
99 | /* Uncompress the file */ | ||
100 | comp_file = fdopen(srcFd, "r"); | ||
101 | if ((srcFd = gz_open(comp_file, &pid)) == EXIT_FAILURE) { | ||
102 | error_msg_and_die("Couldnt unzip file"); | ||
103 | } | ||
104 | if ( dir_name != NULL) { | ||
105 | if (is_directory(dir_name, TRUE, NULL)==FALSE) { | ||
106 | mkdir(dir_name, 0755); | ||
107 | } | ||
108 | if (chdir(dir_name)==-1) { | ||
109 | error_msg_and_die("Cannot change to dir %s", dir_name); | ||
110 | } | ||
111 | } | ||
112 | status = readTarFile(srcFd, extract_flag, list_flag, | ||
113 | extract_to_stdout, verbose_flag, NULL, extract_list); | ||
114 | |||
115 | /* we are deliberately terminating the child so we can safely ignore this */ | ||
116 | signal(SIGTERM, SIG_IGN); | ||
117 | gz_close(pid); | ||
118 | close(srcFd); | ||
119 | fclose(comp_file); | ||
120 | |||
121 | return status; | ||
122 | } \ No newline at end of file | ||
diff --git a/libbb/libbb.h b/libbb/libbb.h index 649fe11c1..06215d12b 100644 --- a/libbb/libbb.h +++ b/libbb/libbb.h | |||
@@ -226,5 +226,5 @@ typedef struct ar_headers_s { | |||
226 | struct ar_headers_s *next; | 226 | struct ar_headers_s *next; |
227 | } ar_headers_t; | 227 | } ar_headers_t; |
228 | extern ar_headers_t get_ar_headers(int srcFd); | 228 | extern ar_headers_t get_ar_headers(int srcFd); |
229 | 229 | extern int deb_extract(int optflags, const char *dir_name, const char *deb_filename); | |
230 | #endif /* __LIBBB_H__ */ | 230 | #endif /* __LIBBB_H__ */ |