X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Futil.c;h=e074b951e7d4864da2d898f4c3fa83fc9f92e4cf;hp=fceae14b026b4aa196547dc0f815dad22622f668;hb=16a0ef18b1404aab857696ae479e246dfbcfbaa3;hpb=11b4f88edd142c41c7d09384081157d9830ee437 diff --git a/src/util.c b/src/util.c index fceae14b..e074b951 100644 --- a/src/util.c +++ b/src/util.c @@ -37,6 +37,7 @@ #endif #include "wimlib.h" +#include "wimlib/assert.h" #include "wimlib/compiler.h" #include "wimlib/encoding.h" #include "wimlib/error.h" @@ -65,6 +66,8 @@ utf16le_strlen(const utf16lechar *s) #ifdef ENABLE_ERROR_MESSAGES bool wimlib_print_errors = false; +FILE *wimlib_error_file = NULL; /* Set in wimlib_global_init() */ +static bool wimlib_owns_error_file = false; #endif #if defined(ENABLE_ERROR_MESSAGES) || defined(ENABLE_DEBUG) @@ -78,8 +81,8 @@ wimlib_vmsg(const tchar *tag, const tchar *format, { int errno_save = errno; fflush(stdout); - tfputs(tag, stderr); - tvfprintf(stderr, format, va); + tfputs(tag, wimlib_error_file); + tvfprintf(wimlib_error_file, format, va); if (perror && errno_save != 0) { tchar buf[64]; int res; @@ -93,10 +96,10 @@ wimlib_vmsg(const tchar *tag, const tchar *format, if (errno_save == EBUSY) tstrcpy(buf, T("Resource busy")); #endif - tfprintf(stderr, T(": %"TS), buf); + tfprintf(wimlib_error_file, T(": %"TS), buf); } - tputc(T('\n'), stderr); - fflush(stderr); + tputc(T('\n'), wimlib_error_file); + fflush(wimlib_error_file); errno = errno_save; } } @@ -186,6 +189,42 @@ wimlib_set_print_errors(bool show_error_messages) #endif } +WIMLIBAPI int +wimlib_set_error_file(FILE *fp) +{ +#ifdef ENABLE_ERROR_MESSAGES + if (wimlib_owns_error_file) + fclose(wimlib_error_file); + wimlib_error_file = fp; + wimlib_print_errors = (fp != NULL); + wimlib_owns_error_file = false; + return 0; +#else + return WIMLIB_ERR_UNSUPPORTED; +#endif +} + +WIMLIBAPI int +wimlib_set_error_file_by_name(const tchar *path) +{ +#ifdef ENABLE_ERROR_MESSAGES + FILE *fp; + +#ifdef __WIN32__ + fp = win32_open_logfile(path); +#else + fp = fopen(path, "a"); +#endif + if (!fp) + return WIMLIB_ERR_OPEN; + wimlib_set_error_file(fp); + wimlib_owns_error_file = true; + return 0; +#else + return WIMLIB_ERR_UNSUPPORTED; +#endif +} + static const tchar *error_strings[] = { [WIMLIB_ERR_SUCCESS] = T("Success"), @@ -208,13 +247,13 @@ static const tchar *error_strings[] = { [WIMLIB_ERR_INSUFFICIENT_PRIVILEGES] = T("The user does not have sufficient privileges"), [WIMLIB_ERR_INTEGRITY] - = T("The WIM failed an integrity check"), + = T("The WIM file is corrupted (failed integrity check)"), [WIMLIB_ERR_INVALID_CAPTURE_CONFIG] = T("The capture configuration string was invalid"), [WIMLIB_ERR_INVALID_CHUNK_SIZE] - = T("The WIM chunk size was invalid"), + = T("The compression chunk size was unrecognized"), [WIMLIB_ERR_INVALID_COMPRESSION_TYPE] - = T("The WIM compression type was invalid"), + = T("The compression type was unrecognized"), [WIMLIB_ERR_INVALID_HEADER] = T("The WIM header was invalid"), [WIMLIB_ERR_INVALID_IMAGE] @@ -342,22 +381,26 @@ static const tchar *error_strings[] = { = T("There is not a WIM image mounted on the directory"), [WIMLIB_ERR_NOT_PERMITTED_TO_UNMOUNT] = T("The current user does not have permission to unmount the WIM image"), + [WIMLIB_ERR_FVE_LOCKED_VOLUME] + = T("The volume must be unlocked before it can be used"), }; /* API function documented in wimlib.h */ WIMLIBAPI const tchar * -wimlib_get_error_string(enum wimlib_error_code code) +wimlib_get_error_string(enum wimlib_error_code _code) { - if ((int)code < 0 || code >= ARRAY_LEN(error_strings)) - return NULL; - else - return error_strings[code]; + unsigned int code = (unsigned int)_code; + + if (code >= ARRAY_LEN(error_strings) || error_strings[code] == NULL) + return T("Unknown error"); + + return error_strings[code]; } -static void *(*wimlib_malloc_func) (size_t) = malloc; -static void (*wimlib_free_func) (void *) = free; +static void *(*wimlib_malloc_func) (size_t) = malloc; +static void (*wimlib_free_func) (void *) = free; static void *(*wimlib_realloc_func)(void *, size_t) = realloc; void * @@ -432,6 +475,36 @@ wimlib_wcsdup(const wchar_t *str) } #endif +void * +wimlib_aligned_malloc(size_t size, size_t alignment) +{ + u8 *raw_ptr; + u8 *ptr; + uintptr_t mask; + + wimlib_assert(alignment != 0 && is_power_of_2(alignment) && + alignment <= 4096); + mask = alignment - 1; + + raw_ptr = MALLOC(size + alignment - 1 + sizeof(size_t)); + if (!raw_ptr) + return NULL; + + ptr = (u8 *)raw_ptr + sizeof(size_t); + while ((uintptr_t)ptr & mask) + ptr++; + *((size_t *)ptr - 1) = (ptr - raw_ptr); + + return ptr; +} + +void +wimlib_aligned_free(void *ptr) +{ + if (ptr) + FREE((u8 *)ptr - *((size_t *)ptr - 1)); +} + void * memdup(const void *mem, size_t size) {