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
This commit is contained in:
Werner Koch 2020-10-21 16:53:41 +02:00
parent 18e5dd7b03
commit 9a0197b6fe
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
1 changed files with 33 additions and 3 deletions

View File

@ -668,7 +668,7 @@ gnupg_allow_set_foregound_window (pid_t pid)
int int
gnupg_remove (const char *fname) gnupg_remove (const char *fname)
{ {
#ifdef HAVE_W32CE_SYSTEM #ifdef HAVE_W32_SYSTEM
int rc; int rc;
wchar_t *wfname; wchar_t *wfname;
@ -677,7 +677,7 @@ gnupg_remove (const char *fname)
rc = 0; rc = 0;
else else
{ {
rc = DeleteFile (wfname); rc = DeleteFileW (wfname);
xfree (wfname); xfree (wfname);
} }
if (!rc) if (!rc)
@ -689,6 +689,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 /* Wrapper for rename(2) to handle Windows peculiarities. If
* BLOCK_SIGNALS is not NULL and points to a variable set to true, all * 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 * signals will be blocked by calling gnupg_block_all_signals; the
@ -708,7 +738,7 @@ gnupg_rename_file (const char *oldname, const char *newname, int *block_signals)
gnupg_remove (newname); gnupg_remove (newname);
again: again:
if (rename (oldname, newname)) if (w32_rename (oldname, newname))
{ {
if (GetLastError () == ERROR_SHARING_VIOLATION) if (GetLastError () == ERROR_SHARING_VIOLATION)
{ {