diff options
Diffstat (limited to 'archival')
-rw-r--r-- | archival/dpkg_deb.c | 171 |
1 files changed, 86 insertions, 85 deletions
diff --git a/archival/dpkg_deb.c b/archival/dpkg_deb.c index 3345c273f..32ef4ca75 100644 --- a/archival/dpkg_deb.c +++ b/archival/dpkg_deb.c @@ -14,6 +14,10 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/* + * Merge this applet into dpkg when dpkg becomes more stable + */ + #include <stdio.h> #include <stdlib.h> #include <fcntl.h> @@ -33,31 +37,82 @@ typedef struct ar_headers_s { struct ar_headers_s *next; } ar_headers_t; -extern ar_headers_t get_headers(int srcFd); +extern ar_headers_t get_ar_headers(int srcFd); extern int tar_unzip_init(int tarFd); extern int readTarFile(int tarFd, int extractFlag, int listFlag, - int tostdoutFlag, int verboseFlag, char** extractList, - char** excludeList); + int tostdoutFlag, int verboseFlag, char** extractList, char** excludeList); -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_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; - int opt=0; - int optflag=0; +const int dpkg_deb_extract = 8; +const int dpkg_deb_verbose_extract = 16; + +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; - char ar_filename[15]; - int srcFd=0; - int status=0; - ar_headers_t *ar_headers = NULL; - char **extract_list=NULL; - char *target_dir=NULL; + int srcFd = 0; + int status; + + if (dpkg_deb_contents == (dpkg_deb_contents & optflags)) { + strcpy(ar_filename, "data.tar.gz"); + verbose_flag = TRUE; + 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); + srcFd = tar_unzip_init(srcFd); + 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); + + return status; +} + +extern int dpkg_deb_main(int argc, char **argv) +{ + char *target_dir = NULL; + int opt = 0; + int optflag = 0; while ((opt = getopt(argc, argv, "cexX")) != -1) { switch (opt) { @@ -67,16 +122,16 @@ extern int dpkg_deb_main(int argc, char **argv) case 'e': optflag |= dpkg_deb_control; break; -/* case 'I': - optflag |= dpkg_deb_info; + case 'X': + optflag |= dpkg_deb_verbose_extract; break; -*/ case 'x': optflag |= dpkg_deb_extract; break; - case 'X': - optflag |= dpkg_deb_verbose_extract; +/* case 'I': + optflag |= dpkg_deb_info; break; +*/ default: usage(dpkg_deb_usage); return EXIT_FAILURE; @@ -87,25 +142,16 @@ extern int dpkg_deb_main(int argc, char **argv) usage(dpkg_deb_usage); return(EXIT_FAILURE); } - - if (optflag & dpkg_deb_contents) { - list_flag = TRUE; - verbose_flag = TRUE; - strcpy(ar_filename, "data.tar.gz"); - } - else if (optflag & dpkg_deb_control) { - extract_flag = TRUE; - strcpy(ar_filename, "control.tar.gz"); - if ( (optind + 1) == argc ) { - target_dir = (char *) xmalloc(7); - strcpy(target_dir, "DEBIAN"); - } - else { - target_dir = (char *) xmalloc(strlen(argv[optind+1])); - - strcpy(target_dir, argv[optind+1]); - } + if ((optflag & dpkg_deb_control) || (optflag & dpkg_deb_extract) || (optflag & dpkg_deb_verbose_extract)) { + if ( (optind + 1) == argc ) { + target_dir = (char *) xmalloc(7); + strcpy(target_dir, "DEBIAN"); + } else { + target_dir = (char *) xmalloc(strlen(argv[optind + 1])); + strcpy(target_dir, argv[optind + 1]); + } } + deb_extract(optflag, target_dir, argv[optind]); /* else if (optflag & dpkg_deb_info) { extract_flag = TRUE; extract_to_stdout = TRUE; @@ -114,50 +160,5 @@ extern int dpkg_deb_main(int argc, char **argv) printf("list one is [%s]\n",extract_list[0]); } */ - else if (optflag & dpkg_deb_extract) { - extract_flag = TRUE; - strcpy(ar_filename, "data.tar.gz"); - if ( (optind + 2) > argc ) { - error_msg_and_die("No directory specified"); - } - target_dir = (char *) xmalloc(strlen(argv[optind+1])); - strcpy(target_dir, argv[optind+1]); - } - else if (optflag & dpkg_deb_verbose_extract) { - extract_flag = TRUE; - list_flag = TRUE; - strcpy(ar_filename, "data.tar.gz"); - if ( (optind + 2) > argc ) { - error_msg_and_die("No directory specified"); - } - target_dir = (char *) xmalloc(strlen(argv[optind+1])); - strcpy(target_dir, argv[optind+1]); - } - - ar_headers = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); - srcFd = open(argv[optind], O_RDONLY); - - *ar_headers = get_headers(srcFd); - if (ar_headers->next==NULL) - error_msg_and_die("Couldnt find %s in %s", ar_filename, argv[optind]); - - 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); - srcFd = tar_unzip_init(srcFd); - if ( target_dir != NULL) { - if (is_directory(target_dir, TRUE, NULL)==FALSE) { - mkdir(target_dir, 0755); - } - if (chdir(target_dir)==-1) { - error_msg_and_die("Cannot change to dir %s", argv[optind+1]); - } - } - status = readTarFile(srcFd, extract_flag, list_flag, extract_to_stdout, verbose_flag, NULL, extract_list); - close (srcFd); return(EXIT_SUCCESS); } |