void zip_discard(zip_t *za) { zip_uint64_t i; if (za == NULL) return; if (za->src) { zip_source_close(za->src); zip_source_free(za->src); } free(za->default_password); _zip_string_free(za->comment_orig); _zip_string_free(za->comment_changes); if (za->entry) { for (i=0; i<za->nentry; i++) _zip_entry_finalize(za->entry+i); free(za->entry); } for (i=0; i<za->nopen_source; i++) { _zip_source_invalidate(za->open_source[i]); } free(za->open_source); zip_error_fini(&za->error); free(za); return; }
zip_int64_t _zip_file_replace(struct zip *za, zip_uint64_t idx, const char *name, struct zip_source *source, zip_flags_t flags) { zip_uint64_t za_nentry_prev; if (ZIP_IS_RDONLY(za)) { _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } za_nentry_prev = za->nentry; if (idx == ZIP_UINT64_MAX) { zip_int64_t i = -1; if (flags & ZIP_FL_OVERWRITE) i = _zip_name_locate(za, name, flags, NULL); if (i == -1) { /* create and use new entry, used by zip_add */ if ((i=_zip_add_entry(za)) < 0) return -1; } idx = (zip_uint64_t)i; } if (name && _zip_set_name(za, idx, name, flags) != 0) { if (za->nentry != za_nentry_prev) { _zip_entry_finalize(za->entry+idx); za->nentry = za_nentry_prev; } return -1; } /* does not change any name related data, so we can do it here; * needed for a double add of the same file name */ _zip_unchange_data(za->entry+idx); if (za->entry[idx].orig != NULL && (za->entry[idx].changes == NULL || (za->entry[idx].changes->changed & ZIP_DIRENT_COMP_METHOD) == 0)) { if (za->entry[idx].changes == NULL) { if ((za->entry[idx].changes=_zip_dirent_clone(za->entry[idx].orig)) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return -1; } } za->entry[idx].changes->comp_method = ZIP_CM_REPLACED_DEFAULT; za->entry[idx].changes->changed |= ZIP_DIRENT_COMP_METHOD; } za->entry[idx].source = source; return (zip_int64_t)idx; }
void zip_discard(struct zip *za) { zip_uint64_t i; if (za == NULL) return; if (za->zn) free(za->zn); if (za->zp) fclose(za->zp); free(za->default_password); _zip_string_free(za->comment_orig); _zip_string_free(za->comment_changes); if (za->entry) { for (i=0; i<za->nentry; i++) _zip_entry_finalize(za->entry+i); free(za->entry); } for (i=0; i<za->nfile; i++) { if (za->file[i]->error.zip_err == ZIP_ER_OK) { _zip_error_set(&za->file[i]->error, ZIP_ER_ZIPCLOSED, 0); za->file[i]->za = NULL; } } _zip_error_fini(&za->error); free(za->file); free(za); return; }