From d22e560ad6a3fe8bfbd23519935a1942cd510758 Mon Sep 17 00:00:00 2001 From: Glenn L McGrath Date: Wed, 11 Apr 2001 02:12:08 +0000 Subject: [PATCH] Move deb_extract() to libbb, dpkg now independent of dpkg-deb --- Makefile | 14 ++--- archival/dpkg.c | 2 +- archival/dpkg_deb.c | 109 +++------------------------------------ dpkg.c | 2 +- dpkg_deb.c | 109 +++------------------------------------ include/libbb.h | 2 +- libbb/deb_extract.c | 122 ++++++++++++++++++++++++++++++++++++++++++++ libbb/libbb.h | 2 +- 8 files changed, 147 insertions(+), 215 deletions(-) create mode 100644 libbb/deb_extract.c diff --git a/Makefile b/Makefile index 3b6b910ed..84337ba52 100644 --- a/Makefile +++ b/Makefile @@ -237,13 +237,13 @@ LIBBB = libbb LIBBB_LIB = libbb.a LIBBB_CSRC= ask_confirmation.c check_wildcard_match.c chomp.c \ concat_path_file.c copy_file.c copy_file_chunk.c create_path.c daemon.c \ -device_open.c error_msg.c error_msg_and_die.c find_mount_point.c \ -find_pid_by_name.c find_root_device.c full_read.c full_write.c \ -get_ar_headers.c get_console.c get_last_path_component.c get_line_from_file.c \ -human_readable.c inode_hash.c isdirectory.c kernel_version.c loop.c \ -mode_string.c module_syscalls.c mtab.c mtab_file.c my_getgrnam.c \ -my_getgrgid.c my_getpwnam.c my_getpwnamegid.c my_getpwuid.c parse_mode.c \ -parse_number.c perror_msg.c perror_msg_and_die.c print_file.c \ +deb_extract.c device_open.c error_msg.c error_msg_and_die.c \ +find_mount_point.c find_pid_by_name.c find_root_device.c full_read.c \ +full_write.c get_ar_headers.c get_console.c get_last_path_component.c \ +get_line_from_file.c human_readable.c inode_hash.c isdirectory.c \ +kernel_version.c loop.c mode_string.c module_syscalls.c mtab.c mtab_file.c \ +my_getgrnam.c my_getgrgid.c my_getpwnam.c my_getpwnamegid.c my_getpwuid.c \ +parse_mode.c parse_number.c perror_msg.c perror_msg_and_die.c print_file.c \ process_escape_sequence.c recursive_action.c safe_read.c safe_strncpy.c \ syscalls.c syslog_msg_with_name.c time_string.c trim.c vdprintf.c verror_msg.c \ vperror_msg.c wfopen.c xfuncs.c xgetcwd.c xregcomp.c diff --git a/archival/dpkg.c b/archival/dpkg.c index 5687e00be..55d97adda 100644 --- a/archival/dpkg.c +++ b/archival/dpkg.c @@ -31,7 +31,7 @@ #endif /* from dpkg-deb.c */ -extern int deb_extract(int optflags, const char *dir_name, const char *deb_filename); + static const int dpkg_deb_contents = 1; static const int dpkg_deb_control = 2; // const int dpkg_deb_info = 4; 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 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* - * Merge this applet into dpkg when dpkg becomes more stable - */ - -#include #include -#include -#include -#include -#include -#include +#include #include "busybox.h" -/* From gunzip.c */ -extern int gz_open(FILE *compressed_file, int *pid); -extern void gz_close(int gunzip_pid); - -extern int tar_unzip_init(int tarFd); -extern int readTarFile(int tarFd, int extractFlag, int listFlag, - int tostdoutFlag, int verboseFlag, char** extractList, char** excludeList); - -static const int dpkg_deb_contents = 1; -static const int dpkg_deb_control = 2; -// const int dpkg_deb_info = 4; -static const int dpkg_deb_extract = 8; -static const int dpkg_deb_verbose_extract = 16; -static const int dpkg_deb_list = 32; - -extern int deb_extract(int optflags, const char *dir_name, const char *deb_filename) -{ - char **extract_list = NULL; - ar_headers_t *ar_headers = NULL; - char ar_filename[15]; - int extract_flag = FALSE; - int list_flag = FALSE; - int verbose_flag = FALSE; - int extract_to_stdout = FALSE; - int srcFd = 0; - int status; - pid_t pid; - FILE *comp_file = NULL; - - if (dpkg_deb_contents == (dpkg_deb_contents & optflags)) { - strcpy(ar_filename, "data.tar.gz"); - verbose_flag = TRUE; - list_flag = TRUE; - } - if (dpkg_deb_list == (dpkg_deb_list & optflags)) { - strcpy(ar_filename, "data.tar.gz"); - list_flag = TRUE; - } - if (dpkg_deb_control == (dpkg_deb_control & optflags)) { - strcpy(ar_filename, "control.tar.gz"); - extract_flag = TRUE; - } - if (dpkg_deb_extract == (dpkg_deb_extract & optflags)) { - strcpy(ar_filename, "data.tar.gz"); - extract_flag = TRUE; - } - if (dpkg_deb_verbose_extract == (dpkg_deb_verbose_extract & optflags)) { - strcpy(ar_filename, "data.tar.gz"); - extract_flag = TRUE; - list_flag = TRUE; - } - - ar_headers = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); - srcFd = open(deb_filename, O_RDONLY); - - *ar_headers = get_ar_headers(srcFd); - if (ar_headers->next == NULL) { - error_msg_and_die("Couldnt find %s in %s", ar_filename, deb_filename); - } - - while (ar_headers->next != NULL) { - if (strcmp(ar_headers->name, ar_filename) == 0) { - break; - } - ar_headers = ar_headers->next; - } - lseek(srcFd, ar_headers->offset, SEEK_SET); - /* Uncompress the file */ - comp_file = fdopen(srcFd, "r"); - if ((srcFd = gz_open(comp_file, &pid)) == EXIT_FAILURE) { - error_msg_and_die("Couldnt unzip file"); - } - if ( dir_name != NULL) { - if (is_directory(dir_name, TRUE, NULL)==FALSE) { - mkdir(dir_name, 0755); - } - if (chdir(dir_name)==-1) { - error_msg_and_die("Cannot change to dir %s", dir_name); - } - } - status = readTarFile(srcFd, extract_flag, list_flag, - extract_to_stdout, verbose_flag, NULL, extract_list); - - /* we are deliberately terminating the child so we can safely ignore this */ - signal(SIGTERM, SIG_IGN); - gz_close(pid); - close(srcFd); - fclose(comp_file); - - return status; -} - extern int dpkg_deb_main(int argc, char **argv) { + const int dpkg_deb_contents = 1; + const int dpkg_deb_control = 2; +// const int dpkg_deb_info = 4; + const int dpkg_deb_extract = 8; + const int dpkg_deb_verbose_extract = 16; + const int dpkg_deb_list = 32; char *target_dir = NULL; int opt = 0; int optflag = 0; diff --git a/dpkg.c b/dpkg.c index 5687e00be..55d97adda 100644 --- a/dpkg.c +++ b/dpkg.c @@ -31,7 +31,7 @@ #endif /* from dpkg-deb.c */ -extern int deb_extract(int optflags, const char *dir_name, const char *deb_filename); + static const int dpkg_deb_contents = 1; static const int dpkg_deb_control = 2; // const int dpkg_deb_info = 4; diff --git a/dpkg_deb.c b/dpkg_deb.c index 9f78e642c..450b04b8e 100644 --- a/dpkg_deb.c +++ b/dpkg_deb.c @@ -14,113 +14,18 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* - * Merge this applet into dpkg when dpkg becomes more stable - */ - -#include #include -#include -#include -#include -#include -#include +#include #include "busybox.h" -/* From gunzip.c */ -extern int gz_open(FILE *compressed_file, int *pid); -extern void gz_close(int gunzip_pid); - -extern int tar_unzip_init(int tarFd); -extern int readTarFile(int tarFd, int extractFlag, int listFlag, - int tostdoutFlag, int verboseFlag, char** extractList, char** excludeList); - -static const int dpkg_deb_contents = 1; -static const int dpkg_deb_control = 2; -// const int dpkg_deb_info = 4; -static const int dpkg_deb_extract = 8; -static const int dpkg_deb_verbose_extract = 16; -static const int dpkg_deb_list = 32; - -extern int deb_extract(int optflags, const char *dir_name, const char *deb_filename) -{ - char **extract_list = NULL; - ar_headers_t *ar_headers = NULL; - char ar_filename[15]; - int extract_flag = FALSE; - int list_flag = FALSE; - int verbose_flag = FALSE; - int extract_to_stdout = FALSE; - int srcFd = 0; - int status; - pid_t pid; - FILE *comp_file = NULL; - - if (dpkg_deb_contents == (dpkg_deb_contents & optflags)) { - strcpy(ar_filename, "data.tar.gz"); - verbose_flag = TRUE; - list_flag = TRUE; - } - if (dpkg_deb_list == (dpkg_deb_list & optflags)) { - strcpy(ar_filename, "data.tar.gz"); - list_flag = TRUE; - } - if (dpkg_deb_control == (dpkg_deb_control & optflags)) { - strcpy(ar_filename, "control.tar.gz"); - extract_flag = TRUE; - } - if (dpkg_deb_extract == (dpkg_deb_extract & optflags)) { - strcpy(ar_filename, "data.tar.gz"); - extract_flag = TRUE; - } - if (dpkg_deb_verbose_extract == (dpkg_deb_verbose_extract & optflags)) { - strcpy(ar_filename, "data.tar.gz"); - extract_flag = TRUE; - list_flag = TRUE; - } - - ar_headers = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); - srcFd = open(deb_filename, O_RDONLY); - - *ar_headers = get_ar_headers(srcFd); - if (ar_headers->next == NULL) { - error_msg_and_die("Couldnt find %s in %s", ar_filename, deb_filename); - } - - while (ar_headers->next != NULL) { - if (strcmp(ar_headers->name, ar_filename) == 0) { - break; - } - ar_headers = ar_headers->next; - } - lseek(srcFd, ar_headers->offset, SEEK_SET); - /* Uncompress the file */ - comp_file = fdopen(srcFd, "r"); - if ((srcFd = gz_open(comp_file, &pid)) == EXIT_FAILURE) { - error_msg_and_die("Couldnt unzip file"); - } - if ( dir_name != NULL) { - if (is_directory(dir_name, TRUE, NULL)==FALSE) { - mkdir(dir_name, 0755); - } - if (chdir(dir_name)==-1) { - error_msg_and_die("Cannot change to dir %s", dir_name); - } - } - status = readTarFile(srcFd, extract_flag, list_flag, - extract_to_stdout, verbose_flag, NULL, extract_list); - - /* we are deliberately terminating the child so we can safely ignore this */ - signal(SIGTERM, SIG_IGN); - gz_close(pid); - close(srcFd); - fclose(comp_file); - - return status; -} - extern int dpkg_deb_main(int argc, char **argv) { + const int dpkg_deb_contents = 1; + const int dpkg_deb_control = 2; +// const int dpkg_deb_info = 4; + const int dpkg_deb_extract = 8; + const int dpkg_deb_verbose_extract = 16; + const int dpkg_deb_list = 32; char *target_dir = NULL; int opt = 0; int optflag = 0; diff --git a/include/libbb.h b/include/libbb.h index 649fe11c1..06215d12b 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -226,5 +226,5 @@ typedef struct ar_headers_s { struct ar_headers_s *next; } ar_headers_t; extern ar_headers_t get_ar_headers(int srcFd); - +extern int deb_extract(int optflags, const char *dir_name, const char *deb_filename); #endif /* __LIBBB_H__ */ 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 @@ +/* vi: set sw=4 ts=4: */ +/* + * Copyright (C) tons of folks. Tracking down who wrote what + * isn't something I'm going to worry about... If you wrote something + * here, please feel free to acknowledge your work. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Based in part on code from sash, Copyright (c) 1999 by David I. Bell + * Permission has been granted to redistribute this code under the GPL. + * + */ + +#include +#include +#include +#include +#include "libbb.h" + +/* From gunzip.c */ +extern int gz_open(FILE *compressed_file, int *pid); +extern void gz_close(int gunzip_pid); + +extern int tar_unzip_init(int tarFd); +extern int readTarFile(int tarFd, int extractFlag, int listFlag, + int tostdoutFlag, int verboseFlag, char** extractList, char** excludeList); + +extern int deb_extract(int optflags, const char *dir_name, const char *deb_filename) +{ + const int dpkg_deb_contents = 1; + const int dpkg_deb_control = 2; +// const int dpkg_deb_info = 4; + const int dpkg_deb_extract = 8; + const int dpkg_deb_verbose_extract = 16; + const int dpkg_deb_list = 32; + + char **extract_list = NULL; + ar_headers_t *ar_headers = NULL; + char ar_filename[15]; + int extract_flag = FALSE; + int list_flag = FALSE; + int verbose_flag = FALSE; + int extract_to_stdout = FALSE; + int srcFd = 0; + int status; + pid_t pid; + FILE *comp_file = NULL; + + if (dpkg_deb_contents == (dpkg_deb_contents & optflags)) { + strcpy(ar_filename, "data.tar.gz"); + verbose_flag = TRUE; + list_flag = TRUE; + } + if (dpkg_deb_list == (dpkg_deb_list & optflags)) { + strcpy(ar_filename, "data.tar.gz"); + list_flag = TRUE; + } + if (dpkg_deb_control == (dpkg_deb_control & optflags)) { + strcpy(ar_filename, "control.tar.gz"); + extract_flag = TRUE; + } + if (dpkg_deb_extract == (dpkg_deb_extract & optflags)) { + strcpy(ar_filename, "data.tar.gz"); + extract_flag = TRUE; + } + if (dpkg_deb_verbose_extract == (dpkg_deb_verbose_extract & optflags)) { + strcpy(ar_filename, "data.tar.gz"); + extract_flag = TRUE; + list_flag = TRUE; + } + + ar_headers = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); + srcFd = open(deb_filename, O_RDONLY); + + *ar_headers = get_ar_headers(srcFd); + if (ar_headers->next == NULL) { + error_msg_and_die("Couldnt find %s in %s", ar_filename, deb_filename); + } + + while (ar_headers->next != NULL) { + if (strcmp(ar_headers->name, ar_filename) == 0) { + break; + } + ar_headers = ar_headers->next; + } + lseek(srcFd, ar_headers->offset, SEEK_SET); + /* Uncompress the file */ + comp_file = fdopen(srcFd, "r"); + if ((srcFd = gz_open(comp_file, &pid)) == EXIT_FAILURE) { + error_msg_and_die("Couldnt unzip file"); + } + if ( dir_name != NULL) { + if (is_directory(dir_name, TRUE, NULL)==FALSE) { + mkdir(dir_name, 0755); + } + if (chdir(dir_name)==-1) { + error_msg_and_die("Cannot change to dir %s", dir_name); + } + } + status = readTarFile(srcFd, extract_flag, list_flag, + extract_to_stdout, verbose_flag, NULL, extract_list); + + /* we are deliberately terminating the child so we can safely ignore this */ + signal(SIGTERM, SIG_IGN); + gz_close(pid); + close(srcFd); + fclose(comp_file); + + return status; +} \ 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 { struct ar_headers_s *next; } ar_headers_t; extern ar_headers_t get_ar_headers(int srcFd); - +extern int deb_extract(int optflags, const char *dir_name, const char *deb_filename); #endif /* __LIBBB_H__ */