1#ifndef _FSPROTO_H
2#define _FSPROTO_H
3
4#include <dirent.h>
5#include <sys/types.h>
6#include <sys/param.h>
7#include <sys/stat.h>
8#include <unistd.h>
9#include <iovec.h>
10
11#include <OS.h>
12
13#ifndef BUILDING_USERLAND_FS_SERVER
14#	include <fs_attr.h>
15#	include <fs_info.h>
16#	include <fs_volume.h>
17#endif	// ! BUILDING_USERLAND_FS_SERVER
18
19#ifndef _IMPEXP_KERNEL
20#define _IMPEXP_KERNEL
21#endif
22
23typedef dev_t		nspace_id;
24typedef ino_t		vnode_id;
25
26/*
27 * PUBLIC PART OF THE FILE SYSTEM PROTOCOL
28 */
29
30#define		WSTAT_MODE		0x0001
31#define		WSTAT_UID		0x0002
32#define		WSTAT_GID		0x0004
33#define		WSTAT_SIZE		0x0008
34#define		WSTAT_ATIME		0x0010
35#define		WSTAT_MTIME		0x0020
36#define		WSTAT_CRTIME	0x0040
37
38#define		WFSSTAT_NAME	0x0001
39
40#define		B_ENTRY_CREATED		1
41#define		B_ENTRY_REMOVED		2
42#define		B_ENTRY_MOVED		3
43#define		B_STAT_CHANGED		4
44#define		B_ATTR_CHANGED		5
45#define		B_DEVICE_MOUNTED	6
46#define		B_DEVICE_UNMOUNTED	7
47
48#define		B_STOP_WATCHING     0x0000
49#define		B_WATCH_NAME		0x0001
50#define		B_WATCH_STAT		0x0002
51#define		B_WATCH_ATTR		0x0004
52#define		B_WATCH_DIRECTORY	0x0008
53
54#define		SELECT_READ			1
55#define		SELECT_WRITE		2
56#define 	SELECT_EXCEPTION	3
57
58// missing ioctl() call added
59#define		IOCTL_FILE_UNCACHED_IO	10000
60#define		IOCTL_CREATE_TIME		10002
61#define		IOCTL_MODIFIED_TIME		10003
62
63#define		B_CUR_FS_API_VERSION	2
64
65struct attr_info;
66struct index_info;
67typedef struct selectsync selectsync;
68
69typedef int	op_read_vnode(void *ns, vnode_id vnid, char r, void **node);
70typedef int	op_write_vnode(void *ns, void *node, char r);
71typedef int	op_remove_vnode(void *ns, void *node, char r);
72typedef int	op_secure_vnode(void *ns, void *node);
73
74typedef int	op_walk(void *ns, void *base, const char *file, char **newpath,
75					vnode_id *vnid);
76
77typedef int	op_access(void *ns, void *node, int mode);
78
79typedef int	op_create(void *ns, void *dir, const char *name,
80					int omode, int perms, vnode_id *vnid, void **cookie);
81typedef int	op_mkdir(void *ns, void *dir, const char *name,	int perms);
82typedef int	op_symlink(void *ns, void *dir, const char *name,
83					const char *path);
84typedef int op_link(void *ns, void *dir, const char *name, void *node);
85
86typedef int	op_rename(void *ns, void *olddir, const char *oldname,
87					void *newdir, const char *newname);
88typedef int	op_unlink(void *ns, void *dir, const char *name);
89typedef int	op_rmdir(void *ns, void *dir, const char *name);
90
91typedef int	op_readlink(void *ns, void *node, char *buf, size_t *bufsize);
92
93typedef int op_opendir(void *ns, void *node, void **cookie);
94typedef int	op_closedir(void *ns, void *node, void *cookie);
95typedef int	op_rewinddir(void *ns, void *node, void *cookie);
96typedef int	op_readdir(void *ns, void *node, void *cookie, long *num,
97					struct dirent *buf, size_t bufsize);
98
99typedef int	op_open(void *ns, void *node, int omode, void **cookie);
100typedef int	op_close(void *ns, void *node, void *cookie);
101typedef int op_free_cookie(void *ns, void *node, void *cookie);
102typedef int op_read(void *ns, void *node, void *cookie, off_t pos, void *buf,
103					size_t *len);
104typedef int op_write(void *ns, void *node, void *cookie, off_t pos,
105					const void *buf, size_t *len);
106typedef int op_readv(void *ns, void *node, void *cookie, off_t pos, const iovec *vec,
107					size_t count, size_t *len);
108typedef int op_writev(void *ns, void *node, void *cookie, off_t pos, const iovec *vec,
109					size_t count, size_t *len);
110typedef int	op_ioctl(void *ns, void *node, void *cookie, int cmd, void *buf,
111					size_t len);
112typedef	int	op_setflags(void *ns, void *node, void *cookie, int flags);
113
114typedef int	op_rstat(void *ns, void *node, struct stat *);
115typedef int op_wstat(void *ns, void *node, struct stat *, long mask);
116typedef int	op_fsync(void *ns, void *node);
117
118typedef int	op_select(void *ns, void *node, void *cookie, uint8 event,
119				uint32 ref, selectsync *sync);
120typedef int	op_deselect(void *ns, void *node, void *cookie, uint8 event,
121				selectsync *sync);
122
123typedef int	op_initialize(const char *devname, void *parms, size_t len);
124typedef int	op_mount(nspace_id nsid, const char *devname, ulong flags,
125					void *parms, size_t len, void **data, vnode_id *vnid);
126typedef int	op_unmount(void *ns);
127typedef int	op_sync(void *ns);
128typedef int op_rfsstat(void *ns, struct fs_info *);
129typedef int op_wfsstat(void *ns, struct fs_info *, long mask);
130
131
132typedef int	op_open_attrdir(void *ns, void *node, void **cookie);
133typedef int	op_close_attrdir(void *ns, void *node, void *cookie);
134typedef int	op_rewind_attrdir(void *ns, void *node, void *cookie);
135typedef int	op_read_attrdir(void *ns, void *node, void *cookie, long *num,
136					struct dirent *buf, size_t bufsize);
137typedef int	op_remove_attr(void *ns, void *node, const char *name);
138typedef	int	op_rename_attr(void *ns, void *node, const char *oldname,
139					const char *newname);
140typedef int	op_stat_attr(void *ns, void *node, const char *name,
141					struct attr_info *buf);
142
143typedef int	op_write_attr(void *ns, void *node, const char *name, int type,
144					const void *buf, size_t *len, off_t pos);
145typedef int	op_read_attr(void *ns, void *node, const char *name, int type,
146					void *buf, size_t *len, off_t pos);
147
148typedef int	op_open_indexdir(void *ns, void **cookie);
149typedef int	op_close_indexdir(void *ns, void *cookie);
150typedef int	op_rewind_indexdir(void *ns, void *cookie);
151typedef int	op_read_indexdir(void *ns, void *cookie, long *num,
152					struct dirent *buf, size_t bufsize);
153typedef int	op_create_index(void *ns, const char *name, int type, int flags);
154typedef int	op_remove_index(void *ns, const char *name);
155typedef	int	op_rename_index(void *ns, const char *oldname,
156					const char *newname);
157typedef int	op_stat_index(void *ns, const char *name, struct index_info *buf);
158
159typedef int	op_open_query(void *ns, const char *query, ulong flags,
160					port_id port, long token, void **cookie);
161typedef int	op_close_query(void *ns, void *cookie);
162typedef int	op_read_query(void *ns, void *cookie, long *num,
163					struct dirent *buf, size_t bufsize);
164
165typedef struct vnode_ops {
166	op_read_vnode			*read_vnode;
167	op_write_vnode			*write_vnode;
168	op_remove_vnode			*remove_vnode;
169	op_secure_vnode			*secure_vnode;
170	op_walk					*walk;
171	op_access				*access;
172	op_create				*create;
173	op_mkdir				*mkdir;
174	op_symlink				*symlink;
175	op_link					*link;
176	op_rename				*rename;
177	op_unlink				*unlink;
178	op_rmdir				*rmdir;
179	op_readlink				*readlink;
180	op_opendir				*opendir;
181	op_closedir				*closedir;
182	op_free_cookie			*free_dircookie;
183	op_rewinddir			*rewinddir;
184	op_readdir				*readdir;
185	op_open					*open;
186	op_close				*close;
187	op_free_cookie			*free_cookie;
188	op_read					*read;
189	op_write				*write;
190	op_readv				*readv;
191	op_writev				*writev;
192	op_ioctl				*ioctl;
193	op_setflags				*setflags;
194	op_rstat				*rstat;
195	op_wstat				*wstat;
196	op_fsync				*fsync;
197	op_initialize			*initialize;
198	op_mount				*mount;
199	op_unmount				*unmount;
200	op_sync					*sync;
201	op_rfsstat				*rfsstat;
202	op_wfsstat				*wfsstat;
203	op_select				*select;
204	op_deselect				*deselect;
205	op_open_indexdir		*open_indexdir;
206	op_close_indexdir		*close_indexdir;
207	op_free_cookie			*free_indexdircookie;
208	op_rewind_indexdir		*rewind_indexdir;
209	op_read_indexdir		*read_indexdir;
210	op_create_index			*create_index;
211	op_remove_index			*remove_index;
212	op_rename_index			*rename_index;
213	op_stat_index			*stat_index;
214	op_open_attrdir			*open_attrdir;
215	op_close_attrdir		*close_attrdir;
216	op_free_cookie			*free_attrdircookie;
217	op_rewind_attrdir		*rewind_attrdir;
218	op_read_attrdir			*read_attrdir;
219	op_write_attr			*write_attr;
220	op_read_attr			*read_attr;
221	op_remove_attr			*remove_attr;
222	op_rename_attr			*rename_attr;
223	op_stat_attr			*stat_attr;
224	op_open_query			*open_query;
225	op_close_query			*close_query;
226	op_free_cookie			*free_querycookie;
227	op_read_query			*read_query;
228} vnode_ops;
229
230#ifdef __cplusplus
231	extern "C" {
232#endif
233
234extern _IMPEXP_KERNEL int	new_path(const char *path, char **copy);
235extern _IMPEXP_KERNEL void	free_path(char *p);
236
237extern _IMPEXP_KERNEL int	notify_listener(int op, nspace_id nsid,
238									vnode_id vnida,	vnode_id vnidb,
239									vnode_id vnidc, const char *name);
240extern _IMPEXP_KERNEL void	notify_select_event(selectsync *sync, uint32 ref);
241extern _IMPEXP_KERNEL int	send_notification(port_id port, long token,
242									ulong what, long op, nspace_id nsida,
243									nspace_id nsidb, vnode_id vnida,
244									vnode_id vnidb, vnode_id vnidc,
245									const char *name);
246extern _IMPEXP_KERNEL int	get_vnode(nspace_id nsid, vnode_id vnid, void **data);
247extern _IMPEXP_KERNEL int	put_vnode(nspace_id nsid, vnode_id vnid);
248extern _IMPEXP_KERNEL int	new_vnode(nspace_id nsid, vnode_id vnid, void *data);
249extern _IMPEXP_KERNEL int	remove_vnode(nspace_id nsid, vnode_id vnid);
250extern _IMPEXP_KERNEL int	unremove_vnode(nspace_id nsid, vnode_id vnid);
251extern _IMPEXP_KERNEL int	is_vnode_removed(nspace_id nsid, vnode_id vnid);
252
253
254extern _EXPORT vnode_ops	fs_entry;
255extern _EXPORT int32		api_version;
256
257#ifdef __cplusplus
258	}	// extern "C"
259#endif
260
261#endif
262