[PATCH 2/5] OS: add the subsurface_mkdir() wrapper

Lubomir I. Ivanov neolit123 at gmail.com
Sun Feb 15 10:25:19 PST 2015


From: "Lubomir I. Ivanov" <neolit123 at gmail.com>

Win32's API does not support file permission bits via the
mkdir() function. We wrap the mkdir() call into
subsurface_mkdir() and ignore 'mode' for Win32.

Signed-off-by: Lubomir I. Ivanov <neolit123 at gmail.com>
---
 dive.h       |  1 +
 git-access.c |  2 +-
 linux.c      |  6 ++++++
 macos.c      |  7 +++++++
 windows.c    | 15 +++++++++++++++
 5 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/dive.h b/dive.h
index 8247a5f..f798332 100644
--- a/dive.h
+++ b/dive.h
@@ -675,6 +675,7 @@ extern int subsurface_rename(const char *path, const char *newpath);
 extern int subsurface_open(const char *path, int oflags, mode_t mode);
 extern FILE *subsurface_fopen(const char *path, const char *mode);
 extern void *subsurface_opendir(const char *path);
+extern int subsurface_mkdir(const char *path, mode_t mode);
 extern int subsurface_access(const char *path, int mode);
 extern struct zip *subsurface_zip_open_readonly(const char *path, int flags, int *errorp);
 extern int subsurface_zip_close(struct zip *zip);
diff --git a/git-access.c b/git-access.c
index c39e7ef..d0c489d 100644
--- a/git-access.c
+++ b/git-access.c
@@ -30,7 +30,7 @@ static const char *system_git_dir(void)
 	if (!*pathname) {
 		// This doesn't work on Windows, crap that it is. Somebody needs to fix it.
 		snprintf(pathname, PATH_MAX, "%s/git-caches", system_default_directory());
-		mkdir(pathname, 0777);
+		subsurface_mkdir(pathname, 0777);
 	}
 	return pathname;
 }
diff --git a/linux.c b/linux.c
index 3ffd997..2576b76 100644
--- a/linux.c
+++ b/linux.c
@@ -5,6 +5,7 @@
 #include "membuffer.h"
 #include <string.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 #include <dirent.h>
 #include <fnmatch.h>
 #include <stdio.h>
@@ -164,6 +165,11 @@ void *subsurface_opendir(const char *path)
 	return (void *)opendir(path);
 }
 
+int subsurface_mkdir(const char *path, mode_t mode)
+{
+	return mkdir(path, mode);
+}
+
 int subsurface_access(const char *path, int mode)
 {
 	return access(path, mode);
diff --git a/macos.c b/macos.c
index 36c1f60..2c7c8ad 100644
--- a/macos.c
+++ b/macos.c
@@ -9,6 +9,8 @@
 #include <CoreServices/CoreServices.h>
 #include <mach-o/dyld.h>
 #include <sys/syslimits.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 #include <stdio.h>
 #include <fcntl.h>
 #include <unistd.h>
@@ -147,6 +149,11 @@ void *subsurface_opendir(const char *path)
 	return (void *)opendir(path);
 }
 
+int subsurface_mkdir(const char *path, mode_t mode)
+{
+	return mkdir(path, mode);
+}
+
 int subsurface_access(const char *path, int mode)
 {
 	return access(path, mode);
diff --git a/windows.c b/windows.c
index 5441b39..e859518 100644
--- a/windows.c
+++ b/windows.c
@@ -12,6 +12,8 @@
 #include <assert.h>
 #include <dirent.h>
 #include <zip.h>
+#include <direct.h>
+#include <sys/types.h>
 
 const char non_standard_system_divelist_default_font[] = "Calibri";
 const char current_system_divelist_default_font[] = "Segoe UI";
@@ -231,6 +233,19 @@ void *subsurface_opendir(const char *path)
 	return (void *)ret;
 }
 
+int subsurface_mkdir(const char *path, mode_t mode)
+{
+	(void)mode;
+	int ret = -1;
+	if (!path)
+		return ret;
+	wchar_t *wpath = utf8_to_utf16(path);
+	if (wpath)
+		ret = _wmkdir(wpath);
+	free((void *)wpath);
+	return ret;
+}
+
 int subsurface_access(const char *path, int mode)
 {
 	int ret = -1;
-- 
1.7.11.msysgit.0



More information about the subsurface mailing list