mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-02 22:46:30 +02:00
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
This commit is contained in:
parent
b47c355b18
commit
4dcef0e178
8 changed files with 79 additions and 26 deletions
|
@ -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*/
|
||||
|
|
|
@ -182,6 +182,18 @@ enable_core_dumps (void)
|
|||
#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*/
|
||||
|
||||
|
||||
/* Allow the use of special "-&nnn" style file names. */
|
||||
void
|
||||
|
@ -1066,6 +1078,30 @@ gnupg_access (const char *name, int mode)
|
|||
#endif
|
||||
}
|
||||
|
||||
/* A wrapper around open to handle Unicode file names under Windows. */
|
||||
int
|
||||
gnupg_open (const char *name, int flags, unsigned int mode)
|
||||
{
|
||||
#ifdef HAVE_W32_SYSTEM
|
||||
if (any8bitchar (name))
|
||||
{
|
||||
wchar_t *wname;
|
||||
int ret;
|
||||
|
||||
wname = utf8_to_wchar (name);
|
||||
if (!wname)
|
||||
return -1;
|
||||
ret = _wopen (wname, flags, mode);
|
||||
xfree (wname);
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
return open (name, flags, mode);
|
||||
#else
|
||||
return open (name, flags, mode);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* Try to set an envvar. Print only a notice on error. */
|
||||
#ifndef HAVE_W32_SYSTEM
|
||||
|
|
|
@ -74,6 +74,7 @@ int gnupg_setenv (const char *name, const char *value, int overwrite);
|
|||
int gnupg_unsetenv (const char *name);
|
||||
char *gnupg_getcwd (void);
|
||||
gpg_err_code_t gnupg_access (const char *name, int mode);
|
||||
int gnupg_open (const char *name, int flags, unsigned int mode);
|
||||
gpg_error_t gnupg_chuid (const char *user, int silent);
|
||||
char *gnupg_get_socket_name (int fd);
|
||||
int gnupg_fd_valid (int fd);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue