diff options
Diffstat (limited to 'common/sysutils.c')
-rw-r--r-- | common/sysutils.c | 36 |
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 |