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 */