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)
137 if (offset + size > archive->size || offset > offset + size)
140 return archive->data + offset;
144 * archive uses features which are not supported.
146 static int try_parse_end_of_cd(struct zip_archive *archive, __u32 offset)
152 eocd = check_access(archive, offset, sizeof(*eocd));
157 if (offset + sizeof(*eocd) + comment_length != archive->size)
167 if (!check_access(archive, cd_offset, cd_size))
170 archive->cd_offset = cd_offset;
171 archive->cd_records = cd_records;
175 static int find_cd(struct zip_archive *archive)
180 if (archive->size <= sizeof(struct end_of_cd_record))
187 offset = archive->size - sizeof(struct end_of_cd_record);
191 rc = try_parse_end_of_cd(archive, offset);
200 struct zip_archive *archive;
222 archive = malloc(sizeof(*archive));
223 if (!archive) {
228 archive->data = data;
229 archive->size = size;
231 err = find_cd(archive);
234 free(archive);
238 return archive;
241 void zip_archive_close(struct zip_archive *archive)
243 munmap(archive->data, archive->size);
244 free(archive);
247 static struct local_file_header *local_file_header_at_offset(struct zip_archive *archive,
252 lfh = check_access(archive, offset, sizeof(*lfh));
259 static int get_entry_at_offset(struct zip_archive *archive, __u32 offset, struct zip_entry *out)
266 lfh = local_file_header_at_offset(archive, offset);
274 name = check_access(archive, offset, lfh->file_name_length);
279 if (!check_access(archive, offset, lfh->extra_field_length))
284 data = check_access(archive, offset, compressed_size);
298 int zip_archive_find_entry(struct zip_archive *archive, const char *file_name,
302 __u32 i, offset = archive->cd_offset;
304 for (i = 0; i < archive->cd_records; ++i) {
309 cdfh = check_access(archive, offset, sizeof(*cdfh));
315 cdfh_name = check_access(archive, offset, cdfh_name_length);
323 memcmp(file_name, archive->data + offset, file_name_length) == 0) {
324 return get_entry_at_offset(archive, cdfh->offset, out);