From 68537ca04fdff30bafbfb89cd5b06a3b4f73947e Mon Sep 17 00:00:00 2001 From: Emanuele Aliberti Date: Sat, 12 Feb 2005 14:33:41 +0000 Subject: [PATCH 1/1] PSX: posixw32: some work for compatibility with future SM svn path=/trunk/; revision=13504 --- posix/apps/posixw32/Makefile | 4 +- posix/apps/posixw32/posixw32.c | 89 +++++++++++++++++++++++---------- posix/apps/posixw32/posixw32.rc | 10 +--- 3 files changed, 67 insertions(+), 36 deletions(-) diff --git a/posix/apps/posixw32/Makefile b/posix/apps/posixw32/Makefile index b6680581ffb..961503b3823 100644 --- a/posix/apps/posixw32/Makefile +++ b/posix/apps/posixw32/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.4 2003/01/05 18:27:19 robd Exp $ +# $Id$ # # Win32 Terminal Emulator for the POSIX+ subsystem. # @@ -15,7 +15,7 @@ TARGET_APPTYPE = console TARGET_CFLAGS = -I$(PATH_TO_TOP_PSX)/include -TARGET_SDKLIBS = ntdll.a kernel32.a +TARGET_SDKLIBS = ntdll.a smdll.a kernel32.a TARGET_OBJECTS = \ $(TARGET_NAME).o \ diff --git a/posix/apps/posixw32/posixw32.c b/posix/apps/posixw32/posixw32.c index 32e6715675a..b1d214e6d59 100644 --- a/posix/apps/posixw32/posixw32.c +++ b/posix/apps/posixw32/posixw32.c @@ -1,4 +1,4 @@ -/* $Id: posixw32.c,v 1.4 2003/08/28 20:01:23 ea Exp $ +/* $Id$ * * PROJECT : ReactOS Operating System / POSIX+ Environment Subsystem * DESCRIPTION: POSIXW32 - A DEC VT-100 terminal emulator for the PSX subsystem @@ -39,6 +39,7 @@ #define NTOS_MODE_USER #include +#include #include #include "vt100.h" @@ -53,7 +54,8 @@ #ifdef NDEBUG #define TRACE #else -#define TRACE OutputDebugString(__FUNCTION__) +//#define TRACE OutputDebugString(__FUNCTION__) +#define TRACE vtprintf("%s\n",__FUNCTION__) #endif /*** GLOBALS *********************************************************/ @@ -347,7 +349,31 @@ TRACE; } return Status; } +/********************************************************************** + * RunPsxSs/0 + * + * DESCRIPTION + * This function is called only when initializing the session + * with PSXSS fails. We assume that it failed because the + * subsystem, being optional, is not running, therefore we + * ask the SM to start it up. + */ +PRIVATE NTSTATUS RunPsxSs(VOID) +{ + NTSTATUS Status; + HANDLE SmApiPort; + UNICODE_STRING Program; + RtlInitUnicodeString (& Program, L"POSIX"); + Status = SmConnectApiPort (NULL, 0, 0, & SmApiPort); + if(!NT_SUCCESS(Status)) + { + return Status; + } + Status = SmExecuteProgram (SmApiPort, & Program); + NtClose (SmApiPort); + return Status; +} /********************************************************************** * CreateTerminalToPsxChannel/0 PRIVATE * @@ -360,6 +386,7 @@ PRIVATE NTSTATUS STDCALL CreateTerminalToPsxChannel (VOID) ULONG ConnectDataLength = sizeof ConnectData; SECURITY_QUALITY_OF_SERVICE Sqos; NTSTATUS Status; + LONG Count = 2; TRACE; @@ -374,22 +401,32 @@ TRACE; * Try connecting to \POSIX+\SessionPort. */ RtlInitUnicodeString (& Session.ServerPort.Name, Session.ServerPort.NameBuffer); - OutputDebugStringW(Session.ServerPort.Name.Buffer); - Status = NtConnectPort ( - & Session.ServerPort.Handle, - & Session.ServerPort.Name, - & Sqos, - NULL, - NULL, - 0, - & ConnectData, - & ConnectDataLength - ); - if (STATUS_SUCCESS != Status) + while (Count--) { - vtprintf ("%s: %s: NtConnectPort failed with %08x\n", - MyName, __FUNCTION__, Status); - return Status; + OutputDebugStringW(Session.ServerPort.Name.Buffer); + Status = NtConnectPort ( + & Session.ServerPort.Handle, + & Session.ServerPort.Name, + & Sqos, + NULL, + NULL, + 0, + & ConnectData, + & ConnectDataLength + ); + if (STATUS_SUCCESS != Status) + { + if(Count) + { + vtprintf("%s: %s: asking SM to start PSXSS...\n",MyName,__FUNCTION__); + RunPsxSs(); + continue; + } + vtprintf ("%s: %s: NtConnectPort failed with %08x\n", + MyName, __FUNCTION__, Status); + return Status; + } + break; } Session.Identifier = ConnectData.PortIdentifier; return STATUS_SUCCESS; @@ -399,9 +436,9 @@ TRACE; * InitializeSsIoChannel PRIVATE * * DESCRIPTION - * Create our objects in the system name space - * (CreateSessionObjects) and then connect to the session port - * (CreateControChannel). + * Connect to the session port (CreateControChannel) of the PSX + * subsystem. If that succeeds, create our objects in the system + * name space (CreateSessionObjects). */ PRIVATE NTSTATUS STDCALL InitializeSsIoChannel (VOID) { @@ -411,18 +448,18 @@ PRIVATE NTSTATUS STDCALL InitializeSsIoChannel (VOID) TRACE; - Status = CreateSessionObjects (Pid); + Status = CreateTerminalToPsxChannel (); if (STATUS_SUCCESS != Status) { - vtprintf ("%s: %s: CreateSessionObjects failed with %08x\n", - MyName, __FUNCTION__, Status); + vtprintf ("%s: %s: CreateTerminalToPsxChannel failed with %08x\n", + MyName, __FUNCTION__, Status); return Status; } - Status = CreateTerminalToPsxChannel (); + Status = CreateSessionObjects (Pid); if (STATUS_SUCCESS != Status) { - vtprintf ("%s: %s: CreateTerminalToPsxChannel failed with %08x\n", - MyName, __FUNCTION__, Status); + vtprintf ("%s: %s: CreateSessionObjects failed with %08x\n", + MyName, __FUNCTION__, Status); return Status; } return STATUS_SUCCESS; diff --git a/posix/apps/posixw32/posixw32.rc b/posix/apps/posixw32/posixw32.rc index 5d849dc08aa..f29da60632c 100644 --- a/posix/apps/posixw32/posixw32.rc +++ b/posix/apps/posixw32/posixw32.rc @@ -1,12 +1,6 @@ -/* $Id: posixw32.rc,v 1.5 2004/10/31 20:11:09 ea Exp $ */ -#include -#include - -#include - -#define REACTOS_STR_FILE_DESCRIPTION "W32 Terminal Emulator for POSIX+\0" +/* $Id$ */ +#define REACTOS_STR_FILE_DESCRIPTION "W32 Terminal Emulator for POSIX+ LPC pseudo tty\0" #define REACTOS_STR_INTERNAL_NAME "posixw32\0" #define REACTOS_STR_ORIGINAL_FILENAME "posixw32.exe\0" #include - /* EOF */ -- 2.17.1