#include <errno.h>
#include <pthread.h>
#include <io.h> /* for _get_osfhandle() */
+#include <fcntl.h>
#include "wimlib/win32_common.h"
/* This really could be replaced with _wcserror_s, but this doesn't seem to
* actually be available in MSVCRT.DLL on Windows XP (perhaps it's statically
* linked in by Visual Studio...?). */
-extern int
+int
win32_strerror_r_replacement(int errnum, wchar_t *buf, size_t buflen)
{
static pthread_mutex_t strerror_lock = PTHREAD_MUTEX_INITIALIZER;
FREE(pglob->gl_pathv);
}
+/* Replacement for fopen(path, "a") that doesn't prevent other processes from
+ * reading the file */
+FILE *
+win32_open_logfile(const wchar_t *path)
+{
+ HANDLE h;
+ int fd;
+ FILE *fp;
+
+ h = CreateFile(path, FILE_APPEND_DATA, FILE_SHARE_VALID_FLAGS,
+ NULL, OPEN_ALWAYS, 0, NULL);
+ if (h == INVALID_HANDLE_VALUE)
+ return NULL;
+
+ fd = _open_osfhandle((intptr_t)h, O_APPEND);
+ if (fd < 0) {
+ CloseHandle(h);
+ return NULL;
+ }
+
+ fp = fdopen(fd, "a");
+ if (!fp) {
+ close(fd);
+ return NULL;
+ }
+
+ return fp;
+}
+
#endif /* __WIN32__ */