118 lines
2.4 KiB
C
118 lines
2.4 KiB
C
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
session.c
|
|
|
|
Abstract:
|
|
|
|
This module contains the worker routines called by the Sb API Request
|
|
routines.
|
|
|
|
Author:
|
|
|
|
Steve Wood (stevewo) 04-Oct-1989
|
|
|
|
Revision History:
|
|
15-Jul-91: Modified for POSIX subsystem.
|
|
|
|
--*/
|
|
|
|
|
|
#include "psxsrv.h"
|
|
|
|
|
|
NTSTATUS
|
|
PsxInitializeNtSessionList( VOID )
|
|
{
|
|
NTSTATUS Status;
|
|
|
|
Status = RtlInitializeCriticalSection( &PsxNtSessionLock );
|
|
return( Status );
|
|
}
|
|
|
|
RTL_CRITICAL_SECTION ConnectingTerminalListMutex;
|
|
LIST_ENTRY ConnectingTerminalList;
|
|
|
|
|
|
NTSTATUS
|
|
InitConnectingTerminalList(
|
|
VOID
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
|
|
InitializeListHead(&ConnectingTerminalList);
|
|
Status = RtlInitializeCriticalSection(&ConnectingTerminalListMutex);
|
|
return Status;
|
|
}
|
|
|
|
//
|
|
// AddConnectingTerminal - a new terminal has connected to the posix
|
|
// subsystem, but has not yet asked to have a process created to
|
|
// be the session leader. We keep track of the information about
|
|
// the terminal in the ConnectingTerminalList until we have a process
|
|
// structure to put it in.
|
|
//
|
|
NTSTATUS
|
|
AddConnectingTerminal(
|
|
int Id,
|
|
HANDLE CommPort,
|
|
HANDLE ReqPort
|
|
)
|
|
{
|
|
PPSX_CONTROLLING_TTY Terminal;
|
|
|
|
Terminal = RtlAllocateHeap(PsxHeap, 0, sizeof(*Terminal));
|
|
if (NULL == Terminal) {
|
|
return STATUS_NO_MEMORY;
|
|
}
|
|
|
|
Terminal->ReferenceCount = 1;
|
|
Terminal->UniqueId = Id;
|
|
Terminal->ConsoleCommPort = CommPort;
|
|
Terminal->ConsolePort = ReqPort;
|
|
RtlInitializeCriticalSection(&Terminal->Lock);
|
|
|
|
RtlEnterCriticalSection(&ConnectingTerminalListMutex);
|
|
|
|
InsertHeadList(&ConnectingTerminalList, &Terminal->Links);
|
|
|
|
RtlLeaveCriticalSection(&ConnectingTerminalListMutex);
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
//
|
|
// GetConnectingTerminal - the terminal with the given id has requested
|
|
// a process for session leader, so remove it from the list and return
|
|
// it. NULL is returned if the terminal is not on the list.
|
|
//
|
|
PPSX_CONTROLLING_TTY
|
|
GetConnectingTerminal(
|
|
int Id
|
|
)
|
|
{
|
|
PPSX_CONTROLLING_TTY Terminal;
|
|
|
|
RtlEnterCriticalSection(&ConnectingTerminalListMutex);
|
|
|
|
for (Terminal = (PVOID)ConnectingTerminalList.Flink;
|
|
Terminal != (PVOID)&ConnectingTerminalList;
|
|
Terminal = (PVOID)Terminal->Links.Flink) {
|
|
if ((unsigned int)Id == Terminal->UniqueId) {
|
|
RemoveEntryList(&Terminal->Links);
|
|
Terminal->Links.Flink = Terminal->Links.Blink = NULL;
|
|
RtlLeaveCriticalSection(&ConnectingTerminalListMutex);
|
|
|
|
return Terminal;
|
|
}
|
|
}
|
|
|
|
RtlLeaveCriticalSection(&ConnectingTerminalListMutex);
|
|
return NULL;
|
|
|
|
}
|