2001-07-29 16:41:25 +00:00
|
|
|
/* $Id: fsctrl.c,v 1.5 2001/07/29 16:40:20 ekohl Exp $
|
2000-05-13 13:51:08 +00:00
|
|
|
*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS kernel
|
|
|
|
* FILE: services/fs/np/fsctrl.c
|
|
|
|
* PURPOSE: Named pipe filesystem
|
|
|
|
* PROGRAMMER: David Welch <welch@cwcom.net>
|
2001-05-10 23:38:31 +00:00
|
|
|
* Eric Kohl <ekohl@rz-online.de>
|
2000-05-13 13:51:08 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
|
|
|
|
#include <ddk/ntddk.h>
|
2001-05-01 11:09:01 +00:00
|
|
|
#include "npfs.h"
|
2000-05-13 13:51:08 +00:00
|
|
|
|
|
|
|
//#define NDEBUG
|
2001-05-01 11:09:01 +00:00
|
|
|
#include <debug.h>
|
2000-05-13 13:51:08 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
|
2001-05-10 23:38:31 +00:00
|
|
|
static NTSTATUS
|
|
|
|
NpfsConnectPipe(PNPFS_FCB Fcb)
|
|
|
|
{
|
2001-07-29 16:41:25 +00:00
|
|
|
PNPFS_PIPE Pipe;
|
|
|
|
PLIST_ENTRY current_entry;
|
|
|
|
PNPFS_FCB ClientFcb;
|
2001-05-10 23:38:31 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
|
2001-07-29 16:41:25 +00:00
|
|
|
DPRINT("NpfsConnectPipe()\n");
|
|
|
|
|
|
|
|
if (Fcb->PipeState == FILE_PIPE_CONNECTED_STATE)
|
|
|
|
return STATUS_PIPE_CONNECTED;
|
|
|
|
|
|
|
|
if (Fcb->PipeState == FILE_PIPE_CLOSING_STATE)
|
|
|
|
return STATUS_PIPE_CLOSING;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Acceptable states are: FILE_PIPE_DISCONNECTED_STATE and
|
|
|
|
* FILE_PIPE_LISTENING_STATE
|
|
|
|
*/
|
|
|
|
|
2001-06-12 12:35:42 +00:00
|
|
|
DPRINT("Waiting for connection...\n");
|
|
|
|
|
2001-07-29 16:41:25 +00:00
|
|
|
Pipe = Fcb->Pipe;
|
|
|
|
|
|
|
|
Fcb->PipeState = FILE_PIPE_LISTENING_STATE;
|
2001-05-10 23:38:31 +00:00
|
|
|
|
2001-07-29 16:41:25 +00:00
|
|
|
/* search for a listening client fcb */
|
2001-05-10 23:38:31 +00:00
|
|
|
|
2001-07-29 16:41:25 +00:00
|
|
|
current_entry = Pipe->ClientFcbListHead.Flink;
|
|
|
|
while (current_entry != &Pipe->ClientFcbListHead)
|
|
|
|
{
|
|
|
|
ClientFcb = CONTAINING_RECORD(current_entry,
|
|
|
|
NPFS_FCB,
|
|
|
|
FcbListEntry);
|
|
|
|
|
|
|
|
if (ClientFcb->PipeState == FILE_PIPE_LISTENING_STATE)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
current_entry = current_entry->Flink;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (current_entry != &Pipe->ClientFcbListHead)
|
|
|
|
{
|
|
|
|
/* found a listening client fcb */
|
|
|
|
DPRINT("Listening client fcb found -- connecting\n");
|
|
|
|
|
|
|
|
/* connect client and server fcb's */
|
|
|
|
Fcb->OtherSide = ClientFcb;
|
|
|
|
ClientFcb->OtherSide = Fcb;
|
|
|
|
|
|
|
|
/* set connected state */
|
|
|
|
Fcb->PipeState = FILE_PIPE_CONNECTED_STATE;
|
|
|
|
ClientFcb->PipeState = FILE_PIPE_CONNECTED_STATE;
|
|
|
|
|
|
|
|
/* FIXME: create and initialize data queues */
|
|
|
|
|
|
|
|
/* signal client's connect event */
|
|
|
|
KeSetEvent(&ClientFcb->ConnectEvent, IO_NO_INCREMENT, FALSE);
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* no listening client fcb found */
|
|
|
|
DPRINT("No listening client fcb found -- waiting for client\n");
|
|
|
|
Status = KeWaitForSingleObject(&Fcb->ConnectEvent,
|
|
|
|
UserRequest,
|
|
|
|
KernelMode,
|
|
|
|
FALSE,
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
DPRINT("Finished waiting! Status: %x\n", Status);
|
|
|
|
}
|
2001-06-12 12:35:42 +00:00
|
|
|
|
2001-05-10 23:38:31 +00:00
|
|
|
|
2001-07-29 16:41:25 +00:00
|
|
|
DPRINT("Client Fcb: %p\n", Fcb->OtherSide);
|
|
|
|
|
|
|
|
return STATUS_PIPE_CONNECTED;
|
2001-05-10 23:38:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static NTSTATUS
|
|
|
|
NpfsDisconnectPipe(PNPFS_FCB Fcb)
|
|
|
|
{
|
2001-07-29 16:41:25 +00:00
|
|
|
PNPFS_FCB ServerFcb;
|
|
|
|
|
|
|
|
DPRINT("NpfsDisconnectPipe()\n");
|
|
|
|
|
|
|
|
if (Fcb->PipeState == FILE_PIPE_DISCONNECTED_STATE)
|
|
|
|
return(STATUS_SUCCESS);
|
2001-05-10 23:38:31 +00:00
|
|
|
|
2001-07-29 16:41:25 +00:00
|
|
|
if (Fcb->PipeState == FILE_PIPE_CONNECTED_STATE)
|
|
|
|
{
|
|
|
|
Fcb->PipeState = FILE_PIPE_DISCONNECTED_STATE;
|
|
|
|
Fcb->OtherSide->PipeState = FILE_PIPE_DISCONNECTED_STATE;
|
|
|
|
|
|
|
|
/* FIXME: remove data queue(s) */
|
|
|
|
|
|
|
|
Fcb->OtherSide->OtherSide = NULL;
|
|
|
|
Fcb->OtherSide = NULL;
|
|
|
|
|
|
|
|
DPRINT("Pipe disconnected\n");
|
|
|
|
return(STATUS_SUCCESS);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Fcb->PipeState == FILE_PIPE_CLOSING_STATE)
|
|
|
|
{
|
|
|
|
Fcb->PipeState = FILE_PIPE_DISCONNECTED_STATE;
|
|
|
|
|
|
|
|
/* FIXME: remove data queue(s) */
|
|
|
|
|
|
|
|
DPRINT("Pipe disconnected\n");
|
|
|
|
return(STATUS_SUCCESS);
|
|
|
|
}
|
|
|
|
|
|
|
|
return(STATUS_UNSUCCESSFUL);
|
2001-05-10 23:38:31 +00:00
|
|
|
}
|
|
|
|
|
2001-06-12 12:35:42 +00:00
|
|
|
|
|
|
|
static NTSTATUS
|
|
|
|
NpfsWaitPipe(PNPFS_FCB Fcb)
|
|
|
|
{
|
2001-07-29 16:41:25 +00:00
|
|
|
DPRINT("NpfsWaitPipe\n");
|
|
|
|
return STATUS_NOT_IMPLEMENTED;
|
2001-06-12 12:35:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-05-01 11:09:01 +00:00
|
|
|
NTSTATUS STDCALL
|
|
|
|
NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
|
|
|
|
PIRP Irp)
|
2000-05-13 13:51:08 +00:00
|
|
|
{
|
|
|
|
PIO_STACK_LOCATION IoStack;
|
|
|
|
PFILE_OBJECT FileObject;
|
|
|
|
NTSTATUS Status;
|
|
|
|
PNPFS_DEVICE_EXTENSION DeviceExt;
|
|
|
|
PNPFS_PIPE Pipe;
|
|
|
|
PNPFS_FCB Fcb;
|
|
|
|
|
2001-05-10 23:38:31 +00:00
|
|
|
DPRINT("NpfsFileSystemContol(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
|
|
|
|
|
2000-05-13 13:51:08 +00:00
|
|
|
DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
|
|
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
2001-07-29 16:41:25 +00:00
|
|
|
DPRINT("IoStack: %p\n", IoStack);
|
2000-05-13 13:51:08 +00:00
|
|
|
FileObject = IoStack->FileObject;
|
2001-06-12 12:35:42 +00:00
|
|
|
DPRINT("FileObject: %p\n", FileObject);
|
2000-05-13 13:51:08 +00:00
|
|
|
Fcb = FileObject->FsContext;
|
2001-07-29 16:41:25 +00:00
|
|
|
DPRINT("Fcb: %p\n", Fcb);
|
2000-05-13 13:51:08 +00:00
|
|
|
Pipe = Fcb->Pipe;
|
2001-07-29 16:41:25 +00:00
|
|
|
DPRINT("Pipe: %p\n", Pipe);
|
|
|
|
DPRINT("PipeName: %wZ\n", &Pipe->PipeName);
|
2000-05-13 13:51:08 +00:00
|
|
|
|
2001-05-01 11:09:01 +00:00
|
|
|
switch (IoStack->Parameters.FileSystemControl.IoControlCode)
|
2000-05-13 13:51:08 +00:00
|
|
|
{
|
2001-05-10 23:38:31 +00:00
|
|
|
case FSCTL_PIPE_LISTEN:
|
|
|
|
DPRINT("Connecting pipe %wZ\n", &Pipe->PipeName);
|
|
|
|
Status = NpfsConnectPipe(Fcb);
|
2000-05-13 13:51:08 +00:00
|
|
|
break;
|
2001-05-10 23:38:31 +00:00
|
|
|
|
|
|
|
case FSCTL_PIPE_DISCONNECT:
|
|
|
|
DPRINT("Disconnecting pipe %wZ\n", &Pipe->PipeName);
|
|
|
|
Status = NpfsDisconnectPipe(Fcb);
|
|
|
|
break;
|
|
|
|
|
2001-06-12 12:35:42 +00:00
|
|
|
case FSCTL_PIPE_WAIT:
|
|
|
|
DPRINT("Waiting for pipe %wZ\n", &Pipe->PipeName);
|
|
|
|
Status = NpfsWaitPipe(Fcb);
|
2000-05-13 13:51:08 +00:00
|
|
|
break;
|
2001-06-12 12:35:42 +00:00
|
|
|
|
2000-05-13 13:51:08 +00:00
|
|
|
default:
|
2001-05-10 23:38:31 +00:00
|
|
|
DPRINT("IoControlCode: %x\n", IoStack->Parameters.FileSystemControl.IoControlCode)
|
|
|
|
Status = STATUS_UNSUCCESSFUL;
|
2000-05-13 13:51:08 +00:00
|
|
|
}
|
2001-05-10 23:38:31 +00:00
|
|
|
|
|
|
|
Irp->IoStatus.Status = Status;
|
|
|
|
Irp->IoStatus.Information = 0;
|
|
|
|
|
|
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
|
|
|
|
|
|
return(Status);
|
2000-05-13 13:51:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* EOF */
|