aboutsummaryrefslogtreecommitdiffstats
path: root/common/iobuf.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2020-10-20 12:08:35 +0000
committerWerner Koch <[email protected]>2020-10-20 12:08:35 +0000
commit4dcef0e17836e8725c31a3b76f2bf7144345c808 (patch)
treee75dc82afa98ea964ee65fde05608a6148214ffe /common/iobuf.c
parentw32: Allow Unicode filenames for dotlock (diff)
downloadgnupg-4dcef0e17836e8725c31a3b76f2bf7144345c808.tar.gz
gnupg-4dcef0e17836e8725c31a3b76f2bf7144345c808.zip
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
Diffstat (limited to 'common/iobuf.c')
-rw-r--r--common/iobuf.c45
1 files changed, 30 insertions, 15 deletions
diff --git a/common/iobuf.c b/common/iobuf.c
index a5b8d5955..e82e75d1b 100644
--- a/common/iobuf.c
+++ b/common/iobuf.c
@@ -198,6 +198,19 @@ fd_cache_strcmp (const char *a, const char *b)
#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*/
+
/*
* Invalidate (i.e. close) a cached iobuf
*/
@@ -299,21 +312,23 @@ direct_open (const char *fname, const char *mode, int mode700)
sm = FILE_SHARE_READ;
}
-#ifdef HAVE_W32CE_SYSTEM
- {
- wchar_t *wfname = utf8_to_wchar (fname);
- if (wfname)
- {
- hfile = CreateFile (wfname, da, sm, NULL, cd,
- FILE_ATTRIBUTE_NORMAL, NULL);
- xfree (wfname);
- }
- else
- hfile = INVALID_HANDLE_VALUE;
- }
-#else
- hfile = CreateFile (fname, da, sm, NULL, cd, FILE_ATTRIBUTE_NORMAL, NULL);
-#endif
+ /* We use the Unicode version of the function only if needed to
+ * avoid an extra conversion step. */
+ if (any8bitchar (fname))
+ {
+ wchar_t *wfname = utf8_to_wchar (fname);
+ if (wfname)
+ {
+ hfile = CreateFileW (wfname, da, sm, NULL, cd,
+ FILE_ATTRIBUTE_NORMAL, NULL);
+ xfree (wfname);
+ }
+ else
+ hfile = INVALID_HANDLE_VALUE;
+ }
+ else
+ hfile = CreateFileA (fname, da, sm, NULL, cd, FILE_ATTRIBUTE_NORMAL, NULL);
+
return hfile;
#else /*!HAVE_W32_SYSTEM*/