diff options
author | Werner Koch <wk@gnupg.org> | 2020-10-09 15:36:51 +0200 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2020-10-09 15:36:51 +0200 |
commit | dbedf190969de1a796560cfa15fb4ea986bc79dc (patch) | |
tree | 9009cde2ee1a353955bbe5505c3aecbc258e0abe /src/sysutils.c | |
parent | 3a86bdb2aad31835c10b910c4564c73603694430 (diff) | |
download | libgpg-error-dbedf190969de1a796560cfa15fb4ea986bc79dc.tar.gz |
w32: Support utf8 also for getcwd.
* src/sysutils.c (_gpgrt_getcwd) [W32]: Implement utf-8 support.
* src/w32-gettext.c (wchar_to_native): Factor some code out to ..
(wchar_to_cp): new.
(_gpgrt_wchar_to_utf8): New.
* tests/t-stringutils.c: Include windows.h.
(utf8_to_wchar): New.
(wchar_to_utf8): New.
(mygetcwd): Use wchar version for Windows.
(main): New option --pwd.
Diffstat (limited to 'src/sysutils.c')
-rw-r--r-- | src/sysutils.c | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/src/sysutils.c b/src/sysutils.c index eb5249a..36daaec 100644 --- a/src/sysutils.c +++ b/src/sysutils.c @@ -345,27 +345,53 @@ _gpgrt_chdir (const char *name) char * _gpgrt_getcwd (void) { +#ifdef HAVE_W32CE_SYSTEM + + return xtrystrdup ("/"); + +#elif defined(HAVE_W32_SYSTEM) + wchar_t wbuffer[MAX_PATH + sizeof(wchar_t)]; + DWORD wlen; + char *buf, *p; + + wlen = GetCurrentDirectoryW (MAX_PATH, wbuffer); + if (!wlen) + { + _gpgrt_w32_set_errno (-1); + return NULL; + + } + else if (wlen > MAX_PATH) + { + _gpg_err_set_errno (ENAMETOOLONG); + return NULL; + } + buf = _gpgrt_wchar_to_utf8 (wbuffer, wlen); + if (buf) + { + for (p=buf; *p; p++) + if (*p == '\\') + *p = '/'; + } + return buf; + +#else /*Unix*/ char *buffer; size_t size = 100; - /* FIXME: We need to support utf8 */ for (;;) { buffer = xtrymalloc (size+1); if (!buffer) return NULL; -#ifdef HAVE_W32CE_SYSTEM - strcpy (buffer, "/"); /* Always "/". */ - return buffer; -#else if (getcwd (buffer, size) == buffer) return buffer; xfree (buffer); if (errno != ERANGE) return NULL; size *= 2; -#endif } +#endif /*Unix*/ } |