From 9291dde27412a3c9ab62e1044bd15517c1ced255 Mon Sep 17 00:00:00 2001 From: Ray Hayes Date: Thu, 20 Oct 2016 16:37:56 -0700 Subject: [PATCH] Merge with PowerShell\L1-Prod. --- auth.c | 85 +-- auth.h | 4 - authfile.c | 2 +- channels.c | 3 +- contrib/win32/openssh/keygen.vcxproj | 13 +- contrib/win32/openssh/keygen.vcxproj.filters | 3 - contrib/win32/openssh/scp.vcxproj | 14 +- contrib/win32/openssh/scp.vcxproj.filters | 2 +- contrib/win32/openssh/sftp-server.vcxproj | 11 +- .../win32/openssh/sftp-server.vcxproj.filters | 2 +- contrib/win32/openssh/sftp.vcxproj | 14 +- contrib/win32/openssh/sftp.vcxproj.filters | 2 +- contrib/win32/openssh/ssh-add.vcxproj | 13 +- contrib/win32/openssh/ssh-add.vcxproj.filters | 3 - contrib/win32/openssh/ssh-agent.vcxproj | 12 +- contrib/win32/openssh/ssh.vcxproj | 13 +- contrib/win32/openssh/ssh.vcxproj.filters | 3 - contrib/win32/openssh/sshd.vcxproj | 13 +- contrib/win32/openssh/sshd.vcxproj.filters | 3 - contrib/win32/openssh/win32compat.vcxproj | 2 - .../win32/openssh/win32compat.vcxproj.filters | 6 - contrib/win32/openssh/win32iocompat.vcxproj | 11 +- .../openssh/win32iocompat.vcxproj.filters | 22 +- contrib/win32/win32compat/fileio.c | 22 +- contrib/win32/win32compat/inc/pwd.h | 42 ++ contrib/win32/win32compat/inc/sys/param.h | 10 + contrib/win32/win32compat/inc/sys/socket.h | 6 +- contrib/win32/win32compat/inc/unistd.h | 1 + contrib/win32/win32compat/inc/utf.h | 12 + contrib/win32/win32compat/inc/w32posix.h | 1 + contrib/win32/win32compat/includes/pwd.h | 34 - contrib/win32/win32compat/misc.c | 23 + contrib/win32/win32compat/pwd.c | 605 ++++++------------ contrib/win32/win32compat/socketio.c | 103 ++- .../win32/win32compat/ssh-agent/agentconfig.c | 49 +- contrib/win32/win32compat/stringhelp.c | 198 ------ contrib/win32/win32compat/stringhelp.h | 48 -- contrib/win32/win32compat/w32fd.c | 25 +- contrib/win32/win32compat/wmain.c | 15 +- loginrec.c | 1 + misc.c | 63 +- misc.h | 3 - readconf.c | 2 +- readpass.c | 2 +- session.c | 52 +- sftp-client.h | 2 +- sftp-common.c | 10 +- sftp-server-main.c | 4 - sftp-server.c | 60 +- sftp.c | 2 +- ssh-add.c | 11 - ssh-keygen.c | 25 +- ssh.c | 28 +- sshd.c | 50 +- .../win32_dirent.c => win32_dirent.c | 8 +- .../win32_dirent.h => win32_dirent.h | 0 56 files changed, 664 insertions(+), 1109 deletions(-) create mode 100644 contrib/win32/win32compat/inc/pwd.h create mode 100644 contrib/win32/win32compat/inc/sys/param.h create mode 100644 contrib/win32/win32compat/inc/utf.h delete mode 100644 contrib/win32/win32compat/includes/pwd.h delete mode 100644 contrib/win32/win32compat/stringhelp.c delete mode 100644 contrib/win32/win32compat/stringhelp.h rename contrib/win32/win32compat/win32_dirent.c => win32_dirent.c (85%) rename contrib/win32/win32compat/win32_dirent.h => win32_dirent.h (100%) diff --git a/auth.c b/auth.c index 680dffc..5b21636 100644 --- a/auth.c +++ b/auth.c @@ -379,78 +379,6 @@ auth_root_allowed(const char *method) * This returns a buffer allocated by xmalloc. */ -/* - * Win32 implementation uses UTF16 names. - */ - -#ifdef WIN32_FIXME - -wchar_t *expand_authorized_keys(const wchar_t *filename, struct passwd *pw) -{ - wchar_t *file_w, ret[MAXPATHLEN], pw_name_w[MAXPATHLEN], filename_w[MAXPATHLEN]; - - int i; - - wchar_t *slash; - - i = MultiByteToWideChar(CP_UTF8, 0, filename, -1, filename_w, MAXPATHLEN); - - if (i == 0) - { - fatal("expand_authorized_keys: unable to convert path to UTF-16"); - } - - MultiByteToWideChar(CP_UTF8, 0, pw -> pw_name, -1, pw_name_w, MAXPATHLEN); - - if (i == 0) - { - fatal("expand_authorized_keys: unable to convert path to UTF-16"); - } - - file_w = percent_expand_w(filename_w, L"h", pw -> pw_dir, - L"u", pw_name_w, (char *) NULL); - - /* - * Replace '/' with '\' - */ - - slash = file_w; - - while ((slash = wcschr(slash, L'/'))) - { - *slash = L'\\'; - } - - /* - * Absolute path given. - */ - - if (wcschr(file_w, ':')) - { - i = _snwprintf(ret, sizeof(ret), L"%ls", file_w); - } - - /* - * Relative path given. Expand to user homedir. - */ - - else - { - i = _snwprintf(ret, sizeof(ret), L"%ls\\%ls", pw->pw_dir, file_w); - } - - if (i < 0 || (size_t) i >= sizeof(ret)) - { - fatal("expand_authorized_keys: path too long"); - } - - free(file_w); - - return (_wcsdup(ret)); -} - -#else /* WIN32_FIXME */ - char * expand_authorized_keys(const char *filename, struct passwd *pw) { @@ -473,7 +401,6 @@ expand_authorized_keys(const char *filename, struct passwd *pw) free(file); return (xstrdup(ret)); } -#endif /* WIN32_FIXME */ char * authorized_principals_file(struct passwd *pw) @@ -639,23 +566,15 @@ auth_openfile(const char *file, struct passwd *pw, int strict_modes, FILE *f; #ifdef WIN32_FIXME - if ((fd = _wopen(file, O_RDONLY|O_NONBLOCK)) == -1) { + if ((f = fopen(file, "r")) == NULL) + return NULL; #else if ((fd = open(file, O_RDONLY|O_NONBLOCK)) == -1) { -#endif if (log_missing || errno != ENOENT) debug("Could not open %s '%s': %s", file_type, file, strerror(errno)); return NULL; } - -#ifdef WIN32_FIXME - if ((f = _fdopen(fd, "r")) == NULL) { - _close(fd); - return NULL; - } - -#else if (fstat(fd, &st) < 0) { close(fd); return NULL; diff --git a/auth.h b/auth.h index c65b747..edc2d68 100644 --- a/auth.h +++ b/auth.h @@ -196,11 +196,7 @@ char *get_challenge(Authctxt *); int verify_response(Authctxt *, const char *); void abandon_challenge_response(Authctxt *); -#ifndef WIN32_FIXME char *expand_authorized_keys(const char *, struct passwd *pw); -#else -wchar_t *expand_authorized_keys(const wchar_t *filename, struct passwd *pw); -#endif char *authorized_principals_file(struct passwd *); diff --git a/authfile.c b/authfile.c index 601fab4..6955ae0 100644 --- a/authfile.c +++ b/authfile.c @@ -183,7 +183,7 @@ sshkey_perm_ok(int fd, const char *filename) if (check_ntsec(filename)) #endif -#ifndef WIN32_FIXME//R +#ifndef WINDOWS /*TODO - implement permission checks on Windows*/ if ((st.st_uid == getuid()) && (st.st_mode & 077) != 0) { error("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); error("@ WARNING: UNPROTECTED PRIVATE KEY FILE! @"); diff --git a/channels.c b/channels.c index bc1c6c4..e0bfb2b 100644 --- a/channels.c +++ b/channels.c @@ -1997,7 +1997,7 @@ channel_post_mux_listener(Channel *c, fd_set *readset, fd_set *writeset) c->notbefore = monotime() + 1; return; } - +#ifndef WINDOWS /*TODO - implement user check for Windows*/ if (getpeereid(newsock, &euid, &egid) < 0) { error("%s getpeereid failed: %s", __func__, strerror(errno)); @@ -2010,6 +2010,7 @@ channel_post_mux_listener(Channel *c, fd_set *readset, fd_set *writeset) close(newsock); return; } +#endif nc = channel_new("multiplex client", SSH_CHANNEL_MUX_CLIENT, newsock, newsock, -1, c->local_window_max, c->local_maxpacket, 0, "mux-control", 1); diff --git a/contrib/win32/openssh/keygen.vcxproj b/contrib/win32/openssh/keygen.vcxproj index 844abd6..b9d134b 100644 --- a/contrib/win32/openssh/keygen.vcxproj +++ b/contrib/win32/openssh/keygen.vcxproj @@ -110,7 +110,8 @@ Console true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + win32iocompat.lib;bcrypt.lib;Netapi32.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Debug-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -130,7 +131,8 @@ Console true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + win32iocompat.lib;bcrypt.lib;Netapi32.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Debug-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -153,7 +155,8 @@ No true true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + win32iocompat.lib;bcrypt.lib;Netapi32.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Release-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -176,14 +179,14 @@ No true true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + win32iocompat.lib;bcrypt.lib;Netapi32.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Release-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup - diff --git a/contrib/win32/openssh/keygen.vcxproj.filters b/contrib/win32/openssh/keygen.vcxproj.filters index d99cfb4..232bc8f 100644 --- a/contrib/win32/openssh/keygen.vcxproj.filters +++ b/contrib/win32/openssh/keygen.vcxproj.filters @@ -18,9 +18,6 @@ Source Files - - Source Files - diff --git a/contrib/win32/openssh/scp.vcxproj b/contrib/win32/openssh/scp.vcxproj index 48cd12d..18a8740 100644 --- a/contrib/win32/openssh/scp.vcxproj +++ b/contrib/win32/openssh/scp.vcxproj @@ -21,7 +21,7 @@ - + @@ -116,7 +116,8 @@ Console true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Debug-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -135,7 +136,8 @@ Console true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Debug-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -158,7 +160,8 @@ No true true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Release-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -181,7 +184,8 @@ No true true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Release-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup diff --git a/contrib/win32/openssh/scp.vcxproj.filters b/contrib/win32/openssh/scp.vcxproj.filters index 13080e4..7aa9873 100644 --- a/contrib/win32/openssh/scp.vcxproj.filters +++ b/contrib/win32/openssh/scp.vcxproj.filters @@ -18,7 +18,7 @@ Source Files - + Source Files diff --git a/contrib/win32/openssh/sftp-server.vcxproj b/contrib/win32/openssh/sftp-server.vcxproj index 7f178fa..bcb75a8 100644 --- a/contrib/win32/openssh/sftp-server.vcxproj +++ b/contrib/win32/openssh/sftp-server.vcxproj @@ -23,7 +23,7 @@ - + @@ -119,7 +119,8 @@ Console true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Debug-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -139,7 +140,7 @@ Console true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Debug-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -162,7 +163,7 @@ true true true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Release-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -185,7 +186,7 @@ true true true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Release-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup diff --git a/contrib/win32/openssh/sftp-server.vcxproj.filters b/contrib/win32/openssh/sftp-server.vcxproj.filters index 3221f2b..2179a95 100644 --- a/contrib/win32/openssh/sftp-server.vcxproj.filters +++ b/contrib/win32/openssh/sftp-server.vcxproj.filters @@ -24,7 +24,7 @@ Source Files - + Source Files diff --git a/contrib/win32/openssh/sftp.vcxproj b/contrib/win32/openssh/sftp.vcxproj index c9e022f..b59ab65 100644 --- a/contrib/win32/openssh/sftp.vcxproj +++ b/contrib/win32/openssh/sftp.vcxproj @@ -25,7 +25,7 @@ - + @@ -121,7 +121,8 @@ Console true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Debug-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -141,7 +142,8 @@ Console true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Debug-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -164,7 +166,8 @@ false true true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Release-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -187,7 +190,8 @@ false true true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Release-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup diff --git a/contrib/win32/openssh/sftp.vcxproj.filters b/contrib/win32/openssh/sftp.vcxproj.filters index ddf172e..30e54f3 100644 --- a/contrib/win32/openssh/sftp.vcxproj.filters +++ b/contrib/win32/openssh/sftp.vcxproj.filters @@ -30,7 +30,7 @@ Source Files - + Source Files diff --git a/contrib/win32/openssh/ssh-add.vcxproj b/contrib/win32/openssh/ssh-add.vcxproj index b56aaa3..0e880a5 100644 --- a/contrib/win32/openssh/ssh-add.vcxproj +++ b/contrib/win32/openssh/ssh-add.vcxproj @@ -21,7 +21,6 @@ - @@ -120,7 +119,8 @@ Console true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + win32iocompat.lib;Netapi32.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Debug-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -140,7 +140,8 @@ Console true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + win32iocompat.lib;Netapi32.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Debug-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -163,7 +164,8 @@ No true true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + win32iocompat.lib;Netapi32.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Release-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup @@ -186,7 +188,8 @@ No true true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + win32iocompat.lib;Netapi32.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Release-Path)lib;%(AdditionalLibraryDirectories) wmainCRTStartup diff --git a/contrib/win32/openssh/ssh-add.vcxproj.filters b/contrib/win32/openssh/ssh-add.vcxproj.filters index 4a75f1d..f619dc7 100644 --- a/contrib/win32/openssh/ssh-add.vcxproj.filters +++ b/contrib/win32/openssh/ssh-add.vcxproj.filters @@ -18,9 +18,6 @@ Source Files - - Source Files - diff --git a/contrib/win32/openssh/ssh-agent.vcxproj b/contrib/win32/openssh/ssh-agent.vcxproj index 309a8d1..1f98e09 100644 --- a/contrib/win32/openssh/ssh-agent.vcxproj +++ b/contrib/win32/openssh/ssh-agent.vcxproj @@ -116,7 +116,8 @@ Console true $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Debug-Path)lib;%(AdditionalLibraryDirectories) - Crypt32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;Crypt32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + targetos.manifest @@ -138,7 +139,8 @@ Console true $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Debug-Path)lib;%(AdditionalLibraryDirectories) - Crypt32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;Crypt32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + targetos.manifest @@ -162,7 +164,8 @@ true true $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Release-Path)lib;%(AdditionalLibraryDirectories) - Crypt32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;Crypt32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + targetos.manifest @@ -187,7 +190,8 @@ true true $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Release-Path)lib;%(AdditionalLibraryDirectories) - Crypt32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;Crypt32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + targetos.manifest diff --git a/contrib/win32/openssh/ssh.vcxproj b/contrib/win32/openssh/ssh.vcxproj index e0f8ef5..aa3187e 100644 --- a/contrib/win32/openssh/ssh.vcxproj +++ b/contrib/win32/openssh/ssh.vcxproj @@ -116,7 +116,8 @@ Console true $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Debug-Path)lib;%(AdditionalLibraryDirectories) - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + wmainCRTStartup @@ -139,7 +140,8 @@ Console true $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Debug-Path)lib;%(AdditionalLibraryDirectories) - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + wmainCRTStartup @@ -164,7 +166,8 @@ true true $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Release-Path)lib;%(AdditionalLibraryDirectories) - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + wmainCRTStartup @@ -190,7 +193,8 @@ true true $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Release-Path)lib;%(AdditionalLibraryDirectories) - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + wmainCRTStartup @@ -300,7 +304,6 @@ - diff --git a/contrib/win32/openssh/ssh.vcxproj.filters b/contrib/win32/openssh/ssh.vcxproj.filters index be274a7..81077fb 100644 --- a/contrib/win32/openssh/ssh.vcxproj.filters +++ b/contrib/win32/openssh/ssh.vcxproj.filters @@ -317,9 +317,6 @@ Source Files - - Source Files - diff --git a/contrib/win32/openssh/sshd.vcxproj b/contrib/win32/openssh/sshd.vcxproj index 1d4828f..0562d29 100644 --- a/contrib/win32/openssh/sshd.vcxproj +++ b/contrib/win32/openssh/sshd.vcxproj @@ -110,7 +110,8 @@ Console true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;Netapi32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;Netapi32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Debug-Path)lib;%(AdditionalLibraryDirectories) MultiplyDefinedSymbolOnly wmainCRTStartup @@ -134,7 +135,8 @@ Console true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;Netapi32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;Netapi32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Debug-Path)lib;%(AdditionalLibraryDirectories) MultiplyDefinedSymbolOnly wmainCRTStartup @@ -161,7 +163,8 @@ No true true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;Netapi32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;Netapi32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Release-Path)lib;%(AdditionalLibraryDirectories) MultiplyDefinedSymbolOnly wmainCRTStartup @@ -189,7 +192,8 @@ No true true - win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;Netapi32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + Netapi32.lib;win32iocompat.lib;bcrypt.lib;Userenv.lib;Ws2_32.lib;Secur32.lib;Shlwapi.lib;openbsd_compat.lib;libssh.lib;win32compat.lib;libeay32.lib;Netapi32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Release-Path)lib;%(AdditionalLibraryDirectories) MultiplyDefinedSymbolOnly wmainCRTStartup @@ -252,7 +256,6 @@ - diff --git a/contrib/win32/openssh/sshd.vcxproj.filters b/contrib/win32/openssh/sshd.vcxproj.filters index 5375158..475ec1f 100644 --- a/contrib/win32/openssh/sshd.vcxproj.filters +++ b/contrib/win32/openssh/sshd.vcxproj.filters @@ -174,9 +174,6 @@ Source Files - - Source Files - diff --git a/contrib/win32/openssh/win32compat.vcxproj b/contrib/win32/openssh/win32compat.vcxproj index 4cc6522..a629fcd 100644 --- a/contrib/win32/openssh/win32compat.vcxproj +++ b/contrib/win32/openssh/win32compat.vcxproj @@ -151,10 +151,8 @@ - - diff --git a/contrib/win32/openssh/win32compat.vcxproj.filters b/contrib/win32/openssh/win32compat.vcxproj.filters index 90ee82c..c651d8f 100644 --- a/contrib/win32/openssh/win32compat.vcxproj.filters +++ b/contrib/win32/openssh/win32compat.vcxproj.filters @@ -57,18 +57,12 @@ Source Files - - Source Files - Source Files Source Files - - Source Files - Source Files diff --git a/contrib/win32/openssh/win32iocompat.vcxproj b/contrib/win32/openssh/win32iocompat.vcxproj index ed569cc..167f8c6 100644 --- a/contrib/win32/openssh/win32iocompat.vcxproj +++ b/contrib/win32/openssh/win32iocompat.vcxproj @@ -150,7 +150,10 @@ - + + + + @@ -169,6 +172,12 @@ + + + + + + diff --git a/contrib/win32/openssh/win32iocompat.vcxproj.filters b/contrib/win32/openssh/win32iocompat.vcxproj.filters index 5c4975b..6b4ea8a 100644 --- a/contrib/win32/openssh/win32iocompat.vcxproj.filters +++ b/contrib/win32/openssh/win32iocompat.vcxproj.filters @@ -10,7 +10,10 @@ - + + + + @@ -53,6 +56,23 @@ + + + inc + + + + + + inc\sys + + + + + + inc + + diff --git a/contrib/win32/win32compat/fileio.c b/contrib/win32/win32compat/fileio.c index 148efe9..64dc065 100644 --- a/contrib/win32/win32compat/fileio.c +++ b/contrib/win32/win32compat/fileio.c @@ -36,6 +36,7 @@ #include "inc/defs.h" #include #include +#include "inc\utf.h" /* internal read buffer size */ #define READ_BUFFER_SIZE 100*1024 @@ -238,39 +239,40 @@ createFile_flags_setup(int flags, int mode, struct createFile_flags* cf_flags) { /* open() implementation. Uses CreateFile to open file, console, device, etc */ struct w32_io* - fileio_open(const char *pathname, int flags, int mode) { + fileio_open(const char *path_utf8, int flags, int mode) { struct w32_io* pio = NULL; struct createFile_flags cf_flags; HANDLE handle; - wchar_t wpathname[MAX_PATH]; + wchar_t *path_utf16 = NULL; - debug2("open - pathname:%s, flags:%d, mode:%d", pathname, flags, mode); + debug2("open - pathname:%s, flags:%d, mode:%d", path_utf8, flags, mode); /* check input params*/ - if (pathname == NULL) { + if (path_utf8 == NULL) { errno = EINVAL; debug("open - ERROR:%d", errno); return NULL; } - if (MultiByteToWideChar(CP_UTF8, 0, pathname, -1, wpathname, MAX_PATH) == 0) { - errno = EFAULT; - debug("WideCharToMultiByte failed - ERROR:%d", GetLastError()); + if ((path_utf16 = utf8_to_utf16(path_utf8)) == NULL) { + errno = ENOMEM; + debug("utf8_to_utf16 failed - ERROR:%d", GetLastError()); return NULL; } if (createFile_flags_setup(flags, mode, &cf_flags) == -1) return NULL; - handle = CreateFileW(wpathname, cf_flags.dwDesiredAccess, cf_flags.dwShareMode, + handle = CreateFileW(path_utf16, cf_flags.dwDesiredAccess, cf_flags.dwShareMode, &cf_flags.securityAttributes, cf_flags.dwCreationDisposition, cf_flags.dwFlagsAndAttributes, NULL); if (handle == INVALID_HANDLE_VALUE) { errno = errno_from_Win32LastError(); debug("open - CreateFile ERROR:%d", GetLastError()); + free(path_utf16); return NULL; } - + free(path_utf16); pio = (struct w32_io*)malloc(sizeof(struct w32_io)); if (pio == NULL) { CloseHandle(handle); @@ -565,7 +567,7 @@ fileio_stat(const char *path, struct _stat64 *buf) { return GetLastError(); } - return _wstat64(wpath, buf); + return _wstat64(wpath, buf); } long diff --git a/contrib/win32/win32compat/inc/pwd.h b/contrib/win32/win32compat/inc/pwd.h new file mode 100644 index 0000000..da81734 --- /dev/null +++ b/contrib/win32/win32compat/inc/pwd.h @@ -0,0 +1,42 @@ +/* +* Author: Manoj Ampalam +* +* Compatibility header to give us pwd-like functionality on Win32 +* A lot of passwd fields are not applicable in Windows, neither are some API calls based on this structure +* Ideally, usage of this structure needs to be replaced in core SSH code to an ssh_user interface, +* that each platform can extend and implement. +*/ + +#ifndef COMPAT_PWD_H +#define COMPAT_PWD_H 1 + +#include "sys\param.h" + +struct passwd { + char *pw_name; /* user's login name */ + char *pw_passwd; /* password? */ + char *pw_gecos; /* ??? */ + uid_t pw_uid; /* numerical user ID */ + gid_t pw_gid; /* numerical group ID */ + char *pw_dir; /* initial working directory */ + char *pw_shell; /* path to shell */ +}; + +/*start - declarations not applicable in Windows */ +uid_t getuid(void); +gid_t getgid(void); +uid_t geteuid(void); +gid_t getegid(void); +int setuid(uid_t uid); +int setgid(gid_t gid); +int seteuid(uid_t uid); +int setegid(gid_t gid); +/*end - declarations not applicable in Windows */ + +struct passwd *w32_getpwuid(uid_t uid); +struct passwd *w32_getpwnam(const char *username); + +#define getpwuid w32_getpwuid +#define getpwnam w32_getpwnam + +#endif diff --git a/contrib/win32/win32compat/inc/sys/param.h b/contrib/win32/win32compat/inc/sys/param.h new file mode 100644 index 0000000..bfc2d46 --- /dev/null +++ b/contrib/win32/win32compat/inc/sys/param.h @@ -0,0 +1,10 @@ +#ifndef COMPAT_PARAM_H +#define COMPAT_PARAM_H 1 + +typedef unsigned int uid_t; +typedef unsigned int gid_t; +typedef long off_t; +typedef unsigned int dev_t; + + +#endif diff --git a/contrib/win32/win32compat/inc/sys/socket.h b/contrib/win32/win32compat/inc/sys/socket.h index 9d80321..a792438 100644 --- a/contrib/win32/win32compat/inc/sys/socket.h +++ b/contrib/win32/win32compat/inc/sys/socket.h @@ -13,10 +13,12 @@ #define getsockopt(a,b,c,d,e) w32_getsockopt((a), (b), (c), (d), (e)) #define getsockname(a,b,c) w32_getsockname((a), (b), (c)) #define getpeername(a,b,c) w32_getpeername((a), (b), (c)) -#define listen(a,b) w32_listen((a), (b)) -#define bind(a,b,c) w32_bind((a), (b), (c)) +#define listen(a,b) w32_listen((a), (b)) +#define bind(a,b,c) w32_bind((a), (b), (c)) #define connect(a,b,c) w32_connect((a), (b), (c)) #define recv(a,b,c,d) w32_recv((a), (b), (c), (d)) #define send(a,b,c,d) w32_send((a), (b), (c), (d)) #define shutdown(a,b) w32_shutdown((a), (b)) #define socketpair(a,b,c,d) w32_socketpair((a), (b), (c), (d)) +#define freeaddrinfo w32_freeaddrinfo +#define getaddrinfo w32_getaddrinfo diff --git a/contrib/win32/win32compat/inc/unistd.h b/contrib/win32/win32compat/inc/unistd.h index f5ac0db..d526aa8 100644 --- a/contrib/win32/win32compat/inc/unistd.h +++ b/contrib/win32/win32compat/inc/unistd.h @@ -35,6 +35,7 @@ #define lseek w32_lseek #define getdtablesize() MAX_FDS +#define gethostname w32_gethostname #define fopen w32_fopen_utf8 diff --git a/contrib/win32/win32compat/inc/utf.h b/contrib/win32/win32compat/inc/utf.h new file mode 100644 index 0000000..1e959b5 --- /dev/null +++ b/contrib/win32/win32compat/inc/utf.h @@ -0,0 +1,12 @@ +/* +* Author: Manoj Ampalam +* +* UTF-16 <--> UTF-8 definitions +*/ +#ifndef UTF_H +#define UTF_H 1 + +wchar_t* utf8_to_utf16(const char *); +char* utf16_to_utf8(const wchar_t*); + +#endif \ No newline at end of file diff --git a/contrib/win32/win32compat/inc/w32posix.h b/contrib/win32/win32compat/inc/w32posix.h index 874ddeb..a08fbb0 100644 --- a/contrib/win32/win32compat/inc/w32posix.h +++ b/contrib/win32/win32compat/inc/w32posix.h @@ -8,6 +8,7 @@ #include #include #include "defs.h" +#include "utf.h" #ifndef _OFF_T_DEFINED #define _OFF_T_DEFINED diff --git a/contrib/win32/win32compat/includes/pwd.h b/contrib/win32/win32compat/includes/pwd.h deleted file mode 100644 index 7a0d13c..0000000 --- a/contrib/win32/win32compat/includes/pwd.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef COMPAT_PWD_H -#define COMPAT_PWD_H 1 - -/* Compatibility header to give us pwd-like functionality on Win32 */ - -struct passwd -{ - char *pw_name; /* user's login name */ - char *pw_passwd; /* password? */ - char *pw_gecos; /* ??? */ - uid_t pw_uid; /* numerical user ID */ - gid_t pw_gid; /* numerical group ID */ - char *pw_dir; /* initial working directory */ - char *pw_shell; /* path to shell */ -}; - -uid_t getuid(void); -gid_t getgid(void); -uid_t geteuid(void); -gid_t getegid(void); -int setuid(uid_t uid); -int setgid(gid_t gid); -int seteuid(uid_t uid); -int setegid(gid_t gid); -struct passwd *getpwuid(uid_t uid); -struct passwd *getpwnam(const char *username); -void endpwent(void); - -char *realpathWin32(const char *path, char resolved[PATH_MAX]); - -const char * -user_from_uid(uid_t uid, int nouser); - -#endif diff --git a/contrib/win32/win32compat/misc.c b/contrib/win32/win32compat/misc.c index ec6c109..855259e 100644 --- a/contrib/win32/win32compat/misc.c +++ b/contrib/win32/win32compat/misc.c @@ -117,4 +117,27 @@ w32_fopen_utf8(const char *path, const char *mode) { } return f; +} + + +wchar_t* +utf8_to_utf16(const char *utf8) { + int needed = 0; + wchar_t* utf16 = NULL; + if ((needed = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0)) == 0 || + (utf16 = malloc(needed * sizeof(wchar_t))) == NULL || + MultiByteToWideChar(CP_UTF8, 0, utf8, -1, utf16, needed) == 0) + return NULL; + return utf16; +} + +char* +utf16_to_utf8(const wchar_t* utf16) { + int needed = 0; + char* utf8 = NULL; + if ((needed = WideCharToMultiByte(CP_UTF8, 0, utf16, -1, NULL, 0, NULL, NULL)) == 0 || + (utf8 = malloc(needed)) == NULL || + WideCharToMultiByte(CP_UTF8, 0, utf16, -1, utf8, needed, NULL, NULL) == 0) + return NULL; + return utf8; } \ No newline at end of file diff --git a/contrib/win32/win32compat/pwd.c b/contrib/win32/win32compat/pwd.c index e311d0f..e5c9593 100644 --- a/contrib/win32/win32compat/pwd.c +++ b/contrib/win32/win32compat/pwd.c @@ -29,76 +29,160 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "includes.h" - -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include #include - -#include "win32auth.h" -#include "homedirhelp.h" - - -char *GetHomeDirFromToken(char *userName, HANDLE token); - -uid_t getuid(void) -{ - return 0; -} - -gid_t getgid(void) -{ - return 0; -} - -uid_t geteuid(void) -{ - return 0; -} - -gid_t getegid(void) -{ - return 0; -} - -int setuid(uid_t uid) -{ - return 0; -} - -int setgid(gid_t gid) -{ - return 0; -} - -int seteuid(uid_t uid) -{ - return 0; -} - -int setegid(gid_t gid) -{ - return 0; -} - -/* - * Global pw variables - */ +#define SECURITY_WIN32 +#include +#include "inc\pwd.h" +#include "inc\utf.h" static struct passwd pw; +static char* pw_shellpath = "ssh-shellhost.exe"; -static char pw_gecos[UNLEN + 1] = {'\0'}; -static char pw_username[UNLEN + 1] = {'\0'}; -static char pw_passwd[UNLEN + 1] = {'\0'}; -static wchar_t pw_homedir[MAX_PATH] = {L'\0'}; -static char pw_homedir_ascii[MAX_PATH] = {'\0'}; -static char pw_password[MAX_PATH] = {'\0'}; -static char pw_shellpath[MAX_PATH] = {'\0'}; +int +initialize_pw() { + if (pw.pw_shell != pw_shellpath) { + memset(&pw, 0, sizeof(pw)); + pw.pw_shell = pw_shellpath; + pw.pw_passwd = "\0"; + } + return 0; +} + +void +reset_pw() { + initialize_pw(); + if (pw.pw_name) + free(pw.pw_name); + if (pw.pw_dir) + free(pw.pw_dir); +} + +static struct passwd* +get_passwd(const char *user_utf8, LPWSTR user_sid) { + struct passwd *ret = NULL; + wchar_t *user_utf16 = NULL, *uname_utf16, *udom_utf16, *tmp; + char *uname_utf8 = NULL, *pw_home_utf8 = NULL; + LPBYTE user_info = NULL; + LPWSTR user_sid_local = NULL; + wchar_t reg_path[MAX_PATH], profile_home[MAX_PATH]; + HKEY reg_key = 0; + int tmp_len = MAX_PATH; + + errno = 0; + + reset_pw(); + + if ((user_utf16 = utf8_to_utf16(user_utf8) ) == NULL) { + errno = ENOMEM; + goto done; + } + + /*find domain part if any*/ + if ((tmp = wcschr(user_utf16, L'\\')) != NULL) { + udom_utf16 = user_utf16; + uname_utf16 = tmp + 1; + *tmp = L'\0'; + + } + else if ((tmp = wcschr(user_utf16, L'@')) != NULL) { + udom_utf16 = tmp + 1; + uname_utf16 = user_utf16; + *tmp = L'\0'; + } + else { + uname_utf16 = user_utf16; + udom_utf16 = NULL; + } + + if (user_sid == NULL) { + if (NetUserGetInfo(udom_utf16, uname_utf16, 23, &user_info) != NERR_Success || + ConvertSidToStringSidW(((LPUSER_INFO_23)user_info)->usri23_user_sid, &user_sid_local) == FALSE) { + errno = ENOMEM; //?? + goto done; + } + user_sid = user_sid_local; + } + + if (swprintf(reg_path, MAX_PATH, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\%ls", user_sid) == MAX_PATH || + RegOpenKeyExW(HKEY_LOCAL_MACHINE, reg_path, 0, STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_WOW64_64KEY, ®_key) != 0 || + RegQueryValueExW(reg_key, L"ProfileImagePath", 0, NULL, (LPBYTE)profile_home, &tmp_len) != 0) + GetWindowsDirectoryW(profile_home, MAX_PATH); + + if ((uname_utf8 = _strdup(user_utf8)) == NULL || + (pw_home_utf8 = utf16_to_utf8(profile_home)) == NULL) { + errno = ENOMEM; + goto done; + } + + pw.pw_name = uname_utf8; + uname_utf8 = NULL; + pw.pw_dir = pw_home_utf8; + pw_home_utf8 = NULL; + ret = &pw; +done: + if (user_utf16) + free(user_utf16); + if (uname_utf8) + free(uname_utf8); + if (pw_home_utf8) + free(pw_home_utf8); + if (user_info) + NetApiBufferFree(user_info); + if (user_sid_local) + LocalFree(user_sid_local); + if (reg_key) + RegCloseKey(reg_key); + return ret; +} + +struct passwd* +w32_getpwnam(const char *user_utf8) { + return get_passwd(user_utf8, NULL); +} + +struct passwd* +w32_getpwuid(uid_t uid) { + wchar_t* wuser = NULL; + char* user_utf8 = NULL; + ULONG needed = 0; + struct passwd *ret = NULL; + HANDLE token = 0; + DWORD info_len = 0; + TOKEN_USER* info = NULL; + LPWSTR user_sid = NULL; + + errno = 0; + + if (GetUserNameExW(NameSamCompatible, NULL, &needed) != 0 || + (wuser = malloc(needed * sizeof(wchar_t))) == NULL || + GetUserNameExW(NameSamCompatible, wuser, &needed) == 0 || + (user_utf8 = utf16_to_utf8(wuser)) == NULL || + OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token) == FALSE || + GetTokenInformation(token, TokenUser, NULL, 0, &info_len) == TRUE || + (info = (TOKEN_USER*)malloc(info_len)) == NULL || + GetTokenInformation(token, TokenUser, info, info_len, &info_len) == FALSE || + ConvertSidToStringSidW(info->User.Sid, &user_sid) == FALSE){ + errno = ENOMEM; + goto done; + } + ret = get_passwd(user_utf8, user_sid); + +done: + if (wuser) + free(wuser); + if (user_utf8) + free(user_utf8); + if (token) + CloseHandle(token); + if (info) + free(info); + if (user_sid) + LocalFree(user_sid); + return ret; +} /* given a access token, find the domain name of user account of the access token */ int GetDomainFromToken ( HANDLE *hAccessToken, UCHAR *domain, DWORD dwSize) @@ -135,315 +219,13 @@ int GetDomainFromToken ( HANDLE *hAccessToken, UCHAR *domain, DWORD dwSize) } \ } while (0) -char *GetHomeDirFromToken(char *userName, HANDLE token) -{ - UCHAR InfoBuffer[1000]; - PTOKEN_USER pTokenUser = (PTOKEN_USER)InfoBuffer; - DWORD dwInfoBufferSize, tmp_len; - LPWSTR sid_str = NULL; - wchar_t reg_path[MAX_PATH]; - HKEY reg_key = 0; - - /* set home dir to Windows if any of below fair*/ - GetWindowsDirectoryW(pw_homedir, MAX_PATH); - - tmp_len = MAX_PATH; - if (GetTokenInformation(token, TokenUser, InfoBuffer, - 1000, &dwInfoBufferSize) == FALSE || - ConvertSidToStringSidW(pTokenUser->User.Sid, &sid_str) == FALSE || - swprintf(reg_path, MAX_PATH, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\%ls", sid_str) == MAX_PATH || - RegOpenKeyExW(HKEY_LOCAL_MACHINE, reg_path, 0, STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_WOW64_64KEY, ®_key) != 0 || - RegQueryValueExW(reg_key, L"ProfileImagePath", 0, NULL, pw_homedir, &tmp_len) != 0 ){ - /* one of the above failed */ - debug("cannot retirve profile path - perhaps user profile is not created yet"); - } - - if (sid_str) - LocalFree(sid_str); - - if (reg_key) - RegCloseKey(reg_key); - - { /* retrieve and set env variables. */ - /* TODO - Get away with fixed limits and dynamically allocate required memory, cleanup this logic*/ -#define MAX_VALUE_LEN 1000 -#define MAX_DATA_LEN 2000 -#define MAX_EXPANDED_DATA_LEN 5000 - wchar_t *path; - wchar_t value_name[MAX_VALUE_LEN]; - wchar_t value_data[MAX_DATA_LEN], value_data_expanded[MAX_EXPANDED_DATA_LEN], *to_apply; - DWORD value_type, name_len, data_len; - int i; - LONG ret; - - if (ImpersonateLoggedOnUser(token) == FALSE) - debug("Failed to impersonate user token, %d", GetLastError()); - SET_USER_ENV(FOLDERID_LocalAppData, L"LOCALAPPDATA"); - SET_USER_ENV(FOLDERID_Profile, L"USERPROFILE"); - SET_USER_ENV(FOLDERID_RoamingAppData, L"APPDATA"); - reg_key = 0; - if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Environment", 0, KEY_QUERY_VALUE, ®_key) == ERROR_SUCCESS) { - i = 0; - while (1) { - name_len = MAX_VALUE_LEN * 2; - data_len = MAX_DATA_LEN * 2; - to_apply = NULL; - if (RegEnumValueW(reg_key, i++, &value_name, &name_len, 0, &value_type, &value_data, &data_len) != ERROR_SUCCESS) - break; - if (value_type == REG_SZ) - to_apply = value_data; - else if (value_type == REG_EXPAND_SZ) { - ExpandEnvironmentStringsW(value_data, value_data_expanded, MAX_EXPANDED_DATA_LEN); - to_apply = value_data_expanded; - } - - if (wcsicmp(value_name, L"PATH") == 0) { - DWORD size; - if ((size = GetEnvironmentVariableW(L"PATH", NULL, 0)) != ERROR_ENVVAR_NOT_FOUND) { - memcpy(value_data_expanded + size, to_apply, (wcslen(to_apply) + 1)*2); - GetEnvironmentVariableW(L"PATH", value_data_expanded, MAX_EXPANDED_DATA_LEN); - value_data_expanded[size-1] = L';'; - to_apply = value_data_expanded; - } - - } - if (to_apply) - SetEnvironmentVariableW(value_name, to_apply); - - - } - RegCloseKey(reg_key); - } - - - RevertToSelf(); - } - - - - debug("<- GetHomeDirFromToken()..."); - - return pw_homedir; -} - /* - * Not thread safe, would need to use thread local - * storage instead of a static. + * Temporary getpwuid implementaion of Windows. This should be replaced with getpw_currentuser */ -struct passwd *getpwuid(uid_t uid) -{ - static struct passwd pw; - - static char username[UNLEN + 1]; - - DWORD usernamelen = UNLEN + 1; - - wchar_t *homedir_w; - - /* - * Clear errno. - */ - - errno = 0; - - /* - * Zero out the structure. - */ - - memset(&pw, 0, sizeof(pw)); - - memset(pw_username, 0, sizeof(pw_username)); - memset(pw_homedir, 0, sizeof(pw_homedir)); - memset(pw_password, 0, sizeof(pw_password)); - memset(pw_shellpath, 0, sizeof(pw_shellpath)); - - /* - * Point to the static string variables. - */ - - pw.pw_name = pw_username; - pw.pw_passwd = pw_password; - pw.pw_gecos = pw_gecos; - pw.pw_shell = pw_shellpath; - pw.pw_dir = pw_homedir_ascii; - - /* - * Get the current user's name. - */ - - GetUserName(username, &usernamelen); - - debug3("getpwuid: username [%s]", username); - - strncpy(pw_username, username, sizeof(pw_username)); - - /* - * ssh need path to 'known_hosts' file, so we don't - * comment it here (see -> getpwnam() function). - */ - - /* - * Get default shell path. - */ - - //GetSystemDirectory(pw_shellpath, MAX_PATH); - - //debug3("getpwuid: system dir [%s]", pw_shellpath); - pw_shellpath[0] = '\0'; - strcat(pw_shellpath, "ssh-shellhost.exe"); - - //debug3("getpwuid: shell path [%s]", pw_shellpath); - - /* - * Get home directory path (if this fails, - * the user is invalid, bail) - */ - - homedir_w = gethomedir_w(username, NULL); - - if (!homedir_w || homedir_w[0] == '\0') - { - /* - * Bail out. - */ - - errno = ENOENT; - - return &pw; - } - - debug3("getpwuid: homedir [%ls]", homedir_w); - - //wcsncpy(pw_homedir, homedir_w, sizeof(pw_homedir)); - // convert to ascii from widechar(unicode) - int rc = WideCharToMultiByte( CP_UTF8, // UTF8/ANSI Code Page - 0, // No special handling of unmapped chars - homedir_w, // wide-character string to be converted - -1, // Unicode src str len, -1 means calc it - pw_homedir_ascii, - sizeof(pw_homedir_ascii), - NULL, NULL ); // Unrepresented char replacement - Use Default - - free(homedir_w); - - if ( rc == 0 ) { - debug3("Could not convert homedirectory [%ls]from unicode to utf8", homedir_w); - } - - /* - * Point to the username static variable. - */ - - //pw.pw_name = pw_username; - //pw.pw_passwd = pw_passwd; - //pw.pw_gecos = pw_gecos; - //pw.pw_shell = pw_shellpath; - //pw.pw_dir = pw_homedir; - - return &pw; -} -struct passwd *getpwnam(const char *userin) -{ - char *homedir; - debug3("getpwnam: username [%s]", userin); - - /* - * Clear errno. - */ - - errno = 0; - - /* - * Zero out the structure. - */ - - memset(&pw, 0, sizeof(pw)); - - memset(pw_username, 0, sizeof(pw_username)); - memset(pw_homedir, 0, sizeof(pw_homedir)); - memset(pw_password, 0, sizeof(pw_password)); - memset(pw_shellpath, 0, sizeof(pw_shellpath)); - - /* - * Point to the static string variables. - */ - - pw.pw_name = pw_username; - pw.pw_passwd = pw_password; - pw.pw_gecos = pw_gecos; - pw.pw_shell = pw_shellpath; - pw.pw_dir = pw_homedir; - - /* - * Get default shell path. - */ - - //GetSystemDirectory(pw_shellpath, MAX_PATH); - - //debug3("getpwuid: system dir [%s]", pw_shellpath); - - pw_shellpath[0] = '\0'; - strcat(pw_shellpath, "ssh-shellhost.exe"); - - //debug3("getpwuid: shell path [%s]", pw_shellpath); - - /* - * Copy user name to static structure. - */ - - strncpy(pw_username, userin, UNLEN + 1); - - /* - * Get a token for this user. - */ - - return &pw; -} - -void endpwent(void) -{ - /* - * This normally cleans up access to the passwd file, - * which we don't have, thus no cleanup. - */ -} - -#define NCACHE 64 /* power of 2 */ -#define MASK (NCACHE - 1) /* bits to store with */ - -const char * -user_from_uid(uid_t uid, int nouser) -{ - static struct ncache { - uid_t uid; - char *name; - } c_uid[NCACHE]; - static int pwopen; - static char nbuf[15]; /* 32 bits == 10 digits */ - struct passwd *pw; - struct ncache *cp; - - cp = c_uid + (uid & MASK); - if (cp->uid != uid || cp->name == NULL) { - if (pwopen == 0) { - pwopen = 1; - } - if ((pw = getpwuid(uid)) == NULL) { - if (nouser) - return (NULL); - (void)snprintf(nbuf, sizeof(nbuf), "%u", uid); - } - cp->uid = uid; - if (cp->name != NULL) - free(cp->name); - cp->name = strdup(pw ? pw->pw_name : nbuf); - } - return (cp->name); -} /* TODO - this is moved from realpath.c in openbsdcompat. Review and finalize its position*/ @@ -469,56 +251,43 @@ void slashconvert(char *str) } } -char *realpathWin32(const char *path, char resolved[PATH_MAX]) -{ - char realpath[PATH_MAX]; - strlcpy(resolved, path + 1, sizeof(realpath)); - backslashconvert(resolved); - PathCanonicalizeA(realpath, resolved); - slashconvert(realpath); - - /* - * Store terminating slash in 'X:/' on Windows. - */ - - if (realpath[1] == ':' && realpath[2] == 0) - { - realpath[2] = '/'; - realpath[3] = 0; - } - - resolved[0] = *path; // will be our first slash in /x:/users/test1 format - strncpy(resolved + 1, realpath, sizeof(realpath)); - return resolved; +uid_t +getuid(void) { + return 0; } -// like realpathWin32() but takes out the first slash so that windows systems can work on the actual file or directory -char *realpathWin32i(const char *path, char resolved[PATH_MAX]) -{ - char realpath[PATH_MAX]; - - if (path[0] != '/') { - // absolute form x:/abc/def given, no first slash to take out - strlcpy(resolved, path, sizeof(realpath)); - } - else - strlcpy(resolved, path + 1, sizeof(realpath)); - - backslashconvert(resolved); - PathCanonicalizeA(realpath, resolved); - slashconvert(realpath); - - /* - * Store terminating slash in 'X:/' on Windows. - */ - - if (realpath[1] == ':' && realpath[2] == 0) - { - realpath[2] = '/'; - realpath[3] = 0; - } - - strncpy(resolved, realpath, sizeof(realpath)); - return resolved; +gid_t +getgid(void) { + return 0; +} + +uid_t +geteuid(void) { + return 0; +} + +gid_t +getegid(void) { + return 0; +} + +int +setuid(uid_t uid) { + return 0; +} + +int +setgid(gid_t gid) { + return 0; +} + +int +seteuid(uid_t uid) { + return 0; +} + +int +setegid(gid_t gid) { + return 0; } diff --git a/contrib/win32/win32compat/socketio.c b/contrib/win32/win32compat/socketio.c index 4353138..8e5bbc2 100644 --- a/contrib/win32/win32compat/socketio.c +++ b/contrib/win32/win32compat/socketio.c @@ -32,8 +32,10 @@ #include #include #include +#include #include "w32fd.h" #include +#include "inc\utf.h" #define INTERNAL_SEND_BUFFER_SIZE 70*1024 //70KB @@ -978,4 +980,103 @@ socketio_on_select(struct w32_io* pio, BOOL rd) { } } -} \ No newline at end of file +} + +int +w32_gethostname(char *name_utf8, size_t len) { + wchar_t name_utf16[256]; + char* tmp_name_utf8 = NULL; + + if (IsWindows8OrGreater()) { + /* TODO - GetHostNameW not present in Win7, do GetProcAddr on Win8+*/ + // if (GetHostNameW(name_utf16, 256) == SOCKET_ERROR) { + // errno = errno_from_WSALastError(); + // return -1; + // } + + // if ((tmp_name_utf8 = utf16_to_utf8(name_utf16)) == NULL || + // strlen(tmp_name_utf8) >= len) { + // errno = EFAULT; //?? + // return -1; + // } + + // memcpy(name_utf8, tmp_name_utf8, strlen(tmp_name_utf8) + 1); + // free(tmp_name_utf8); + // return 0; + return gethostname(name_utf8, len); + } + else + return gethostname(name_utf8, len); +} + +void +w32_freeaddrinfo(struct addrinfo *ai) { + struct addrinfo *cur; + while (ai) { + cur = ai; + ai = ai->ai_next; + if (cur->ai_addr) + free(cur->ai_addr); + if (cur->ai_canonname) + free(cur->ai_canonname); + free(cur); + } +} + +int +w32_getaddrinfo(const char *node_utf8, const char *service_utf8, + const struct addrinfo *hints, struct addrinfo **res) { + int ret = 0; + wchar_t *node_utf16 = NULL, *service_utf16 = NULL; + struct addrinfoW *info_w = NULL; + *res = NULL; + + if ((node_utf8 && (node_utf16 = utf8_to_utf16(node_utf8)) == NULL) || + (service_utf8 && (service_utf16 = utf8_to_utf16(service_utf8)) == NULL)) { + ret = EAI_MEMORY; + goto done; + } + + if ((ret = GetAddrInfoW(node_utf16, service_utf16, (ADDRINFOW*)hints, &info_w)) != 0) + goto done; + + /* copy info_w to res */ + { + struct addrinfoW **cur_w = &info_w; + struct addrinfo **cur = res; + + while (*cur_w) { + if ((*cur = malloc(sizeof(struct addrinfo))) == NULL) { + ret = EAI_MEMORY; + goto done; + } + memcpy(*cur, *cur_w, sizeof(struct addrinfo)); + (*cur)->ai_next = NULL; + if (((*cur_w)->ai_canonname && ((*cur)->ai_canonname = utf16_to_utf8((*cur_w)->ai_canonname)) == NULL) || + ((*cur_w)->ai_addrlen && ((*cur)->ai_addr = malloc((*cur_w)->ai_addrlen)) == NULL) ) { + ret = EAI_MEMORY; + goto done; + + } + if ((*cur_w)->ai_addrlen) + memcpy((*cur)->ai_addr, (*cur_w)->ai_addr, (*cur_w)->ai_addrlen); + cur_w = &(*cur_w)->ai_next; + cur = &(*cur)->ai_next; + } + } + +done: + if (node_utf16) + free(node_utf16); + if (service_utf16) + free(service_utf16); + if (info_w) + FreeAddrInfoW(info_w); + if (ret != 0 && *res) { + w32_freeaddrinfo(*res); + *res = NULL; + } + return ret; +} + + diff --git a/contrib/win32/win32compat/ssh-agent/agentconfig.c b/contrib/win32/win32compat/ssh-agent/agentconfig.c index 2df29b1..b7c8bd2 100644 --- a/contrib/win32/win32compat/ssh-agent/agentconfig.c +++ b/contrib/win32/win32compat/ssh-agent/agentconfig.c @@ -46,6 +46,8 @@ #include "digest.h" #include "agent.h" +#include + static int use_privsep = -1; Buffer cfg; ServerOptions options; @@ -67,14 +69,14 @@ int kexgex_server(struct ssh * sh) { } static -int GetCurrentModulePath(char *path, int pathSize) +int GetCurrentModulePath(wchar_t *path, int pathSize) { - if (GetModuleFileName(NULL, path, pathSize)) { + if (GetModuleFileNameW(NULL, path, pathSize)) { int i; int lastSlashPos = 0; for (i = 0; path[i]; i++) { - if (path[i] == '/' || path[i] == '\\') { + if (path[i] == L'/' || path[i] == L'\\') { lastSlashPos = i; } } @@ -86,17 +88,20 @@ int GetCurrentModulePath(char *path, int pathSize) } int load_config() { - char basePath[MAX_PATH] = { 0 }; - char path[MAX_PATH] = { 0 }; - + wchar_t basePath[MAX_PATH] = { 0 }; + wchar_t path[MAX_PATH] = { 0 }; + /* TODO - account for UNICODE paths*/ - if (GetCurrentModulePath(basePath, MAX_PATH) == 0) - { - strncpy(path, basePath, MAX_PATH); - strncat(path, "/sshd_config", MAX_PATH); - config_file_name = path; - } - buffer_init(&cfg); + if (GetCurrentModulePath(basePath, MAX_PATH) == -1) + return -1; + + wcsncpy(path, basePath, MAX_PATH); + wcsncat(path, L"/sshd_config", MAX_PATH); + + if ((config_file_name = utf16_to_utf8(path)) == NULL) + return -1; + + buffer_init(&cfg); initialize_server_options(&options); load_server_config(config_file_name, &cfg); parse_server_config(&options, config_file_name, &cfg, NULL); @@ -111,14 +116,18 @@ int config_log_level() { int pubkey_allowed(struct sshkey* pubkey, wchar_t* wuser, wchar_t* wuser_home) { struct passwd pw; - char user[256], user_home[MAX_PATH]; + int ret; + char *user = NULL, *user_home = NULL; memset(&pw, 0, sizeof(pw)); - if (WideCharToMultiByte(CP_UTF8, 0, wuser, -1, user, 256, NULL, NULL) == 0) - return 0; - /* BUG - pw structure is assumed to be filled with unicode strings by expand_authorized_keys()*/ - //WideCharToMultiByte(CP_UTF8, 0, wuser_home, -1, user_home, MAX_PATH, NULL, NULL); - pw.pw_dir = wuser_home; + if ((user_home = utf16_to_utf8(wuser_home)) == NULL || + (user = utf16_to_utf8(wuser)) == NULL) + return 0; + + pw.pw_dir = user_home; pw.pw_name = user; - return user_key_allowed(&pw, pubkey, 1); + ret = user_key_allowed(&pw, pubkey, 1); + free(user); + free(user_home); + return ret; } \ No newline at end of file diff --git a/contrib/win32/win32compat/stringhelp.c b/contrib/win32/win32compat/stringhelp.c deleted file mode 100644 index 6f87a0a..0000000 --- a/contrib/win32/win32compat/stringhelp.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Author: NoMachine - * - * Copyright (c) 2009, 2010 NoMachine - * All rights reserved - * - * Support functions and system calls' replacements needed to let the - * software run on Win32 based operating systems. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -#include -#include "Debug.h" - -#undef DEBUG - -#ifdef DEBUG -# define DBG_MSG(...) debug3(__VA_ARGS__) -#else -# define DBG_MSG(...) -#endif - -#define SocketErrorStringSize 1024 - -/* - * Convert string encoding from one 8-bit CP to another 8-bit CP. - * WARNING: Returned string MUST be freed by caller. - * - * src - source string (IN). - * srcSize - size of src string in bytes or -1 if zero terminated (IN). - * srcCP - code page used by src string (IN). - * dstCP - target code page (IN). - * retSize - size of returned string, may be NULL (OUT/OPTIONAL). - * - * RETURNS: Pointer to new allocated string encoded in target CP - * or NULL if error. - * - */ -void *ConvertCodePage(const char *src, int srcSize, - DWORD srcCP, DWORD dstCP, int *retSize) -{ - int exitCode = -1; - - int utf16Len = 0; - int dstLen = 0; - - wchar_t *utf16 = NULL; - - char *ret = NULL; - - DBG_MSG("-> ConvertCodePage(src=[%s], srcSize=[%d])...", src, srcSize); - - /* - * Check args. - */ - - FAIL(src == NULL); - - /* - * Retrieve size for UTF16. - */ - - DBG_MSG("Retrieving size of UTF16..."); - - utf16Len = MultiByteToWideChar(srcCP, 0, src, srcSize, NULL, 0); - - FAIL(utf16Len <= 0); - - /* - * Allocate buffer for UTF16. - */ - - DBG_MSG("Allocating [%d] bytes for UTF16...", utf16Len * sizeof(wchar_t)); - - utf16 = (wchar_t *) malloc((utf16Len + 1) * sizeof(wchar_t)); - - FAIL(utf16 == NULL); - - /* - * Convert src to UTF16. - */ - - DBG_MSG("Allocating [%d] bytes for UTF16...", utf16Len * sizeof(wchar_t)); - - FAIL(MultiByteToWideChar(srcCP, 0, src, srcSize, utf16, utf16Len) < 0); - - /* - * Allocate buffer for return. - */ - - DBG_MSG("Allocating buffer for dst..."); - - dstLen = WideCharToMultiByte(dstCP, 0, utf16, -1, NULL, 0, NULL, NULL); - - ret = malloc(dstLen + 1); - - FAIL(ret == NULL); - - ret[dstLen] = 0; - - /* - * Convert utf16 to target CP. - */ - - DBG_MSG("Converting UTF16 to dst..."); - - dstLen = WideCharToMultiByte(dstCP, 0, utf16, utf16Len, - ret, dstLen + 1, NULL, NULL); - - FAIL(dstLen < 0); - - if (retSize) - { - *retSize = dstLen; - } - - /* - * Clean up. - */ - - exitCode = 0; - - fail: - - if (exitCode) - { - debug3("ERROR: Cannot convert [%s] from CP[0x%x] to CP[0x%x]." - "Error code is : %d.\n", src, srcCP, dstCP, GetLastError()); - - if (ret) - { - free(ret); - - ret = NULL; - } - } - - if (utf16) - { - free(utf16); - } - - DBG_MSG("<- ConvertCodePage()..."); - - return ret; -} - -/* - * Convert string from UTF8 to CP used by current thread (Local8). - * - * utf8 - string in UTF8 (IN). - * utf8Size - size of utf8 string in bytes or -1 if zero terminated (IN). - * bytesReturned - size of returned Local8 string (OUT). - * - * RETURNS: Pointer to new allocated Local8 string or NULL if error. - */ - -void *ConvertUtf8ToLocal8(const char *utf8, int utf8Size, int *bytesReturned) -{ - return ConvertCodePage(utf8, utf8Size, CP_UTF8, GetACP(), bytesReturned); -} - -/* - * Convert string from CP used by current thread (Local8) to UTF8. - * - * local8 - string in Local8 CP (IN). - * local8Size - size of local8 string in bytes or -1 if zero terminated (IN). - * bytesReturned - size of returned UTF8 string (OUT). - * - * RETURNS: Pointer to new allocated UTF8 string or NULL if error. - */ - -void *ConvertLocal8ToUtf8(const char *local8, int local8Size, int *bytesReturned) -{ - return ConvertCodePage(local8, local8Size, - GetACP(), CP_UTF8, bytesReturned); -} diff --git a/contrib/win32/win32compat/stringhelp.h b/contrib/win32/win32compat/stringhelp.h deleted file mode 100644 index e3af1fa..0000000 --- a/contrib/win32/win32compat/stringhelp.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Author: NoMachine - * - * Copyright (c) 2009, 2010 NoMachine - * All rights reserved - * - * Support functions and system calls' replacements needed to let the - * software run on Win32 based operating systems. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef StringHelp_H -#define StringHelp_H 1 - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -void *ConvertCodePage(const char *src, int srcSize, DWORD srcCP, DWORD dstCP, int *retSize); -void *ConvertUtf8ToLocal8(const char *utf8, int utf8Size, int *bytesReturned); - -#ifdef __cplusplus -}; -#endif - -#endif /* StringHelp_H */ diff --git a/contrib/win32/win32compat/w32fd.c b/contrib/win32/win32compat/w32fd.c index 45c4e4e..993758a 100644 --- a/contrib/win32/win32compat/w32fd.c +++ b/contrib/win32/win32compat/w32fd.c @@ -417,24 +417,23 @@ w32_lseek(int fd, long offset, int origin) { } int -w32_mkdir(const char *pathname, unsigned short mode) { - wchar_t wdirname[MAX_PATH]; - - if (MultiByteToWideChar(CP_UTF8, 0, pathname, -1, wdirname, MAX_PATH)) { - return _wmkdir(wdirname); +w32_mkdir(const char *path_utf8, unsigned short mode) { + wchar_t *path_utf16 = utf8_to_utf16(path_utf8); + if (path_utf16 == NULL) { + errno = ENOMEM; + return -1; } - - return 0; + return _wmkdir(path_utf16); } -int w32_chdir(const char *dirname) { - wchar_t wdirname[MAX_PATH]; - - if (MultiByteToWideChar(CP_UTF8, 0, dirname, -1, wdirname, MAX_PATH)) { - return _wchdir(wdirname); +int w32_chdir(const char *dirname_utf8) { + wchar_t *dirname_utf16 = utf8_to_utf16(dirname_utf8); + if (dirname_utf16 == NULL) { + errno = ENOMEM; + return -1; } - return 0; + return _wchdir(dirname_utf16); } char *w32_getcwd(char *buffer, int maxlen) { diff --git a/contrib/win32/win32compat/wmain.c b/contrib/win32/win32compat/wmain.c index 0b2e301..b8418b8 100644 --- a/contrib/win32/win32compat/wmain.c +++ b/contrib/win32/win32compat/wmain.c @@ -31,20 +31,10 @@ */ #include +#include "inc\utf.h" int main(int, char **); - -char* -utf16_to_utf8(wchar_t* utf16str) { - char* ret; - int needed; - if ((needed = WideCharToMultiByte(CP_UTF8, 0, utf16str, -1, NULL, 0, NULL, NULL)) == 0 || - (ret = malloc(needed)) == NULL || - WideCharToMultiByte(CP_UTF8, 0, utf16str, -1, ret, needed, NULL, NULL) != needed ) - fatal("failed to convert input arguments"); - - return ret; -} +void w32posix_initialize(); int wmain(int argc, wchar_t **wargv) { @@ -58,5 +48,6 @@ wmain(int argc, wchar_t **wargv) { argv[i] = utf16_to_utf8(wargv[i]); } + w32posix_initialize(); return main(argc, argv); } diff --git a/loginrec.c b/loginrec.c index 94ae81d..7e361bb 100644 --- a/loginrec.c +++ b/loginrec.c @@ -527,6 +527,7 @@ getlast_entry(struct logininfo *li) /* If wtmp isn't available, try wtmpx */ return (wtmpx_get_entry(li)); # else + /* TODO - implement last_login_entry in Windows*/ /* Give up: No means of retrieving last login time */ return (0); # endif /* DISABLE_LASTLOG */ diff --git a/misc.c b/misc.c index e42c23f..02a4d55 100644 --- a/misc.c +++ b/misc.c @@ -223,11 +223,8 @@ pwcopy(struct passwd *pw) copy->pw_class = xstrdup(pw->pw_class); #endif -#ifdef WIN32_FIXME//N - copy -> pw_dir = (char*)_wcsdup((wchar_t*)pw->pw_dir); -#else + copy->pw_dir = xstrdup(pw->pw_dir); -#endif copy->pw_shell = xstrdup(pw->pw_shell); return copy; } @@ -677,64 +674,6 @@ percent_expand(const char *string, ...) #undef EXPAND_MAX_KEYS } -#ifdef WIN32_FIXME -wchar_t *percent_expand_w(const wchar_t *string, ...) -{ -#define EXPAND_MAX_KEYS 16 - u_int num_keys, i, j; - struct { - const wchar_t *key; - const wchar_t *repl; - } keys[EXPAND_MAX_KEYS]; - wchar_t buf[4096]; - wchar_t *aptr = NULL; - va_list ap; - - /* Gather keys */ - va_start(ap, string); - for (num_keys = 0; num_keys < EXPAND_MAX_KEYS; num_keys++) { - keys[num_keys].key = va_arg(ap, wchar_t *); - if (keys[num_keys].key == NULL) - break; - keys[num_keys].repl = va_arg(ap, wchar_t *); - if (keys[num_keys].repl == NULL) - fatal("%s: NULL replacement", __func__); - } - if (num_keys == EXPAND_MAX_KEYS && va_arg(ap, wchar_t *) != NULL) - fatal("%s: too many keys", __func__); - va_end(ap); - - /* Expand string */ - *buf = L'\0'; - for (i = 0; *string != L'\0'; string++) { - if (*string != L'%') { - append: - buf[i++] = *string; - if (i >= sizeof(buf)) - fatal("%s: string too long", __func__); - buf[i] = L'\0'; - continue; - } - string++; - /* %% case */ - if (*string == L'%') - goto append; - for (j = 0; j < num_keys; j++) { - if (wcschr(keys[j].key, *string) != NULL) { - aptr = wcsncat(buf, keys[j].repl, sizeof(buf)); - buf[sizeof(buf)-1] = 0; - if (aptr == NULL) - fatal("%s: string too long", __func__); - break; - } - } - if (j >= num_keys) - fatal("%s: unknown key %%%c", __func__, *string); - } - return (_wcsdup(buf)); -#undef EXPAND_MAX_KEYS -} -#endif /* * Read an entire line from a public key file into a static buffer, discarding * lines that exceed the buffer size. Returns 0 on success, -1 on failure. diff --git a/misc.h b/misc.h index 764cc5a..374c33c 100644 --- a/misc.h +++ b/misc.h @@ -50,9 +50,6 @@ char *colon(char *); long convtime(const char *); char *tilde_expand_filename(const char *, uid_t); char *percent_expand(const char *, ...) __attribute__((__sentinel__)); -#ifdef WIN32_FIXME -wchar_t *percent_expand_w(const wchar_t *, ...) __attribute__((__sentinel__)); -#endif char *tohex(const void *, size_t); void sanitise_stdfd(void); void ms_subtract_diff(struct timeval *, int *); diff --git a/readconf.c b/readconf.c index 84da4cc..0894cd3 100644 --- a/readconf.c +++ b/readconf.c @@ -1564,7 +1564,7 @@ read_config_file(const char *filename, struct passwd *pw, const char *host, if ((f = fopen(filename, "r")) == NULL) return 0; -#ifndef WIN32_FIXME +#ifndef WINDOWS /* TODO - implement permission checks for Windows */ if (flags & SSHCONF_CHECKPERM) { struct stat sb; diff --git a/readpass.c b/readpass.c index fa11ae7..736cd64 100644 --- a/readpass.c +++ b/readpass.c @@ -334,7 +334,7 @@ read_passphrase(const char *prompt, int flags) /* * Show prompt for user. */ - _cputs(prompt); + _cputws(utf8_to_utf16(prompt)); len = retr = 0; int bufsize = sizeof(buf); diff --git a/session.c b/session.c index f12e164..49b3c78 100644 --- a/session.c +++ b/session.c @@ -103,7 +103,6 @@ #ifdef WIN32_FIXME -char *GetHomeDirFromToken(char *userName, HANDLE token); /* FIXME: GFPZR: Function stat() may be undeclared. */ @@ -510,6 +509,7 @@ int do_exec_no_pty(Session *s, const char *command) { #ifdef WIN32_FIXME + wchar_t* pw_dir_utf16 = utf8_to_utf16(s->pw->pw_dir); /* * Win32 code. @@ -702,33 +702,28 @@ do_exec_no_pty(Session *s, const char *command) SetEnvironmentVariable("DISPLAY", s -> display); } - /* - * Get user homedir if needed. - */ - - if (1) // (s -> pw -> pw_dir == NULL || s -> pw -> pw_dir[0] == '\0') - { - s -> pw -> pw_dir = GetHomeDirFromToken(s -> pw -> pw_name, hToken); - } - /* * Change to users home directory + * TODO - pw_dir is utf-8, convert it to utf-16 and call _wchdir + * also change subsequent calls to SetEnvironmentVariable */ - _wchdir(s -> pw -> pw_dir); + _wchdir(pw_dir_utf16); + + SetEnvironmentVariableW(L"HOME", pw_dir_utf16); + SetEnvironmentVariableW(L"USERPROFILE", pw_dir_utf16); - SetEnvironmentVariableW(L"HOME", s -> pw -> pw_dir); wchar_t *wstr, wchr; - wstr = wcschr(s->pw->pw_dir, ':'); + wstr = wcschr(pw_dir_utf16, L':'); if (wstr) { wchr = *(wstr + 1); *(wstr + 1) = '\0'; - SetEnvironmentVariableW(L"HOMEDRIVE", s->pw->pw_dir); + SetEnvironmentVariableW(L"HOMEDRIVE", pw_dir_utf16); *(wstr + 1) = wchr; SetEnvironmentVariableW(L"HOMEPATH", (wstr+1)); } - SetEnvironmentVariableW(L"USERPROFILE", s -> pw -> pw_dir); + // find the server name of the domain controller which created this token GetDomainFromToken ( &hToken, buf, sizeof(buf)); @@ -742,7 +737,7 @@ do_exec_no_pty(Session *s, const char *command) snprintf(buf, sizeof buf, "%.50s %d %d", get_remote_ipaddr(), get_remote_port(), get_local_port()); - SetEnvironmentVariable("SSH_CLIENT", buf); + SetEnvironmentVariableA("SSH_CLIENT", buf); /* * Set SSH_CONNECTION variable. @@ -755,16 +750,16 @@ do_exec_no_pty(Session *s, const char *command) free(laddr); - SetEnvironmentVariable("SSH_CONNECTION", buf); + SetEnvironmentVariableA("SSH_CONNECTION", buf); if (original_command) - SetEnvironmentVariable("SSH_ORIGINAL_COMMAND", original_command); + SetEnvironmentVariableA("SSH_ORIGINAL_COMMAND", original_command); // set better prompt for Windows cmd shell if (!s -> is_subsystem) { snprintf(buf,sizeof buf, "%s@%s $P$G", s->pw->pw_name, getenv("COMPUTERNAME")); - SetEnvironmentVariable("PROMPT", buf); + SetEnvironmentVariableA("PROMPT", buf); } /* @@ -797,14 +792,17 @@ do_exec_no_pty(Session *s, const char *command) DWORD dwStartupFlags = DETACHED_PROCESS;// CREATE_SUSPENDED; // 0 SetConsoleCtrlHandler(NULL, FALSE); - if (debug_flag) - b = CreateProcessW(NULL, exec_command_w, NULL, NULL, TRUE, - /*CREATE_NEW_PROCESS_GROUP*/ dwStartupFlags, NULL, s->pw->pw_dir, - &si, &pi); - else - b = CreateProcessAsUserW(hToken, NULL, exec_command_w, NULL, NULL, TRUE, - /*CREATE_NEW_PROCESS_GROUP*/ dwStartupFlags, NULL, s -> pw -> pw_dir, - &si, &pi); + + wchar_t* p_dir = utf8_to_utf16(s->pw->pw_dir); + if (debug_flag) + b = CreateProcessW(NULL, exec_command_w, NULL, NULL, TRUE, + /*CREATE_NEW_PROCESS_GROUP*/ dwStartupFlags, NULL, pw_dir_utf16, + &si, &pi); + else + b = CreateProcessAsUserW(hToken, NULL, exec_command_w, NULL, NULL, TRUE, + /*CREATE_NEW_PROCESS_GROUP*/ dwStartupFlags, NULL, pw_dir_utf16, + &si, &pi); + if (!b) { debug("ERROR. Cannot create process (%u).\n", GetLastError()); diff --git a/sftp-client.h b/sftp-client.h index 7d70477..f814b07 100644 --- a/sftp-client.h +++ b/sftp-client.h @@ -68,7 +68,7 @@ void free_sftp_dirents(SFTP_DIRENT **); int do_rm(struct sftp_conn *, const char *); /* Create directory 'path' */ -u_int do_mkdir(struct sftp_conn *, const char *, Attrib *, int); +int do_mkdir(struct sftp_conn *, const char *, Attrib *, int); /* Remove directory 'path' */ int do_rmdir(struct sftp_conn *, const char *); diff --git a/sftp-common.c b/sftp-common.c index 9a16f04..513e0aa 100644 --- a/sftp-common.c +++ b/sftp-common.c @@ -230,9 +230,13 @@ ls_file(const char *name, const struct stat *st, int remote, int si_units) strmode_from_attrib(remote, mode); #endif if (!remote) { - user = user_from_uid(st->st_uid, 0); - snprintf(gbuf, sizeof gbuf, "%u", (u_int)st->st_gid); - group = gbuf; +#ifndef WIN32_FIXME + user = user_from_uid(st->st_uid, 0); +#else + user = "\0"; + snprintf(gbuf, sizeof gbuf, "%u", (u_int)st->st_gid); + group = gbuf; +#endif } else { snprintf(ubuf, sizeof ubuf, "%u", (u_int)st->st_uid); user = ubuf; diff --git a/sftp-server-main.c b/sftp-server-main.c index 3f5795f..7e644ab 100644 --- a/sftp-server-main.c +++ b/sftp-server-main.c @@ -38,10 +38,6 @@ main(int argc, char **argv) { struct passwd *user_pw; -#ifdef WIN32_FIXME - w32posix_initialize(); -#endif - /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ sanitise_stdfd(); diff --git a/sftp-server.c b/sftp-server.c index f9f31cb..dacbbe3 100644 --- a/sftp-server.c +++ b/sftp-server.c @@ -60,8 +60,8 @@ #include "sftp.h" #include "sftp-common.h" - #ifdef WIN32_FIXME +#include char * get_inside_path(char *, BOOL, BOOL); int readlink(const char *path, char *link, int linklen); @@ -72,6 +72,8 @@ * without slash at the end). */ + char *realpathWin32(const char *path, char resolved[PATH_MAX]); + char *realpathWin32i(const char *path, char resolved[PATH_MAX]); #define realpath realpathWin32 #endif /* WIN32_FIXME */ @@ -2157,3 +2159,59 @@ sftp_server_main(int argc, char **argv, struct passwd *user_pw) } //#endif /* else WIN32 */ } + +#ifdef WIN32_FIXME +char *realpathWin32(const char *path, char resolved[PATH_MAX]) +{ + char realpath[PATH_MAX]; + + strlcpy(resolved, path + 1, sizeof(realpath)); + backslashconvert(resolved); + PathCanonicalizeA(realpath, resolved); + slashconvert(realpath); + + /* + * Store terminating slash in 'X:/' on Windows. + */ + + if (realpath[1] == ':' && realpath[2] == 0) + { + realpath[2] = '/'; + realpath[3] = 0; + } + + resolved[0] = *path; // will be our first slash in /x:/users/test1 format + strncpy(resolved + 1, realpath, sizeof(realpath)); + return resolved; +} + +// like realpathWin32() but takes out the first slash so that windows systems can work on the actual file or directory +char *realpathWin32i(const char *path, char resolved[PATH_MAX]) +{ + char realpath[PATH_MAX]; + + if (path[0] != '/') { + // absolute form x:/abc/def given, no first slash to take out + strlcpy(resolved, path, sizeof(realpath)); + } + else + strlcpy(resolved, path + 1, sizeof(realpath)); + + backslashconvert(resolved); + PathCanonicalizeA(realpath, resolved); + slashconvert(realpath); + + /* + * Store terminating slash in 'X:/' on Windows. + */ + + if (realpath[1] == ':' && realpath[2] == 0) + { + realpath[2] = '/'; + realpath[3] = 0; + } + + strncpy(resolved, realpath, sizeof(realpath)); + return resolved; +} +#endif diff --git a/sftp.c b/sftp.c index d5f7471..6b1af98 100644 --- a/sftp.c +++ b/sftp.c @@ -74,7 +74,7 @@ typedef void EditLine; #define DEFAULT_NUM_REQUESTS 64 /* # concurrent outstanding requests */ #define MAX_COMMAND_LINE 2048 -#ifdef WINDOWS +#ifdef WIN32_VS #include "win32_dirent.h" #endif diff --git a/ssh-add.c b/ssh-add.c index 1a17901..cb5add1 100644 --- a/ssh-add.c +++ b/ssh-add.c @@ -484,17 +484,6 @@ main(int argc, char **argv) char *pkcs11provider = NULL; int r, i, ch, deleting = 0, ret = 0, key_only = 0; int xflag = 0, lflag = 0, Dflag = 0; - - - #ifdef WIN32_FIXME - - /* - * Allocate stdio inside our wrapper function. - */ - - w32posix_initialize(); - - #endif /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ sanitise_stdfd(); diff --git a/ssh-keygen.c b/ssh-keygen.c index ceeb844..8247b33 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -58,13 +58,6 @@ #include "krl.h" #include "digest.h" -#ifdef WIN32_FIXME -#undef open -#undef fdopen -#define open(a,b,...) _open((a), (b), __VA_ARGS__) -#define fdopen(a,b) _fdopen((a), (b)) -#endif - #ifdef WITH_OPENSSL # define DEFAULT_KEY_TYPE_NAME "rsa" #else @@ -997,6 +990,11 @@ do_gen_all_hostkeys(struct passwd *pw) } sshkey_free(private); strlcat(identity_file, ".pub", sizeof(identity_file)); +#ifdef WINDOWS + if ((f = fopen(identity_file, "w")) == NULL) { + error("fopen %s failed: %s", identity_file, strerror(errno)); + /* TODO - set permissions on file */ +#else fd = open(identity_file, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (fd == -1) { error("Could not save your public key in %s", @@ -1006,9 +1004,11 @@ do_gen_all_hostkeys(struct passwd *pw) continue; } f = fdopen(fd, "w"); + if (f == NULL) { error("fdopen %s failed", identity_file); close(fd); +#endif sshkey_free(public); first = 0; continue; @@ -2231,11 +2231,6 @@ main(int argc, char **argv) #ifdef WIN32_FIXME - /* - * Init wrapped stdio. - */ - - w32posix_initialize(); /* * -rand option used for generate random password. */ @@ -2777,11 +2772,17 @@ passphrase_again: printf("Your identification has been saved in %s.\n", identity_file); strlcat(identity_file, ".pub", sizeof(identity_file)); +#ifdef WINDOWS + if ((f = fopen(identity_file, "w")) == NULL) + fatal("fopen %s failed: %s", identity_file, strerror(errno)); + /* TODO - set permissions on file */ +#else if ((fd = open(identity_file, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) fatal("Unable to save public key to %s: %s", identity_file, strerror(errno)); if ((f = fdopen(fd, "w")) == NULL) fatal("fdopen %s failed: %s", identity_file, strerror(errno)); +#endif if ((r = sshkey_write(public, f)) != 0) error("write key failed: %s", ssh_err(r)); fprintf(f, " %s\n", comment); diff --git a/ssh.c b/ssh.c index 8ab2220..83dd270 100644 --- a/ssh.c +++ b/ssh.c @@ -528,16 +528,6 @@ main(int ac, char **av) u_char conn_hash[SSH_DIGEST_MAX_LENGTH]; char *conn_hash_hex; - #ifdef WIN32_FIXME - - /* - * Initialize wrapped stdio. - */ - - w32posix_initialize(); - - #endif - /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ sanitise_stdfd(); @@ -560,6 +550,7 @@ main(int ac, char **av) */ closefrom(STDERR_FILENO + 1); +#ifndef WINDOWS /* * Save the original real uid. It will be needed later (uid-swapping * may clobber the real uid). @@ -575,6 +566,7 @@ main(int ac, char **av) * has been made, as we may need to create the port several times). */ PRIV_END; +#endif #ifdef HAVE_SETRLIMIT /* If we are installed setuid root be careful to not drop core. */ @@ -1336,14 +1328,8 @@ main(int ac, char **av) * directory if it doesn't already exist. */ if (config == NULL) { -#ifdef WIN32_FIXME - r = snprintf(buf, sizeof(buf), "%ls%s%s", pw -> pw_dir, - wcscmp(pw -> pw_dir, L"/") ? "/" : "", - _PATH_SSH_USER_DIR); -#else r = snprintf(buf, sizeof buf, "%s%s%s", pw->pw_dir, strcmp(pw->pw_dir, "/") ? "/" : "", _PATH_SSH_USER_DIR); -#endif if (r > 0 && (size_t)r < sizeof(buf) && stat(buf, &st) < 0) { #ifdef WITH_SELINUX @@ -2081,16 +2067,8 @@ load_public_identity_files(void) if ((pw = getpwuid(original_real_uid)) == NULL) fatal("load_public_identity_files: getpwuid failed"); pwname = xstrdup(pw->pw_name); -#ifdef WIN32_FIXME - pwdir = _wcsdup(pw -> pw_dir); - - if (pwdir) - { - sprintf(pwdir, "%ls", pw -> pw_dir); - } -#else pwdir = xstrdup(pw->pw_dir); -#endif + if (gethostname(thishost, sizeof(thishost)) == -1) fatal("load_public_identity_files: gethostname: %s", strerror(errno)); diff --git a/sshd.c b/sshd.c index f17ef23..2c988cd 100644 --- a/sshd.c +++ b/sshd.c @@ -1691,43 +1691,6 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s) } } -#ifdef WIN32_FIXME - - /* - * Win32 only. - */ - - - /* - * This function handles exit signal from parent process. - */ - - BOOL WINAPI CtrlHandlerRoutine(DWORD dwCtrlType) - { - switch( dwCtrlType ) - { - case CTRL_C_EVENT: - return TRUE; // control C will be passed to shell but sshd wil not exit - - case CTRL_BREAK_EVENT: - case CTRL_LOGOFF_EVENT: - break; - - default: - break; - } - - debug("Exit signal received..."); - - cleanup_exit(0); - - return TRUE; - } - -#endif /* WIN32_FIXME */ - - - /* * Main program for the daemon. */ @@ -1768,10 +1731,6 @@ main(int ac, char **av) AllocConsole(); - SetConsoleCtrlHandler(CtrlHandlerRoutine, TRUE); - - w32posix_initialize(); - #endif /* WIN32_FIXME */ @@ -1936,9 +1895,10 @@ main(int ac, char **av) { do { - SERVICE_TABLE_ENTRY DispatchTable[] = + int wmain(int , wchar_t **); + SERVICE_TABLE_ENTRYW DispatchTable[] = { - {SVCNAME, (LPSERVICE_MAIN_FUNCTION) main}, + {L"SSHD", (LPSERVICE_MAIN_FUNCTIONW) wmain}, {NULL, NULL} }; @@ -1961,7 +1921,7 @@ main(int ac, char **av) * for any other reason, bail out. */ - if (!StartServiceCtrlDispatcher(DispatchTable)) + if (!StartServiceCtrlDispatcherW(DispatchTable)) { if (GetLastError() == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) { @@ -2213,6 +2173,7 @@ main(int ac, char **av) logit("[Build " __DATE__ " " __TIME__ "]"); #endif +#ifndef WINDOWS /* Store privilege separation user for later use if required. */ if ((privsep_pw = getpwnam(SSH_PRIVSEP_USER)) == NULL) { if (use_privsep || options.kerberos_authentication) @@ -2226,6 +2187,7 @@ main(int ac, char **av) privsep_pw->pw_passwd = xstrdup("*"); } endpwent(); +#endif /* load host keys */ sensitive_data.host_keys = xcalloc(options.num_host_key_files, diff --git a/contrib/win32/win32compat/win32_dirent.c b/win32_dirent.c similarity index 85% rename from contrib/win32/win32compat/win32_dirent.c rename to win32_dirent.c index 7c5a5c2..31827ee 100644 --- a/contrib/win32/win32compat/win32_dirent.c +++ b/win32_dirent.c @@ -40,8 +40,8 @@ DIR * opendir(char *name) pdir->c_file.time_create = c_file.time_create; pdir->c_file.time_write = c_file.time_write; - if ((needed = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, c_file.name, -1, NULL, 0, NULL, NULL)) == 0 || - WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, c_file.name, -1, pdir->c_file.name, needed, NULL, NULL) != needed) + if ((needed = WideCharToMultiByte(CP_UTF8, 0, c_file.name, -1, NULL, 0, NULL, NULL)) == 0 || + WideCharToMultiByte(CP_UTF8, 0, c_file.name, -1, pdir->c_file.name, needed, NULL, NULL) != needed) fatal("failed to covert input arguments"); strcpy_s(pdir->initName, sizeof(pdir->initName), pdir->c_file.name); @@ -82,9 +82,9 @@ struct dirent *readdir(void *avp) } pdirentry = (struct dirent *) malloc( sizeof(struct dirent) ); - if ((needed = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, c_file.name, -1, NULL, 0, NULL, NULL)) == 0 || + if ((needed = WideCharToMultiByte(CP_UTF8, 0, c_file.name, -1, NULL, 0, NULL, NULL)) == 0 || (pdirentry->d_name = malloc(needed)) == NULL || - WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, c_file.name, -1, pdirentry->d_name, needed, NULL, NULL) != needed) + WideCharToMultiByte(CP_UTF8, 0, c_file.name, -1, pdirentry->d_name, needed, NULL, NULL) != needed) fatal("failed to covert input arguments"); pdirentry->d_ino = 1; // a fictious one like UNIX to say it is nonzero diff --git a/contrib/win32/win32compat/win32_dirent.h b/win32_dirent.h similarity index 100% rename from contrib/win32/win32compat/win32_dirent.h rename to win32_dirent.h