diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2001-04-11 01:37:03 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2001-04-11 01:37:03 +0000 |
commit | 9d53c8ab74ecb2be62ebf4c61350b842787cc6b9 (patch) | |
tree | c351bc7377b948c358f0f9c7da1f225b6f349ee3 | |
parent | 93ffa950bfd349c8d8ff40f1f862f2b7483584d4 (diff) | |
download | busybox-w32-9d53c8ab74ecb2be62ebf4c61350b842787cc6b9.tar.gz busybox-w32-9d53c8ab74ecb2be62ebf4c61350b842787cc6b9.tar.bz2 busybox-w32-9d53c8ab74ecb2be62ebf4c61350b842787cc6b9.zip |
Move get_ar_headers to libbb, make dpkg_deb.c independent of ar.c
-rw-r--r-- | Makefile | 21 | ||||
-rw-r--r-- | ar.c | 102 | ||||
-rw-r--r-- | archival/ar.c | 102 | ||||
-rw-r--r-- | archival/dpkg_deb.c | 12 | ||||
-rw-r--r-- | dpkg_deb.c | 12 | ||||
-rw-r--r-- | include/libbb.h | 12 | ||||
-rw-r--r-- | libbb/get_ar_headers.c | 118 | ||||
-rw-r--r-- | libbb/libbb.h | 12 |
8 files changed, 153 insertions, 238 deletions
@@ -235,17 +235,18 @@ endif | |||
235 | 235 | ||
236 | LIBBB = libbb | 236 | LIBBB = libbb |
237 | LIBBB_LIB = libbb.a | 237 | LIBBB_LIB = libbb.a |
238 | LIBBB_CSRC= ask_confirmation.c check_wildcard_match.c chomp.c copy_file.c \ | 238 | LIBBB_CSRC= ask_confirmation.c check_wildcard_match.c chomp.c \ |
239 | copy_file_chunk.c create_path.c daemon.c device_open.c error_msg.c \ | 239 | concat_path_file.c copy_file.c copy_file_chunk.c create_path.c daemon.c \ |
240 | find_mount_point.c find_pid_by_name.c find_root_device.c full_read.c \ | 240 | device_open.c error_msg.c error_msg_and_die.c find_mount_point.c \ |
241 | full_write.c get_console.c get_last_path_component.c get_line_from_file.c \ | 241 | find_pid_by_name.c find_root_device.c full_read.c full_write.c \ |
242 | get_ar_headers.c get_console.c get_last_path_component.c get_line_from_file.c \ | ||
242 | human_readable.c inode_hash.c isdirectory.c kernel_version.c loop.c \ | 243 | human_readable.c inode_hash.c isdirectory.c kernel_version.c loop.c \ |
243 | mode_string.c parse_mode.c parse_number.c print_file.c process_escape_sequence.c \ | 244 | mode_string.c module_syscalls.c mtab.c mtab_file.c my_getgrnam.c \ |
244 | my_getgrgid.c my_getpwnamegid.c my_getpwuid.c my_getgrnam.c my_getpwnam.c \ | 245 | my_getgrgid.c my_getpwnam.c my_getpwnamegid.c my_getpwuid.c parse_mode.c \ |
245 | recursive_action.c safe_read.c safe_strncpy.c syscalls.c module_syscalls.c \ | 246 | parse_number.c perror_msg.c perror_msg_and_die.c print_file.c \ |
246 | syslog_msg_with_name.c time_string.c trim.c vdprintf.c wfopen.c xfuncs.c \ | 247 | process_escape_sequence.c recursive_action.c safe_read.c safe_strncpy.c \ |
247 | xregcomp.c error_msg_and_die.c perror_msg.c perror_msg_and_die.c \ | 248 | syscalls.c syslog_msg_with_name.c time_string.c trim.c vdprintf.c verror_msg.c \ |
248 | verror_msg.c vperror_msg.c mtab.c mtab_file.c xgetcwd.c concat_path_file.c | 249 | vperror_msg.c wfopen.c xfuncs.c xgetcwd.c xregcomp.c |
249 | 250 | ||
250 | LIBBB_OBJS=$(patsubst %.c,$(LIBBB)/%.o, $(LIBBB_CSRC)) | 251 | LIBBB_OBJS=$(patsubst %.c,$(LIBBB)/%.o, $(LIBBB_CSRC)) |
251 | LIBBB_CFLAGS = -I$(LIBBB) | 252 | LIBBB_CFLAGS = -I$(LIBBB) |
@@ -23,113 +23,11 @@ | |||
23 | * | 23 | * |
24 | */ | 24 | */ |
25 | #include <fcntl.h> | 25 | #include <fcntl.h> |
26 | #include <string.h> | ||
27 | #include <stdlib.h> | 26 | #include <stdlib.h> |
28 | #include <getopt.h> | 27 | #include <getopt.h> |
29 | #include <unistd.h> | 28 | #include <unistd.h> |
30 | #include "busybox.h" | 29 | #include "busybox.h" |
31 | 30 | ||
32 | typedef struct ar_headers_s { | ||
33 | char *name; | ||
34 | off_t size; | ||
35 | uid_t uid; | ||
36 | gid_t gid; | ||
37 | mode_t mode; | ||
38 | time_t mtime; | ||
39 | off_t offset; | ||
40 | struct ar_headers_s *next; | ||
41 | } ar_headers_t; | ||
42 | |||
43 | /* | ||
44 | * return the headerL_t struct for the filename descriptor | ||
45 | */ | ||
46 | extern ar_headers_t get_ar_headers(int srcFd) | ||
47 | { | ||
48 | typedef struct raw_ar_header_s { /* Byte Offset */ | ||
49 | char name[16]; /* 0-15 */ | ||
50 | char date[12]; /* 16-27 */ | ||
51 | char uid[6]; | ||
52 | char gid[6]; /* 28-39 */ | ||
53 | char mode[8]; /* 40-47 */ | ||
54 | char size[10]; /* 48-57 */ | ||
55 | char fmag[2]; /* 58-59 */ | ||
56 | } raw_ar_header_t; | ||
57 | |||
58 | raw_ar_header_t raw_ar_header; | ||
59 | |||
60 | ar_headers_t *head, *entry; | ||
61 | char ar_magic[8]; | ||
62 | char *long_name=NULL; | ||
63 | |||
64 | head = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); | ||
65 | entry = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); | ||
66 | |||
67 | /* check ar magic */ | ||
68 | if (full_read(srcFd, ar_magic, 8) != 8) { | ||
69 | error_msg_and_die("cannot read magic"); | ||
70 | } | ||
71 | |||
72 | if (strncmp(ar_magic,"!<arch>",7) != 0) { | ||
73 | error_msg_and_die("invalid magic"); | ||
74 | } | ||
75 | |||
76 | while (full_read(srcFd, (char *) &raw_ar_header, 60)==60) { | ||
77 | /* check the end of header markers are valid */ | ||
78 | if ((raw_ar_header.fmag[0]!='`') || (raw_ar_header.fmag[1]!='\n')) { | ||
79 | char newline; | ||
80 | if (raw_ar_header.fmag[1]!='`') { | ||
81 | break; | ||
82 | } | ||
83 | /* some version of ar, have an extra '\n' after each entry */ | ||
84 | read(srcFd, &newline, 1); | ||
85 | if (newline!='\n') { | ||
86 | break; | ||
87 | } | ||
88 | /* fix up the header, we started reading 1 byte too early due to a '\n' */ | ||
89 | memmove((char *) &raw_ar_header, (char *)&raw_ar_header+1, 59); | ||
90 | /* dont worry about adding the last '\n', we dont need it now */ | ||
91 | } | ||
92 | |||
93 | entry->size = (off_t) atoi(raw_ar_header.size); | ||
94 | /* long filenames have '/' as the first character */ | ||
95 | if (raw_ar_header.name[0] == '/') { | ||
96 | if (raw_ar_header.name[1] == '/') { | ||
97 | /* multiple long filenames are stored as data in one entry */ | ||
98 | long_name = (char *) xrealloc(long_name, entry->size); | ||
99 | full_read(srcFd, long_name, entry->size); | ||
100 | continue; | ||
101 | } | ||
102 | else { | ||
103 | /* The number after the '/' indicates the offset in the ar data section | ||
104 | (saved in variable long_name) that conatains the real filename */ | ||
105 | const int long_name_offset = (int) atoi((char *) &raw_ar_header.name[1]); | ||
106 | entry->name = xmalloc(strlen(&long_name[long_name_offset])); | ||
107 | strcpy(entry->name, &long_name[long_name_offset]); | ||
108 | } | ||
109 | } | ||
110 | else { | ||
111 | /* short filenames */ | ||
112 | entry->name = xmalloc(16); | ||
113 | strncpy(entry->name, raw_ar_header.name, 16); | ||
114 | } | ||
115 | entry->name[strcspn(entry->name, " /")]='\0'; | ||
116 | |||
117 | /* convert the rest of the now valid char header to its typed struct */ | ||
118 | parse_mode(raw_ar_header.mode, &entry->mode); | ||
119 | entry->mtime = atoi(raw_ar_header.date); | ||
120 | entry->uid = atoi(raw_ar_header.uid); | ||
121 | entry->gid = atoi(raw_ar_header.gid); | ||
122 | entry->offset = lseek(srcFd, 0, SEEK_CUR); | ||
123 | |||
124 | /* add this entries header to our combined list */ | ||
125 | entry->next = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); | ||
126 | *entry->next = *head; | ||
127 | *head = *entry; | ||
128 | lseek(srcFd, (off_t) entry->size, SEEK_CUR); | ||
129 | } | ||
130 | return(*head); | ||
131 | } | ||
132 | |||
133 | extern int ar_main(int argc, char **argv) | 31 | extern int ar_main(int argc, char **argv) |
134 | { | 32 | { |
135 | const int preserve_date = 1; /* preserve original dates */ | 33 | 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 @@ | |||
23 | * | 23 | * |
24 | */ | 24 | */ |
25 | #include <fcntl.h> | 25 | #include <fcntl.h> |
26 | #include <string.h> | ||
27 | #include <stdlib.h> | 26 | #include <stdlib.h> |
28 | #include <getopt.h> | 27 | #include <getopt.h> |
29 | #include <unistd.h> | 28 | #include <unistd.h> |
30 | #include "busybox.h" | 29 | #include "busybox.h" |
31 | 30 | ||
32 | typedef struct ar_headers_s { | ||
33 | char *name; | ||
34 | off_t size; | ||
35 | uid_t uid; | ||
36 | gid_t gid; | ||
37 | mode_t mode; | ||
38 | time_t mtime; | ||
39 | off_t offset; | ||
40 | struct ar_headers_s *next; | ||
41 | } ar_headers_t; | ||
42 | |||
43 | /* | ||
44 | * return the headerL_t struct for the filename descriptor | ||
45 | */ | ||
46 | extern ar_headers_t get_ar_headers(int srcFd) | ||
47 | { | ||
48 | typedef struct raw_ar_header_s { /* Byte Offset */ | ||
49 | char name[16]; /* 0-15 */ | ||
50 | char date[12]; /* 16-27 */ | ||
51 | char uid[6]; | ||
52 | char gid[6]; /* 28-39 */ | ||
53 | char mode[8]; /* 40-47 */ | ||
54 | char size[10]; /* 48-57 */ | ||
55 | char fmag[2]; /* 58-59 */ | ||
56 | } raw_ar_header_t; | ||
57 | |||
58 | raw_ar_header_t raw_ar_header; | ||
59 | |||
60 | ar_headers_t *head, *entry; | ||
61 | char ar_magic[8]; | ||
62 | char *long_name=NULL; | ||
63 | |||
64 | head = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); | ||
65 | entry = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); | ||
66 | |||
67 | /* check ar magic */ | ||
68 | if (full_read(srcFd, ar_magic, 8) != 8) { | ||
69 | error_msg_and_die("cannot read magic"); | ||
70 | } | ||
71 | |||
72 | if (strncmp(ar_magic,"!<arch>",7) != 0) { | ||
73 | error_msg_and_die("invalid magic"); | ||
74 | } | ||
75 | |||
76 | while (full_read(srcFd, (char *) &raw_ar_header, 60)==60) { | ||
77 | /* check the end of header markers are valid */ | ||
78 | if ((raw_ar_header.fmag[0]!='`') || (raw_ar_header.fmag[1]!='\n')) { | ||
79 | char newline; | ||
80 | if (raw_ar_header.fmag[1]!='`') { | ||
81 | break; | ||
82 | } | ||
83 | /* some version of ar, have an extra '\n' after each entry */ | ||
84 | read(srcFd, &newline, 1); | ||
85 | if (newline!='\n') { | ||
86 | break; | ||
87 | } | ||
88 | /* fix up the header, we started reading 1 byte too early due to a '\n' */ | ||
89 | memmove((char *) &raw_ar_header, (char *)&raw_ar_header+1, 59); | ||
90 | /* dont worry about adding the last '\n', we dont need it now */ | ||
91 | } | ||
92 | |||
93 | entry->size = (off_t) atoi(raw_ar_header.size); | ||
94 | /* long filenames have '/' as the first character */ | ||
95 | if (raw_ar_header.name[0] == '/') { | ||
96 | if (raw_ar_header.name[1] == '/') { | ||
97 | /* multiple long filenames are stored as data in one entry */ | ||
98 | long_name = (char *) xrealloc(long_name, entry->size); | ||
99 | full_read(srcFd, long_name, entry->size); | ||
100 | continue; | ||
101 | } | ||
102 | else { | ||
103 | /* The number after the '/' indicates the offset in the ar data section | ||
104 | (saved in variable long_name) that conatains the real filename */ | ||
105 | const int long_name_offset = (int) atoi((char *) &raw_ar_header.name[1]); | ||
106 | entry->name = xmalloc(strlen(&long_name[long_name_offset])); | ||
107 | strcpy(entry->name, &long_name[long_name_offset]); | ||
108 | } | ||
109 | } | ||
110 | else { | ||
111 | /* short filenames */ | ||
112 | entry->name = xmalloc(16); | ||
113 | strncpy(entry->name, raw_ar_header.name, 16); | ||
114 | } | ||
115 | entry->name[strcspn(entry->name, " /")]='\0'; | ||
116 | |||
117 | /* convert the rest of the now valid char header to its typed struct */ | ||
118 | parse_mode(raw_ar_header.mode, &entry->mode); | ||
119 | entry->mtime = atoi(raw_ar_header.date); | ||
120 | entry->uid = atoi(raw_ar_header.uid); | ||
121 | entry->gid = atoi(raw_ar_header.gid); | ||
122 | entry->offset = lseek(srcFd, 0, SEEK_CUR); | ||
123 | |||
124 | /* add this entries header to our combined list */ | ||
125 | entry->next = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); | ||
126 | *entry->next = *head; | ||
127 | *head = *entry; | ||
128 | lseek(srcFd, (off_t) entry->size, SEEK_CUR); | ||
129 | } | ||
130 | return(*head); | ||
131 | } | ||
132 | |||
133 | extern int ar_main(int argc, char **argv) | 31 | extern int ar_main(int argc, char **argv) |
134 | { | 32 | { |
135 | const int preserve_date = 1; /* preserve original dates */ | 33 | 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 @@ | |||
31 | extern int gz_open(FILE *compressed_file, int *pid); | 31 | extern int gz_open(FILE *compressed_file, int *pid); |
32 | extern void gz_close(int gunzip_pid); | 32 | extern void gz_close(int gunzip_pid); |
33 | 33 | ||
34 | typedef struct ar_headers_s { | ||
35 | char *name; | ||
36 | size_t size; | ||
37 | uid_t uid; | ||
38 | gid_t gid; | ||
39 | mode_t mode; | ||
40 | time_t mtime; | ||
41 | off_t offset; | ||
42 | struct ar_headers_s *next; | ||
43 | } ar_headers_t; | ||
44 | |||
45 | extern ar_headers_t get_ar_headers(int srcFd); | ||
46 | extern int tar_unzip_init(int tarFd); | 34 | extern int tar_unzip_init(int tarFd); |
47 | extern int readTarFile(int tarFd, int extractFlag, int listFlag, | 35 | extern int readTarFile(int tarFd, int extractFlag, int listFlag, |
48 | int tostdoutFlag, int verboseFlag, char** extractList, char** excludeList); | 36 | 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 @@ | |||
31 | extern int gz_open(FILE *compressed_file, int *pid); | 31 | extern int gz_open(FILE *compressed_file, int *pid); |
32 | extern void gz_close(int gunzip_pid); | 32 | extern void gz_close(int gunzip_pid); |
33 | 33 | ||
34 | typedef struct ar_headers_s { | ||
35 | char *name; | ||
36 | size_t size; | ||
37 | uid_t uid; | ||
38 | gid_t gid; | ||
39 | mode_t mode; | ||
40 | time_t mtime; | ||
41 | off_t offset; | ||
42 | struct ar_headers_s *next; | ||
43 | } ar_headers_t; | ||
44 | |||
45 | extern ar_headers_t get_ar_headers(int srcFd); | ||
46 | extern int tar_unzip_init(int tarFd); | 34 | extern int tar_unzip_init(int tarFd); |
47 | extern int readTarFile(int tarFd, int extractFlag, int listFlag, | 35 | extern int readTarFile(int tarFd, int extractFlag, int listFlag, |
48 | int tostdoutFlag, int verboseFlag, char** extractList, char** excludeList); | 36 | 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); | |||
215 | char *xgetcwd(char *cwd); | 215 | char *xgetcwd(char *cwd); |
216 | char *concat_path_file(const char *path, const char *filename); | 216 | char *concat_path_file(const char *path, const char *filename); |
217 | 217 | ||
218 | typedef struct ar_headers_s { | ||
219 | char *name; | ||
220 | off_t size; | ||
221 | uid_t uid; | ||
222 | gid_t gid; | ||
223 | mode_t mode; | ||
224 | time_t mtime; | ||
225 | off_t offset; | ||
226 | struct ar_headers_s *next; | ||
227 | } ar_headers_t; | ||
228 | extern ar_headers_t get_ar_headers(int srcFd); | ||
229 | |||
218 | #endif /* __LIBBB_H__ */ | 230 | #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 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * Utility routines. | ||
4 | * | ||
5 | * Copyright (C) tons of folks. Tracking down who wrote what | ||
6 | * isn't something I'm going to worry about... If you wrote something | ||
7 | * here, please feel free to acknowledge your work. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
17 | * General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
22 | * | ||
23 | * Based in part on code from sash, Copyright (c) 1999 by David I. Bell | ||
24 | * Permission has been granted to redistribute this code under the GPL. | ||
25 | * | ||
26 | */ | ||
27 | |||
28 | #include <stdlib.h> | ||
29 | #include <string.h> | ||
30 | #include <unistd.h> | ||
31 | #include "libbb.h" | ||
32 | |||
33 | extern ar_headers_t get_ar_headers(int srcFd) | ||
34 | { | ||
35 | typedef struct raw_ar_header_s { /* Byte Offset */ | ||
36 | char name[16]; /* 0-15 */ | ||
37 | char date[12]; /* 16-27 */ | ||
38 | char uid[6]; | ||
39 | char gid[6]; /* 28-39 */ | ||
40 | char mode[8]; /* 40-47 */ | ||
41 | char size[10]; /* 48-57 */ | ||
42 | char fmag[2]; /* 58-59 */ | ||
43 | } raw_ar_header_t; | ||
44 | |||
45 | raw_ar_header_t raw_ar_header; | ||
46 | |||
47 | ar_headers_t *head, *entry; | ||
48 | char ar_magic[8]; | ||
49 | char *long_name=NULL; | ||
50 | |||
51 | head = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); | ||
52 | entry = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); | ||
53 | |||
54 | /* check ar magic */ | ||
55 | if (full_read(srcFd, ar_magic, 8) != 8) { | ||
56 | error_msg_and_die("cannot read magic"); | ||
57 | } | ||
58 | |||
59 | if (strncmp(ar_magic,"!<arch>",7) != 0) { | ||
60 | error_msg_and_die("invalid magic"); | ||
61 | } | ||
62 | |||
63 | while (full_read(srcFd, (char *) &raw_ar_header, 60)==60) { | ||
64 | /* check the end of header markers are valid */ | ||
65 | if ((raw_ar_header.fmag[0]!='`') || (raw_ar_header.fmag[1]!='\n')) { | ||
66 | char newline; | ||
67 | if (raw_ar_header.fmag[1]!='`') { | ||
68 | break; | ||
69 | } | ||
70 | /* some version of ar, have an extra '\n' after each entry */ | ||
71 | read(srcFd, &newline, 1); | ||
72 | if (newline!='\n') { | ||
73 | break; | ||
74 | } | ||
75 | /* fix up the header, we started reading 1 byte too early due to a '\n' */ | ||
76 | memmove((char *) &raw_ar_header, (char *)&raw_ar_header+1, 59); | ||
77 | /* dont worry about adding the last '\n', we dont need it now */ | ||
78 | } | ||
79 | |||
80 | entry->size = (off_t) atoi(raw_ar_header.size); | ||
81 | /* long filenames have '/' as the first character */ | ||
82 | if (raw_ar_header.name[0] == '/') { | ||
83 | if (raw_ar_header.name[1] == '/') { | ||
84 | /* multiple long filenames are stored as data in one entry */ | ||
85 | long_name = (char *) xrealloc(long_name, entry->size); | ||
86 | full_read(srcFd, long_name, entry->size); | ||
87 | continue; | ||
88 | } | ||
89 | else { | ||
90 | /* The number after the '/' indicates the offset in the ar data section | ||
91 | (saved in variable long_name) that conatains the real filename */ | ||
92 | const int long_name_offset = (int) atoi((char *) &raw_ar_header.name[1]); | ||
93 | entry->name = xmalloc(strlen(&long_name[long_name_offset])); | ||
94 | strcpy(entry->name, &long_name[long_name_offset]); | ||
95 | } | ||
96 | } | ||
97 | else { | ||
98 | /* short filenames */ | ||
99 | entry->name = xmalloc(16); | ||
100 | strncpy(entry->name, raw_ar_header.name, 16); | ||
101 | } | ||
102 | entry->name[strcspn(entry->name, " /")]='\0'; | ||
103 | |||
104 | /* convert the rest of the now valid char header to its typed struct */ | ||
105 | parse_mode(raw_ar_header.mode, &entry->mode); | ||
106 | entry->mtime = atoi(raw_ar_header.date); | ||
107 | entry->uid = atoi(raw_ar_header.uid); | ||
108 | entry->gid = atoi(raw_ar_header.gid); | ||
109 | entry->offset = lseek(srcFd, 0, SEEK_CUR); | ||
110 | |||
111 | /* add this entries header to our combined list */ | ||
112 | entry->next = (ar_headers_t *) xmalloc(sizeof(ar_headers_t)); | ||
113 | *entry->next = *head; | ||
114 | *head = *entry; | ||
115 | lseek(srcFd, (off_t) entry->size, SEEK_CUR); | ||
116 | } | ||
117 | return(*head); | ||
118 | } \ 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); | |||
215 | char *xgetcwd(char *cwd); | 215 | char *xgetcwd(char *cwd); |
216 | char *concat_path_file(const char *path, const char *filename); | 216 | char *concat_path_file(const char *path, const char *filename); |
217 | 217 | ||
218 | typedef struct ar_headers_s { | ||
219 | char *name; | ||
220 | off_t size; | ||
221 | uid_t uid; | ||
222 | gid_t gid; | ||
223 | mode_t mode; | ||
224 | time_t mtime; | ||
225 | off_t offset; | ||
226 | struct ar_headers_s *next; | ||
227 | } ar_headers_t; | ||
228 | extern ar_headers_t get_ar_headers(int srcFd); | ||
229 | |||
218 | #endif /* __LIBBB_H__ */ | 230 | #endif /* __LIBBB_H__ */ |