Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
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; }
|