diff --git a/contrib/win32/win32compat/inc/sys/stat.h b/contrib/win32/win32compat/inc/sys/stat.h index e4a8954..b8a2521 100644 --- a/contrib/win32/win32compat/inc/sys/stat.h +++ b/contrib/win32/win32compat/inc/sys/stat.h @@ -30,6 +30,7 @@ #define lstat w32_stat #define mkdir w32_mkdir #define chdir w32_chdir +#define getcwd w32_getcwd struct w32_stat { dev_t st_dev; /* ID of device containing file */ diff --git a/contrib/win32/win32compat/inc/w32posix.h b/contrib/win32/win32compat/inc/w32posix.h index c98dfbb..3e21515 100644 --- a/contrib/win32/win32compat/inc/w32posix.h +++ b/contrib/win32/win32compat/inc/w32posix.h @@ -53,6 +53,7 @@ int w32_isatty(int fd); FILE* w32_fdopen(int fd, const char *mode); int w32_mkdir(const char *pathname, unsigned short mode); int w32_chdir(const char *dirname); +char *w32_getcwd(char *buffer, int maxlen); /*common i/o*/ #define fcntl(a,b,...) w32_fcntl((a), (b), __VA_ARGS__) diff --git a/contrib/win32/win32compat/w32fd.c b/contrib/win32/win32compat/w32fd.c index ce16e04..ec0e4f4 100644 --- a/contrib/win32/win32compat/w32fd.c +++ b/contrib/win32/win32compat/w32fd.c @@ -437,6 +437,19 @@ int w32_chdir(const char *dirname) { return 0; } +char *w32_getcwd(char *buffer, int maxlen) { + wchar_t wdirname[MAX_PATH]; + int needed; + + wchar_t *wpwd = _wgetcwd(wdirname, MAX_PATH); + + if ((needed = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, wdirname, -1, NULL, 0, NULL, NULL)) == 0 || + WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, wdirname, -1, buffer, needed, NULL, NULL) != needed) + fatal("failed to covert input arguments"); + + return buffer; +} + int w32_isatty(int fd) { struct w32_io* pio; diff --git a/sftp.c b/sftp.c index 19dbdc0..43ad371 100644 --- a/sftp.c +++ b/sftp.c @@ -2357,8 +2357,10 @@ main(int argc, char **argv) addargs(&args, "\"-oClearAllForwardings yes\""); ll = SYSLOG_LEVEL_INFO; - infile = stdin; - _setmode(_fileno(infile), O_U16TEXT); +#ifdef WINDOWS + _setmode(_fileno(stdin), O_U16TEXT); +#endif + infile = stdin; while ((ch = getopt(argc, argv, "1246afhpqrvCc:D:i:l:o:s:S:b:B:F:P:R:")) != -1) {