1 /* $Id: fsctrl.c,v 1.5 2001/07/29 16:40:20 ekohl Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: services/fs/np/fsctrl.c
6 * PURPOSE: Named pipe filesystem
7 * PROGRAMMER: David Welch <welch@cwcom.net>
8 * Eric Kohl <ekohl@rz-online.de>
11 /* INCLUDES ******************************************************************/
13 #include <ddk/ntddk.h>
20 /* FUNCTIONS *****************************************************************/
23 NpfsConnectPipe(PNPFS_FCB Fcb
)
26 PLIST_ENTRY current_entry
;
30 DPRINT("NpfsConnectPipe()\n");
32 if (Fcb
->PipeState
== FILE_PIPE_CONNECTED_STATE
)
33 return STATUS_PIPE_CONNECTED
;
35 if (Fcb
->PipeState
== FILE_PIPE_CLOSING_STATE
)
36 return STATUS_PIPE_CLOSING
;
39 * Acceptable states are: FILE_PIPE_DISCONNECTED_STATE and
40 * FILE_PIPE_LISTENING_STATE
43 DPRINT("Waiting for connection...\n");
47 Fcb
->PipeState
= FILE_PIPE_LISTENING_STATE
;
49 /* search for a listening client fcb */
51 current_entry
= Pipe
->ClientFcbListHead
.Flink
;
52 while (current_entry
!= &Pipe
->ClientFcbListHead
)
54 ClientFcb
= CONTAINING_RECORD(current_entry
,
58 if (ClientFcb
->PipeState
== FILE_PIPE_LISTENING_STATE
)
63 current_entry
= current_entry
->Flink
;
66 if (current_entry
!= &Pipe
->ClientFcbListHead
)
68 /* found a listening client fcb */
69 DPRINT("Listening client fcb found -- connecting\n");
71 /* connect client and server fcb's */
72 Fcb
->OtherSide
= ClientFcb
;
73 ClientFcb
->OtherSide
= Fcb
;
75 /* set connected state */
76 Fcb
->PipeState
= FILE_PIPE_CONNECTED_STATE
;
77 ClientFcb
->PipeState
= FILE_PIPE_CONNECTED_STATE
;
79 /* FIXME: create and initialize data queues */
81 /* signal client's connect event */
82 KeSetEvent(&ClientFcb
->ConnectEvent
, IO_NO_INCREMENT
, FALSE
);
87 /* no listening client fcb found */
88 DPRINT("No listening client fcb found -- waiting for client\n");
89 Status
= KeWaitForSingleObject(&Fcb
->ConnectEvent
,
95 DPRINT("Finished waiting! Status: %x\n", Status
);
99 DPRINT("Client Fcb: %p\n", Fcb
->OtherSide
);
101 return STATUS_PIPE_CONNECTED
;
106 NpfsDisconnectPipe(PNPFS_FCB Fcb
)
110 DPRINT("NpfsDisconnectPipe()\n");
112 if (Fcb
->PipeState
== FILE_PIPE_DISCONNECTED_STATE
)
113 return(STATUS_SUCCESS
);
115 if (Fcb
->PipeState
== FILE_PIPE_CONNECTED_STATE
)
117 Fcb
->PipeState
= FILE_PIPE_DISCONNECTED_STATE
;
118 Fcb
->OtherSide
->PipeState
= FILE_PIPE_DISCONNECTED_STATE
;
120 /* FIXME: remove data queue(s) */
122 Fcb
->OtherSide
->OtherSide
= NULL
;
123 Fcb
->OtherSide
= NULL
;
125 DPRINT("Pipe disconnected\n");
126 return(STATUS_SUCCESS
);
129 if (Fcb
->PipeState
== FILE_PIPE_CLOSING_STATE
)
131 Fcb
->PipeState
= FILE_PIPE_DISCONNECTED_STATE
;
133 /* FIXME: remove data queue(s) */
135 DPRINT("Pipe disconnected\n");
136 return(STATUS_SUCCESS
);
139 return(STATUS_UNSUCCESSFUL
);
144 NpfsWaitPipe(PNPFS_FCB Fcb
)
146 DPRINT("NpfsWaitPipe\n");
147 return STATUS_NOT_IMPLEMENTED
;
152 NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject
,
155 PIO_STACK_LOCATION IoStack
;
156 PFILE_OBJECT FileObject
;
158 PNPFS_DEVICE_EXTENSION DeviceExt
;
162 DPRINT("NpfsFileSystemContol(DeviceObject %p Irp %p)\n", DeviceObject
, Irp
);
164 DeviceExt
= (PNPFS_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
165 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
166 DPRINT("IoStack: %p\n", IoStack
);
167 FileObject
= IoStack
->FileObject
;
168 DPRINT("FileObject: %p\n", FileObject
);
169 Fcb
= FileObject
->FsContext
;
170 DPRINT("Fcb: %p\n", Fcb
);
172 DPRINT("Pipe: %p\n", Pipe
);
173 DPRINT("PipeName: %wZ\n", &Pipe
->PipeName
);
175 switch (IoStack
->Parameters
.FileSystemControl
.IoControlCode
)
177 case FSCTL_PIPE_LISTEN
:
178 DPRINT("Connecting pipe %wZ\n", &Pipe
->PipeName
);
179 Status
= NpfsConnectPipe(Fcb
);
182 case FSCTL_PIPE_DISCONNECT
:
183 DPRINT("Disconnecting pipe %wZ\n", &Pipe
->PipeName
);
184 Status
= NpfsDisconnectPipe(Fcb
);
187 case FSCTL_PIPE_WAIT
:
188 DPRINT("Waiting for pipe %wZ\n", &Pipe
->PipeName
);
189 Status
= NpfsWaitPipe(Fcb
);
193 DPRINT("IoControlCode: %x\n", IoStack
->Parameters
.FileSystemControl
.IoControlCode
)
194 Status
= STATUS_UNSUCCESSFUL
;
197 Irp
->IoStatus
.Status
= Status
;
198 Irp
->IoStatus
.Information
= 0;
200 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);