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 /ar.c | |
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 'ar.c')
-rw-r--r-- | ar.c | 102 |
1 files changed, 0 insertions, 102 deletions
@@ -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 */ |