int _zip_unchange(struct zip *za, zip_uint64_t idx, int allow_duplicates) { zip_int64_t i; if (idx >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } if (!allow_duplicates && za->entry[idx].changes && (za->entry[idx].changes->changed & ZIP_DIRENT_FILENAME)) { i = _zip_name_locate(za, _zip_get_name(za, idx, ZIP_FL_UNCHANGED, NULL), 0, NULL); if (i >= 0 && (zip_uint64_t)i != idx) { _zip_error_set(&za->error, ZIP_ER_EXISTS, 0); return -1; } } _zip_dirent_free(za->entry[idx].changes); za->entry[idx].changes = NULL; _zip_unchange_data(za->entry+idx); return 0; }
int _zip_unchange(struct zip *za, int idx, int allow_duplicates) { int i; if (idx < 0 || idx >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } if (za->entry[idx].ch_filename) { if (!allow_duplicates) { i = _zip_name_locate(za, _zip_get_name(za, idx, ZIP_FL_UNCHANGED, NULL), 0, NULL); if (i != -1 && i != idx) { _zip_error_set(&za->error, ZIP_ER_EXISTS, 0); return -1; } } free(za->entry[idx].ch_filename); za->entry[idx].ch_filename = NULL; } free(za->entry[idx].ch_comment); za->entry[idx].ch_comment = NULL; za->entry[idx].ch_comment_len = -1; _zip_unchange_data(za->entry+idx); return 0; }
zip_int64_t _zip_name_locate(zip_t *za, const char *fname, zip_flags_t flags, zip_error_t *error) { int (*cmp)(const char *, const char *); const char *fn, *p; zip_uint64_t i; if (za == NULL) return -1; if (fname == NULL) { zip_error_set(error, ZIP_ER_INVAL, 0); return -1; } if (flags & (ZIP_FL_NOCASE | ZIP_FL_NODIR | ZIP_FL_ENC_CP437)) { /* can't use hash table */ cmp = (flags & ZIP_FL_NOCASE) ? strcasecmp : strcmp; for (i = 0; i < za->nentry; i++) { fn = _zip_get_name(za, i, flags, error); /* newly added (partially filled) entry or error */ if (fn == NULL) continue; if (flags & ZIP_FL_NODIR) { p = strrchr(fn, '/'); if (p) fn = p + 1; } if (cmp(fname, fn) == 0) { _zip_error_clear(error); return (zip_int64_t)i; } } zip_error_set(error, ZIP_ER_NOENT, 0); return -1; } else { return _zip_hash_lookup(za->names, (const zip_uint8_t *)fname, flags, error); } }
int _zip_name_locate(struct zip *za, const char *fname, int flags, struct zip_error *error) { int (*cmp)(const char *, const char *); const char *fn, *p; int i, n; if (fname == NULL) { _zip_error_set(error, ZIP_ER_INVAL, 0); return -1; } cmp = (flags & ZIP_FL_NOCASE) ? strcasecmp : strcmp; n = (flags & ZIP_FL_UNCHANGED) ? za->cdir->nentry : za->nentry; for (i=0; i<n; i++) { if (flags & ZIP_FL_UNCHANGED) fn = za->cdir->entry[i].filename; else fn = _zip_get_name(za, i, flags, error); /* newly added (partially filled) entry */ if (fn == NULL) continue; if (flags & ZIP_FL_NODIR) { p = strrchr(fn, '/'); if (p) fn = p+1; } if (cmp(fname, fn) == 0) return i; } _zip_error_set(error, ZIP_ER_NOENT, 0); return -1; }
zip_int64_t _zip_name_locate(struct zip *za, const char *fname, zip_flags_t flags, struct zip_error *error) { int (*cmp)(const char *, const char *); const char *fn, *p; zip_uint64_t i; if (za == NULL) return -1; if (fname == NULL) { _zip_error_set(error, ZIP_ER_INVAL, 0); return -1; } cmp = (flags & ZIP_FL_NOCASE) ? strcasecmp : strcmp; for (i=0; i<za->nentry; i++) { fn = _zip_get_name(za, i, flags, error); /* newly added (partially filled) entry or error */ if (fn == NULL) continue; if (flags & ZIP_FL_NODIR) { p = strrchr(fn, '/'); if (p) fn = p+1; } if (cmp(fname, fn) == 0) { _zip_error_clear(error); return (zip_int64_t)i; } } _zip_error_set(error, ZIP_ER_NOENT, 0); return -1; }
const char * zip_get_name(struct zip *za, int idx, int flags) { return _zip_get_name(za, idx, flags, &za->error); }
ZIP_EXTERN const char * zip_get_name(struct zip *za, zip_uint64_t idx, zip_flags_t flags) { return _zip_get_name(za, idx, flags, &za->error); }