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
gnupg_remove (const char *fname)
{
#ifdef HAVE_W32CE_SYSTEM
#ifdef HAVE_W32_SYSTEM
int rc;
wchar_t *wfname;
@ -677,7 +677,7 @@ gnupg_remove (const char *fname)
rc = 0;
else
{
rc = DeleteFile (wfname);
rc = DeleteFileW (wfname);
xfree (wfname);
}
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
* 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
@ -708,7 +738,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)
{