static void init_key(const char* file_name, el_zip_file_entry_t* key, const Uint32 size, char* buffer) { char* ptr; Uint32 src_idx, dst_idx, len, count; if ((key == 0) || (file_name == 0)) { LOG_ERROR("Invalid key or file_name"); return; } memset(key, 0, sizeof(el_zip_file_entry_t)); memset(buffer, 0, size); len = strlen(file_name); src_idx = 0; dst_idx = 0; while ((src_idx < len) && (dst_idx < size)) { ptr = strstr(file_name + src_idx, "./"); if (ptr != 0) { count = ptr - file_name + src_idx; memcpy(buffer + dst_idx, file_name + src_idx, min2u(count, size - dst_idx - 1)); } else { count = len - src_idx; memcpy(buffer + dst_idx, file_name + src_idx, min2u(count, size - dst_idx - 1)); } dst_idx += count; src_idx += count + 2; } len = strlen(buffer); key->hash = mem_hash(buffer, len); key->file_name = buffer; }
void load_zip_archive(const char* file_name) { unzFile file; unz_file_info64 info; unz_global_info64 global_info; el_zip_file_entry_t* files; char* name; Uint32 i, count, size, index; if (file_name == 0) { LOG_ERROR("Empty zip file name", file_name); return; } if (num_zip_files >= MAX_NUM_ZIP_FILES) { LOG_ERROR("Can't add zip file %s", file_name); return; } file = unzOpen64(file_name); if (unzGetGlobalInfo64(file, &global_info) != UNZ_OK) { LOG_ERROR("Can't load zip file %s", file_name); unzClose(file); return; } count = global_info.number_entry; if (unzGoToFirstFile(file) != UNZ_OK) { LOG_ERROR("Can't load zip file %s", file_name); unzClose(file); return; } ENTER_DEBUG_MARK("load zip"); LOG_DEBUG("Loading zip file '%s' with %d files", file_name, count); files = malloc(count * sizeof(el_zip_file_entry_t)); for (i = 0; i < count; i++) { unzGetFilePos64(file, &files[i].position); unzGetCurrentFileInfo64(file, &info, 0, 0, 0, 0, 0, 0); size = info.size_filename; files[i].file_name = calloc(size + 1, 1); unzGetCurrentFileInfo64(file, 0, files[i].file_name, size, 0, 0, 0, 0); LOG_DEBUG("Loading file (%d) '%s' from zip file '%s'.", i, files[i].file_name, file_name); files[i].hash = mem_hash(files[i].file_name, size); unzGoToNextFile(file); } size = strlen(file_name); name = calloc(size + 1, 1); memcpy(name, file_name, size); LOG_DEBUG("Sorting files from zip file '%s'.", file_name); qsort(files, count, sizeof(el_zip_file_entry_t), compare_el_zip_file_entry); CHECK_AND_LOCK_MUTEX(zip_mutex); index = num_zip_files; for (i = 0; i < num_zip_files; i++) { if (zip_files[i].file_name == 0) { index = i; break; } } num_zip_files = max2u(num_zip_files, index + 1); CHECK_AND_LOCK_MUTEX(zip_files[index].mutex); CHECK_AND_UNLOCK_MUTEX(zip_mutex); LOG_DEBUG("Adding zip file '%s' at position %d.", file_name, index); zip_files[index].file_name = name; zip_files[index].file = file; zip_files[index].files = files; zip_files[index].count = count; CHECK_AND_UNLOCK_MUTEX(zip_files[index].mutex); LEAVE_DEBUG_MARK("load zip"); LOG_DEBUG("Loaded zip file '%s' with %d files", file_name, count); }
static guint arc_path_hash (Arc *arc) { return mem_hash ((gconstpointer)arc, sizeof (Arc)); }