]> wimlib.net Git - wimlib/blobdiff - src/win32_replacements.c
win32_apply.c: Never externally back extracted SYSTEM registry files
[wimlib] / src / win32_replacements.c
index 25a3ae08c96e0a2ea720720fe2f08013ecfe8c40..b282768d3edc1f3473967f3252167aa4226efa32 100644 (file)
@@ -6,20 +6,18 @@
 /*
  * Copyright (C) 2013 Eric Biggers
  *
- * This file is part of wimlib, a library for working with WIM files.
+ * This file is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at your option) any
+ * later version.
  *
- * wimlib is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 3 of the License, or (at your option)
- * any later version.
- *
- * wimlib is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * This file is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
  * details.
  *
- * You should have received a copy of the GNU General Public License
- * along with wimlib; if not, see http://www.gnu.org/licenses/.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this file; if not, see http://www.gnu.org/licenses/.
  */
 
 #ifdef __WIN32__
@@ -31,6 +29,7 @@
 #include <errno.h>
 #include <pthread.h>
 #include <io.h>        /* for _get_osfhandle()  */
+#include <fcntl.h>
 
 #include "wimlib/win32_common.h"
 
@@ -191,7 +190,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 +371,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__ */