From f397f763bf6c496c36fa24402af9638a110bfd03 Mon Sep 17 00:00:00 2001
From: bug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277>
Date: Wed, 11 Apr 2001 01:37:03 +0000
Subject: Move get_ar_headers to libbb, make dpkg_deb.c independent of ar.c

git-svn-id: svn://busybox.net/trunk/busybox@2305 69ca8d6d-28ef-0310-b511-8ec308f3f277
---
 Makefile               |  21 ++++-----
 ar.c                   | 102 ------------------------------------------
 archival/ar.c          | 102 ------------------------------------------
 archival/dpkg_deb.c    |  12 -----
 dpkg_deb.c             |  12 -----
 include/libbb.h        |  12 +++++
 libbb/get_ar_headers.c | 118 +++++++++++++++++++++++++++++++++++++++++++++++++
 libbb/libbb.h          |  12 +++++
 8 files changed, 153 insertions(+), 238 deletions(-)
 create mode 100644 libbb/get_ar_headers.c

diff --git a/Makefile b/Makefile
index 2c0d420ef..3b6b910ed 100644
--- 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 89c43b43d..fbbc7aa64 100644
--- a/ar.c
+++ b/ar.c
@@ -23,113 +23,11 @@
  *
  */
 #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 */
diff --git a/archival/ar.c b/archival/ar.c
index 89c43b43d..fbbc7aa64 100644
--- a/archival/ar.c
+++ b/archival/ar.c
@@ -23,113 +23,11 @@
  *
  */
 #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 */
diff --git a/archival/dpkg_deb.c b/archival/dpkg_deb.c
index 8239c3c43..9f78e642c 100644
--- a/archival/dpkg_deb.c
+++ b/archival/dpkg_deb.c
@@ -31,18 +31,6 @@
 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);
diff --git a/dpkg_deb.c b/dpkg_deb.c
index 8239c3c43..9f78e642c 100644
--- a/dpkg_deb.c
+++ b/dpkg_deb.c
@@ -31,18 +31,6 @@
 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);
diff --git a/include/libbb.h b/include/libbb.h
index 6133b19d3..649fe11c1 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -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
index 000000000..cf7de5c2a
--- /dev/null
+++ b/libbb/get_ar_headers.c
@@ -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
diff --git a/libbb/libbb.h b/libbb/libbb.h
index 6133b19d3..649fe11c1 100644
--- a/libbb/libbb.h
+++ b/libbb/libbb.h
@@ -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__ */
-- 
cgit v1.2.3-55-g6feb