summaryrefslogtreecommitdiff
path: root/src/sysutils.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2020-10-09 15:36:51 +0200
committerWerner Koch <wk@gnupg.org>2020-10-09 15:36:51 +0200
commitdbedf190969de1a796560cfa15fb4ea986bc79dc (patch)
tree9009cde2ee1a353955bbe5505c3aecbc258e0abe /src/sysutils.c
parent3a86bdb2aad31835c10b910c4564c73603694430 (diff)
downloadlibgpg-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.c38
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*/
}