diff options
author | Werner Koch <[email protected]> | 2020-10-21 14:53:41 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2020-10-23 09:20:24 +0000 |
commit | 4252cd7b18b41a0d91076e46df9ba857e743406b (patch) | |
tree | 56fdf3dbaf725f03770196c695e3006e0669762d | |
parent | Replace all calls to stat by gnupg_stat. (diff) | |
download | gnupg-4252cd7b18b41a0d91076e46df9ba857e743406b.tar.gz gnupg-4252cd7b18b41a0d91076e46df9ba857e743406b.zip |
w32: Make gnupg_remove and gnupg_rename_file Unicode aware
* common/sysutils.c (w32_rename): New.
(gnupg_rename_file) [W32]: Support Unicode.
(gnupg_remove) [W32]: Support Unicode. Drop Windows-CE support.
--
GnuPG-bug-id: 5098
(cherry picked from commit 9a0197b6fe412cfc66b0cece521267180e454416)
-rw-r--r-- | common/sysutils.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/common/sysutils.c b/common/sysutils.c index 842efb975..422a783e5 100644 --- a/common/sysutils.c +++ b/common/sysutils.c @@ -641,7 +641,7 @@ gnupg_allow_set_foregound_window (pid_t pid) int gnupg_remove (const char *fname) { -#ifdef HAVE_W32CE_SYSTEM +#ifdef HAVE_W32_SYSTEM int rc; wchar_t *wfname; @@ -650,7 +650,7 @@ gnupg_remove (const char *fname) rc = 0; else { - rc = DeleteFile (wfname); + rc = DeleteFileW (wfname); xfree (wfname); } if (!rc) @@ -662,6 +662,36 @@ gnupg_remove (const char *fname) } +/* Helper for gnupg_rename_file. */ +#ifdef HAVE_W32_SYSTEM +static int +w32_rename (const char *oldname, const char *newname) +{ + if (any8bitchar (oldname) || any8bitchar (newname)) + { + wchar_t *woldname, *wnewname; + int ret; + + woldname = utf8_to_wchar (oldname); + if (!woldname) + return -1; + wnewname = utf8_to_wchar (newname); + if (!wnewname) + { + xfree (wnewname); + return -1; + } + ret = _wrename (woldname, wnewname); + xfree (wnewname); + xfree (woldname); + return ret; + } + else + return rename (oldname, newname); +} +#endif /*HAVE_W32_SYSTEM*/ + + /* Wrapper for rename(2) to handle Windows peculiarities. If * BLOCK_SIGNALS is not NULL and points to a variable set to true, all * signals will be blocked by calling gnupg_block_all_signals; the @@ -681,7 +711,7 @@ gnupg_rename_file (const char *oldname, const char *newname, int *block_signals) gnupg_remove (newname); again: - if (rename (oldname, newname)) + if (w32_rename (oldname, newname)) { if (GetLastError () == ERROR_SHARING_VIOLATION) { |