X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fwin32_replacements.c;h=3082255033b3123cec78f70d965df4cb16e9c39c;hb=9ca5c20853d3be06378fb985aa75c75df280d1e2;hp=25a3ae08c96e0a2ea720720fe2f08013ecfe8c40;hpb=b0948f133903373626d74324a9693a47b7a48feb;p=wimlib diff --git a/src/win32_replacements.c b/src/win32_replacements.c index 25a3ae08..30822550 100644 --- a/src/win32_replacements.c +++ b/src/win32_replacements.c @@ -31,6 +31,7 @@ #include #include #include /* for _get_osfhandle() */ +#include #include "wimlib/win32_common.h" @@ -191,7 +192,7 @@ err_set_errno: /* 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; @@ -372,4 +373,33 @@ globfree(glob_t *pglob) 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__ */