Lines Matching full:archive
41 /* Number of the file containing this structure or 0xFFFF if ZIP64 archive.
42 * Zip archive might span multiple files (disks).
47 * 0xFFFF if ZIP64 archive.
52 * archive.
57 * archive.
61 /* Size of the central directory record or 0xFFFFFFFF if ZIP64 archive. */
64 /* Offset of the central directory from the beginning of the archive or
65 * 0xFFFFFFFF if ZIP64 archive.
97 /* Number of the disk where the file starts or 0xFFFF if ZIP64 archive. */
135 static void *check_access(struct zip_archive *archive, __u32 offset, __u32 size) in check_access() argument
137 if (offset + size > archive->size || offset > offset + size) in check_access()
140 return archive->data + offset; in check_access()
144 * archive uses features which are not supported.
146 static int try_parse_end_of_cd(struct zip_archive *archive, __u32 offset) in try_parse_end_of_cd() argument
152 eocd = check_access(archive, offset, sizeof(*eocd)); in try_parse_end_of_cd()
157 if (offset + sizeof(*eocd) + comment_length != archive->size) in try_parse_end_of_cd()
167 if (!check_access(archive, cd_offset, cd_size)) in try_parse_end_of_cd()
170 archive->cd_offset = cd_offset; in try_parse_end_of_cd()
171 archive->cd_records = cd_records; in try_parse_end_of_cd()
175 static int find_cd(struct zip_archive *archive) in find_cd() argument
180 if (archive->size <= sizeof(struct end_of_cd_record)) in find_cd()
187 offset = archive->size - sizeof(struct end_of_cd_record); in find_cd()
191 rc = try_parse_end_of_cd(archive, offset); in find_cd()
200 struct zip_archive *archive; in zip_archive_open() local
222 archive = malloc(sizeof(*archive)); in zip_archive_open()
223 if (!archive) { in zip_archive_open()
228 archive->data = data; in zip_archive_open()
229 archive->size = size; in zip_archive_open()
231 err = find_cd(archive); in zip_archive_open()
234 free(archive); in zip_archive_open()
238 return archive; in zip_archive_open()
241 void zip_archive_close(struct zip_archive *archive) in zip_archive_close() argument
243 munmap(archive->data, archive->size); in zip_archive_close()
244 free(archive); in zip_archive_close()
247 static struct local_file_header *local_file_header_at_offset(struct zip_archive *archive, in local_file_header_at_offset() argument
252 lfh = check_access(archive, offset, sizeof(*lfh)); in local_file_header_at_offset()
259 static int get_entry_at_offset(struct zip_archive *archive, __u32 offset, struct zip_entry *out) in get_entry_at_offset() argument
266 lfh = local_file_header_at_offset(archive, offset); in get_entry_at_offset()
274 name = check_access(archive, offset, lfh->file_name_length); in get_entry_at_offset()
279 if (!check_access(archive, offset, lfh->extra_field_length)) in get_entry_at_offset()
284 data = check_access(archive, offset, compressed_size); in get_entry_at_offset()
298 int zip_archive_find_entry(struct zip_archive *archive, const char *file_name, in zip_archive_find_entry() argument
302 __u32 i, offset = archive->cd_offset; in zip_archive_find_entry()
304 for (i = 0; i < archive->cd_records; ++i) { in zip_archive_find_entry()
309 cdfh = check_access(archive, offset, sizeof(*cdfh)); in zip_archive_find_entry()
315 cdfh_name = check_access(archive, offset, cdfh_name_length); in zip_archive_find_entry()
323 memcmp(file_name, archive->data + offset, file_name_length) == 0) { in zip_archive_find_entry()
324 return get_entry_at_offset(archive, cdfh->offset, out); in zip_archive_find_entry()