]> wimlib.net Git - wimlib/blobdiff - src/win32_replacements.c
read_wim_header(): Check return value of lseek()
[wimlib] / src / win32_replacements.c
index 25a3ae08c96e0a2ea720720fe2f08013ecfe8c40..3082255033b3123cec78f70d965df4cb16e9c39c 100644 (file)
@@ -31,6 +31,7 @@
 #include <errno.h>
 #include <pthread.h>
 #include <io.h>        /* for _get_osfhandle()  */
+#include <fcntl.h>
 
 #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__ */