aboutsummaryrefslogtreecommitdiffstats
path: root/common/sysutils.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--common/sysutils.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/common/sysutils.c b/common/sysutils.c
index 6738da108..bfb5d7dd8 100644
--- a/common/sysutils.c
+++ b/common/sysutils.c
@@ -182,6 +182,18 @@ enable_core_dumps (void)
#endif
}
+#ifdef HAVE_W32_SYSTEM
+static int
+any8bitchar (const char *string)
+{
+ if (string)
+ for ( ; *string; string++)
+ if ((*string & 0x80))
+ return 1;
+ return 0;
+}
+#endif /*HAVE_W32_SYSTEM*/
+
/* Allow the use of special "-&nnn" style file names. */
void
@@ -1066,6 +1078,30 @@ gnupg_access (const char *name, int mode)
#endif
}
+/* A wrapper around open to handle Unicode file names under Windows. */
+int
+gnupg_open (const char *name, int flags, unsigned int mode)
+{
+#ifdef HAVE_W32_SYSTEM
+ if (any8bitchar (name))
+ {
+ wchar_t *wname;
+ int ret;
+
+ wname = utf8_to_wchar (name);
+ if (!wname)
+ return -1;
+ ret = _wopen (wname, flags, mode);
+ xfree (wname);
+ return ret;
+ }
+ else
+ return open (name, flags, mode);
+#else
+ return open (name, flags, mode);
+#endif
+}
+
/* Try to set an envvar. Print only a notice on error. */
#ifndef HAVE_W32_SYSTEM