static hole_t * hole_new(const char *fname, int flags, zip_error_t *error) { hole_t *ctx = (hole_t *)malloc(sizeof(*ctx)); if (ctx == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } if ((ctx->fname = strdup(fname)) == NULL) { free(ctx); zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } if ((ctx->in = buffer_from_file(fname, flags, error)) == NULL) { free(ctx); return NULL; } zip_error_init(&ctx->error); ctx->out = NULL; return ctx; }
ZIP_EXTERN zip_source_t * zip_source_buffer_create(const void *data, zip_uint64_t len, int freep, zip_error_t *error) { struct read_data *ctx; zip_source_t *zs; if (data == NULL && len > 0) { zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } if ((ctx=(struct read_data *)malloc(sizeof(*ctx))) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } if ((ctx->in = buffer_new_read(data, len, freep)) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); free(ctx); return NULL; } ctx->out = NULL; ctx->mtime = time(NULL); zip_error_init(&ctx->error); if ((zs=zip_source_function_create(read_data, ctx, error)) == NULL) { buffer_free(ctx->in); free(ctx); return NULL; } return zs; }
zip_source_t * zip_source_deflate(zip_t *za, zip_source_t *src, zip_int32_t cm, int flags) { struct deflate *ctx; zip_source_t *s2; if (src == NULL || (cm != ZIP_CM_DEFLATE && !ZIP_CM_IS_DEFAULT(cm))) { zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } if ((ctx=(struct deflate *)malloc(sizeof(*ctx))) == NULL) { zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } zip_error_init(&ctx->error); ctx->eof = false; ctx->is_stored = false; ctx->can_store = ZIP_CM_IS_DEFAULT(cm); if (flags & ZIP_CODEC_ENCODE) { ctx->mem_level = MAX_MEM_LEVEL; } if ((s2=zip_source_layered(za, src, ((flags & ZIP_CODEC_ENCODE) ? deflate_compress : deflate_decompress), ctx)) == NULL) { deflate_free(ctx); return NULL; } return s2; }
zip_t * _zip_new(zip_error_t *error) { zip_t *za; za = (zip_t *)malloc(sizeof(struct zip)); if (!za) { zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } if ((za->names = _zip_hash_new(ZIP_HASH_TABLE_SIZE, error)) == NULL) { free(za); return NULL; } za->src = NULL; za->open_flags = 0; zip_error_init(&za->error); za->flags = za->ch_flags = 0; za->default_password = NULL; za->comment_orig = za->comment_changes = NULL; za->comment_changed = 0; za->nentry = za->nentry_alloc = 0; za->entry = NULL; za->nopen_source = za->nopen_source_alloc = 0; za->open_source = NULL; za->tempdir = NULL; return za; }
zip_source_t * zip_source_pkware(zip_t *za, zip_source_t *src, zip_uint16_t em, int flags, const char *password) { struct trad_pkware *ctx; zip_source_t *s2; if (password == NULL || src == NULL || em != ZIP_EM_TRAD_PKWARE) { zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } if (flags & ZIP_CODEC_ENCODE) { zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0); return NULL; } if ((ctx=(struct trad_pkware *)malloc(sizeof(*ctx))) == NULL) { zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } zip_error_init(&ctx->error); ctx->key[0] = KEY0; ctx->key[1] = KEY1; ctx->key[2] = KEY2; decrypt(ctx, NULL, (const zip_uint8_t *)password, strlen(password), 1); if ((s2=zip_source_layered(za, src, pkware_decrypt, ctx)) == NULL) { pkware_free(ctx); return NULL; } return s2; }
COpcPackageReader::COpcPackageReader(_In_ PImportStream pImportStream) { if (pImportStream.get() == nullptr) throw CNMRException(NMR_ERROR_INVALIDPARAM); m_ZIPError.str = nullptr; m_ZIPError.sys_err = 0; m_ZIPError.zip_err = 0; m_ZIParchive = nullptr; m_ZIPsource = nullptr; try { // determine stream size nfUint64 nStreamSize = pImportStream->retrieveSize(); pImportStream->seekPosition(0, true); if (nStreamSize == 0) throw CNMRException(NMR_ERROR_COULDNOTGETSTREAMPOSITION); // read ZIP into memory m_Buffer.resize ((size_t) nStreamSize); pImportStream->readBuffer(&m_Buffer[0], nStreamSize, true); // create ZIP objects zip_error_init(&m_ZIPError); m_ZIPsource = zip_source_buffer_create(&m_Buffer[0], (size_t) nStreamSize, 0, &m_ZIPError); if (m_ZIPsource == nullptr) throw CNMRException(NMR_ERROR_COULDNOTREADZIPFILE); m_ZIParchive = zip_open_from_source(m_ZIPsource, ZIP_RDONLY | ZIP_CHECKCONS, &m_ZIPError); if (m_ZIParchive == nullptr) throw CNMRException(NMR_ERROR_COULDNOTREADZIPFILE); // Get ZIP Content nfInt64 nEntryCount = zip_get_num_entries(m_ZIParchive, ZIP_FL_UNCHANGED); if (nEntryCount < 0) throw CNMRException(NMR_ERROR_COULDNOTREADZIPFILE); // List Entries nfInt64 nIndex; for (nIndex = 0; nIndex < nEntryCount; nIndex++) { const char * pszName = zip_get_name(m_ZIParchive, (nfUint64) nIndex, ZIP_FL_ENC_GUESS); std::string sUTF8Name(pszName); std::wstring sUTF16Name = fnUTF8toUTF16(sUTF8Name); m_ZIPEntries.insert(std::make_pair(sUTF16Name, nIndex)); } readContentTypes(); readRootRelationships(); } catch (...) { releaseZIP(); throw; } }
ZIP_EXTERN void zip_error_init_with_code(zip_error_t *error, int ze) { zip_error_init(error); error->zip_err = ze; switch (zip_error_system_type(error)) { case ZIP_ET_SYS: error->sys_err = errno; break; default: error->sys_err = 0; break; } }
PCK_Catalog *PCK_OpenZipFile(const char *zipName){ int err=0; zip_error_t error; zip_error_init(&error); struct zip* z = zip_open(zipName,ZIP_RDONLY,&err); if(err != ZIP_ER_OK ){ zip_error_init_with_code(&error, err); SDL_SetError("PCK_OpenZipFile failed:%d %s ",err, zip_error_strerror(&error)); zip_error_fini(&error); return NULL; } PCK_Catalog* ptr=PCK_AllocCatalog(); ptr->openRW = zip_OpenRW; ptr->close = zip_Close; ptr->context = (SDL_RWops*)z; }
static struct winzip_aes * winzip_aes_new(int mode, const char *password) { struct winzip_aes *ctx; if ((ctx = (struct winzip_aes *)malloc(sizeof(*ctx))) == NULL) { return NULL; } if ((ctx->password = strdup(password)) == NULL) { free(ctx); return NULL; } ctx->mode = mode; zip_error_init(&ctx->error); return ctx; }
int main() { zip_source_t *zsrc = loadFromFile(); if (!zsrc) return 1; fprintf(stderr, "zip_open_from_source...\n"); zip_error_t error; zip_error_init(&error); zip_t *archive = zip_open_from_source(zsrc, 0, &error); if (!archive) return 2; zip_error_fini(&error); show(archive, "after zip_open_from_source"); const char *name = "y.txt"; zip_flags_t flags = 0; zip_source_t *otherZsrc = zip_source_buffer_create("hello", 5, 0, &error); fprintf(stderr, "zip_file_add...\n"); zip_int64_t i = zip_file_add(archive, name, otherZsrc, flags); fprintf(stderr, "zip_file_add(): i=%lld\n", i); // show(archive, "after zip_file_add"); zip_source_keep(zsrc); int ret; ret = zip_close(archive); // print to stdout zip_stat_t zst; ret = zip_source_stat(zsrc, &zst); fprintf(stderr, "zip_source_stat: ret=%d, zst.size=%d\n", ret, zst.size); ret = zip_source_open(zsrc); fprintf(stderr, "zip_source_open: ret=%d\n", ret); unsigned char data[10000]; zip_uint64_t n = zip_source_read(zsrc, data, sizeof(data)); fprintf(stderr, "zip_source_read: n=%d\n", n); write(1, data, n); // print to stdout }
zip_source_t * _zip_source_new(zip_error_t *error) { zip_source_t *src; if ((src=(zip_source_t *)malloc(sizeof(*src))) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } src->src = NULL; src->cb.f = NULL; src->ud = NULL; src->open_count = 0; src->write_state = ZIP_SOURCE_WRITE_CLOSED; src->source_closed = false; src->source_archive = NULL; src->refcount = 1; zip_error_init(&src->error); return src; }
zip_source_t * zip_source_crc(zip_t *za, zip_source_t *src, int validate) { struct crc_context *ctx; if (src == NULL) { zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } if ((ctx=(struct crc_context *)malloc(sizeof(*ctx))) == NULL) { zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } ctx->eof = 0; ctx->validate = validate; zip_error_init(&ctx->error); ctx->size = 0; ctx->crc = 0; return zip_source_layered(za, src, crc_read, ctx); }
ZIP_EXTERN zip_t * zip_open(const char *fn, int _flags, int *zep) { zip_t *za; zip_source_t *src; struct zip_error error; zip_error_init(&error); if ((src = zip_source_file_create(fn, 0, -1, &error)) == NULL) { _zip_set_open_error(zep, &error, 0); zip_error_fini(&error); return NULL; } if ((za = zip_open_from_source(src, _flags, &error)) == NULL) { zip_source_free(src); _zip_set_open_error(zep, &error, 0); zip_error_fini(&error); return NULL; } zip_error_fini(&error); return za; }
zip_source_t * _zip_source_win32_handle_or_name(const void *fname, HANDLE h, zip_uint64_t start, zip_int64_t len, int closep, const zip_stat_t *st, _zip_source_win32_file_ops_t *ops, zip_error_t *error) { _zip_source_win32_read_file_t *ctx; zip_source_t *zs; if (h == INVALID_HANDLE_VALUE && fname == NULL) { zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } if ((ctx = (_zip_source_win32_read_file_t *)malloc(sizeof(_zip_source_win32_read_file_t))) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } ctx->fname = NULL; if (fname) { if ((ctx->fname = ops->op_strdup(fname)) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); free(ctx); return NULL; } } ctx->ops = ops; ctx->h = h; ctx->start = start; ctx->end = (len < 0 ? 0 : start + (zip_uint64_t)len); ctx->closep = ctx->fname ? 1 : closep; if (st) { memcpy(&ctx->st, st, sizeof(ctx->st)); ctx->st.name = NULL; ctx->st.valid &= ~ZIP_STAT_NAME; } else { zip_stat_init(&ctx->st); } ctx->tmpname = NULL; ctx->hout = INVALID_HANDLE_VALUE; zip_error_init(&ctx->error); ctx->supports = ZIP_SOURCE_SUPPORTS_READABLE | zip_source_make_command_bitmap(ZIP_SOURCE_SUPPORTS, ZIP_SOURCE_TELL, -1); if (ctx->fname) { HANDLE th; th = ops->op_open(ctx); if (th == INVALID_HANDLE_VALUE || GetFileType(th) == FILE_TYPE_DISK) { ctx->supports = ZIP_SOURCE_SUPPORTS_WRITABLE; } if (th != INVALID_HANDLE_VALUE) { CloseHandle(th); } } else if (GetFileType(ctx->h) == FILE_TYPE_DISK) { ctx->supports = ZIP_SOURCE_SUPPORTS_SEEKABLE; } if ((zs = zip_source_function_create(_win32_read_file, ctx, error)) == NULL) { free(ctx->fname); free(ctx); return NULL; } return zs; }
zip_source_t * _zip_source_file_or_p(const char *fname, FILE *file, zip_uint64_t start, zip_int64_t len, const zip_stat_t *st, zip_error_t *error) { struct read_file *ctx; zip_source_t *zs; if (file == NULL && fname == NULL) { zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } if ((ctx=(struct read_file *)malloc(sizeof(struct read_file))) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } ctx->fname = NULL; if (fname) { if ((ctx->fname=strdup(fname)) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); free(ctx); return NULL; } } ctx->f = file; ctx->start = start; ctx->end = (len < 0 ? 0 : start+(zip_uint64_t)len); if (st) { memcpy(&ctx->st, st, sizeof(ctx->st)); ctx->st.name = NULL; ctx->st.valid &= ~ZIP_STAT_NAME; } else { zip_stat_init(&ctx->st); } ctx->tmpname = NULL; ctx->fout = NULL; zip_error_init(&ctx->error); ctx->supports = ZIP_SOURCE_SUPPORTS_READABLE | zip_source_make_command_bitmap(ZIP_SOURCE_SUPPORTS, ZIP_SOURCE_TELL, -1); if (ctx->fname) { struct stat sb; if (stat(ctx->fname, &sb) < 0 || S_ISREG(sb.st_mode)) { ctx->supports = ZIP_SOURCE_SUPPORTS_WRITABLE; } } else if (fseeko(ctx->f, 0, SEEK_CUR) == 0) { ctx->supports = ZIP_SOURCE_SUPPORTS_SEEKABLE; } if ((zs=zip_source_function_create(read_file, ctx, error)) == NULL) { free(ctx->fname); free(ctx); return NULL; } return zs; }