shell host is now the default shell process in sshd
This commit is contained in:
parent
7bff604e70
commit
5cb9fb09ed
46
channels.c
46
channels.c
|
@ -2479,53 +2479,7 @@ channel_input_data(int type, u_int32_t seq, void *ctxt)
|
|||
if (c->datagram)
|
||||
buffer_put_string(&c->output, data, data_len);
|
||||
else {
|
||||
#if(0)//ndef WIN32_FIXME
|
||||
buffer_append(&c->output, data, data_len);
|
||||
#else
|
||||
if ( c->client_tty )
|
||||
buffer_append(&c->output, data, data_len);
|
||||
//telProcessNetwork ( data, data_len ); // run it by ANSI engine if it is the ssh client
|
||||
else {
|
||||
#ifdef WIN32_PRAGMA_REMCON
|
||||
buffer_append(&c->output, data, data_len); // it is the sshd server, so pass it on
|
||||
#else
|
||||
if ( ( c->isatty) && (data_len ==1) && (data[0] == '\003') ) {
|
||||
/* send control-c to the shell process */
|
||||
if ( GenerateConsoleCtrlEvent ( CTRL_C_EVENT, 0 ) ) {
|
||||
}
|
||||
else {
|
||||
debug3("GenerateConsoleCtrlEvent failed with %d\n",GetLastError());
|
||||
}
|
||||
}
|
||||
else {
|
||||
// avoid sending the 4 arrow keys out to remote for now "ESC[A" ..
|
||||
if ( (c->isatty) && (data_len ==3) && (data[0] == '\033') && (data[1] == '[')) {
|
||||
if ( ( data[2] == 'A') || (data[2] == 'B') || (data[2] == 'C') || (data[2] == 'D'))
|
||||
packet_check_eom();
|
||||
return 0;
|
||||
}
|
||||
buffer_append(&c->output, data, data_len); // it is the sshd server, so pass it on
|
||||
if ( c->isatty ) { // we echo the data if it is sshd server and pty interactive mode
|
||||
|
||||
if ( (data_len ==1) && (data[0] == '\b') ) {
|
||||
if (charinline >0) {
|
||||
buffer_append(&c->input, "\b \b", 3); // for backspace, we need to send space and another backspace for visual erase
|
||||
charinline--;
|
||||
}
|
||||
}
|
||||
else {
|
||||
buffer_append(&c->input, data, data_len);
|
||||
charinline += data_len; // one more char on the line
|
||||
}
|
||||
|
||||
if ( (data[data_len-1] == '\r') || (data[data_len-1] == '\n') )
|
||||
charinline = 0; // a line has ended, begin char in line count again
|
||||
}
|
||||
}
|
||||
#endif // WIN32_PRAGMA_REMCON
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
packet_check_eom();
|
||||
return 0;
|
||||
|
|
|
@ -0,0 +1,184 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="paths.targets" />
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\shell-host.c" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{C0AE8A30-E4FA-49CE-A2B5-0C072C77EC64}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>shellhost</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
||||
<ProjectName>ssh-shellhost</ProjectName>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<OutDir>$(OpenSSH-Bin-Path)$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir>$(Platform)\$(Configuration)\$(TargetName)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<OutDir>$(OpenSSH-Bin-Path)$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir>$(Platform)\$(Configuration)\$(TargetName)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<OutDir>$(OpenSSH-Bin-Path)$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir>$(Platform)\$(Configuration)\$(TargetName)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<OutDir>$(OpenSSH-Bin-Path)$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir>$(Platform)\$(Configuration)\$(TargetName)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level1</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>_WIN32_WINNT=0x501;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SDLCheck>false</SDLCheck>
|
||||
<AdditionalIncludeDirectories>
|
||||
</AdditionalIncludeDirectories>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>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)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Debug-Path)lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level1</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>_WIN32_WINNT=0x501;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SDLCheck>false</SDLCheck>
|
||||
<AdditionalIncludeDirectories>
|
||||
</AdditionalIncludeDirectories>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>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)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-x64-Debug-Path)lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level1</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>_WIN32_WINNT=0x501;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SDLCheck>false</SDLCheck>
|
||||
<AdditionalIncludeDirectories>
|
||||
</AdditionalIncludeDirectories>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>No</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>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)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OpenSSH-Lib-Path)$(Platform)\$(Configuration);$(OpenSSL-Win32-Release-Path)lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level1</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>_WIN32_WINNT=0x501;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SDLCheck>false</SDLCheck>
|
||||
<AdditionalIncludeDirectories>
|
||||
</AdditionalIncludeDirectories>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>No</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
|
@ -286,13 +286,13 @@ struct passwd *getpwuid(uid_t uid)
|
|||
* Get default shell path.
|
||||
*/
|
||||
|
||||
GetSystemDirectory(pw_shellpath, MAX_PATH);
|
||||
//GetSystemDirectory(pw_shellpath, MAX_PATH);
|
||||
|
||||
debug3("getpwuid: system dir [%s]", pw_shellpath);
|
||||
//debug3("getpwuid: system dir [%s]", pw_shellpath);
|
||||
pw_shellpath[0] = '\0';
|
||||
strcat(pw_shellpath, "ssh-shellhost.exe");
|
||||
|
||||
strcat(pw_shellpath, "\\cmd.exe");
|
||||
|
||||
debug3("getpwuid: shell path [%s]", pw_shellpath);
|
||||
//debug3("getpwuid: shell path [%s]", pw_shellpath);
|
||||
|
||||
/*
|
||||
* Get home directory path (if this fails,
|
||||
|
@ -381,13 +381,14 @@ struct passwd *getpwnam(const char *userin)
|
|||
* Get default shell path.
|
||||
*/
|
||||
|
||||
GetSystemDirectory(pw_shellpath, MAX_PATH);
|
||||
//GetSystemDirectory(pw_shellpath, MAX_PATH);
|
||||
|
||||
debug3("getpwnam: system dir [%s]", pw_shellpath);
|
||||
//debug3("getpwuid: system dir [%s]", pw_shellpath);
|
||||
|
||||
strcat(pw_shellpath, "\\cmd.exe");
|
||||
pw_shellpath[0] = '\0';
|
||||
strcat(pw_shellpath, "ssh-shellhost.exe");
|
||||
|
||||
debug3("getpwnam: shell path [%s]", pw_shellpath);
|
||||
//debug3("getpwuid: shell path [%s]", pw_shellpath);
|
||||
|
||||
/*
|
||||
* Copy user name to static structure.
|
||||
|
|
|
@ -156,6 +156,8 @@ int wmain(int ac, wchar_t **av) {
|
|||
}
|
||||
|
||||
while (i < rd) {
|
||||
/* TODO - handle any pty data*/
|
||||
|
||||
/* skip them for now*/
|
||||
if ((rd - i >= 3) && (buf[i] == '\033') && (buf[i + 1] == '[')
|
||||
&& (buf[i + 2] >= 'A') && (buf[i + 2] <= 'D')) {
|
||||
|
|
169
session.c
169
session.c
|
@ -501,45 +501,6 @@ do_authenticated1(Authctxt *authctxt)
|
|||
#define USE_PIPES 1
|
||||
#endif
|
||||
|
||||
#ifdef WIN32_FIXME
|
||||
HANDLE hConIn = NULL;
|
||||
HANDLE hConOut = NULL;
|
||||
HANDLE hConErr = NULL;
|
||||
|
||||
BOOL MakeNewConsole(void)
|
||||
{
|
||||
BOOL bRet = TRUE;
|
||||
|
||||
if (!(bRet = FreeConsole())) return bRet;
|
||||
if (!(bRet = AllocConsole())) return bRet;
|
||||
HANDLE hTemp;
|
||||
|
||||
hTemp = CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
|
||||
if (INVALID_HANDLE_VALUE != hTemp)
|
||||
{
|
||||
DuplicateHandle(GetCurrentProcess(),hTemp,GetCurrentProcess(),&hConIn, 0,TRUE,DUPLICATE_SAME_ACCESS);
|
||||
CloseHandle(hTemp);
|
||||
} else
|
||||
return FALSE;
|
||||
|
||||
hTemp = CreateFile("CONOUT$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
|
||||
if (INVALID_HANDLE_VALUE != hTemp)
|
||||
{
|
||||
DuplicateHandle(GetCurrentProcess(),hTemp,GetCurrentProcess(),&hConOut, 0,TRUE,DUPLICATE_SAME_ACCESS);
|
||||
DuplicateHandle(GetCurrentProcess(),hTemp,GetCurrentProcess(),&hConErr, 0,TRUE,DUPLICATE_SAME_ACCESS);
|
||||
CloseHandle(hTemp);
|
||||
|
||||
} else
|
||||
return FALSE;
|
||||
|
||||
SetStdHandle(STD_INPUT_HANDLE,hConIn);
|
||||
SetStdHandle(STD_OUTPUT_HANDLE,hConOut);
|
||||
SetStdHandle(STD_ERROR_HANDLE,hConErr);
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* This is called to fork and execute a command when we have no tty. This
|
||||
* will call do_child from the child, and server_loop from the parent after
|
||||
|
@ -575,9 +536,9 @@ do_exec_no_pty(Session *s, const char *command)
|
|||
PROCESS_INFORMATION pi;
|
||||
STARTUPINFOW si;
|
||||
|
||||
int sockin[2];
|
||||
int sockout[2];
|
||||
int sockerr[2];
|
||||
int pipein[2];
|
||||
int pipeout[2];
|
||||
int pipeerr[2];
|
||||
|
||||
BOOL b;
|
||||
|
||||
|
@ -626,8 +587,10 @@ do_exec_no_pty(Session *s, const char *command)
|
|||
/*
|
||||
* Create three socket pairs for stdin, stdout and stderr
|
||||
*/
|
||||
pipe(pipein);
|
||||
|
||||
#ifdef WIN32_PRAGMA_REMCON
|
||||
pipe(pipeout);
|
||||
pipe(pipeerr);
|
||||
|
||||
int retcode = -1;
|
||||
if ( (!s -> is_subsystem) && (s ->ttyfd != -1))
|
||||
|
@ -637,52 +600,17 @@ do_exec_no_pty(Session *s, const char *command)
|
|||
extern HANDLE hConsole ;
|
||||
hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
|
||||
ConSetScreenSize( s->col, s->row );
|
||||
socketpair(sockin);
|
||||
s->ptyfd = sockin[1]; // hConsole; // the pty is the Windows console output handle in our Win32 port
|
||||
s->ptyfd = pipein[1]; // hConsole; // the pty is the Windows console output handle in our Win32 port
|
||||
}
|
||||
else
|
||||
socketpair(sockin);
|
||||
#else
|
||||
HANDLE wfdtocmd = -1;
|
||||
int retcode = -1;
|
||||
if ((!s->is_subsystem) && (s->ttyfd != -1))
|
||||
{
|
||||
//FreeConsole();
|
||||
//AllocConsole();
|
||||
MakeNewConsole();
|
||||
prot_scr_width = s->col;
|
||||
prot_scr_height = s->row;
|
||||
extern HANDLE hConsole;
|
||||
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
ConSetScreenSize(s->col, s->row);
|
||||
s->ptyfd = hConsole; // the pty is the Windows console output handle in our Win32 port
|
||||
|
||||
wfdtocmd = GetStdHandle(STD_INPUT_HANDLE); // we use this console handle to feed input to Windows shell cmd.exe
|
||||
sockin[1] = allocate_sfd((int)wfdtocmd); // put the std input handle in our global general handle table
|
||||
}
|
||||
else
|
||||
pipe(sockin);
|
||||
#endif
|
||||
debug3("sockin[0]: %d sockin[1]: %d", pipein[0], pipein[1]);
|
||||
debug3("sockout[0]: %d sockout[1]: %d", pipeout[0], pipeout[1]);
|
||||
debug3("sockerr[0]: %d sockerr[1]: %d", pipeerr[0], pipeerr[1]);
|
||||
|
||||
pipe(sockout);
|
||||
pipe(sockerr);
|
||||
|
||||
debug3("sockin[0]: %d sockin[1]: %d", sockin[0], sockin[1]);
|
||||
debug3("sockout[0]: %d sockout[1]: %d", sockout[0], sockout[1]);
|
||||
debug3("sockerr[0]: %d sockerr[1]: %d", sockerr[0], sockerr[1]);
|
||||
|
||||
#ifndef WIN32_PRAGMA_REMCON
|
||||
// if ( (s -> is_subsystem) || (s ->ttyfd == -1))
|
||||
//crlf_sfd(sockin[1]);
|
||||
|
||||
// crlf_sfd(sockout[1]);
|
||||
|
||||
if ( (s -> is_subsystem) || (s ->ttyfd == -1))
|
||||
#endif
|
||||
SetHandleInformation(sfd_to_handle(sockin[1]), HANDLE_FLAG_INHERIT, 0);
|
||||
|
||||
SetHandleInformation(sfd_to_handle(sockout[1]), HANDLE_FLAG_INHERIT, 0);
|
||||
SetHandleInformation(sfd_to_handle(sockerr[1]), HANDLE_FLAG_INHERIT, 0);
|
||||
SetHandleInformation(sfd_to_handle(pipein[1]), HANDLE_FLAG_INHERIT, 0);
|
||||
SetHandleInformation(sfd_to_handle(pipeout[0]), HANDLE_FLAG_INHERIT, 0);
|
||||
SetHandleInformation(sfd_to_handle(pipeerr[0]), HANDLE_FLAG_INHERIT, 0);
|
||||
|
||||
/*
|
||||
* Assign sockets to StartupInfo
|
||||
|
@ -705,23 +633,11 @@ do_exec_no_pty(Session *s, const char *command)
|
|||
si.cbReserved2 = 0;
|
||||
si.lpReserved2 = 0;
|
||||
|
||||
#ifdef WIN32_PRAGMA_REMCON
|
||||
if (0) {
|
||||
#else
|
||||
if ( (!s -> is_subsystem) && (s ->ttyfd != -1) ) {
|
||||
|
||||
si.hStdInput = GetStdHandle (STD_INPUT_HANDLE) ; // shell tty interactive session gets a console input for Win32
|
||||
si.hStdOutput = (HANDLE) sfd_to_handle(sockout[0]);
|
||||
si.hStdError = (HANDLE) sfd_to_handle(sockerr[0]);
|
||||
si.lpDesktop = NULL ; //winstadtname_w ;
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
si.hStdInput = (HANDLE) sfd_to_handle(sockin[0]);
|
||||
si.hStdOutput = (HANDLE) sfd_to_handle(sockout[0]);
|
||||
si.hStdError = (HANDLE) sfd_to_handle(sockerr[0]);
|
||||
si.hStdInput = (HANDLE) sfd_to_handle(pipein[0]);
|
||||
si.hStdOutput = (HANDLE) sfd_to_handle(pipeout[1]);
|
||||
si.hStdError = (HANDLE) sfd_to_handle(pipeerr[1]);
|
||||
si.lpDesktop = NULL; //L"winsta0\\default";
|
||||
}
|
||||
|
||||
//si.wShowWindow = SW_HIDE;
|
||||
//si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
|
||||
|
||||
|
@ -767,14 +683,14 @@ do_exec_no_pty(Session *s, const char *command)
|
|||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
|
||||
set_nonblock(sockin[0]);
|
||||
set_nonblock(sockin[1]);
|
||||
set_nonblock(sockout[0]);
|
||||
set_nonblock(sockout[1]);
|
||||
set_nonblock(sockerr[0]);
|
||||
set_nonblock(sockerr[1]);
|
||||
set_nonblock(pipein[0]);
|
||||
set_nonblock(pipein[1]);
|
||||
set_nonblock(pipeout[0]);
|
||||
set_nonblock(pipeout[1]);
|
||||
set_nonblock(pipeerr[0]);
|
||||
set_nonblock(pipeerr[1]);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -931,15 +847,15 @@ do_exec_no_pty(Session *s, const char *command)
|
|||
|
||||
GetUserName(name, &size);
|
||||
|
||||
#ifndef WIN32_PRAGMA_REMCON
|
||||
if ( (!s -> is_subsystem) && (s ->ttyfd != -1)) {
|
||||
// Send to the remote client ANSI/VT Sequence so that they send us CRLF in place of LF
|
||||
char *inittermseq = "\033[20h\033[?7h\0" ; // LFtoCRLF AUTOWRAPON
|
||||
Channel *c=channel_by_id ( s->chanid );
|
||||
buffer_append(&c->input, inittermseq, strlen(inittermseq));
|
||||
channel_output_poll();
|
||||
}
|
||||
#endif
|
||||
//#ifndef WIN32_PRAGMA_REMCON
|
||||
// if ( (!s -> is_subsystem) && (s ->ttyfd != -1)) {
|
||||
// // Send to the remote client ANSI/VT Sequence so that they send us CRLF in place of LF
|
||||
// char *inittermseq = "\033[20h\033[?7h\0" ; // LFtoCRLF AUTOWRAPON
|
||||
// Channel *c=channel_by_id ( s->chanid );
|
||||
// buffer_append(&c->input, inittermseq, strlen(inittermseq));
|
||||
// channel_output_poll();
|
||||
// }
|
||||
//#endif
|
||||
|
||||
//if (s ->ttyfd != -1) {
|
||||
// set the channel to tty interactive type
|
||||
|
@ -962,7 +878,7 @@ do_exec_no_pty(Session *s, const char *command)
|
|||
wchar_t exec_command_w[MAX_PATH];
|
||||
|
||||
MultiByteToWideChar(CP_UTF8, 0, exec_command, -1, exec_command_w, MAX_PATH);
|
||||
DWORD dwStartupFlags = CREATE_SUSPENDED ; // 0
|
||||
DWORD dwStartupFlags = 0;// CREATE_SUSPENDED; // 0
|
||||
|
||||
SetConsoleCtrlHandler(NULL, FALSE);
|
||||
b = CreateProcessAsUserW(hToken, NULL, exec_command_w, NULL, NULL, TRUE,
|
||||
|
@ -1020,15 +936,10 @@ do_exec_no_pty(Session *s, const char *command)
|
|||
/*
|
||||
* We are the parent. Close the child sides of the socket pairs.
|
||||
*/
|
||||
#ifndef WIN32_PRAGMA_REMCON
|
||||
if ( (s -> is_subsystem) || (s ->ttyfd == -1))
|
||||
close(sockin[0]);
|
||||
#else
|
||||
close(sockin[0]);
|
||||
#endif
|
||||
|
||||
close(sockout[0]);
|
||||
close(sockerr[0]);
|
||||
close(pipein[0]);
|
||||
close(pipeout[1]);
|
||||
close(pipeout[1]);
|
||||
|
||||
ResumeThread ( pi.hThread ); /* now let cmd shell main thread be active s we have closed all i/o file handle that cmd will use */
|
||||
SetConsoleCtrlHandler(NULL, TRUE);
|
||||
|
@ -1057,13 +968,13 @@ do_exec_no_pty(Session *s, const char *command)
|
|||
if (compat20)
|
||||
{
|
||||
if ( s->ttyfd == -1)
|
||||
session_set_fds(s, sockin[1], sockout[1], sockerr[1], s -> is_subsystem, 0);
|
||||
session_set_fds(s, pipein[1], pipeout[0], pipeerr[0], s -> is_subsystem, 0);
|
||||
else
|
||||
session_set_fds(s, sockin[1], sockout[1], sockerr[1], s -> is_subsystem, 1); // tty interctive session
|
||||
session_set_fds(s, pipein[1], pipeout[0], pipeerr[0], s -> is_subsystem, 1); // tty interctive session
|
||||
}
|
||||
else
|
||||
{
|
||||
server_loop(pi.hProcess, sockin[1], sockout[1], sockerr[1]);
|
||||
server_loop(pi.hProcess, pipein[1], pipeout[0], pipeerr[0]);
|
||||
|
||||
/*
|
||||
* server_loop has closed inout[0] and err[0].
|
||||
|
|
Loading…
Reference in New Issue