From 4dcef0e17836e8725c31a3b76f2bf7144345c808 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 20 Oct 2020 14:08:35 +0200 Subject: Replace most calls to open by a new wrapper. * common/sysutils.c (any8bitchar) [W32]: New. (gnupg_open): New. Replace most calls to open by this. * common/iobuf.c (any8bitchar) [W32]: New. (direct_open) [W32]: Use CreateFileW if needed. -- This is yet another step for full Unicode support on Windows. GnuPG-bug-id: 5098 --- common/sysutils.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'common/sysutils.c') 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 -- cgit v1.2.3