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