1// Requests.h
2
3#ifndef USERLAND_FS_REQUESTS_H
4#define USERLAND_FS_REQUESTS_H
5
6#include <fs_attr.h>
7#include <fs_index.h>
8#include <fsproto.h>
9
10#include "Compatibility.h"
11#include "Request.h"
12
13enum {
14	MAX_REQUEST_ADDRESS_COUNT	= 4,
15};
16
17// request types
18enum {
19	// kernel -> userland requests
20
21	// administrative
22	UFS_DISCONNECT_REQUEST = 0,
23	FS_CONNECT_REQUEST,
24	FS_CONNECT_REPLY,
25	// FS
26	MOUNT_VOLUME_REQUEST,
27	MOUNT_VOLUME_REPLY,
28	UNMOUNT_VOLUME_REQUEST,
29	UNMOUNT_VOLUME_REPLY,
30	INITIALIZE_VOLUME_REQUEST,
31	INITIALIZE_VOLUME_REPLY,
32	SYNC_VOLUME_REQUEST,
33	SYNC_VOLUME_REPLY,
34	READ_FS_STAT_REQUEST,
35	READ_FS_STAT_REPLY,
36	WRITE_FS_STAT_REQUEST,
37	WRITE_FS_STAT_REPLY,
38	// vnodes
39	READ_VNODE_REQUEST,
40	READ_VNODE_REPLY,
41	WRITE_VNODE_REQUEST,
42	WRITE_VNODE_REPLY,
43	FS_REMOVE_VNODE_REQUEST,
44	FS_REMOVE_VNODE_REPLY,
45	// nodes
46	FSYNC_REQUEST,
47	FSYNC_REPLY,
48	READ_STAT_REQUEST,
49	READ_STAT_REPLY,
50	WRITE_STAT_REQUEST,
51	WRITE_STAT_REPLY,
52	ACCESS_REQUEST,
53	ACCESS_REPLY,
54	// files
55	CREATE_REQUEST,
56	CREATE_REPLY,
57	OPEN_REQUEST,
58	OPEN_REPLY,
59	CLOSE_REQUEST,
60	CLOSE_REPLY,
61	FREE_COOKIE_REQUEST,
62	FREE_COOKIE_REPLY,
63	READ_REQUEST,
64	READ_REPLY,
65	WRITE_REQUEST,
66	WRITE_REPLY,
67	IOCTL_REQUEST,
68	IOCTL_REPLY,
69	SET_FLAGS_REQUEST,
70	SET_FLAGS_REPLY,
71	SELECT_REQUEST,
72	SELECT_REPLY,
73	DESELECT_REQUEST,
74	DESELECT_REPLY,
75	// hard links / symlinks
76	LINK_REQUEST,
77	LINK_REPLY,
78	SYMLINK_REQUEST,
79	SYMLINK_REPLY,
80	UNLINK_REQUEST,
81	UNLINK_REPLY,
82	READ_LINK_REQUEST,
83	READ_LINK_REPLY,
84	RENAME_REQUEST,
85	RENAME_REPLY,
86	// directories
87	MKDIR_REQUEST,
88	MKDIR_REPLY,
89	RMDIR_REQUEST,
90	RMDIR_REPLY,
91	OPEN_DIR_REQUEST,
92	OPEN_DIR_REPLY,
93	CLOSE_DIR_REQUEST,
94	CLOSE_DIR_REPLY,
95	FREE_DIR_COOKIE_REQUEST,
96	FREE_DIR_COOKIE_REPLY,
97	READ_DIR_REQUEST,
98	READ_DIR_REPLY,
99	REWIND_DIR_REQUEST,
100	REWIND_DIR_REPLY,
101	WALK_REQUEST,
102	WALK_REPLY,
103	// attributes
104	OPEN_ATTR_DIR_REQUEST,
105	OPEN_ATTR_DIR_REPLY,
106	CLOSE_ATTR_DIR_REQUEST,
107	CLOSE_ATTR_DIR_REPLY,
108	FREE_ATTR_DIR_COOKIE_REQUEST,
109	FREE_ATTR_DIR_COOKIE_REPLY,
110	READ_ATTR_DIR_REQUEST,
111	READ_ATTR_DIR_REPLY,
112	REWIND_ATTR_DIR_REQUEST,
113	REWIND_ATTR_DIR_REPLY,
114	READ_ATTR_REQUEST,
115	READ_ATTR_REPLY,
116	WRITE_ATTR_REQUEST,
117	WRITE_ATTR_REPLY,
118	REMOVE_ATTR_REQUEST,
119	REMOVE_ATTR_REPLY,
120	RENAME_ATTR_REQUEST,
121	RENAME_ATTR_REPLY,
122	STAT_ATTR_REQUEST,
123	STAT_ATTR_REPLY,
124	// indices
125	OPEN_INDEX_DIR_REQUEST,
126	OPEN_INDEX_DIR_REPLY,
127	CLOSE_INDEX_DIR_REQUEST,
128	CLOSE_INDEX_DIR_REPLY,
129	FREE_INDEX_DIR_COOKIE_REQUEST,
130	FREE_INDEX_DIR_COOKIE_REPLY,
131	READ_INDEX_DIR_REQUEST,
132	READ_INDEX_DIR_REPLY,
133	REWIND_INDEX_DIR_REQUEST,
134	REWIND_INDEX_DIR_REPLY,
135	CREATE_INDEX_REQUEST,
136	CREATE_INDEX_REPLY,
137	REMOVE_INDEX_REQUEST,
138	REMOVE_INDEX_REPLY,
139	RENAME_INDEX_REQUEST,
140	RENAME_INDEX_REPLY,
141	STAT_INDEX_REQUEST,
142	STAT_INDEX_REPLY,
143	// queries
144	OPEN_QUERY_REQUEST,
145	OPEN_QUERY_REPLY,
146	CLOSE_QUERY_REQUEST,
147	CLOSE_QUERY_REPLY,
148	FREE_QUERY_COOKIE_REQUEST,
149	FREE_QUERY_COOKIE_REPLY,
150	READ_QUERY_REQUEST,
151	READ_QUERY_REPLY,
152
153	// userland -> kernel requests
154	// notifications
155	NOTIFY_LISTENER_REQUEST,
156	NOTIFY_LISTENER_REPLY,
157	NOTIFY_SELECT_EVENT_REQUEST,
158	NOTIFY_SELECT_EVENT_REPLY,
159	SEND_NOTIFICATION_REQUEST,
160	SEND_NOTIFICATION_REPLY,
161	// vnodes
162	GET_VNODE_REQUEST,
163	GET_VNODE_REPLY,
164	PUT_VNODE_REQUEST,
165	PUT_VNODE_REPLY,
166	NEW_VNODE_REQUEST,
167	NEW_VNODE_REPLY,
168	REMOVE_VNODE_REQUEST,
169	REMOVE_VNODE_REPLY,
170	UNREMOVE_VNODE_REQUEST,
171	UNREMOVE_VNODE_REPLY,
172	IS_VNODE_REMOVED_REQUEST,
173	IS_VNODE_REMOVED_REPLY,
174
175	// general reply
176	RECEIPT_ACK_REPLY,
177
178	// invalid request ID (e.g. for request handlers)
179	NO_REQUEST,
180};
181
182namespace UserlandFSUtil {
183
184// ReplyRequest
185class ReplyRequest : public Request {
186public:
187	ReplyRequest(uint32 type) : Request(type) {}
188
189	status_t	error;
190};
191
192// #pragma mark -
193// #pragma mark ----- kernel requests -----
194
195// VolumeRequest
196class VolumeRequest : public Request {
197public:
198	VolumeRequest(uint32 type) : Request(type) {}
199
200	void*		volume;
201};
202
203// NodeRequest
204class NodeRequest : public VolumeRequest {
205public:
206	NodeRequest(uint32 type) : VolumeRequest(type) {}
207
208	void*		node;
209};
210
211// FileRequest
212class FileRequest : public NodeRequest {
213public:
214	FileRequest(uint32 type) : NodeRequest(type) {}
215
216	void*		fileCookie;
217};
218
219// DirRequest
220class DirRequest : public NodeRequest {
221public:
222	DirRequest(uint32 type) : NodeRequest(type) {}
223
224	void*		dirCookie;
225};
226
227// AttrDirRequest
228class AttrDirRequest : public NodeRequest {
229public:
230	AttrDirRequest(uint32 type) : NodeRequest(type) {}
231
232	void*		attrDirCookie;
233};
234
235// IndexDirRequest
236class IndexDirRequest : public VolumeRequest {
237public:
238	IndexDirRequest(uint32 type) : VolumeRequest(type) {}
239
240	void*		indexDirCookie;
241};
242
243// #pragma mark -
244// #pragma mark ----- administrative -----
245
246// UFSDisconnectRequest
247class UFSDisconnectRequest : public Request {
248public:
249	UFSDisconnectRequest() : Request(UFS_DISCONNECT_REQUEST) {}
250};
251
252// FSConnectRequest
253class FSConnectRequest : public Request {
254public:
255	FSConnectRequest() : Request(FS_CONNECT_REQUEST) {}
256	status_t GetAddressInfos(AddressInfo* infos, int32* count);
257
258	Address		fsName;
259};
260
261// FSConnectReply
262class FSConnectReply : public ReplyRequest {
263public:
264	FSConnectReply() : ReplyRequest(FS_CONNECT_REPLY) {}
265	status_t GetAddressInfos(AddressInfo* infos, int32* count);
266
267	Address		portInfos;
268	int32		portInfoCount;
269};
270
271// #pragma mark -
272// #pragma mark ----- FS -----
273
274// MountVolumeRequest
275class MountVolumeRequest : public Request {
276public:
277	MountVolumeRequest() : Request(MOUNT_VOLUME_REQUEST) {}
278	status_t GetAddressInfos(AddressInfo* infos, int32* count);
279
280	nspace_id	nsid;
281	Address		cwd;			// current working dir of the mount() caller
282	Address		device;
283	ulong		flags;
284	Address		parameters;
285};
286
287// MountVolumeReply
288class MountVolumeReply : public ReplyRequest {
289public:
290	MountVolumeReply() : ReplyRequest(MOUNT_VOLUME_REPLY) {}
291
292	vnode_id	rootID;
293	void*		volume;
294};
295
296// UnmountVolumeRequest
297class UnmountVolumeRequest : public VolumeRequest {
298public:
299	UnmountVolumeRequest() : VolumeRequest(UNMOUNT_VOLUME_REQUEST) {}
300};
301
302// UnmountVolumeReply
303class UnmountVolumeReply : public ReplyRequest {
304public:
305	UnmountVolumeReply() : ReplyRequest(UNMOUNT_VOLUME_REPLY) {}
306};
307
308// InitializeVolumeRequest
309class InitializeVolumeRequest : public Request {
310public:
311	InitializeVolumeRequest() : Request(INITIALIZE_VOLUME_REQUEST) {}
312	status_t GetAddressInfos(AddressInfo* infos, int32* count);
313
314	Address		device;
315	Address		parameters;
316};
317
318// InitializeVolumeReply
319class InitializeVolumeReply : public ReplyRequest {
320public:
321	InitializeVolumeReply() : ReplyRequest(INITIALIZE_VOLUME_REPLY) {}
322};
323
324// SyncVolumeRequest
325class SyncVolumeRequest : public VolumeRequest {
326public:
327	SyncVolumeRequest() : VolumeRequest(SYNC_VOLUME_REQUEST) {}
328};
329
330// SyncVolumeReply
331class SyncVolumeReply : public ReplyRequest {
332public:
333	SyncVolumeReply() : ReplyRequest(SYNC_VOLUME_REPLY) {}
334};
335
336// ReadFSStatRequest
337class ReadFSStatRequest : public VolumeRequest {
338public:
339	ReadFSStatRequest() : VolumeRequest(READ_FS_STAT_REQUEST) {}
340};
341
342// ReadFSStatReply
343class ReadFSStatReply : public ReplyRequest {
344public:
345	ReadFSStatReply() : ReplyRequest(READ_FS_STAT_REPLY) {}
346
347	fs_info		info;
348};
349
350// WriteFSStatRequest
351class WriteFSStatRequest : public VolumeRequest {
352public:
353	WriteFSStatRequest() : VolumeRequest(WRITE_FS_STAT_REQUEST) {}
354
355	fs_info		info;
356	long		mask;
357};
358
359// WriteFSStatReply
360class WriteFSStatReply : public ReplyRequest {
361public:
362	WriteFSStatReply() : ReplyRequest(WRITE_FS_STAT_REPLY) {}
363};
364
365// #pragma mark -
366// #pragma mark ----- vnodes -----
367
368// ReadVNodeRequest
369class ReadVNodeRequest : public VolumeRequest {
370public:
371	ReadVNodeRequest() : VolumeRequest(READ_VNODE_REQUEST) {}
372
373	vnode_id	vnid;
374	bool		reenter;
375};
376
377// ReadVNodeReply
378class ReadVNodeReply : public ReplyRequest {
379public:
380	ReadVNodeReply() : ReplyRequest(READ_VNODE_REPLY) {}
381
382	void*		node;
383};
384
385// WriteVNodeRequest
386class WriteVNodeRequest : public NodeRequest {
387public:
388	WriteVNodeRequest() : NodeRequest(WRITE_VNODE_REQUEST) {}
389
390	bool		reenter;
391};
392
393// WriteVNodeReply
394class WriteVNodeReply : public ReplyRequest {
395public:
396	WriteVNodeReply() : ReplyRequest(WRITE_VNODE_REPLY) {}
397};
398
399// FSRemoveVNodeRequest
400class FSRemoveVNodeRequest : public NodeRequest {
401public:
402	FSRemoveVNodeRequest() : NodeRequest(FS_REMOVE_VNODE_REQUEST) {}
403
404	bool		reenter;
405};
406
407// FSRemoveVNodeReply
408class FSRemoveVNodeReply : public ReplyRequest {
409public:
410	FSRemoveVNodeReply() : ReplyRequest(FS_REMOVE_VNODE_REPLY) {}
411};
412
413// #pragma mark -
414// #pragma mark ----- nodes -----
415
416// FSyncRequest
417class FSyncRequest : public NodeRequest {
418public:
419	FSyncRequest() : NodeRequest(FSYNC_REQUEST) {}
420};
421
422// FSyncReply
423class FSyncReply : public ReplyRequest {
424public:
425	FSyncReply() : ReplyRequest(FSYNC_REPLY) {}
426};
427
428// ReadStatRequest
429class ReadStatRequest : public NodeRequest {
430public:
431	ReadStatRequest() : NodeRequest(READ_STAT_REQUEST) {}
432};
433
434// ReadStatReply
435class ReadStatReply : public ReplyRequest {
436public:
437	ReadStatReply() : ReplyRequest(READ_STAT_REPLY) {}
438
439	struct stat	st;
440};
441
442// WriteStatRequest
443class WriteStatRequest : public NodeRequest {
444public:
445	WriteStatRequest() : NodeRequest(WRITE_STAT_REQUEST) {}
446
447	struct stat	st;
448	long		mask;
449};
450
451// WriteStatReply
452class WriteStatReply : public ReplyRequest {
453public:
454	WriteStatReply() : ReplyRequest(WRITE_STAT_REPLY) {}
455};
456
457// AccessRequest
458class AccessRequest : public NodeRequest {
459public:
460	AccessRequest() : NodeRequest(ACCESS_REQUEST) {}
461
462	int			mode;
463};
464
465// AccessReply
466class AccessReply : public ReplyRequest {
467public:
468	AccessReply() : ReplyRequest(ACCESS_REPLY) {}
469};
470
471// #pragma mark -
472// #pragma mark ----- files -----
473
474// CreateRequest
475class CreateRequest : public NodeRequest {
476public:
477	CreateRequest() : NodeRequest(CREATE_REQUEST) {}
478	status_t GetAddressInfos(AddressInfo* infos, int32* count);
479
480	Address		name;
481	int			openMode;
482	int			mode;
483};
484
485// CreateReply
486class CreateReply : public ReplyRequest {
487public:
488	CreateReply() : ReplyRequest(CREATE_REPLY) {}
489
490	vnode_id	vnid;
491	void*		fileCookie;
492};
493
494// OpenRequest
495class OpenRequest : public NodeRequest {
496public:
497	OpenRequest() : NodeRequest(OPEN_REQUEST) {}
498
499	int			openMode;
500};
501
502// OpenReply
503class OpenReply : public ReplyRequest {
504public:
505	OpenReply() : ReplyRequest(OPEN_REPLY) {}
506
507	void*		fileCookie;
508};
509
510// CloseRequest
511class CloseRequest : public FileRequest {
512public:
513	CloseRequest() : FileRequest(CLOSE_REQUEST) {}
514};
515
516// CloseReply
517class CloseReply : public ReplyRequest {
518public:
519	CloseReply() : ReplyRequest(CLOSE_REPLY) {}
520};
521
522// FreeCookieRequest
523class FreeCookieRequest : public FileRequest {
524public:
525	FreeCookieRequest() : FileRequest(FREE_COOKIE_REQUEST) {}
526};
527
528// FreeCookieReply
529class FreeCookieReply : public ReplyRequest {
530public:
531	FreeCookieReply() : ReplyRequest(FREE_COOKIE_REPLY) {}
532};
533
534// ReadRequest
535class ReadRequest : public FileRequest {
536public:
537	ReadRequest() : FileRequest(READ_REQUEST) {}
538
539	off_t		pos;
540	size_t		size;
541};
542
543// ReadReply
544class ReadReply : public ReplyRequest {
545public:
546	ReadReply() : ReplyRequest(READ_REPLY) {}
547	status_t GetAddressInfos(AddressInfo* infos, int32* count);
548
549	Address		buffer;
550	size_t		bytesRead;
551};
552
553// WriteRequest
554class WriteRequest : public FileRequest {
555public:
556	WriteRequest() : FileRequest(WRITE_REQUEST) {}
557	status_t GetAddressInfos(AddressInfo* infos, int32* count);
558
559	Address		buffer;
560	off_t		pos;
561};
562
563// WriteReply
564class WriteReply : public ReplyRequest {
565public:
566	WriteReply() : ReplyRequest(WRITE_REPLY) {}
567
568	size_t		bytesWritten;
569};
570
571// IOCtlRequest
572class IOCtlRequest : public FileRequest {
573public:
574	IOCtlRequest() : FileRequest(IOCTL_REQUEST) {}
575	status_t GetAddressInfos(AddressInfo* infos, int32* count);
576
577	int			command;
578	void*		bufferParameter;
579	size_t		lenParameter;
580	bool		isBuffer;	// if false, just pass bufferParameter
581							// otherwise use buffer
582	Address		buffer;
583	int32		writeSize;	// ignored unless isBuffer -- then
584							// it indicates the size of the buffer to allocate
585};
586
587// IOCtlReply
588class IOCtlReply : public ReplyRequest {
589public:
590	IOCtlReply() : ReplyRequest(IOCTL_REPLY) {}
591	status_t GetAddressInfos(AddressInfo* infos, int32* count);
592
593	status_t	ioctlError;		// we need a special handling since error
594								// may be a part of the client FS protocol
595	Address		buffer;
596};
597
598// SetFlagsRequest
599class SetFlagsRequest : public FileRequest {
600public:
601	SetFlagsRequest() : FileRequest(SET_FLAGS_REQUEST) {}
602
603	int			flags;
604};
605
606// SetFlagsReply
607class SetFlagsReply : public ReplyRequest {
608public:
609	SetFlagsReply() : ReplyRequest(SET_FLAGS_REPLY) {}
610};
611
612// SelectRequest
613class SelectRequest : public FileRequest {
614public:
615	SelectRequest() : FileRequest(SELECT_REQUEST) {}
616
617	uint8		event;
618	uint32		ref;
619	selectsync*	sync;
620};
621
622// SelectReply
623class SelectReply : public ReplyRequest {
624public:
625	SelectReply() : ReplyRequest(SELECT_REPLY) {}
626};
627
628// DeselectRequest
629class DeselectRequest : public FileRequest {
630public:
631	DeselectRequest() : FileRequest(DESELECT_REQUEST) {}
632
633	uint8		event;
634	selectsync*	sync;
635};
636
637// DeselectReply
638class DeselectReply : public ReplyRequest {
639public:
640	DeselectReply() : ReplyRequest(DESELECT_REPLY) {}
641};
642
643// #pragma mark -
644// #pragma mark ----- hard links / symlinks -----
645
646// LinkRequest
647class LinkRequest : public NodeRequest {
648public:
649	LinkRequest() : NodeRequest(LINK_REQUEST) {}
650	status_t GetAddressInfos(AddressInfo* infos, int32* count);
651
652	Address		name;
653	void*		target;
654};
655
656// LinkReply
657class LinkReply : public ReplyRequest {
658public:
659	LinkReply() : ReplyRequest(LINK_REPLY) {}
660};
661
662// UnlinkRequest
663class UnlinkRequest : public NodeRequest {
664public:
665	UnlinkRequest() : NodeRequest(UNLINK_REQUEST) {}
666	status_t GetAddressInfos(AddressInfo* infos, int32* count);
667
668	Address		name;
669};
670
671// UnlinkReply
672class UnlinkReply : public ReplyRequest {
673public:
674	UnlinkReply() : ReplyRequest(UNLINK_REPLY) {}
675};
676
677// SymlinkRequest
678class SymlinkRequest : public NodeRequest {
679public:
680	SymlinkRequest() : NodeRequest(SYMLINK_REQUEST) {}
681	status_t GetAddressInfos(AddressInfo* infos, int32* count);
682
683	Address		name;
684	Address		target;
685};
686
687// SymlinkReply
688class SymlinkReply : public ReplyRequest {
689public:
690	SymlinkReply() : ReplyRequest(SYMLINK_REPLY) {}
691};
692
693// ReadLinkRequest
694class ReadLinkRequest : public NodeRequest {
695public:
696	ReadLinkRequest() : NodeRequest(READ_LINK_REQUEST) {}
697
698	size_t		size;
699};
700
701// ReadLinkReply
702class ReadLinkReply : public ReplyRequest {
703public:
704	ReadLinkReply() : ReplyRequest(READ_LINK_REPLY) {}
705	status_t GetAddressInfos(AddressInfo* infos, int32* count);
706
707	Address		buffer;
708	size_t		bytesRead;
709};
710
711// RenameRequest
712class RenameRequest : public VolumeRequest {
713public:
714	RenameRequest() : VolumeRequest(RENAME_REQUEST) {}
715	status_t GetAddressInfos(AddressInfo* infos, int32* count);
716
717	void*		oldDir;
718	Address		oldName;
719	void*		newDir;
720	Address		newName;
721};
722
723// RenameReply
724class RenameReply : public ReplyRequest {
725public:
726	RenameReply() : ReplyRequest(RENAME_REPLY) {}
727};
728
729// #pragma mark -
730// #pragma mark ----- directories -----
731
732// MkDirRequest
733class MkDirRequest : public NodeRequest {
734public:
735	MkDirRequest() : NodeRequest(MKDIR_REQUEST) {}
736	status_t GetAddressInfos(AddressInfo* infos, int32* count);
737
738	Address		name;
739	int			mode;
740};
741
742// MkDirReply
743class MkDirReply : public ReplyRequest {
744public:
745	MkDirReply() : ReplyRequest(MKDIR_REPLY) {}
746};
747
748// RmDirRequest
749class RmDirRequest : public NodeRequest {
750public:
751	RmDirRequest() : NodeRequest(RMDIR_REQUEST) {}
752	status_t GetAddressInfos(AddressInfo* infos, int32* count);
753
754	Address		name;
755};
756
757// RmDirReply
758class RmDirReply : public ReplyRequest {
759public:
760	RmDirReply() : ReplyRequest(RMDIR_REPLY) {}
761};
762
763// OpenDirRequest
764class OpenDirRequest : public NodeRequest {
765public:
766	OpenDirRequest() : NodeRequest(OPEN_DIR_REQUEST) {}
767};
768
769// OpenDirReply
770class OpenDirReply : public ReplyRequest {
771public:
772	OpenDirReply() : ReplyRequest(OPEN_DIR_REPLY) {}
773
774	void*		dirCookie;
775};
776
777// CloseDirRequest
778class CloseDirRequest : public DirRequest {
779public:
780	CloseDirRequest() : DirRequest(CLOSE_DIR_REQUEST) {}
781};
782
783// CloseDirReply
784class CloseDirReply : public ReplyRequest {
785public:
786	CloseDirReply() : ReplyRequest(CLOSE_DIR_REPLY) {}
787};
788
789// FreeDirCookieRequest
790class FreeDirCookieRequest : public DirRequest {
791public:
792	FreeDirCookieRequest() : DirRequest(FREE_DIR_COOKIE_REQUEST) {}
793};
794
795// FreeDirCookieReply
796class FreeDirCookieReply : public ReplyRequest {
797public:
798	FreeDirCookieReply() : ReplyRequest(FREE_DIR_COOKIE_REPLY) {}
799};
800
801// ReadDirRequest
802class ReadDirRequest : public DirRequest {
803public:
804	ReadDirRequest() : DirRequest(READ_DIR_REQUEST) {}
805
806	size_t		bufferSize;
807	int32		count;
808};
809
810// ReadDirReply
811class ReadDirReply : public ReplyRequest {
812public:
813	ReadDirReply() : ReplyRequest(READ_DIR_REPLY) {}
814	status_t GetAddressInfos(AddressInfo* infos, int32* count);
815
816	int32		count;
817	Address		buffer;
818};
819
820// RewindDirRequest
821class RewindDirRequest : public DirRequest {
822public:
823	RewindDirRequest() : DirRequest(REWIND_DIR_REQUEST) {}
824};
825
826// RewindDirReply
827class RewindDirReply : public ReplyRequest {
828public:
829	RewindDirReply() : ReplyRequest(REWIND_DIR_REPLY) {}
830};
831
832// WalkRequest
833class WalkRequest : public NodeRequest {
834public:
835	WalkRequest() : NodeRequest(WALK_REQUEST) {}
836	status_t GetAddressInfos(AddressInfo* infos, int32* count);
837
838	Address		entryName;
839	bool		traverseLink;
840};
841
842// WalkReply
843class WalkReply : public ReplyRequest {
844public:
845	WalkReply() : ReplyRequest(WALK_REPLY) {}
846	status_t GetAddressInfos(AddressInfo* infos, int32* count);
847
848	Address		resolvedPath;
849	vnode_id	vnid;
850};
851
852// #pragma mark -
853// #pragma mark ----- attributes -----
854
855// OpenAttrDirRequest
856class OpenAttrDirRequest : public NodeRequest {
857public:
858	OpenAttrDirRequest() : NodeRequest(OPEN_ATTR_DIR_REQUEST) {}
859};
860
861// OpenAttrDirReply
862class OpenAttrDirReply : public ReplyRequest {
863public:
864	OpenAttrDirReply() : ReplyRequest(OPEN_ATTR_DIR_REPLY) {}
865
866	void*		attrDirCookie;
867};
868
869// CloseAttrDirRequest
870class CloseAttrDirRequest : public AttrDirRequest {
871public:
872	CloseAttrDirRequest() : AttrDirRequest(CLOSE_ATTR_DIR_REQUEST) {}
873};
874
875// CloseAttrDirReply
876class CloseAttrDirReply : public ReplyRequest {
877public:
878	CloseAttrDirReply() : ReplyRequest(CLOSE_ATTR_DIR_REPLY) {}
879};
880
881// FreeAttrDirCookieRequest
882class FreeAttrDirCookieRequest : public AttrDirRequest {
883public:
884	FreeAttrDirCookieRequest() : AttrDirRequest(FREE_ATTR_DIR_COOKIE_REQUEST) {}
885};
886
887// FreeAttrDirCookieReply
888class FreeAttrDirCookieReply : public ReplyRequest {
889public:
890	FreeAttrDirCookieReply() : ReplyRequest(FREE_ATTR_DIR_COOKIE_REPLY) {}
891};
892
893// ReadAttrDirRequest
894class ReadAttrDirRequest : public AttrDirRequest {
895public:
896	ReadAttrDirRequest() : AttrDirRequest(READ_ATTR_DIR_REQUEST) {}
897
898	size_t		bufferSize;
899	int32		count;
900};
901
902// ReadAttrDirReply
903class ReadAttrDirReply : public ReplyRequest {
904public:
905	ReadAttrDirReply() : ReplyRequest(READ_ATTR_DIR_REPLY) {}
906	status_t GetAddressInfos(AddressInfo* infos, int32* count);
907
908	int32		count;
909	Address		buffer;
910};
911
912// RewindAttrDirRequest
913class RewindAttrDirRequest : public AttrDirRequest {
914public:
915	RewindAttrDirRequest() : AttrDirRequest(REWIND_ATTR_DIR_REQUEST) {}
916};
917
918// RewindAttrDirReply
919class RewindAttrDirReply : public ReplyRequest {
920public:
921	RewindAttrDirReply() : ReplyRequest(REWIND_ATTR_DIR_REPLY) {}
922};
923
924// ReadAttrRequest
925class ReadAttrRequest : public NodeRequest {
926public:
927	ReadAttrRequest() : NodeRequest(READ_ATTR_REQUEST) {}
928	status_t GetAddressInfos(AddressInfo* infos, int32* count);
929
930	Address		name;
931	int			type;
932	off_t		pos;
933	size_t		size;
934};
935
936// ReadAttrReply
937class ReadAttrReply : public ReplyRequest {
938public:
939	ReadAttrReply() : ReplyRequest(READ_ATTR_REPLY) {}
940	status_t GetAddressInfos(AddressInfo* infos, int32* count);
941
942	Address		buffer;
943	size_t		bytesRead;
944};
945
946// WriteAttrRequest
947class WriteAttrRequest : public NodeRequest {
948public:
949	WriteAttrRequest() : NodeRequest(WRITE_ATTR_REQUEST) {}
950	status_t GetAddressInfos(AddressInfo* infos, int32* count);
951
952	Address		name;
953	int			type;
954	Address		buffer;
955	off_t		pos;
956	size_t		size;
957};
958
959// WriteAttrReply
960class WriteAttrReply : public ReplyRequest {
961public:
962	WriteAttrReply() : ReplyRequest(WRITE_ATTR_REPLY) {}
963
964	size_t		bytesWritten;
965};
966
967// RemoveAttrRequest
968class RemoveAttrRequest : public NodeRequest {
969public:
970	RemoveAttrRequest() : NodeRequest(REMOVE_ATTR_REQUEST) {}
971	status_t GetAddressInfos(AddressInfo* infos, int32* count);
972
973	Address		name;
974};
975
976// RemoveAttrReply
977class RemoveAttrReply : public ReplyRequest {
978public:
979	RemoveAttrReply() : ReplyRequest(REMOVE_ATTR_REPLY) {}
980};
981
982// RenameAttrRequest
983class RenameAttrRequest : public NodeRequest {
984public:
985	RenameAttrRequest() : NodeRequest(RENAME_ATTR_REQUEST) {}
986	status_t GetAddressInfos(AddressInfo* infos, int32* count);
987
988	Address		oldName;
989	Address		newName;
990};
991
992// RenameAttrReply
993class RenameAttrReply : public ReplyRequest {
994public:
995	RenameAttrReply() : ReplyRequest(RENAME_ATTR_REPLY) {}
996};
997
998// StatAttrRequest
999class StatAttrRequest : public NodeRequest {
1000public:
1001	StatAttrRequest() : NodeRequest(STAT_ATTR_REQUEST) {}
1002	status_t GetAddressInfos(AddressInfo* infos, int32* count);
1003
1004	Address		name;
1005};
1006
1007// StatAttrReply
1008class StatAttrReply : public ReplyRequest {
1009public:
1010	StatAttrReply() : ReplyRequest(STAT_ATTR_REPLY) {}
1011
1012	attr_info	info;
1013};
1014
1015// #pragma mark -
1016// #pragma mark ----- indices -----
1017
1018// OpenIndexDirRequest
1019class OpenIndexDirRequest : public VolumeRequest {
1020public:
1021	OpenIndexDirRequest() : VolumeRequest(OPEN_INDEX_DIR_REQUEST) {}
1022};
1023
1024// OpenIndexDirReply
1025class OpenIndexDirReply : public ReplyRequest {
1026public:
1027	OpenIndexDirReply() : ReplyRequest(OPEN_INDEX_DIR_REPLY) {}
1028
1029	void*		indexDirCookie;
1030};
1031
1032// CloseIndexDirRequest
1033class CloseIndexDirRequest : public IndexDirRequest {
1034public:
1035	CloseIndexDirRequest() : IndexDirRequest(CLOSE_INDEX_DIR_REQUEST) {}
1036};
1037
1038// CloseIndexDirReply
1039class CloseIndexDirReply : public ReplyRequest {
1040public:
1041	CloseIndexDirReply() : ReplyRequest(CLOSE_INDEX_DIR_REPLY) {}
1042};
1043
1044// FreeIndexDirCookieRequest
1045class FreeIndexDirCookieRequest : public IndexDirRequest {
1046public:
1047	FreeIndexDirCookieRequest()
1048		: IndexDirRequest(FREE_INDEX_DIR_COOKIE_REQUEST) {}
1049};
1050
1051// FreeIndexDirCookieReply
1052class FreeIndexDirCookieReply : public ReplyRequest {
1053public:
1054	FreeIndexDirCookieReply() : ReplyRequest(FREE_INDEX_DIR_COOKIE_REPLY) {}
1055};
1056
1057// ReadIndexDirRequest
1058class ReadIndexDirRequest : public IndexDirRequest {
1059public:
1060	ReadIndexDirRequest() : IndexDirRequest(READ_INDEX_DIR_REQUEST) {}
1061
1062	size_t		bufferSize;
1063	int32		count;
1064};
1065
1066// ReadIndexDirReply
1067class ReadIndexDirReply : public ReplyRequest {
1068public:
1069	ReadIndexDirReply() : ReplyRequest(READ_INDEX_DIR_REPLY) {}
1070	status_t GetAddressInfos(AddressInfo* infos, int32* count);
1071
1072	int32		count;
1073	Address		buffer;
1074};
1075
1076// RewindIndexDirRequest
1077class RewindIndexDirRequest : public IndexDirRequest {
1078public:
1079	RewindIndexDirRequest() : IndexDirRequest(REWIND_INDEX_DIR_REQUEST) {}
1080};
1081
1082// RewindIndexDirReply
1083class RewindIndexDirReply : public ReplyRequest {
1084public:
1085	RewindIndexDirReply() : ReplyRequest(REWIND_INDEX_DIR_REPLY) {}
1086};
1087
1088// CreateIndexRequest
1089class CreateIndexRequest : public VolumeRequest {
1090public:
1091	CreateIndexRequest() : VolumeRequest(CREATE_INDEX_REQUEST) {}
1092	status_t GetAddressInfos(AddressInfo* infos, int32* count);
1093
1094	Address		name;
1095	int			type;
1096	int			flags;
1097};
1098
1099// CreateIndexReply
1100class CreateIndexReply : public ReplyRequest {
1101public:
1102	CreateIndexReply() : ReplyRequest(CREATE_INDEX_REPLY) {}
1103};
1104
1105// RemoveIndexRequest
1106class RemoveIndexRequest : public VolumeRequest {
1107public:
1108	RemoveIndexRequest() : VolumeRequest(REMOVE_INDEX_REQUEST) {}
1109	status_t GetAddressInfos(AddressInfo* infos, int32* count);
1110
1111	Address		name;
1112};
1113
1114// RemoveIndexReply
1115class RemoveIndexReply : public ReplyRequest {
1116public:
1117	RemoveIndexReply() : ReplyRequest(REMOVE_INDEX_REPLY) {}
1118};
1119
1120// RenameIndexRequest
1121class RenameIndexRequest : public VolumeRequest {
1122public:
1123	RenameIndexRequest() : VolumeRequest(RENAME_INDEX_REQUEST) {}
1124	status_t GetAddressInfos(AddressInfo* infos, int32* count);
1125
1126	Address		oldName;
1127	Address		newName;
1128};
1129
1130// RenameIndexReply
1131class RenameIndexReply : public ReplyRequest {
1132public:
1133	RenameIndexReply() : ReplyRequest(RENAME_INDEX_REPLY) {}
1134};
1135
1136// StatIndexRequest
1137class StatIndexRequest : public VolumeRequest {
1138public:
1139	StatIndexRequest() : VolumeRequest(STAT_INDEX_REQUEST) {}
1140	status_t GetAddressInfos(AddressInfo* infos, int32* count);
1141
1142	Address		name;
1143};
1144
1145// StatIndexReply
1146class StatIndexReply : public ReplyRequest {
1147public:
1148	StatIndexReply() : ReplyRequest(STAT_INDEX_REPLY) {}
1149
1150	index_info	info;
1151};
1152
1153// #pragma mark -
1154// #pragma mark ----- queries -----
1155
1156// OpenQueryRequest
1157class OpenQueryRequest : public VolumeRequest {
1158public:
1159	OpenQueryRequest() : VolumeRequest(OPEN_QUERY_REQUEST) {}
1160	status_t GetAddressInfos(AddressInfo* infos, int32* count);
1161
1162	Address		queryString;
1163	ulong		flags;
1164	port_id		port;
1165	long		token;
1166};
1167
1168// OpenQueryReply
1169class OpenQueryReply : public ReplyRequest {
1170public:
1171	OpenQueryReply() : ReplyRequest(OPEN_QUERY_REPLY) {}
1172
1173	void*		queryCookie;
1174};
1175
1176// CloseQueryRequest
1177class CloseQueryRequest : public VolumeRequest {
1178public:
1179	CloseQueryRequest() : VolumeRequest(CLOSE_QUERY_REQUEST) {}
1180
1181	void*		queryCookie;
1182};
1183
1184// CloseQueryReply
1185class CloseQueryReply : public ReplyRequest {
1186public:
1187	CloseQueryReply() : ReplyRequest(CLOSE_QUERY_REPLY) {}
1188};
1189
1190// FreeQueryCookieRequest
1191class FreeQueryCookieRequest : public VolumeRequest {
1192public:
1193	FreeQueryCookieRequest() : VolumeRequest(FREE_QUERY_COOKIE_REQUEST) {}
1194
1195	void*		queryCookie;
1196};
1197
1198// FreeQueryCookieReply
1199class FreeQueryCookieReply : public ReplyRequest {
1200public:
1201	FreeQueryCookieReply() : ReplyRequest(FREE_QUERY_COOKIE_REPLY) {}
1202};
1203
1204// ReadQueryRequest
1205class ReadQueryRequest : public VolumeRequest {
1206public:
1207	ReadQueryRequest() : VolumeRequest(READ_QUERY_REQUEST) {}
1208
1209	void*		queryCookie;
1210	size_t		bufferSize;
1211	int32		count;
1212};
1213
1214// ReadQueryReply
1215class ReadQueryReply : public ReplyRequest {
1216public:
1217	ReadQueryReply() : ReplyRequest(READ_QUERY_REPLY) {}
1218	status_t GetAddressInfos(AddressInfo* infos, int32* count);
1219
1220	int32		count;
1221	Address		buffer;
1222};
1223
1224
1225// #pragma mark -
1226// #pragma mark ----- userland requests -----
1227
1228// #pragma mark -
1229// #pragma mark ----- notifications -----
1230
1231// NotifyListenerRequest
1232class NotifyListenerRequest : public Request {
1233public:
1234	NotifyListenerRequest() : Request(NOTIFY_LISTENER_REQUEST) {}
1235	status_t GetAddressInfos(AddressInfo* infos, int32* count);
1236
1237	int32		operation;
1238	nspace_id	nsid;
1239	vnode_id	vnida;
1240	vnode_id	vnidb;
1241	vnode_id	vnidc;
1242	Address		name;
1243};
1244
1245// NotifyListenerReply
1246class NotifyListenerReply : public ReplyRequest {
1247public:
1248	NotifyListenerReply() : ReplyRequest(NOTIFY_LISTENER_REPLY) {}
1249};
1250
1251// NotifySelectRequest
1252class NotifySelectEventRequest : public Request {
1253public:
1254	NotifySelectEventRequest() : Request(NOTIFY_SELECT_EVENT_REQUEST) {}
1255
1256	selectsync*	sync;
1257	uint32		ref;
1258};
1259
1260// NotifySelectEventReply
1261class NotifySelectEventReply : public ReplyRequest {
1262public:
1263	NotifySelectEventReply() : ReplyRequest(NOTIFY_SELECT_EVENT_REPLY) {}
1264};
1265
1266// SendNotificationRequest
1267class SendNotificationRequest : public Request {
1268public:
1269	SendNotificationRequest() : Request(SEND_NOTIFICATION_REQUEST) {}
1270	status_t GetAddressInfos(AddressInfo* infos, int32* count);
1271
1272	port_id		port;
1273	int32		token;
1274	uint32		what;
1275	int32		operation;
1276	nspace_id	nsida;
1277	nspace_id	nsidb;
1278	vnode_id	vnida;
1279	vnode_id	vnidb;
1280	vnode_id	vnidc;
1281	Address		name;
1282};
1283
1284// SendNotificationReply
1285class SendNotificationReply : public ReplyRequest {
1286public:
1287	SendNotificationReply() : ReplyRequest(SEND_NOTIFICATION_REPLY) {}
1288};
1289
1290
1291// #pragma mark -
1292// #pragma mark ----- vnodes -----
1293
1294// GetVNodeRequest
1295class GetVNodeRequest : public Request {
1296public:
1297	GetVNodeRequest() : Request(GET_VNODE_REQUEST) {}
1298
1299	nspace_id	nsid;
1300	vnode_id	vnid;
1301};
1302
1303// GetVNodeReply
1304class GetVNodeReply : public ReplyRequest {
1305public:
1306	GetVNodeReply() : ReplyRequest(GET_VNODE_REPLY) {}
1307
1308	void*		node;
1309};
1310
1311// PutVNodeRequest
1312class PutVNodeRequest : public Request {
1313public:
1314	PutVNodeRequest() : Request(PUT_VNODE_REQUEST) {}
1315
1316	nspace_id	nsid;
1317	vnode_id	vnid;
1318};
1319
1320// PutVNodeReply
1321class PutVNodeReply : public ReplyRequest {
1322public:
1323	PutVNodeReply() : ReplyRequest(PUT_VNODE_REPLY) {}
1324};
1325
1326// NewVNodeRequest
1327class NewVNodeRequest : public Request {
1328public:
1329	NewVNodeRequest() : Request(NEW_VNODE_REQUEST) {}
1330
1331	nspace_id	nsid;
1332	vnode_id	vnid;
1333	void*		node;
1334};
1335
1336// NewVNodeReply
1337class NewVNodeReply : public ReplyRequest {
1338public:
1339	NewVNodeReply() : ReplyRequest(NEW_VNODE_REPLY) {}
1340};
1341
1342// RemoveVNodeRequest
1343class RemoveVNodeRequest : public Request {
1344public:
1345	RemoveVNodeRequest() : Request(REMOVE_VNODE_REQUEST) {}
1346
1347	nspace_id	nsid;
1348	vnode_id	vnid;
1349};
1350
1351// RemoveVNodeReply
1352class RemoveVNodeReply : public ReplyRequest {
1353public:
1354	RemoveVNodeReply() : ReplyRequest(REMOVE_VNODE_REPLY) {}
1355};
1356
1357// UnremoveVNodeRequest
1358class UnremoveVNodeRequest : public Request {
1359public:
1360	UnremoveVNodeRequest() : Request(UNREMOVE_VNODE_REQUEST) {}
1361
1362	nspace_id	nsid;
1363	vnode_id	vnid;
1364};
1365
1366// UnremoveVNodeReply
1367class UnremoveVNodeReply : public ReplyRequest {
1368public:
1369	UnremoveVNodeReply() : ReplyRequest(UNREMOVE_VNODE_REPLY) {}
1370};
1371
1372// IsVNodeRemovedRequest
1373class IsVNodeRemovedRequest : public Request {
1374public:
1375	IsVNodeRemovedRequest() : Request(IS_VNODE_REMOVED_REQUEST) {}
1376
1377	nspace_id	nsid;
1378	vnode_id	vnid;
1379};
1380
1381// IsVNodeRemovedReply
1382class IsVNodeRemovedReply : public ReplyRequest {
1383public:
1384	IsVNodeRemovedReply() : ReplyRequest(IS_VNODE_REMOVED_REPLY) {}
1385
1386	int			result;
1387};
1388
1389
1390//////////////////
1391// General Reply
1392
1393// ReceiptAckReply
1394class ReceiptAckReply : public ReplyRequest {
1395public:
1396	ReceiptAckReply() : ReplyRequest(RECEIPT_ACK_REPLY) {}
1397};
1398
1399
1400///////////////////
1401// Request Checks
1402
1403// do_for_request
1404template<class Task>
1405static
1406status_t
1407do_for_request(Request* request, Task& task)
1408{
1409	if (!request)
1410		return B_BAD_VALUE;
1411	switch (request->GetType()) {
1412		// kernel -> userland requests
1413		// administrative
1414		case UFS_DISCONNECT_REQUEST:
1415			return task((UFSDisconnectRequest*)request);
1416		case FS_CONNECT_REQUEST:
1417			return task((FSConnectRequest*)request);
1418		case FS_CONNECT_REPLY:
1419			return task((FSConnectReply*)request);
1420		// FS
1421		case MOUNT_VOLUME_REQUEST:
1422			return task((MountVolumeRequest*)request);
1423		case MOUNT_VOLUME_REPLY:
1424			return task((MountVolumeReply*)request);
1425		case UNMOUNT_VOLUME_REQUEST:
1426			return task((UnmountVolumeRequest*)request);
1427		case UNMOUNT_VOLUME_REPLY:
1428			return task((UnmountVolumeReply*)request);
1429		case INITIALIZE_VOLUME_REQUEST:
1430			return task((InitializeVolumeRequest*)request);
1431		case INITIALIZE_VOLUME_REPLY:
1432			return task((InitializeVolumeReply*)request);
1433		case SYNC_VOLUME_REQUEST:
1434			return task((SyncVolumeRequest*)request);
1435		case SYNC_VOLUME_REPLY:
1436			return task((SyncVolumeReply*)request);
1437		case READ_FS_STAT_REQUEST:
1438			return task((ReadFSStatRequest*)request);
1439		case READ_FS_STAT_REPLY:
1440			return task((ReadFSStatReply*)request);
1441		case WRITE_FS_STAT_REQUEST:
1442			return task((WriteFSStatRequest*)request);
1443		case WRITE_FS_STAT_REPLY:
1444			return task((WriteFSStatReply*)request);
1445		// vnodes
1446		case READ_VNODE_REQUEST:
1447			return task((ReadVNodeRequest*)request);
1448		case READ_VNODE_REPLY:
1449			return task((ReadVNodeReply*)request);
1450		case WRITE_VNODE_REQUEST:
1451			return task((WriteVNodeRequest*)request);
1452		case WRITE_VNODE_REPLY:
1453			return task((WriteVNodeReply*)request);
1454		case FS_REMOVE_VNODE_REQUEST:
1455			return task((FSRemoveVNodeRequest*)request);
1456		case FS_REMOVE_VNODE_REPLY:
1457			return task((FSRemoveVNodeReply*)request);
1458		// nodes
1459		case FSYNC_REQUEST:
1460			return task((FSyncRequest*)request);
1461		case FSYNC_REPLY:
1462			return task((FSyncReply*)request);
1463		case READ_STAT_REQUEST:
1464			return task((ReadStatRequest*)request);
1465		case READ_STAT_REPLY:
1466			return task((ReadStatReply*)request);
1467		case WRITE_STAT_REQUEST:
1468			return task((WriteStatRequest*)request);
1469		case WRITE_STAT_REPLY:
1470			return task((WriteStatReply*)request);
1471		case ACCESS_REQUEST:
1472			return task((AccessRequest*)request);
1473		case ACCESS_REPLY:
1474			return task((AccessReply*)request);
1475		// files
1476		case CREATE_REQUEST:
1477			return task((CreateRequest*)request);
1478		case CREATE_REPLY:
1479			return task((CreateReply*)request);
1480		case OPEN_REQUEST:
1481			return task((OpenRequest*)request);
1482		case OPEN_REPLY:
1483			return task((OpenReply*)request);
1484		case CLOSE_REQUEST:
1485			return task((CloseRequest*)request);
1486		case CLOSE_REPLY:
1487			return task((CloseReply*)request);
1488		case FREE_COOKIE_REQUEST:
1489			return task((FreeCookieRequest*)request);
1490		case FREE_COOKIE_REPLY:
1491			return task((FreeCookieReply*)request);
1492		case READ_REQUEST:
1493			return task((ReadRequest*)request);
1494		case READ_REPLY:
1495			return task((ReadReply*)request);
1496		case WRITE_REQUEST:
1497			return task((WriteRequest*)request);
1498		case WRITE_REPLY:
1499			return task((WriteReply*)request);
1500		case IOCTL_REQUEST:
1501			return task((IOCtlRequest*)request);
1502		case IOCTL_REPLY:
1503			return task((IOCtlReply*)request);
1504		case SET_FLAGS_REQUEST:
1505			return task((SetFlagsRequest*)request);
1506		case SET_FLAGS_REPLY:
1507			return task((SetFlagsReply*)request);
1508		case SELECT_REQUEST:
1509			return task((SelectRequest*)request);
1510		case SELECT_REPLY:
1511			return task((SelectReply*)request);
1512		case DESELECT_REQUEST:
1513			return task((DeselectRequest*)request);
1514		case DESELECT_REPLY:
1515			return task((DeselectReply*)request);
1516		// hard links / symlinks
1517		case LINK_REQUEST:
1518			return task((LinkRequest*)request);
1519		case LINK_REPLY:
1520			return task((LinkReply*)request);
1521		case UNLINK_REQUEST:
1522			return task((UnlinkRequest*)request);
1523		case UNLINK_REPLY:
1524			return task((UnlinkReply*)request);
1525		case SYMLINK_REQUEST:
1526			return task((SymlinkRequest*)request);
1527		case SYMLINK_REPLY:
1528			return task((SymlinkReply*)request);
1529		case READ_LINK_REQUEST:
1530			return task((ReadLinkRequest*)request);
1531		case READ_LINK_REPLY:
1532			return task((ReadLinkReply*)request);
1533		case RENAME_REQUEST:
1534			return task((RenameRequest*)request);
1535		case RENAME_REPLY:
1536			return task((RenameReply*)request);
1537		// directories
1538		case MKDIR_REQUEST:
1539			return task((MkDirRequest*)request);
1540		case MKDIR_REPLY:
1541			return task((MkDirReply*)request);
1542		case RMDIR_REQUEST:
1543			return task((RmDirRequest*)request);
1544		case RMDIR_REPLY:
1545			return task((RmDirReply*)request);
1546		case OPEN_DIR_REQUEST:
1547			return task((OpenDirRequest*)request);
1548		case OPEN_DIR_REPLY:
1549			return task((OpenDirReply*)request);
1550		case CLOSE_DIR_REQUEST:
1551			return task((CloseDirRequest*)request);
1552		case CLOSE_DIR_REPLY:
1553			return task((CloseDirReply*)request);
1554		case FREE_DIR_COOKIE_REQUEST:
1555			return task((FreeDirCookieRequest*)request);
1556		case FREE_DIR_COOKIE_REPLY:
1557			return task((FreeDirCookieReply*)request);
1558		case READ_DIR_REQUEST:
1559			return task((ReadDirRequest*)request);
1560		case READ_DIR_REPLY:
1561			return task((ReadDirReply*)request);
1562		case REWIND_DIR_REQUEST:
1563			return task((RewindDirRequest*)request);
1564		case REWIND_DIR_REPLY:
1565			return task((RewindDirReply*)request);
1566		case WALK_REQUEST:
1567			return task((WalkRequest*)request);
1568		case WALK_REPLY:
1569			return task((WalkReply*)request);
1570		// attributes
1571		case OPEN_ATTR_DIR_REQUEST:
1572			return task((OpenAttrDirRequest*)request);
1573		case OPEN_ATTR_DIR_REPLY:
1574			return task((OpenAttrDirReply*)request);
1575		case CLOSE_ATTR_DIR_REQUEST:
1576			return task((CloseAttrDirRequest*)request);
1577		case CLOSE_ATTR_DIR_REPLY:
1578			return task((CloseAttrDirReply*)request);
1579		case FREE_ATTR_DIR_COOKIE_REQUEST:
1580			return task((FreeAttrDirCookieRequest*)request);
1581		case FREE_ATTR_DIR_COOKIE_REPLY:
1582			return task((FreeAttrDirCookieReply*)request);
1583		case READ_ATTR_DIR_REQUEST:
1584			return task((ReadAttrDirRequest*)request);
1585		case READ_ATTR_DIR_REPLY:
1586			return task((ReadAttrDirReply*)request);
1587		case REWIND_ATTR_DIR_REQUEST:
1588			return task((RewindAttrDirRequest*)request);
1589		case REWIND_ATTR_DIR_REPLY:
1590			return task((RewindAttrDirReply*)request);
1591		case READ_ATTR_REQUEST:
1592			return task((ReadAttrRequest*)request);
1593		case READ_ATTR_REPLY:
1594			return task((ReadAttrReply*)request);
1595		case WRITE_ATTR_REQUEST:
1596			return task((WriteAttrRequest*)request);
1597		case WRITE_ATTR_REPLY:
1598			return task((WriteAttrReply*)request);
1599		case REMOVE_ATTR_REQUEST:
1600			return task((RemoveAttrRequest*)request);
1601		case REMOVE_ATTR_REPLY:
1602			return task((RemoveAttrReply*)request);
1603		case RENAME_ATTR_REQUEST:
1604			return task((RenameAttrRequest*)request);
1605		case RENAME_ATTR_REPLY:
1606			return task((RenameAttrReply*)request);
1607		case STAT_ATTR_REQUEST:
1608			return task((StatAttrRequest*)request);
1609		case STAT_ATTR_REPLY:
1610			return task((StatAttrReply*)request);
1611		// indices
1612		case OPEN_INDEX_DIR_REQUEST:
1613			return task((OpenIndexDirRequest*)request);
1614		case OPEN_INDEX_DIR_REPLY:
1615			return task((OpenIndexDirReply*)request);
1616		case CLOSE_INDEX_DIR_REQUEST:
1617			return task((CloseIndexDirRequest*)request);
1618		case CLOSE_INDEX_DIR_REPLY:
1619			return task((CloseIndexDirReply*)request);
1620		case FREE_INDEX_DIR_COOKIE_REQUEST:
1621			return task((FreeIndexDirCookieRequest*)request);
1622		case FREE_INDEX_DIR_COOKIE_REPLY:
1623			return task((FreeIndexDirCookieReply*)request);
1624		case READ_INDEX_DIR_REQUEST:
1625			return task((ReadIndexDirRequest*)request);
1626		case READ_INDEX_DIR_REPLY:
1627			return task((ReadIndexDirReply*)request);
1628		case REWIND_INDEX_DIR_REQUEST:
1629			return task((RewindIndexDirRequest*)request);
1630		case REWIND_INDEX_DIR_REPLY:
1631			return task((RewindIndexDirReply*)request);
1632		case CREATE_INDEX_REQUEST:
1633			return task((CreateIndexRequest*)request);
1634		case CREATE_INDEX_REPLY:
1635			return task((CreateIndexReply*)request);
1636		case REMOVE_INDEX_REQUEST:
1637			return task((RemoveIndexRequest*)request);
1638		case REMOVE_INDEX_REPLY:
1639			return task((RemoveIndexReply*)request);
1640		case RENAME_INDEX_REQUEST:
1641			return task((RenameIndexRequest*)request);
1642		case RENAME_INDEX_REPLY:
1643			return task((RenameIndexReply*)request);
1644		case STAT_INDEX_REQUEST:
1645			return task((StatIndexRequest*)request);
1646		case STAT_INDEX_REPLY:
1647			return task((StatIndexReply*)request);
1648		// queries
1649		case OPEN_QUERY_REQUEST:
1650			return task((OpenQueryRequest*)request);
1651		case OPEN_QUERY_REPLY:
1652			return task((OpenQueryReply*)request);
1653		case CLOSE_QUERY_REQUEST:
1654			return task((CloseQueryRequest*)request);
1655		case CLOSE_QUERY_REPLY:
1656			return task((CloseQueryReply*)request);
1657		case FREE_QUERY_COOKIE_REQUEST:
1658			return task((FreeQueryCookieRequest*)request);
1659		case FREE_QUERY_COOKIE_REPLY:
1660			return task((FreeQueryCookieReply*)request);
1661		case READ_QUERY_REQUEST:
1662			return task((ReadQueryRequest*)request);
1663		case READ_QUERY_REPLY:
1664			return task((ReadQueryReply*)request);
1665
1666		// userland -> kernel requests
1667		// notifications
1668		case NOTIFY_LISTENER_REQUEST:
1669			return task((NotifyListenerRequest*)request);
1670		case NOTIFY_LISTENER_REPLY:
1671			return task((NotifyListenerReply*)request);
1672		case NOTIFY_SELECT_EVENT_REQUEST:
1673			return task((NotifySelectEventRequest*)request);
1674		case NOTIFY_SELECT_EVENT_REPLY:
1675			return task((NotifySelectEventReply*)request);
1676		case SEND_NOTIFICATION_REQUEST:
1677			return task((SendNotificationRequest*)request);
1678		case SEND_NOTIFICATION_REPLY:
1679			return task((SendNotificationReply*)request);
1680		// vnodes
1681		case GET_VNODE_REQUEST:
1682			return task((GetVNodeRequest*)request);
1683		case GET_VNODE_REPLY:
1684			return task((GetVNodeReply*)request);
1685		case PUT_VNODE_REQUEST:
1686			return task((PutVNodeRequest*)request);
1687		case PUT_VNODE_REPLY:
1688			return task((PutVNodeReply*)request);
1689		case NEW_VNODE_REQUEST:
1690			return task((NewVNodeRequest*)request);
1691		case NEW_VNODE_REPLY:
1692			return task((NewVNodeReply*)request);
1693		case REMOVE_VNODE_REQUEST:
1694			return task((RemoveVNodeRequest*)request);
1695		case REMOVE_VNODE_REPLY:
1696			return task((RemoveVNodeReply*)request);
1697		case UNREMOVE_VNODE_REQUEST:
1698			return task((UnremoveVNodeRequest*)request);
1699		case UNREMOVE_VNODE_REPLY:
1700			return task((UnremoveVNodeReply*)request);
1701		case IS_VNODE_REMOVED_REQUEST:
1702			return task((IsVNodeRemovedRequest*)request);
1703		case IS_VNODE_REMOVED_REPLY:
1704			return task((IsVNodeRemovedReply*)request);
1705		// general reply
1706		case RECEIPT_ACK_REPLY:
1707			return task((ReceiptAckReply*)request);
1708		default:
1709			return B_BAD_DATA;
1710	}
1711	return task(request);
1712}
1713
1714status_t get_request_address_infos(Request* request, AddressInfo* infos,
1715	int32* count);
1716status_t check_request(Request* request);
1717status_t relocate_request(Request* request, int32 requestBufferSize,
1718	area_id* areas, int32* count);
1719
1720}	// namespace UserlandFSUtil
1721
1722using UserlandFSUtil::ReplyRequest;
1723using UserlandFSUtil::VolumeRequest;
1724using UserlandFSUtil::NodeRequest;
1725using UserlandFSUtil::FileRequest;
1726using UserlandFSUtil::DirRequest;
1727using UserlandFSUtil::AttrDirRequest;
1728using UserlandFSUtil::IndexDirRequest;
1729
1730// kernel -> userland requests
1731// administrative
1732using UserlandFSUtil::UFSDisconnectRequest;
1733using UserlandFSUtil::FSConnectRequest;
1734using UserlandFSUtil::FSConnectReply;
1735// FS
1736using UserlandFSUtil::MountVolumeRequest;
1737using UserlandFSUtil::MountVolumeReply;
1738using UserlandFSUtil::UnmountVolumeRequest;
1739using UserlandFSUtil::UnmountVolumeReply;
1740using UserlandFSUtil::InitializeVolumeRequest;
1741using UserlandFSUtil::InitializeVolumeReply;
1742using UserlandFSUtil::SyncVolumeRequest;
1743using UserlandFSUtil::SyncVolumeReply;
1744using UserlandFSUtil::ReadFSStatRequest;
1745using UserlandFSUtil::ReadFSStatReply;
1746using UserlandFSUtil::WriteFSStatRequest;
1747using UserlandFSUtil::WriteFSStatReply;
1748// vnodes
1749using UserlandFSUtil::ReadVNodeRequest;
1750using UserlandFSUtil::ReadVNodeReply;
1751using UserlandFSUtil::WriteVNodeRequest;
1752using UserlandFSUtil::WriteVNodeReply;
1753using UserlandFSUtil::FSRemoveVNodeRequest;
1754using UserlandFSUtil::FSRemoveVNodeReply;
1755// nodes
1756using UserlandFSUtil::FSyncRequest;
1757using UserlandFSUtil::FSyncReply;
1758using UserlandFSUtil::ReadStatRequest;
1759using UserlandFSUtil::ReadStatReply;
1760using UserlandFSUtil::WriteStatRequest;
1761using UserlandFSUtil::WriteStatReply;
1762using UserlandFSUtil::AccessRequest;
1763using UserlandFSUtil::AccessReply;
1764// files
1765using UserlandFSUtil::CreateRequest;
1766using UserlandFSUtil::CreateReply;
1767using UserlandFSUtil::OpenRequest;
1768using UserlandFSUtil::OpenReply;
1769using UserlandFSUtil::CloseRequest;
1770using UserlandFSUtil::CloseReply;
1771using UserlandFSUtil::FreeCookieRequest;
1772using UserlandFSUtil::FreeCookieReply;
1773using UserlandFSUtil::ReadRequest;
1774using UserlandFSUtil::ReadReply;
1775using UserlandFSUtil::WriteRequest;
1776using UserlandFSUtil::WriteReply;
1777using UserlandFSUtil::IOCtlRequest;
1778using UserlandFSUtil::IOCtlReply;
1779using UserlandFSUtil::SetFlagsRequest;
1780using UserlandFSUtil::SetFlagsReply;
1781using UserlandFSUtil::SelectRequest;
1782using UserlandFSUtil::SelectReply;
1783using UserlandFSUtil::DeselectRequest;
1784using UserlandFSUtil::DeselectReply;
1785// hard links / symlinks
1786using UserlandFSUtil::LinkRequest;
1787using UserlandFSUtil::LinkReply;
1788using UserlandFSUtil::UnlinkRequest;
1789using UserlandFSUtil::UnlinkReply;
1790using UserlandFSUtil::SymlinkRequest;
1791using UserlandFSUtil::SymlinkReply;
1792using UserlandFSUtil::ReadLinkRequest;
1793using UserlandFSUtil::ReadLinkReply;
1794using UserlandFSUtil::RenameRequest;
1795using UserlandFSUtil::RenameReply;
1796// directories
1797using UserlandFSUtil::MkDirRequest;
1798using UserlandFSUtil::MkDirReply;
1799using UserlandFSUtil::RmDirRequest;
1800using UserlandFSUtil::RmDirReply;
1801using UserlandFSUtil::OpenDirRequest;
1802using UserlandFSUtil::OpenDirReply;
1803using UserlandFSUtil::CloseDirRequest;
1804using UserlandFSUtil::CloseDirReply;
1805using UserlandFSUtil::FreeDirCookieRequest;
1806using UserlandFSUtil::FreeDirCookieReply;
1807using UserlandFSUtil::ReadDirRequest;
1808using UserlandFSUtil::ReadDirReply;
1809using UserlandFSUtil::RewindDirRequest;
1810using UserlandFSUtil::RewindDirReply;
1811using UserlandFSUtil::WalkRequest;
1812using UserlandFSUtil::WalkReply;
1813// attributes
1814using UserlandFSUtil::OpenAttrDirRequest;
1815using UserlandFSUtil::OpenAttrDirReply;
1816using UserlandFSUtil::CloseAttrDirRequest;
1817using UserlandFSUtil::CloseAttrDirReply;
1818using UserlandFSUtil::FreeAttrDirCookieRequest;
1819using UserlandFSUtil::FreeAttrDirCookieReply;
1820using UserlandFSUtil::ReadAttrDirRequest;
1821using UserlandFSUtil::ReadAttrDirReply;
1822using UserlandFSUtil::RewindAttrDirRequest;
1823using UserlandFSUtil::RewindAttrDirReply;
1824using UserlandFSUtil::ReadAttrRequest;
1825using UserlandFSUtil::ReadAttrReply;
1826using UserlandFSUtil::WriteAttrRequest;
1827using UserlandFSUtil::WriteAttrReply;
1828using UserlandFSUtil::RemoveAttrRequest;
1829using UserlandFSUtil::RemoveAttrReply;
1830using UserlandFSUtil::RenameAttrRequest;
1831using UserlandFSUtil::RenameAttrReply;
1832using UserlandFSUtil::StatAttrRequest;
1833using UserlandFSUtil::StatAttrReply;
1834// indices
1835using UserlandFSUtil::OpenIndexDirRequest;
1836using UserlandFSUtil::OpenIndexDirReply;
1837using UserlandFSUtil::CloseIndexDirRequest;
1838using UserlandFSUtil::CloseIndexDirReply;
1839using UserlandFSUtil::FreeIndexDirCookieRequest;
1840using UserlandFSUtil::FreeIndexDirCookieReply;
1841using UserlandFSUtil::ReadIndexDirRequest;
1842using UserlandFSUtil::ReadIndexDirReply;
1843using UserlandFSUtil::RewindIndexDirRequest;
1844using UserlandFSUtil::RewindIndexDirReply;
1845using UserlandFSUtil::CreateIndexRequest;
1846using UserlandFSUtil::CreateIndexReply;
1847using UserlandFSUtil::RemoveIndexRequest;
1848using UserlandFSUtil::RemoveIndexReply;
1849using UserlandFSUtil::RenameIndexRequest;
1850using UserlandFSUtil::RenameIndexReply;
1851using UserlandFSUtil::StatIndexRequest;
1852using UserlandFSUtil::StatIndexReply;
1853// queries
1854using UserlandFSUtil::OpenQueryRequest;
1855using UserlandFSUtil::OpenQueryReply;
1856using UserlandFSUtil::CloseQueryRequest;
1857using UserlandFSUtil::CloseQueryReply;
1858using UserlandFSUtil::FreeQueryCookieRequest;
1859using UserlandFSUtil::FreeQueryCookieReply;
1860using UserlandFSUtil::ReadQueryRequest;
1861using UserlandFSUtil::ReadQueryReply;
1862
1863// userland -> kernel requests
1864// notifications
1865using UserlandFSUtil::NotifyListenerRequest;
1866using UserlandFSUtil::NotifyListenerReply;
1867using UserlandFSUtil::NotifySelectEventRequest;
1868using UserlandFSUtil::NotifySelectEventReply;
1869using UserlandFSUtil::SendNotificationRequest;
1870using UserlandFSUtil::SendNotificationReply;
1871// vnodes
1872using UserlandFSUtil::GetVNodeRequest;
1873using UserlandFSUtil::GetVNodeReply;
1874using UserlandFSUtil::PutVNodeRequest;
1875using UserlandFSUtil::PutVNodeReply;
1876using UserlandFSUtil::NewVNodeRequest;
1877using UserlandFSUtil::NewVNodeReply;
1878using UserlandFSUtil::RemoveVNodeRequest;
1879using UserlandFSUtil::RemoveVNodeReply;
1880using UserlandFSUtil::UnremoveVNodeRequest;
1881using UserlandFSUtil::UnremoveVNodeReply;
1882using UserlandFSUtil::IsVNodeRemovedRequest;
1883using UserlandFSUtil::IsVNodeRemovedReply;
1884// general reply
1885using UserlandFSUtil::ReceiptAckReply;
1886
1887using UserlandFSUtil::do_for_request;
1888using UserlandFSUtil::get_request_address_infos;
1889using UserlandFSUtil::check_request;
1890using UserlandFSUtil::relocate_request;
1891
1892#endif	// USERLAND_FS_REQUESTS_H
1893