From b1da37e56bcf5fffbc55c6ce3fd58dc68dfcc53e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Fri, 20 Apr 2018 16:15:06 +0200
Subject: [PATCH] I/O [NT]: Added fd_chdir().

---
 src/fdlib.c | 17 +++++++++++++++++
 src/fdlib.h |  3 +++
 2 files changed, 20 insertions(+)

diff --git a/src/fdlib.c b/src/fdlib.c
index 4b92d1530c..4d7f8892af 100644
--- a/src/fdlib.c
+++ b/src/fdlib.c
@@ -1058,6 +1058,23 @@ PMOD_EXPORT int debug_fd_rename(const char *old, const char *new)
   return ret;
 }
 
+PMOD_EXPORT int debug_fd_chdir(const char *dir)
+{
+  p_wchar1 *dname = pike_dwim_utf8_to_utf16(dir);
+  int ret;
+
+  if (!dname) {
+    errno = ENOMEM;
+    return -1;
+  }
+
+  ret = _wchdir(dname);
+
+  free(dname);
+
+  return ret;
+}
+
 PMOD_EXPORT FD debug_fd_open(const char *file, int open_mode, int create_mode)
 {
   HANDLE x;
diff --git a/src/fdlib.h b/src/fdlib.h
index 1c773b66ad..b327a3c9b5 100644
--- a/src/fdlib.h
+++ b/src/fdlib.h
@@ -94,6 +94,7 @@ typedef off_t PIKE_OFF_T;
 #define fd_unlink(FILE)	debug_fd_unlink(FILE)
 #define fd_mkdir(DIR,MODE)	debug_fd_mkdir(DIR,MODE)
 #define fd_rename(O,N)	debug_fd_rename(O,N)
+#define fd_chdir(DIR)	debug_fd_chdir(DIR)
 #define fd_open(X,Y,Z) dmalloc_register_fd(debug_fd_open((X),(Y)|fd_BINARY,(Z)))
 #define fd_socket(X,Y,Z) dmalloc_register_fd(debug_fd_socket((X),(Y),(Z)))
 #define fd_pipe(X) debug_fd_pipe( (X) DMALLOC_POS )
@@ -140,6 +141,7 @@ PMOD_EXPORT int debug_fd_rmdir(const char *dir);
 PMOD_EXPORT int debug_fd_unlink(const char *file);
 PMOD_EXPORT int debug_fd_mkdir(const char *dir, int mode);
 PMOD_EXPORT int debug_fd_rename(const char *old, const char *new);
+PMOD_EXPORT int debug_fd_chdir(const char *dir);
 PMOD_EXPORT FD debug_fd_open(const char *file, int open_mode, int create_mode);
 PMOD_EXPORT FD debug_fd_socket(int domain, int type, int proto);
 PMOD_EXPORT int debug_fd_pipe(int fds[2] DMALLOC_LINE_ARGS);
@@ -381,6 +383,7 @@ static int PIKE_UNUSED_ATTRIBUTE debug_fd_mkdir(const char *dir, int mode)
 #define fd_mkdir(DIR,MODE)	debug_fd_mkdir(DIR,MODE)
 #endif
 #define fd_rename(O,N)	rename(O,N)
+#define fd_chdir(DIR)	chdir(DIR)
 #define fd_open(X,Y,Z) dmalloc_register_fd(open((X),(Y)|fd_BINARY,(Z)))
 #define fd_socket(X,Y,Z) dmalloc_register_fd(socket((X),(Y),(Z)))
 #define fd_pipe pipe /* FIXME */
-- 
GitLab