Added experimental new write flag:
WIMLIB_WRITE_FLAG_SEND_DONE_WITH_FILE_MESSAGES.
+ Library users can now specify a custom file for warning and error
+ messages to be sent to, rather than the default of standard error.
+
Version 1.7.0:
Improved compression, decompression, and extraction performance.
wimlib_resolve_image(WIMStruct *wim,
const wimlib_tchar *image_name_or_num);
+/**
+ * Sets the file to which the library will print error and warning messages.
+ *
+ * This version of the function takes a C library <c>FILE *</c> opened for
+ * writing (or appending). Use wimlib_set_error_file_by_name() to specify the
+ * file by name instead.
+ *
+ * This also enables error messages, as if by a call to
+ * wimlib_set_print_errors(true).
+ *
+ * @return 0 on success; nonzero on error.
+ * @retval ::WIMLIB_ERR_UNSUPPORTED
+ * wimlib was compiled using the <c>--without-error-messages</c> option.
+ */
+extern int
+wimlib_set_error_file(FILE *fp);
+
+/**
+ * Sets the path to the file to which the library will print error and warning
+ * messages. The library will open this file for appending.
+ *
+ * This also enables error messages, as if by a call to
+ * wimlib_set_print_errors(true).
+ *
+ * @return 0 on success; nonzero on error.
+ * @retval ::WIMLIB_ERR_OPEN
+ * The file named by @p path could not be opened for appending.
+ * @retval ::WIMLIB_ERR_UNSUPPORTED
+ * wimlib was compiled using the <c>--without-error-messages</c> option.
+ */
+extern int
+wimlib_set_error_file_by_name(const char *path);
+
/**
* @ingroup G_modifying_wims
*
# define WARNING(format, ...) wimlib_warning(T(format), ## __VA_ARGS__)
# define WARNING_WITH_ERRNO(format, ...) wimlib_warning_with_errno(T(format), ## __VA_ARGS__)
extern bool wimlib_print_errors;
+extern FILE *wimlib_error_file;
#else /* ENABLE_ERROR_MESSAGES */
# define wimlib_print_errors 0
+# define wimlib_error_file NULL
# define ERROR(format, ...) dummy_tprintf(T(format), ## __VA_ARGS__)
# define ERROR_WITH_ERRNO(format, ...) dummy_tprintf(T(format), ## __VA_ARGS__)
# define WARNING(format, ...) dummy_tprintf(T(format), ## __VA_ARGS__)
{
if (wimlib_print_errors) {
ERROR("\"%"TS"\": stream not found", inode_first_full_path(inode));
- tfprintf(stderr, T(" SHA-1 message digest of missing stream:\n "));
- print_hash(hash, stderr);
- tputc(T('\n'), stderr);
+ tfprintf(wimlib_error_file,
+ T(" SHA-1 message digest of missing stream:\n "));
+ print_hash(hash, wimlib_error_file);
+ tputc(T('\n'), wimlib_error_file);
}
return WIMLIB_ERR_RESOURCE_NOT_FOUND;
}
ERROR_WITH_ERRNO("Failed to set security descriptor "
"on \"%s\" in NTFS volume",
dentry_full_path(one_dentry));
- fprintf(stderr, "The security descriptor is: ");
- print_byte_field(desc, desc_size, stderr);
- fprintf(stderr, "\n");
+ fprintf(wimlib_error_file,
+ "The security descriptor is: ");
+ print_byte_field(desc, desc_size, wimlib_error_file);
+ fprintf(wimlib_error_file, "\n");
}
return ret;
}
#ifdef ENABLE_ERROR_MESSAGES
bool wimlib_print_errors = false;
+FILE *wimlib_error_file = NULL; /* Set in wimlib_global_init() */
#endif
#if defined(ENABLE_ERROR_MESSAGES) || defined(ENABLE_DEBUG)
{
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;
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;
}
}
#endif
}
+WIMLIBAPI int
+wimlib_set_error_file(FILE *fp)
+{
+#ifdef ENABLE_ERROR_MESSAGES
+ wimlib_error_file = fp;
+ wimlib_print_errors = true;
+ return 0;
+#else
+ return WIMLIB_ERR_UNSUPPORTED;
+#endif
+}
+
+WIMLIBAPI int
+wimlib_set_error_file_by_name(const char *path)
+{
+#ifdef ENABLE_ERROR_MESSAGES
+ FILE *fp;
+
+ fp = fopen(path, "a");
+ if (!fp)
+ return WIMLIB_ERR_OPEN;
+
+ wimlib_error_file = fp;
+ wimlib_print_errors = true;
+ return 0;
+#else
+ return WIMLIB_ERR_UNSUPPORTED;
+#endif
+}
+
static const tchar *error_strings[] = {
[WIMLIB_ERR_SUCCESS]
= T("Success"),
if (lib_initialized)
return 0;
+#ifdef ENABLE_ERROR_MESSAGES
+ if (wimlib_error_file == NULL)
+ wimlib_error_file = stderr;
+#endif
+
if (init_flags & ~(WIMLIB_INIT_FLAG_ASSUME_UTF8 |
WIMLIB_INIT_FLAG_DONT_ACQUIRE_PRIVILEGES |
WIMLIB_INIT_FLAG_STRICT_CAPTURE_PRIVILEGES |
if (wimlib_print_errors) {
print_byte_field((const u8 *)hdr,
sizeof(struct WimOverlay_dat_header),
- stderr);
- fputc('\n', stderr);
+ wimlib_error_file);
+ fputc('\n', wimlib_error_file);
}
ret = WIMLIB_ERR_UNSUPPORTED;
goto out_free_contents;
path, i, entry_1->data_source_id);
if (wimlib_print_errors) {
print_byte_field((const u8 *)entry_2->wim_file_name,
- wim_file_name_length, stderr);
- fputc('\n', stderr);
+ wim_file_name_length,
+ wimlib_error_file);
+ fputc('\n', wimlib_error_file);
}
ret = WIMLIB_ERR_UNSUPPORTED;
goto out_free_contents;
if (wimlib_print_errors) {
print_byte_field((const u8 *)entry_2,
entry_1->entry_2_length,
- stderr);
- fputc('\n', stderr);
+ wimlib_error_file);
+ fputc('\n', wimlib_error_file);
}
ret = WIMLIB_ERR_UNSUPPORTED;
goto out_free_contents;