windows-nt/Source/XPSP1/NT/base/subsys/posix/psxss/session.c
2020-09-26 16:20:57 +08:00

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;
}