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 /libbb | |
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
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/get_ar_headers.c | 118 | ||||
-rw-r--r-- | libbb/libbb.h | 12 |
2 files changed, 130 insertions, 0 deletions
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__ */ |