From b4226fbb569bd39fa0198c0e823400836dd6cc2d Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Sat, 23 Nov 2019 16:21:08 +0100 Subject: Add windows implementation for chdir in libcompat Signed-off-by: David Oberhollenzer --- lib/compat/Makemodule.am | 2 +- lib/compat/chdir.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 lib/compat/chdir.c (limited to 'lib/compat') diff --git a/lib/compat/Makemodule.am b/lib/compat/Makemodule.am index 7ba3444..fb37b46 100644 --- a/lib/compat/Makemodule.am +++ b/lib/compat/Makemodule.am @@ -1,5 +1,5 @@ libcompat_a_SOURCES = lib/compat/getline.c lib/compat/getsubopt.c libcompat_a_SOURCES += lib/compat/strndup.c lib/compat/mockups.c -libcompat_a_SOURCES += include/compat.h +libcompat_a_SOURCES += lib/compat/chdir.c include/compat.h noinst_LIBRARIES += libcompat.a diff --git a/lib/compat/chdir.c b/lib/compat/chdir.c new file mode 100644 index 0000000..b1b2d0c --- /dev/null +++ b/lib/compat/chdir.c @@ -0,0 +1,56 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * chdir.c + * + * Copyright (C) 2019 David Oberhollenzer + */ +#include "config.h" +#include "compat.h" + +#include "util/util.h" + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#include + +int chdir(const char *path) +{ + WCHAR *wpath, *ptr; + DWORD length; + int ret; + + length = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0); + if (length <= 0) { + fprintf(stderr, "Converting '%s' to UTF-16: %ld\n", + path, GetLastError()); + return -1; + } + + wpath = alloc_array(sizeof(wpath[0]), length + 1); + if (wpath == NULL) { + fprintf(stderr, "Converting '%s' to UTF-16: out of memory\n", + path); + return -1; + } + + MultiByteToWideChar(CP_UTF8, 0, path, -1, wpath, length + 1); + wpath[length] = '\0'; + + for (ptr = wpath; *ptr != '\0'; ++ptr) { + if (*ptr == '/') + *ptr = '\\'; + } + + if (!SetCurrentDirectoryW(wpath)) { + fprintf(stderr, "Switching to directory '%s': %ld\n", + path, GetLastError()); + ret = -1; + } else { + ret = 0; + } + + free(wpath); + return ret; +} +#endif -- cgit v1.2.3