| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- /*
- zip_error_sterror.c -- get string representation of struct zip_error
- Copyright (C) 1999-2021 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>
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- 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
- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
- IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <zlib.h>
- #include "zipint.h"
- ZIP_EXTERN const char *
- zip_error_strerror(zip_error_t *err) {
- const char *zip_error_string, *system_error_string;
- char buf[128], *s;
- zip_error_fini(err);
- if (err->zip_err < 0 || err->zip_err >= _zip_err_str_count) {
- snprintf(buf, sizeof(buf), "Unknown error %d", err->zip_err);
- buf[sizeof(buf) - 1] = '\0'; /* make sure string is NUL-terminated */
- zip_error_string = NULL;
- system_error_string = buf;
- }
- else {
- zip_error_string = _zip_err_str[err->zip_err].description;
- switch (_zip_err_str[err->zip_err].type) {
- case ZIP_ET_SYS:
- system_error_string = strerror(err->sys_err);
- break;
-
- case ZIP_ET_ZLIB:
- system_error_string = zError(err->sys_err);
- break;
-
- case ZIP_ET_LIBZIP: {
- zip_uint8_t error = GET_ERROR_FROM_DETAIL(err->sys_err);
- int index = GET_INDEX_FROM_DETAIL(err->sys_err);
-
- if (error == 0) {
- system_error_string = NULL;
- }
- else if (error >= _zip_err_details_count) {
- snprintf(buf, sizeof(buf), "invalid detail error %u", error);
- buf[sizeof(buf) - 1] = '\0'; /* make sure string is NUL-terminated */
- system_error_string = buf;
- }
- else if (_zip_err_details[error].type == ZIP_DETAIL_ET_ENTRY && index < MAX_DETAIL_INDEX) {
- snprintf(buf, sizeof(buf), "entry %d: %s", index, _zip_err_details[error].description);
- buf[sizeof(buf) - 1] = '\0'; /* make sure string is NUL-terminated */
- system_error_string = buf;
- }
- else {
- system_error_string = _zip_err_details[error].description;
- }
- break;
- }
-
- default:
- system_error_string = NULL;
- }
- }
- if (system_error_string == NULL) {
- return zip_error_string;
- }
- else {
- if ((s = (char *)malloc(strlen(system_error_string) + (zip_error_string ? strlen(zip_error_string) + 2 : 0) + 1)) == NULL) {
- return _zip_err_str[ZIP_ER_MEMORY].description;
- }
- sprintf(s, "%s%s%s", (zip_error_string ? zip_error_string : ""), (zip_error_string ? ": " : ""), system_error_string);
- err->str = s;
- return s;
- }
- }
|