diff options
Diffstat (limited to 'ext/zip/lib/zip_extra_field_api.c')
-rw-r--r-- | ext/zip/lib/zip_extra_field_api.c | 128 |
1 files changed, 60 insertions, 68 deletions
diff --git a/ext/zip/lib/zip_extra_field_api.c b/ext/zip/lib/zip_extra_field_api.c index d0bba96e04..ed93944ac8 100644 --- a/ext/zip/lib/zip_extra_field_api.c +++ b/ext/zip/lib/zip_extra_field_api.c @@ -1,6 +1,6 @@ /* zip_extra_field_api.c -- public extra fields API functions - Copyright (C) 2012-2015 Dieter Baron and Thomas Klausner + Copyright (C) 2012-2014 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <libzip@nih.at> @@ -17,7 +17,7 @@ 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. - + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -32,71 +32,68 @@ */ - #include "zipint.h" - ZIP_EXTERN int -zip_file_extra_field_delete(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_flags_t flags) +zip_file_extra_field_delete(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_flags_t flags) { - struct zip_dirent *de; + zip_dirent_t *de; if ((flags & ZIP_EF_BOTH) == 0) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } if (((flags & ZIP_EF_BOTH) == ZIP_EF_BOTH) && (ef_idx != ZIP_EXTRA_FIELD_ALL)) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } - + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) return -1; - + if (ZIP_IS_RDONLY(za)) { - _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } if (_zip_file_extra_field_prepare_for_change(za, idx) < 0) return -1; - + de = za->entry[idx].changes; - + de->extra_fields = _zip_ef_delete_by_id(de->extra_fields, ZIP_EXTRA_FIELD_ALL, ef_idx, flags); return 0; } - ZIP_EXTERN int -zip_file_extra_field_delete_by_id(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_flags_t flags) +zip_file_extra_field_delete_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_flags_t flags) { - struct zip_dirent *de; + zip_dirent_t *de; if ((flags & ZIP_EF_BOTH) == 0) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } if (((flags & ZIP_EF_BOTH) == ZIP_EF_BOTH) && (ef_idx != ZIP_EXTRA_FIELD_ALL)) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } - + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) return -1; if (ZIP_IS_RDONLY(za)) { - _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } - + if (_zip_file_extra_field_prepare_for_change(za, idx) < 0) return -1; - + de = za->entry[idx].changes; de->extra_fields = _zip_ef_delete_by_id(de->extra_fields, ef_id, ef_idx, flags); @@ -104,18 +101,17 @@ zip_file_extra_field_delete_by_id(struct zip *za, zip_uint64_t idx, zip_uint16_t } - ZIP_EXTERN const zip_uint8_t * -zip_file_extra_field_get(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_uint16_t *idp, zip_uint16_t *lenp, zip_flags_t flags) +zip_file_extra_field_get(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_uint16_t *idp, zip_uint16_t *lenp, zip_flags_t flags) { static const zip_uint8_t empty[1] = { '\0' }; - struct zip_dirent *de; - struct zip_extra_field *ef; + zip_dirent_t *de; + zip_extra_field_t *ef; int i; if ((flags & ZIP_EF_BOTH) == 0) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } @@ -145,20 +141,19 @@ zip_file_extra_field_get(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_idx, } } - _zip_error_set(&za->error, ZIP_ER_NOENT, 0); + zip_error_set(&za->error, ZIP_ER_NOENT, 0); return NULL; } - ZIP_EXTERN const zip_uint8_t * -zip_file_extra_field_get_by_id(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_uint16_t *lenp, zip_flags_t flags) +zip_file_extra_field_get_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_uint16_t *lenp, zip_flags_t flags) { - struct zip_dirent *de; + zip_dirent_t *de; if ((flags & ZIP_EF_BOTH) == 0) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } @@ -173,16 +168,15 @@ zip_file_extra_field_get_by_id(struct zip *za, zip_uint64_t idx, zip_uint16_t ef } - ZIP_EXTERN zip_int16_t -zip_file_extra_fields_count(struct zip *za, zip_uint64_t idx, zip_flags_t flags) +zip_file_extra_fields_count(zip_t *za, zip_uint64_t idx, zip_flags_t flags) { - struct zip_dirent *de; - struct zip_extra_field *ef; + zip_dirent_t *de; + zip_extra_field_t *ef; zip_uint16_t n; if ((flags & ZIP_EF_BOTH) == 0) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } @@ -202,16 +196,15 @@ zip_file_extra_fields_count(struct zip *za, zip_uint64_t idx, zip_flags_t flags) } - ZIP_EXTERN zip_int16_t -zip_file_extra_fields_count_by_id(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_flags_t flags) +zip_file_extra_fields_count_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_flags_t flags) { - struct zip_dirent *de; - struct zip_extra_field *ef; + zip_dirent_t *de; + zip_extra_field_t *ef; zip_uint16_t n; if ((flags & ZIP_EF_BOTH) == 0) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } @@ -231,36 +224,35 @@ zip_file_extra_fields_count_by_id(struct zip *za, zip_uint64_t idx, zip_uint16_t } - ZIP_EXTERN int -zip_file_extra_field_set(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags) +zip_file_extra_field_set(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags) { - struct zip_dirent *de; + zip_dirent_t *de; zip_uint16_t ls, cs; - struct zip_extra_field *ef, *ef_prev, *ef_new; + zip_extra_field_t *ef, *ef_prev, *ef_new; int i, found, new_len; if ((flags & ZIP_EF_BOTH) == 0) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } if (_zip_get_dirent(za, idx, 0, NULL) == NULL) return -1; - + if (ZIP_IS_RDONLY(za)) { - _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } - + if (ZIP_EF_IS_INTERNAL(ef_id)) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } if (_zip_file_extra_field_prepare_for_change(za, idx) < 0) return -1; - + de = za->entry[idx].changes; ef = de->extra_fields; @@ -280,7 +272,7 @@ zip_file_extra_field_set(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, z } if (i < ef_idx && ef_idx != ZIP_EXTRA_FIELD_NEW) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } @@ -299,12 +291,12 @@ zip_file_extra_field_set(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, z new_len += len + 4; if (new_len > ZIP_UINT16_MAX) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } - + if ((ef_new=_zip_ef_new(ef_id, len, data, flags)) == NULL) { - _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return -1; } @@ -322,7 +314,7 @@ zip_file_extra_field_set(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, z ef->flags &= ~(flags & ZIP_EF_BOTH); ef_new->next = ef->next; ef->next = ef_new; - } + } } else if (ef_prev) { ef_new->next = ef_prev->next; @@ -330,24 +322,24 @@ zip_file_extra_field_set(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, z } else de->extra_fields = ef_new; - + return 0; } int -_zip_file_extra_field_prepare_for_change(struct zip *za, zip_uint64_t idx) +_zip_file_extra_field_prepare_for_change(zip_t *za, zip_uint64_t idx) { - struct zip_entry *e; - + zip_entry_t *e; + if (idx >= za->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } - + e = za->entry+idx; - + if (e->changes && (e->changes->changed & ZIP_DIRENT_EXTRA_FIELD)) return 0; @@ -355,20 +347,20 @@ _zip_file_extra_field_prepare_for_change(struct zip *za, zip_uint64_t idx) if (_zip_read_local_ef(za, idx) < 0) return -1; } - + if (e->changes == NULL) { if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) { - _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return -1; } } - + if (e->orig && e->orig->extra_fields) { if ((e->changes->extra_fields=_zip_ef_clone(e->orig->extra_fields, &za->error)) == NULL) return -1; } e->changes->changed |= ZIP_DIRENT_EXTRA_FIELD; - + return 0; } |