Move get_ar_headers to libbb, make dpkg_deb.c independent of ar.c
authorGlenn L McGrath <bug1@ihug.co.nz>
Wed, 11 Apr 2001 01:37:03 +0000 (01:37 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Wed, 11 Apr 2001 01:37:03 +0000 (01:37 -0000)
Makefile
ar.c
archival/ar.c
archival/dpkg_deb.c
dpkg_deb.c
include/libbb.h
libbb/get_ar_headers.c [new file with mode: 0644]
libbb/libbb.h

index 2c0d420ef63abd372c4516e2676cf2aba4961917..3b6b910eda551f5b87f0fdc843ccb031bfa403b0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -235,17 +235,18 @@ endif
     
 LIBBB    = libbb
 LIBBB_LIB = libbb.a
-LIBBB_CSRC= ask_confirmation.c check_wildcard_match.c chomp.c copy_file.c \
-copy_file_chunk.c create_path.c daemon.c device_open.c error_msg.c \
-find_mount_point.c find_pid_by_name.c find_root_device.c full_read.c \
-full_write.c get_console.c get_last_path_component.c get_line_from_file.c \
+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 parse_mode.c parse_number.c print_file.c process_escape_sequence.c \
-my_getgrgid.c my_getpwnamegid.c my_getpwuid.c my_getgrnam.c my_getpwnam.c \
-recursive_action.c safe_read.c safe_strncpy.c syscalls.c module_syscalls.c \
-syslog_msg_with_name.c time_string.c trim.c vdprintf.c wfopen.c xfuncs.c \
-xregcomp.c error_msg_and_die.c perror_msg.c perror_msg_and_die.c \
-verror_msg.c vperror_msg.c mtab.c mtab_file.c xgetcwd.c concat_path_file.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
 
 LIBBB_OBJS=$(patsubst %.c,$(LIBBB)/%.o, $(LIBBB_CSRC))
 LIBBB_CFLAGS = -I$(LIBBB)
diff --git a/ar.c b/ar.c
index 89c43b43d466131e78ce594ce0b7794e0202bb64..fbbc7aa64df04339b9b8037eb116579ada62f34b 100644 (file)
--- a/ar.c
+++ b/ar.c
  *
  */
 #include <fcntl.h>
-#include <string.h>
 #include <stdlib.h>
 #include <getopt.h>
 #include <unistd.h>
 #include "busybox.h"
 
-typedef struct ar_headers_s {
-       char *name;
-       off_t size;
-       uid_t uid;
-       gid_t gid;
-       mode_t mode;
-       time_t mtime;
-       off_t offset;
-       struct ar_headers_s *next;
-} ar_headers_t;
-
-/*
- * return the headerL_t struct for the filename descriptor
- */
-extern ar_headers_t get_ar_headers(int srcFd)
-{
-       typedef struct raw_ar_header_s {        /* Byte Offset */
-               char name[16];  /*  0-15 */
-               char date[12];  /* 16-27 */
-               char uid[6];    
-               char gid[6];    /* 28-39 */
-               char mode[8];   /* 40-47 */
-               char size[10];  /* 48-57 */
-               char fmag[2];   /* 58-59 */
-       } raw_ar_header_t;
-
-       raw_ar_header_t raw_ar_header;
-
-       ar_headers_t *head, *entry;
-       char ar_magic[8];
-       char *long_name=NULL;
-       
-       head = (ar_headers_t *) xmalloc(sizeof(ar_headers_t));
-       entry = (ar_headers_t *) xmalloc(sizeof(ar_headers_t));
-       
-       /* check ar magic */
-       if (full_read(srcFd, ar_magic, 8) != 8) {
-               error_msg_and_die("cannot read magic");
-       }
-
-       if (strncmp(ar_magic,"!<arch>",7) != 0) {
-               error_msg_and_die("invalid magic");
-       }
-
-       while (full_read(srcFd, (char *) &raw_ar_header, 60)==60) {
-               /* check the end of header markers are valid */
-               if ((raw_ar_header.fmag[0]!='`') || (raw_ar_header.fmag[1]!='\n')) {
-                       char newline;
-                       if (raw_ar_header.fmag[1]!='`') {
-                               break;
-                       }
-                       /* some version of ar, have an extra '\n' after each entry */
-                       read(srcFd, &newline, 1);
-                       if (newline!='\n') {
-                               break;
-                       }
-                       /* fix up the header, we started reading 1 byte too early due to a '\n' */
-                       memmove((char *) &raw_ar_header, (char *)&raw_ar_header+1, 59);
-                       /* dont worry about adding the last '\n', we dont need it now */
-               }
-               
-               entry->size = (off_t) atoi(raw_ar_header.size);
-               /* long filenames have '/' as the first character */
-               if (raw_ar_header.name[0] == '/') {
-                       if (raw_ar_header.name[1] == '/') {
-                               /* multiple long filenames are stored as data in one entry */
-                               long_name = (char *) xrealloc(long_name, entry->size);
-                               full_read(srcFd, long_name, entry->size);
-                               continue;
-                       }
-                       else {
-                               /* The number after the '/' indicates the offset in the ar data section
-                                       (saved in variable long_name) that conatains the real filename */
-                               const int long_name_offset = (int) atoi((char *) &raw_ar_header.name[1]);
-                               entry->name = xmalloc(strlen(&long_name[long_name_offset]));
-                               strcpy(entry->name, &long_name[long_name_offset]);
-                       }
-               }
-               else {
-                       /* short filenames */
-                       entry->name = xmalloc(16);
-                       strncpy(entry->name, raw_ar_header.name, 16);
-               }
-               entry->name[strcspn(entry->name, " /")]='\0';
-
-               /* convert the rest of the now valid char header to its typed struct */ 
-               parse_mode(raw_ar_header.mode, &entry->mode);
-               entry->mtime = atoi(raw_ar_header.date);
-               entry->uid = atoi(raw_ar_header.uid);
-               entry->gid = atoi(raw_ar_header.gid);
-               entry->offset = lseek(srcFd, 0, SEEK_CUR);
-
-               /* add this entries header to our combined list */
-               entry->next = (ar_headers_t *) xmalloc(sizeof(ar_headers_t));
-               *entry->next = *head;
-               *head = *entry;
-               lseek(srcFd, (off_t) entry->size, SEEK_CUR);
-       }
-       return(*head);
-}
-
 extern int ar_main(int argc, char **argv)
 {
        const int preserve_date = 1;    /* preserve original dates */
index 89c43b43d466131e78ce594ce0b7794e0202bb64..fbbc7aa64df04339b9b8037eb116579ada62f34b 100644 (file)
  *
  */
 #include <fcntl.h>
-#include <string.h>
 #include <stdlib.h>
 #include <getopt.h>
 #include <unistd.h>
 #include "busybox.h"
 
-typedef struct ar_headers_s {
-       char *name;
-       off_t size;
-       uid_t uid;
-       gid_t gid;
-       mode_t mode;
-       time_t mtime;
-       off_t offset;
-       struct ar_headers_s *next;
-} ar_headers_t;
-
-/*
- * return the headerL_t struct for the filename descriptor
- */
-extern ar_headers_t get_ar_headers(int srcFd)
-{
-       typedef struct raw_ar_header_s {        /* Byte Offset */
-               char name[16];  /*  0-15 */
-               char date[12];  /* 16-27 */
-               char uid[6];    
-               char gid[6];    /* 28-39 */
-               char mode[8];   /* 40-47 */
-               char size[10];  /* 48-57 */
-               char fmag[2];   /* 58-59 */
-       } raw_ar_header_t;
-
-       raw_ar_header_t raw_ar_header;
-
-       ar_headers_t *head, *entry;
-       char ar_magic[8];
-       char *long_name=NULL;
-       
-       head = (ar_headers_t *) xmalloc(sizeof(ar_headers_t));
-       entry = (ar_headers_t *) xmalloc(sizeof(ar_headers_t));
-       
-       /* check ar magic */
-       if (full_read(srcFd, ar_magic, 8) != 8) {
-               error_msg_and_die("cannot read magic");
-       }
-
-       if (strncmp(ar_magic,"!<arch>",7) != 0) {
-               error_msg_and_die("invalid magic");
-       }
-
-       while (full_read(srcFd, (char *) &raw_ar_header, 60)==60) {
-               /* check the end of header markers are valid */
-               if ((raw_ar_header.fmag[0]!='`') || (raw_ar_header.fmag[1]!='\n')) {
-                       char newline;
-                       if (raw_ar_header.fmag[1]!='`') {
-                               break;
-                       }
-                       /* some version of ar, have an extra '\n' after each entry */
-                       read(srcFd, &newline, 1);
-                       if (newline!='\n') {
-                               break;
-                       }
-                       /* fix up the header, we started reading 1 byte too early due to a '\n' */
-                       memmove((char *) &raw_ar_header, (char *)&raw_ar_header+1, 59);
-                       /* dont worry about adding the last '\n', we dont need it now */
-               }
-               
-               entry->size = (off_t) atoi(raw_ar_header.size);
-               /* long filenames have '/' as the first character */
-               if (raw_ar_header.name[0] == '/') {
-                       if (raw_ar_header.name[1] == '/') {
-                               /* multiple long filenames are stored as data in one entry */
-                               long_name = (char *) xrealloc(long_name, entry->size);
-                               full_read(srcFd, long_name, entry->size);
-                               continue;
-                       }
-                       else {
-                               /* The number after the '/' indicates the offset in the ar data section
-                                       (saved in variable long_name) that conatains the real filename */
-                               const int long_name_offset = (int) atoi((char *) &raw_ar_header.name[1]);
-                               entry->name = xmalloc(strlen(&long_name[long_name_offset]));
-                               strcpy(entry->name, &long_name[long_name_offset]);
-                       }
-               }
-               else {
-                       /* short filenames */
-                       entry->name = xmalloc(16);
-                       strncpy(entry->name, raw_ar_header.name, 16);
-               }
-               entry->name[strcspn(entry->name, " /")]='\0';
-
-               /* convert the rest of the now valid char header to its typed struct */ 
-               parse_mode(raw_ar_header.mode, &entry->mode);
-               entry->mtime = atoi(raw_ar_header.date);
-               entry->uid = atoi(raw_ar_header.uid);
-               entry->gid = atoi(raw_ar_header.gid);
-               entry->offset = lseek(srcFd, 0, SEEK_CUR);
-
-               /* add this entries header to our combined list */
-               entry->next = (ar_headers_t *) xmalloc(sizeof(ar_headers_t));
-               *entry->next = *head;
-               *head = *entry;
-               lseek(srcFd, (off_t) entry->size, SEEK_CUR);
-       }
-       return(*head);
-}
-
 extern int ar_main(int argc, char **argv)
 {
        const int preserve_date = 1;    /* preserve original dates */
index 8239c3c43a618291fbd00957c92394859a8ac386..9f78e642c87f194f76c2ce360df481b6ff8bf1d2 100644 (file)
 extern int gz_open(FILE *compressed_file, int *pid);
 extern void gz_close(int gunzip_pid);
 
-typedef struct ar_headers_s {
-       char *name;
-       size_t size;
-       uid_t uid;
-       gid_t gid;
-       mode_t mode;
-       time_t mtime;
-       off_t offset;
-       struct ar_headers_s *next;
-} ar_headers_t;
-
-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);
index 8239c3c43a618291fbd00957c92394859a8ac386..9f78e642c87f194f76c2ce360df481b6ff8bf1d2 100644 (file)
 extern int gz_open(FILE *compressed_file, int *pid);
 extern void gz_close(int gunzip_pid);
 
-typedef struct ar_headers_s {
-       char *name;
-       size_t size;
-       uid_t uid;
-       gid_t gid;
-       mode_t mode;
-       time_t mtime;
-       off_t offset;
-       struct ar_headers_s *next;
-} ar_headers_t;
-
-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);
index 6133b19d37793fd0d4f3fa1a16c011e79e5e4c5f..649fe11c149c74046a381f2bd342aea55461c43a 100644 (file)
@@ -215,4 +215,16 @@ int klogctl(int type, char * b, int len);
 char *xgetcwd(char *cwd);
 char *concat_path_file(const char *path, const char *filename);
 
+typedef struct ar_headers_s {
+       char *name;
+       off_t size;
+       uid_t uid;
+       gid_t gid;
+       mode_t mode;
+       time_t mtime;
+       off_t offset;
+       struct ar_headers_s *next;
+} ar_headers_t;
+extern ar_headers_t get_ar_headers(int srcFd);
+
 #endif /* __LIBBB_H__ */
diff --git a/libbb/get_ar_headers.c b/libbb/get_ar_headers.c
new file mode 100644 (file)
index 0000000..cf7de5c
--- /dev/null
@@ -0,0 +1,118 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Utility routines.
+ *
+ * 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 <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "libbb.h"
+
+extern ar_headers_t get_ar_headers(int srcFd)
+{
+       typedef struct raw_ar_header_s {        /* Byte Offset */
+               char name[16];  /*  0-15 */
+               char date[12];  /* 16-27 */
+               char uid[6];    
+               char gid[6];    /* 28-39 */
+               char mode[8];   /* 40-47 */
+               char size[10];  /* 48-57 */
+               char fmag[2];   /* 58-59 */
+       } raw_ar_header_t;
+
+       raw_ar_header_t raw_ar_header;
+
+       ar_headers_t *head, *entry;
+       char ar_magic[8];
+       char *long_name=NULL;
+       
+       head = (ar_headers_t *) xmalloc(sizeof(ar_headers_t));
+       entry = (ar_headers_t *) xmalloc(sizeof(ar_headers_t));
+       
+       /* check ar magic */
+       if (full_read(srcFd, ar_magic, 8) != 8) {
+               error_msg_and_die("cannot read magic");
+       }
+
+       if (strncmp(ar_magic,"!<arch>",7) != 0) {
+               error_msg_and_die("invalid magic");
+       }
+
+       while (full_read(srcFd, (char *) &raw_ar_header, 60)==60) {
+               /* check the end of header markers are valid */
+               if ((raw_ar_header.fmag[0]!='`') || (raw_ar_header.fmag[1]!='\n')) {
+                       char newline;
+                       if (raw_ar_header.fmag[1]!='`') {
+                               break;
+                       }
+                       /* some version of ar, have an extra '\n' after each entry */
+                       read(srcFd, &newline, 1);
+                       if (newline!='\n') {
+                               break;
+                       }
+                       /* fix up the header, we started reading 1 byte too early due to a '\n' */
+                       memmove((char *) &raw_ar_header, (char *)&raw_ar_header+1, 59);
+                       /* dont worry about adding the last '\n', we dont need it now */
+               }
+               
+               entry->size = (off_t) atoi(raw_ar_header.size);
+               /* long filenames have '/' as the first character */
+               if (raw_ar_header.name[0] == '/') {
+                       if (raw_ar_header.name[1] == '/') {
+                               /* multiple long filenames are stored as data in one entry */
+                               long_name = (char *) xrealloc(long_name, entry->size);
+                               full_read(srcFd, long_name, entry->size);
+                               continue;
+                       }
+                       else {
+                               /* The number after the '/' indicates the offset in the ar data section
+                                       (saved in variable long_name) that conatains the real filename */
+                               const int long_name_offset = (int) atoi((char *) &raw_ar_header.name[1]);
+                               entry->name = xmalloc(strlen(&long_name[long_name_offset]));
+                               strcpy(entry->name, &long_name[long_name_offset]);
+                       }
+               }
+               else {
+                       /* short filenames */
+                       entry->name = xmalloc(16);
+                       strncpy(entry->name, raw_ar_header.name, 16);
+               }
+               entry->name[strcspn(entry->name, " /")]='\0';
+
+               /* convert the rest of the now valid char header to its typed struct */ 
+               parse_mode(raw_ar_header.mode, &entry->mode);
+               entry->mtime = atoi(raw_ar_header.date);
+               entry->uid = atoi(raw_ar_header.uid);
+               entry->gid = atoi(raw_ar_header.gid);
+               entry->offset = lseek(srcFd, 0, SEEK_CUR);
+
+               /* add this entries header to our combined list */
+               entry->next = (ar_headers_t *) xmalloc(sizeof(ar_headers_t));
+               *entry->next = *head;
+               *head = *entry;
+               lseek(srcFd, (off_t) entry->size, SEEK_CUR);
+       }
+       return(*head);
+}
\ No newline at end of file
index 6133b19d37793fd0d4f3fa1a16c011e79e5e4c5f..649fe11c149c74046a381f2bd342aea55461c43a 100644 (file)
@@ -215,4 +215,16 @@ int klogctl(int type, char * b, int len);
 char *xgetcwd(char *cwd);
 char *concat_path_file(const char *path, const char *filename);
 
+typedef struct ar_headers_s {
+       char *name;
+       off_t size;
+       uid_t uid;
+       gid_t gid;
+       mode_t mode;
+       time_t mtime;
+       off_t offset;
+       struct ar_headers_s *next;
+} ar_headers_t;
+extern ar_headers_t get_ar_headers(int srcFd);
+
 #endif /* __LIBBB_H__ */