Applied patch from Vladimir Oleynik via Magnus Damm that removes newlines from
[oweals/busybox.git] / dpkg_deb.c
index 35904950fd891909fd1c572862eac0c10508ad8b..c0843818915451ac87bbb6910081fd55ea86c078 100644 (file)
  *  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>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
 #include "busybox.h"
 
 typedef struct ar_headers_s {
@@ -30,33 +37,89 @@ 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;
+static const int dpkg_deb_contents = 1;
+static 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;  
+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;
-       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_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);
        
-       while ((opt = getopt(argc, argv, "cexX")) != -1) {
+       *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, "cexXl")) != -1) {
                switch (opt) {
                        case 'c':
                                optflag |= dpkg_deb_contents;
@@ -64,45 +127,37 @@ 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 'l':
+                               optflag |= dpkg_deb_list;
                                break;
+/*                     case 'I':
+                               optflag |= dpkg_deb_info;
+                               break;
+*/
                        default:
-                               usage(dpkg_deb_usage);
-                               return EXIT_FAILURE;
+                               show_usage();
                }
        }
 
        if (((optind + 1 ) > argc) || (optflag == 0))  {
-               usage(dpkg_deb_usage);
-               return(EXIT_FAILURE);
+               show_usage();
        }
-       
-       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;
@@ -111,50 +166,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\n");
-               }
-               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\n");
-               }
-               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\n",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\n",argv[optind+1]);
-               }
-       }
-       status = readTarFile(srcFd, extract_flag, list_flag, extract_to_stdout, verbose_flag, NULL, extract_list);
-       close (srcFd);
        return(EXIT_SUCCESS);
 }