X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Futil.c;h=7916f40a77b8a0b333af90c163e4b6d2ca8458a5;hp=6f17b5bf28371cc3a91340ae88e7b77977075a03;hb=3a900017c59c26af398f9cf375719dbcda378fb8;hpb=66abeba083ec882f4fac6a2d6a8ce3eef61be442 diff --git a/src/util.c b/src/util.c index 6f17b5bf..7916f40a 100644 --- a/src/util.c +++ b/src/util.c @@ -54,7 +54,7 @@ #include #include -static size_t +size_t utf16le_strlen(const utf16lechar *s) { const utf16lechar *p = s; @@ -63,87 +63,6 @@ utf16le_strlen(const utf16lechar *s) return (p - s) * sizeof(utf16lechar); } -#ifdef __WIN32__ -# define wimlib_vfprintf vfwprintf -#else -/* Handle %W for UTF16-LE printing. - * - * TODO: this is not yet done properly--- it's assumed that if the format string - * contains %W, then it contains no other format specifiers. - */ -static int -wimlib_vfprintf(FILE *fp, const tchar *format, va_list va) -{ - const tchar *p; - int n; - - for (p = format; *p; p++) - if (*p == T('%') && *(p + 1) == T('W')) - goto special; - return tvfprintf(fp, format, va); -special: - n = 0; - for (p = format; *p; p++) { - if (*p == T('%') && (*(p + 1) == T('W'))) { - int ret; - tchar *tstr; - size_t tstr_nbytes; - utf16lechar *ucs = va_arg(va, utf16lechar*); - - if (ucs) { - size_t ucs_nbytes = utf16le_strlen(ucs); - - ret = utf16le_to_tstr(ucs, ucs_nbytes, - &tstr, &tstr_nbytes); - if (ret) { - ret = tfprintf(fp, T("??????")); - } else { - ret = tfprintf(fp, T("%"TS), tstr); - FREE(tstr); - } - if (ret < 0) - return -1; - else - n += ret; - } else { - n += tfprintf(fp, T("(null)")); - } - p++; - } else { - if (tputc(*p, fp) == EOF) - return -1; - n++; - } - } - return n; -} - -int -wimlib_printf(const tchar *format, ...) -{ - int ret; - va_list va; - - va_start(va, format); - ret = wimlib_vfprintf(stdout, format, va); - va_end(va); - return ret; -} - -int -wimlib_fprintf(FILE *fp, const tchar *format, ...) -{ - int ret; - va_list va; - - va_start(va, format); - ret = wimlib_vfprintf(fp, format, va); - va_end(va); - return ret; -} - -#endif /* __WIN32__ */ - #ifdef ENABLE_ERROR_MESSAGES bool wimlib_print_errors = false; #endif @@ -153,17 +72,18 @@ static void wimlib_vmsg(const tchar *tag, const tchar *format, va_list va, bool perror) { -#ifndef DEBUG - if (wimlib_print_errors) { +#if !defined(ENABLE_DEBUG) + if (wimlib_print_errors) #endif + { int errno_save = errno; fflush(stdout); tfputs(tag, stderr); - wimlib_vfprintf(stderr, format, va); + tvfprintf(stderr, format, va); if (perror && errno_save != 0) { - tchar buf[50]; + tchar buf[64]; int res; - res = tstrerror_r(errno_save, buf, sizeof(buf)); + res = tstrerror_r(errno_save, buf, ARRAY_LEN(buf)); if (res) { tsprintf(buf, T("unknown error (errno=%d)"), @@ -178,9 +98,7 @@ wimlib_vmsg(const tchar *tag, const tchar *format, tputc(T('\n'), stderr); fflush(stderr); errno = errno_save; -#ifndef DEBUG } -#endif } #endif @@ -286,6 +204,8 @@ static const tchar *error_strings[] = { [WIMLIB_ERR_FUSERMOUNT] = T("Could not execute the `fusermount' program, or it exited " "with a failure status"), + [WIMLIB_ERR_GLOB_HAD_NO_MATCHES] + = T("The provided file glob did not match any files"), [WIMLIB_ERR_ICONV_NOT_AVAILABLE] = T("The iconv() function does not seem to work. " "Maybe check to make sure the directory /usr/lib/gconv exists"), @@ -301,11 +221,9 @@ static const tchar *error_strings[] = { [WIMLIB_ERR_INVALID_CAPTURE_CONFIG] = T("The capture configuration string was invalid"), [WIMLIB_ERR_INVALID_CHUNK_SIZE] - = T("The WIM is compressed but does not have a chunk " - "size of 32768"), + = T("The WIM chunk size was invalid"), [WIMLIB_ERR_INVALID_COMPRESSION_TYPE] - = T("The WIM is compressed, but is not marked as having LZX or " - "XPRESS compression"), + = T("The WIM compression type was invalid"), [WIMLIB_ERR_INVALID_HEADER] = T("The WIM header was invalid"), [WIMLIB_ERR_INVALID_IMAGE] @@ -339,12 +257,16 @@ static const tchar *error_strings[] = { = T("A string in a WIM dentry is not a valid UTF-16LE string"), [WIMLIB_ERR_IS_DIRECTORY] = T("One of the specified paths to delete was a directory"), + [WIMLIB_ERR_IS_SPLIT_WIM] + = T("The WIM is part of a split WIM, which is not supported for this operation"), [WIMLIB_ERR_LIBXML_UTF16_HANDLER_NOT_AVAILABLE] = T("libxml2 was unable to find a character encoding conversion handler " "for UTF-16LE"), [WIMLIB_ERR_LINK] = T("Failed to create a hard or symbolic link when extracting " "a file from the WIM"), + [WIMLIB_ERR_METADATA_NOT_FOUND] + = T("A required metadata resource could not be located"), [WIMLIB_ERR_MKDIR] = T("Failed to create a directory"), [WIMLIB_ERR_MQUEUE] @@ -398,8 +320,6 @@ static const tchar *error_strings[] = { = T("Failed to set timestamps on extracted file"), [WIMLIB_ERR_SPLIT_INVALID] = T("The WIM is part of an invalid split WIM"), - [WIMLIB_ERR_SPLIT_UNSUPPORTED] - = T("The WIM is part of a split WIM, which is not supported for this operation"), [WIMLIB_ERR_STAT] = T("Could not read the metadata for a file or directory"), [WIMLIB_ERR_TIMEOUT] @@ -422,6 +342,16 @@ static const tchar *error_strings[] = { = T("Failed to write data to a file"), [WIMLIB_ERR_XML] = T("The XML data of the WIM is invalid"), + [WIMLIB_ERR_WIM_IS_ENCRYPTED] + = T("The WIM file (or parts of it) is encrypted"), + [WIMLIB_ERR_WIMBOOT] + = T("Failed to set WIMBoot pointer data"), + [WIMLIB_ERR_ABORTED_BY_PROGRESS] + = T("The operation was aborted by the library user"), + [WIMLIB_ERR_UNKNOWN_PROGRESS_STATUS] + = T("The user-provided progress function returned an unrecognized value"), + [WIMLIB_ERR_MKNOD] + = T("Unable to create a special file (e.g. device node or socket)"), }; /* API function documented in wimlib.h */ @@ -436,7 +366,6 @@ wimlib_get_error_string(enum wimlib_error_code code) -#ifdef ENABLE_CUSTOM_MEMORY_ALLOCATOR static void *(*wimlib_malloc_func) (size_t) = malloc; static void (*wimlib_free_func) (void *) = free; static void *(*wimlib_realloc_func)(void *, size_t) = realloc; @@ -444,11 +373,17 @@ static void *(*wimlib_realloc_func)(void *, size_t) = realloc; void * wimlib_malloc(size_t size) { - if (size == 0) - size = 1; - void *ptr = (*wimlib_malloc_func)(size); - if (ptr == NULL) + void *ptr; + +retry: + ptr = (*wimlib_malloc_func)(size); + if (unlikely(!ptr)) { + if (!size) { + size++; + goto retry; + } ERROR("memory exhausted"); + } return ptr; } @@ -507,8 +442,6 @@ wimlib_wcsdup(const wchar_t *str) } #endif -#endif /* ENABLE_CUSTOM_MEMORY_ALLOCATOR */ - void * memdup(const void *mem, size_t size) { @@ -524,7 +457,6 @@ wimlib_set_memory_allocator(void *(*malloc_func)(size_t), void (*free_func)(void *), void *(*realloc_func)(void *, size_t)) { -#ifdef ENABLE_CUSTOM_MEMORY_ALLOCATOR wimlib_malloc_func = malloc_func ? malloc_func : malloc; wimlib_free_func = free_func ? free_func : free; wimlib_realloc_func = realloc_func ? realloc_func : realloc; @@ -532,12 +464,6 @@ wimlib_set_memory_allocator(void *(*malloc_func)(size_t), xml_set_memory_allocator(wimlib_malloc_func, wimlib_free_func, wimlib_realloc_func); return 0; -#else - ERROR("Cannot set custom memory allocator functions:"); - ERROR("wimlib was compiled with the --without-custom-memory-allocator " - "flag"); - return WIMLIB_ERR_UNSUPPORTED; -#endif } static bool seeded = false;