PSX: posixw32: some work for compatibility with future SM
Modified: trunk/posix/apps/posixw32/Makefile
Modified: trunk/posix/apps/posixw32/posixw32.c
Modified: trunk/posix/apps/posixw32/posixw32.rc

Modified: trunk/posix/apps/posixw32/Makefile
--- trunk/posix/apps/posixw32/Makefile	2005-02-12 12:42:10 UTC (rev 13503)
+++ trunk/posix/apps/posixw32/Makefile	2005-02-12 14:33:41 UTC (rev 13504)
@@ -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_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 \

Modified: trunk/posix/apps/posixw32/posixw32.c
--- trunk/posix/apps/posixw32/posixw32.c	2005-02-12 12:42:10 UTC (rev 13503)
+++ trunk/posix/apps/posixw32/posixw32.c	2005-02-12 14:33:41 UTC (rev 13504)
@@ -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 <ntos.h>
+#include <sm/helper.h>
 #include <psx/lpcproto.h>
 
 #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 @@
     }
     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 @@
     ULONG                        ConnectDataLength = sizeof ConnectData;
     SECURITY_QUALITY_OF_SERVICE  Sqos;
     NTSTATUS                     Status;
+    LONG			 Count = 2;
 
 TRACE;
 
@@ -374,22 +401,32 @@
      * 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 @@
  *	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 @@
 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;

Modified: trunk/posix/apps/posixw32/posixw32.rc
--- trunk/posix/apps/posixw32/posixw32.rc	2005-02-12 12:42:10 UTC (rev 13503)
+++ trunk/posix/apps/posixw32/posixw32.rc	2005-02-12 14:33:41 UTC (rev 13504)
@@ -1,12 +1,6 @@
-/* $Id: posixw32.rc,v 1.5 2004/10/31 20:11:09 ea Exp $ */
-#include <defines.h>
-#include <reactos/resource.h>
-
-#include <windows.h>
-
-#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 <reactos/version.rc>
-
 /* EOF */