mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-02 12:01:32 +01:00
gpgtar,w32: Fix gpgtar 8 bit encoding handling on W32
* common/utf8conv.c (wchar_to_utf8): Factor code out to ... (wchar_to_cp): new. (utf8_to_wchar): Factor code out to ... (cp_to_wchar): new. (wchar_to_native): New. (native_to_wchar): New. * tools/gpgtar-create.c (fillup_entry_w32): Use native_to_wchar. (scan_directory): Use wchar_to_native. -- Gpgtar needs to handle filenames in the local 8 bit encoding on Windows as it uses the 8 bit file io functions. GnuPG-bug-id: 1624, 1746 Patch from bug 1624 modified to fit into GnuPG 2.1 by wk. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
b8bb16c6c0
commit
3e50236d4e
@ -713,17 +713,17 @@ jnlib_iconv_close (jnlib_iconv_t cd)
|
|||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_W32_SYSTEM
|
#ifdef HAVE_W32_SYSTEM
|
||||||
/* Return a malloced string encoded in UTF-8 from the wide char input
|
/* Return a malloced string encoded for CODEPAGE from the wide char input
|
||||||
string STRING. Caller must free this value. Returns NULL and sets
|
string STRING. Caller must free this value. Returns NULL and sets
|
||||||
ERRNO on failure. Calling this function with STRING set to NULL is
|
ERRNO on failure. Calling this function with STRING set to NULL is
|
||||||
not defined. */
|
not defined. */
|
||||||
char *
|
static char *
|
||||||
wchar_to_utf8 (const wchar_t *string)
|
wchar_to_cp (const wchar_t *string, unsigned int codepage)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
char *result;
|
char *result;
|
||||||
|
|
||||||
n = WideCharToMultiByte (CP_UTF8, 0, string, -1, NULL, 0, NULL, NULL);
|
n = WideCharToMultiByte (codepage, 0, string, -1, NULL, 0, NULL, NULL);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
{
|
{
|
||||||
gpg_err_set_errno (EINVAL);
|
gpg_err_set_errno (EINVAL);
|
||||||
@ -734,7 +734,7 @@ wchar_to_utf8 (const wchar_t *string)
|
|||||||
if (!result)
|
if (!result)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
n = WideCharToMultiByte (CP_UTF8, 0, string, -1, result, n, NULL, NULL);
|
n = WideCharToMultiByte (codepage, 0, string, -1, result, n, NULL, NULL);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
{
|
{
|
||||||
xfree (result);
|
xfree (result);
|
||||||
@ -745,18 +745,18 @@ wchar_to_utf8 (const wchar_t *string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Return a malloced wide char string from an UTF-8 encoded input
|
/* Return a malloced wide char string from a CODEPAGE encoded input
|
||||||
string STRING. Caller must free this value. Returns NULL and sets
|
string STRING. Caller must free this value. Returns NULL and sets
|
||||||
ERRNO on failure. Calling this function with STRING set to NULL is
|
ERRNO on failure. Calling this function with STRING set to NULL is
|
||||||
not defined. */
|
not defined. */
|
||||||
wchar_t *
|
static wchar_t *
|
||||||
utf8_to_wchar (const char *string)
|
cp_to_wchar (const char *string, unsigned int codepage)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
size_t nbytes;
|
size_t nbytes;
|
||||||
wchar_t *result;
|
wchar_t *result;
|
||||||
|
|
||||||
n = MultiByteToWideChar (CP_UTF8, 0, string, -1, NULL, 0);
|
n = MultiByteToWideChar (codepage, 0, string, -1, NULL, 0);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
{
|
{
|
||||||
gpg_err_set_errno (EINVAL);
|
gpg_err_set_errno (EINVAL);
|
||||||
@ -773,7 +773,7 @@ utf8_to_wchar (const char *string)
|
|||||||
if (!result)
|
if (!result)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
n = MultiByteToWideChar (CP_UTF8, 0, string, -1, result, n);
|
n = MultiByteToWideChar (codepage, 0, string, -1, result, n);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
{
|
{
|
||||||
xfree (result);
|
xfree (result);
|
||||||
@ -782,4 +782,49 @@ utf8_to_wchar (const char *string)
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Return a malloced string encoded in the active code page from the
|
||||||
|
* wide char input string STRING. Caller must free this value.
|
||||||
|
* Returns NULL and sets ERRNO on failure. Calling this function with
|
||||||
|
* STRING set to NULL is not defined. */
|
||||||
|
char *
|
||||||
|
wchar_to_native (const wchar_t *string)
|
||||||
|
{
|
||||||
|
return wchar_to_cp (string, CP_ACP);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Return a malloced wide char string from an UTF-8 encoded input
|
||||||
|
* string STRING. Caller must free this value. Returns NULL and sets
|
||||||
|
* ERRNO on failure. Calling this function with STRING set to NULL is
|
||||||
|
* not defined. */
|
||||||
|
wchar_t *
|
||||||
|
native_to_wchar (const char *string)
|
||||||
|
{
|
||||||
|
return cp_to_wchar (string, CP_ACP);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Return a malloced string encoded in UTF-8 from the wide char input
|
||||||
|
* string STRING. Caller must free this value. Returns NULL and sets
|
||||||
|
* ERRNO on failure. Calling this function with STRING set to NULL is
|
||||||
|
* not defined. */
|
||||||
|
char *
|
||||||
|
wchar_to_utf8 (const wchar_t *string)
|
||||||
|
{
|
||||||
|
return wchar_to_cp (string, CP_UTF8);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Return a malloced wide char string from an UTF-8 encoded input
|
||||||
|
* string STRING. Caller must free this value. Returns NULL and sets
|
||||||
|
* ERRNO on failure. Calling this function with STRING set to NULL is
|
||||||
|
* not defined. */
|
||||||
|
wchar_t *
|
||||||
|
utf8_to_wchar (const char *string)
|
||||||
|
{
|
||||||
|
return cp_to_wchar (string, CP_UTF8);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /*HAVE_W32_SYSTEM*/
|
#endif /*HAVE_W32_SYSTEM*/
|
||||||
|
@ -48,6 +48,8 @@ size_t jnlib_iconv (jnlib_iconv_t cd, const char **inbuf, size_t *inbytesleft,
|
|||||||
int jnlib_iconv_close (jnlib_iconv_t cd);
|
int jnlib_iconv_close (jnlib_iconv_t cd);
|
||||||
|
|
||||||
#ifdef HAVE_W32_SYSTEM
|
#ifdef HAVE_W32_SYSTEM
|
||||||
|
char *wchar_to_native (const wchar_t *string);
|
||||||
|
wchar_t *native_to_wchar (const char *string);
|
||||||
char *wchar_to_utf8 (const wchar_t *string);
|
char *wchar_to_utf8 (const wchar_t *string);
|
||||||
wchar_t *utf8_to_wchar (const char *string);
|
wchar_t *utf8_to_wchar (const char *string);
|
||||||
#endif /*HAVE_W32_SYSTEM*/
|
#endif /*HAVE_W32_SYSTEM*/
|
||||||
|
@ -72,13 +72,13 @@ fillup_entry_w32 (tar_header_t hdr)
|
|||||||
for (p=hdr->name; *p; p++)
|
for (p=hdr->name; *p; p++)
|
||||||
if (*p == '/')
|
if (*p == '/')
|
||||||
*p = '\\';
|
*p = '\\';
|
||||||
wfname = utf8_to_wchar (hdr->name);
|
wfname = native_to_wchar (hdr->name);
|
||||||
for (p=hdr->name; *p; p++)
|
for (p=hdr->name; *p; p++)
|
||||||
if (*p == '\\')
|
if (*p == '\\')
|
||||||
*p = '/';
|
*p = '/';
|
||||||
if (!wfname)
|
if (!wfname)
|
||||||
{
|
{
|
||||||
log_error ("error utf8-ing '%s': %s\n", hdr->name, w32_strerror (-1));
|
log_error ("error converting '%s': %s\n", hdr->name, w32_strerror (-1));
|
||||||
return gpg_error_from_syserror ();
|
return gpg_error_from_syserror ();
|
||||||
}
|
}
|
||||||
if (!GetFileAttributesExW (wfname, GetFileExInfoStandard, &fad))
|
if (!GetFileAttributesExW (wfname, GetFileExInfoStandard, &fad))
|
||||||
@ -299,7 +299,7 @@ scan_directory (const char *dname, scanctrl_t scanctrl)
|
|||||||
for (p=fname; *p; p++)
|
for (p=fname; *p; p++)
|
||||||
if (*p == '/')
|
if (*p == '/')
|
||||||
*p = '\\';
|
*p = '\\';
|
||||||
wfname = utf8_to_wchar (fname);
|
wfname = native_to_wchar (fname);
|
||||||
xfree (fname);
|
xfree (fname);
|
||||||
if (!wfname)
|
if (!wfname)
|
||||||
{
|
{
|
||||||
@ -322,11 +322,11 @@ scan_directory (const char *dname, scanctrl_t scanctrl)
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
char *fname = wchar_to_utf8 (fi.cFileName);
|
char *fname = wchar_to_native (fi.cFileName);
|
||||||
if (!fname)
|
if (!fname)
|
||||||
{
|
{
|
||||||
err = gpg_error_from_syserror ();
|
err = gpg_error_from_syserror ();
|
||||||
log_error ("error utf8-ing filename: %s\n", w32_strerror (-1));
|
log_error ("error converting filename: %s\n", w32_strerror (-1));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (p=fname; *p; p++)
|
for (p=fname; *p; p++)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user