1 /* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef _ZIP_ARCHIVE_H 17 #define _ZIP_ARCHIVE_H 18 19 #ifdef __cplusplus 20 extern "C" { 21 #endif 22 23 #include <stdint.h> 24 25 #define PATH_BUF_SIZE 512 26 /* used for read zip file */ 27 static const uint32_t LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50; 28 static const uint32_t CENTRAL_SIGNATURE = 0x02014b50; 29 static const uint32_t EOCD_SIGNATURE = 0x06054b50; 30 static const uint16_t COMPRESS_STORED = 0; 31 static const char* ZIP_FILE_PATH_SEPARATOR = "!/"; 32 33 struct zip_info { 34 int fd; 35 bool found; 36 uint64_t file_offset; 37 uint16_t file_path_index; 38 char path_buf[PATH_BUF_SIZE]; 39 }; 40 41 /* Zip Format: 42 * ------------------------------------------------------- 43 * | Local file header 1 | | 44 * ----------------------------------- | 45 * | File data 1 | | 46 * ----------------------------------- | 47 * | Data descriptor 1 | | 48 * ----------------------------------- File Entry | 49 * | ... | | 50 * ----------------------------------- | 51 * | Local file header n | | 52 * ----------------------------------- | 53 * | File data n | | 54 * ----------------------------------- | 55 * | Data descriptor n | | 56 * ------------------------------------------------------- 57 * | Central dir entry 1 | | 58 * ----------------------------------- | 59 * | ... | Central Directory | 60 * ----------------------------------- | 61 * | Central dir entry n | | 62 * ------------------------------------------------------- 63 * | End of central directory record | EOCD | 64 * ------------------------------------------------------- */ 65 66 // Local file header 67 struct __attribute__((packed)) local_file_header { 68 uint32_t signature; 69 uint16_t version_needed; 70 uint16_t flags; 71 uint16_t compression_method; 72 uint16_t modified_time; 73 uint16_t modified_date; 74 uint32_t crc; 75 uint32_t compressed_size; 76 uint32_t uncompressed_size; 77 uint16_t name_size; 78 uint16_t extra_size; 79 }; 80 81 // Central dir entry 82 struct __attribute__((packed)) central_dir_entry { 83 uint32_t signature; 84 uint16_t version_made; 85 uint16_t version_needed; 86 uint16_t flags; 87 uint16_t compression_method; 88 uint16_t modified_time; 89 uint16_t modified_date; 90 uint32_t crc; 91 uint32_t compressed_size; 92 uint32_t uncompressed_size; 93 uint16_t name_size; 94 uint16_t extra_size; 95 uint16_t comment_size; 96 uint16_t disk_num_start; 97 uint16_t internal_attr; 98 uint32_t external_attr; 99 uint32_t local_header_offset; 100 }; 101 102 // End of central directory record 103 struct __attribute__((packed)) zip_end_locator { 104 uint32_t signature; 105 uint16_t num_disk; 106 uint16_t start_disk_of_central_dir; 107 uint16_t total_entries_in_disk; 108 uint16_t total_entries; /* Total number of central directory entrys. */ 109 uint32_t size_of_central_dir; 110 uint32_t offset; /* Offset of start of central directory entry. */ 111 uint16_t comment_len; 112 }; 113 114 int open_uncompressed_library_in_zipfile(const char *path, struct zip_info *z_info, char *separator); 115 116 #ifdef __cplusplus 117 } 118 #endif 119 120 #endif 121