]> wimlib.net Git - wimlib/blobdiff - src/win32_replacements.c
read_wim_header(): Check return value of lseek()
[wimlib] / src / win32_replacements.c
index 39f031bb4d372f496e76c9b3d53716a586701d89..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;
@@ -269,36 +270,6 @@ pwrite(int fd, const void *buf, size_t count, off_t offset)
        return do_pread_or_pwrite(fd, (void*)buf, count, offset, true);
 }
 
-int
-win32_get_file_and_vol_ids(const wchar_t *path, u64 *ino_ret, u64 *dev_ret)
-{
-       HANDLE h;
-       BY_HANDLE_FILE_INFORMATION file_info;
-       int ret;
-       DWORD err;
-
-       h = win32_open_existing_file(path, FILE_READ_ATTRIBUTES);
-       if (h == INVALID_HANDLE_VALUE) {
-               ret = WIMLIB_ERR_OPEN;
-               goto out;
-       }
-
-       if (!GetFileInformationByHandle(h, &file_info)) {
-               ret = WIMLIB_ERR_STAT;
-       } else {
-               *ino_ret = ((u64)file_info.nFileIndexHigh << 32) |
-                           (u64)file_info.nFileIndexLow;
-               *dev_ret = file_info.dwVolumeSerialNumber;
-               ret = 0;
-       }
-       err = GetLastError();
-       CloseHandle(h);
-       SetLastError(err);
-out:
-       set_errno_from_GetLastError();
-       return ret;
-}
-
 /* Replacement for glob() in Windows native builds that operates on wide
  * characters.  */
 int
@@ -402,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__ */