summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Lubomir I. Ivanov <neolit123@gmail.com>2014-11-13 19:36:08 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-11-13 11:58:59 -0800
commit4096383fb57ab33e9adc32a13f20b7a58a2c33c7 (patch)
treef6c1a20f0ea269256a0124955487b911dae6b583
parent61dc19d2e0bc69004b03a990993eda547f4e0093 (diff)
downloadsubsurface-4096383fb57ab33e9adc32a13f20b7a58a2c33c7.tar.gz
Add subsurface_access()
For our usage the method will acept UTF-8 paths, which are converted to UTF-16 on Win32. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--dive.h1
-rw-r--r--libdivecomputer.c2
-rw-r--r--linux.c5
-rw-r--r--macos.c7
-rw-r--r--windows.c13
5 files changed, 26 insertions, 2 deletions
diff --git a/dive.h b/dive.h
index 272edf70e..c745255a3 100644
--- a/dive.h
+++ b/dive.h
@@ -653,6 +653,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_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);
extern void subsurface_console_init(bool dedicated);
diff --git a/libdivecomputer.c b/libdivecomputer.c
index 991aaaa72..17bd01a0a 100644
--- a/libdivecomputer.c
+++ b/libdivecomputer.c
@@ -849,7 +849,7 @@ const char *do_libdivecomputer_import(device_data_t *data)
err = do_device_import(data);
/* TODO: Show the logfile to the user on error. */
dc_device_close(data->device);
- } else if (access(data->devname, R_OK | W_OK) != 0)
+ } else if (subsurface_access(data->devname, R_OK | W_OK) != 0)
err = translate("gettextFromC", "Insufficient privileges to open the device %s %s (%s)");
dc_context_free(data->context);
diff --git a/linux.c b/linux.c
index caf06b9f8..3ffd997a1 100644
--- a/linux.c
+++ b/linux.c
@@ -164,6 +164,11 @@ void *subsurface_opendir(const char *path)
return (void *)opendir(path);
}
+int subsurface_access(const char *path, int mode)
+{
+ return access(path, mode);
+}
+
struct zip *subsurface_zip_open_readonly(const char *path, int flags, int *errorp)
{
return zip_open(path, flags, errorp);
diff --git a/macos.c b/macos.c
index 91992d839..36c1f6049 100644
--- a/macos.c
+++ b/macos.c
@@ -11,7 +11,7 @@
#include <sys/syslimits.h>
#include <stdio.h>
#include <fcntl.h>
-#include <dirent.h>
+#include <unistd.h>
void subsurface_user_info(struct user_info *info)
{ /* Nothing, let's use libgit2-20 on MacOS */ }
@@ -147,6 +147,11 @@ void *subsurface_opendir(const char *path)
return (void *)opendir(path);
}
+int subsurface_access(const char *path, int mode)
+{
+ return access(path, mode);
+}
+
struct zip *subsurface_zip_open_readonly(const char *path, int flags, int *errorp)
{
return zip_open(path, flags, errorp);
diff --git a/windows.c b/windows.c
index 386b52eb1..02b396f76 100644
--- a/windows.c
+++ b/windows.c
@@ -1,5 +1,6 @@
/* windows.c */
/* implements Windows specific functions */
+#include <io.h>
#include "dive.h"
#include "display.h"
#undef _WIN32_WINNT
@@ -235,6 +236,18 @@ void *subsurface_opendir(const char *path)
return (void *)ret;
}
+int subsurface_access(const char *path, int mode)
+{
+ int ret = -1;
+ if (!path)
+ return ret;
+ wchar_t *wpath = utf8_to_utf16(path);
+ if (wpath)
+ ret = _waccess(wpath, mode);
+ free((void *)wpath);
+ return ret;
+}
+
#ifndef O_BINARY
#define O_BINARY 0
#endif