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