1/*
2   Unix SMB/CIFS implementation.
3   VFS structures and parameters
4   Copyright (C) Jeremy Allison                         1999-2005
5   Copyright (C) Tim Potter				1999
6   Copyright (C) Alexander Bokovoy			2002-2005
7   Copyright (C) Stefan (metze) Metzmacher		2003
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 2 of the License, or
12   (at your option) any later version.
13
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19   You should have received a copy of the GNU General Public License
20   along with this program; if not, write to the Free Software
21   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22
23   This work was sponsored by Optifacio Software Services, Inc.
24*/
25
26#ifndef _VFS_H
27#define _VFS_H
28
29/* Avoid conflict with an AIX include file */
30
31#ifdef vfs_ops
32#undef vfs_ops
33#endif
34
35/*
36 * As we're now (thanks Andrew ! :-) using file_structs and connection
37 * structs in the vfs - then anyone writing a vfs must include includes.h...
38 */
39
40/*
41 * This next constant specifies the version number of the VFS interface
42 * this smbd will load. Increment this if *ANY* changes are made to the
43 * vfs_ops below. JRA.
44 *
45 * If you change anything here, please also update modules/vfs_full_audit.c.
46 * VL.
47 */
48
49/* Changed to version 2 for CIFS UNIX extensions (mknod and link added). JRA. */
50/* Changed to version 3 for POSIX acl extensions. JRA. */
51/* Changed to version 4 for cascaded VFS interface. Alexander Bokovoy. */
52/* Changed to version 5 for sendfile addition. JRA. */
53/* Changed to version 6 for the new module system, fixed cascading and quota functions. --metze */
54/* Changed to version 7 to include the get_nt_acl info parameter. JRA. */
55/* Changed to version 8 includes EA calls. JRA. */
56/* Changed to version 9 to include the get_shadow_data call. --metze */
57/* Changed to version 10 to include pread/pwrite calls. */
58/* Changed to version 11 to include seekdir/telldir/rewinddir calls. JRA */
59/* Changed to version 12 to add mask and attributes to opendir(). JRA
60   Also include aio calls. JRA. */
61/* Changed to version 13 as the internal structure of files_struct has changed. JRA */
62/* Changed to version 14 as we had to change DIR to SMB_STRUCT_DIR. JRA */
63/* Changed to version 15 as we added the statvfs call. JRA */
64/* Changed to version 16 as we added the getlock call. JRA */
65/* Changed to version 17 as we removed redundant connection_struct parameters. --jpeach */
66/* Changed to version 18 to add fsp parameter to the open call -- jpeach
67   Also include kernel_flock call - jmcd */
68/* Changed to version 19, kernel change notify has been merged
69   Also included linux setlease call - jmcd */
70/* Changed to version 20, use ntimes call instead of utime (greater
71 * timestamp resolition. JRA. */
72/* Changed to version21 to add chflags operation -- jpeach */
73#define SMB_VFS_INTERFACE_VERSION 21
74
75
76/* to bug old modules which are trying to compile with the old functions */
77#define vfs_init __ERROR_please_port_this_module_to_SMB_VFS_INTERFACE_VERSION_8_donot_use_vfs_init_anymore(void) { __ERROR_please_port_this_module_to_SMB_VFS_INTERFACE_VERSION_8_donot_use_vfs_init_anymore };
78#define lp_parm_string __ERROR_please_port_lp_parm_string_to_lp_parm_const_string_or_lp_parm_talloc_string { \
79  __ERROR_please_port_lp_parm_string_to_lp_parm_const_string_or_lp_parm_talloc_string };
80#define lp_vfs_options __ERROR_please_donot_use_lp_vfs_options_anymore_use_lp_parm_xxxx_functions_instead { \
81  __ERROR_please_donot_use_lp_vfs_options_anymore_use_lp_parm_xxxx_functions_instead };
82
83/*
84    All intercepted VFS operations must be declared as static functions inside module source
85    in order to keep smbd namespace unpolluted. See source of audit, extd_audit, fake_perms and recycle
86    example VFS modules for more details.
87*/
88
89/* VFS operations structure */
90
91struct vfs_handle_struct;
92struct connection_struct;
93struct files_struct;
94struct security_descriptor_info;
95struct vfs_statvfs_struct;
96
97/*
98    Available VFS operations. These values must be in sync with vfs_ops struct
99    (struct vfs_fn_pointers and struct vfs_handle_pointers inside of struct vfs_ops).
100    In particular, if new operations are added to vfs_ops, appropriate constants
101    should be added to vfs_op_type so that order of them kept same as in vfs_ops.
102*/
103
104typedef enum _vfs_op_type {
105	SMB_VFS_OP_NOOP = -1,
106
107	/* Disk operations */
108
109	SMB_VFS_OP_CONNECT = 0,
110	SMB_VFS_OP_DISCONNECT,
111	SMB_VFS_OP_DISK_FREE,
112	SMB_VFS_OP_GET_QUOTA,
113	SMB_VFS_OP_SET_QUOTA,
114	SMB_VFS_OP_GET_SHADOW_COPY_DATA,
115	SMB_VFS_OP_STATVFS,
116
117	/* Directory operations */
118
119	SMB_VFS_OP_OPENDIR,
120	SMB_VFS_OP_READDIR,
121	SMB_VFS_OP_SEEKDIR,
122	SMB_VFS_OP_TELLDIR,
123	SMB_VFS_OP_REWINDDIR,
124	SMB_VFS_OP_MKDIR,
125	SMB_VFS_OP_RMDIR,
126	SMB_VFS_OP_CLOSEDIR,
127
128	/* File operations */
129
130	SMB_VFS_OP_OPEN,
131	SMB_VFS_OP_CLOSE,
132	SMB_VFS_OP_READ,
133	SMB_VFS_OP_PREAD,
134	SMB_VFS_OP_WRITE,
135	SMB_VFS_OP_PWRITE,
136	SMB_VFS_OP_LSEEK,
137	SMB_VFS_OP_SENDFILE,
138	SMB_VFS_OP_RENAME,
139	SMB_VFS_OP_FSYNC,
140	SMB_VFS_OP_STAT,
141	SMB_VFS_OP_FSTAT,
142	SMB_VFS_OP_LSTAT,
143	SMB_VFS_OP_UNLINK,
144	SMB_VFS_OP_CHMOD,
145	SMB_VFS_OP_FCHMOD,
146	SMB_VFS_OP_CHOWN,
147	SMB_VFS_OP_FCHOWN,
148	SMB_VFS_OP_CHDIR,
149	SMB_VFS_OP_GETWD,
150	SMB_VFS_OP_NTIMES,
151	SMB_VFS_OP_FTRUNCATE,
152	SMB_VFS_OP_LOCK,
153	SMB_VFS_OP_KERNEL_FLOCK,
154	SMB_VFS_OP_LINUX_SETLEASE,
155	SMB_VFS_OP_GETLOCK,
156	SMB_VFS_OP_SYMLINK,
157	SMB_VFS_OP_READLINK,
158	SMB_VFS_OP_LINK,
159	SMB_VFS_OP_MKNOD,
160	SMB_VFS_OP_REALPATH,
161	SMB_VFS_OP_NOTIFY_WATCH,
162	SMB_VFS_OP_CHFLAGS,
163
164	/* NT ACL operations. */
165
166	SMB_VFS_OP_FGET_NT_ACL,
167	SMB_VFS_OP_GET_NT_ACL,
168	SMB_VFS_OP_FSET_NT_ACL,
169	SMB_VFS_OP_SET_NT_ACL,
170
171	/* POSIX ACL operations. */
172
173	SMB_VFS_OP_CHMOD_ACL,
174	SMB_VFS_OP_FCHMOD_ACL,
175
176	SMB_VFS_OP_SYS_ACL_GET_ENTRY,
177	SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE,
178	SMB_VFS_OP_SYS_ACL_GET_PERMSET,
179	SMB_VFS_OP_SYS_ACL_GET_QUALIFIER,
180	SMB_VFS_OP_SYS_ACL_GET_FILE,
181	SMB_VFS_OP_SYS_ACL_GET_FD,
182	SMB_VFS_OP_SYS_ACL_CLEAR_PERMS,
183	SMB_VFS_OP_SYS_ACL_ADD_PERM,
184	SMB_VFS_OP_SYS_ACL_TO_TEXT,
185	SMB_VFS_OP_SYS_ACL_INIT,
186	SMB_VFS_OP_SYS_ACL_CREATE_ENTRY,
187	SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE,
188	SMB_VFS_OP_SYS_ACL_SET_QUALIFIER,
189	SMB_VFS_OP_SYS_ACL_SET_PERMSET,
190	SMB_VFS_OP_SYS_ACL_VALID,
191	SMB_VFS_OP_SYS_ACL_SET_FILE,
192	SMB_VFS_OP_SYS_ACL_SET_FD,
193	SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE,
194	SMB_VFS_OP_SYS_ACL_GET_PERM,
195	SMB_VFS_OP_SYS_ACL_FREE_TEXT,
196	SMB_VFS_OP_SYS_ACL_FREE_ACL,
197	SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER,
198
199	/* EA operations. */
200	SMB_VFS_OP_GETXATTR,
201	SMB_VFS_OP_LGETXATTR,
202	SMB_VFS_OP_FGETXATTR,
203	SMB_VFS_OP_LISTXATTR,
204	SMB_VFS_OP_LLISTXATTR,
205	SMB_VFS_OP_FLISTXATTR,
206	SMB_VFS_OP_REMOVEXATTR,
207	SMB_VFS_OP_LREMOVEXATTR,
208	SMB_VFS_OP_FREMOVEXATTR,
209	SMB_VFS_OP_SETXATTR,
210	SMB_VFS_OP_LSETXATTR,
211	SMB_VFS_OP_FSETXATTR,
212
213	/* aio operations */
214	SMB_VFS_OP_AIO_READ,
215	SMB_VFS_OP_AIO_WRITE,
216	SMB_VFS_OP_AIO_RETURN,
217	SMB_VFS_OP_AIO_CANCEL,
218	SMB_VFS_OP_AIO_ERROR,
219	SMB_VFS_OP_AIO_FSYNC,
220	SMB_VFS_OP_AIO_SUSPEND,
221
222	/* This should always be last enum value */
223
224	SMB_VFS_OP_LAST
225} vfs_op_type;
226
227/*
228    Please keep vfs_op_type, struct vfs_fn_pointers and struct vfs_handles_pointers in sync.
229*/
230struct vfs_ops {
231	struct vfs_fn_pointers {
232		/* Disk operations */
233
234		int (*connect_fn)(struct vfs_handle_struct *handle, const char *service, const char *user);
235		void (*disconnect)(struct vfs_handle_struct *handle);
236		SMB_BIG_UINT (*disk_free)(struct vfs_handle_struct *handle, const char *path, BOOL small_query, SMB_BIG_UINT *bsize,
237			SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize);
238		int (*get_quota)(struct vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *qt);
239		int (*set_quota)(struct vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *qt);
240		int (*get_shadow_copy_data)(struct vfs_handle_struct *handle, struct files_struct *fsp, SHADOW_COPY_DATA *shadow_copy_data, BOOL labels);
241		int (*statvfs)(struct vfs_handle_struct *handle, const char *path, struct vfs_statvfs_struct *statbuf);
242
243		/* Directory operations */
244
245		SMB_STRUCT_DIR *(*opendir)(struct vfs_handle_struct *handle, const char *fname, const char *mask, uint32 attributes);
246		SMB_STRUCT_DIRENT *(*readdir)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp);
247		void (*seekdir)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp, long offset);
248		long (*telldir)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp);
249		void (*rewind_dir)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp);
250		int (*mkdir)(struct vfs_handle_struct *handle, const char *path, mode_t mode);
251		int (*rmdir)(struct vfs_handle_struct *handle, const char *path);
252		int (*closedir)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dir);
253
254		/* File operations */
255
256		int (*open)(struct vfs_handle_struct *handle, const char *fname, files_struct *fsp, int flags, mode_t mode);
257		int (*close_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd);
258		ssize_t (*read)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, void *data, size_t n);
259		ssize_t (*pread)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, void *data, size_t n, SMB_OFF_T offset);
260		ssize_t (*write)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, const void *data, size_t n);
261		ssize_t (*pwrite)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, const void *data, size_t n, SMB_OFF_T offset);
262		SMB_OFF_T (*lseek)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, SMB_OFF_T offset, int whence);
263		ssize_t (*sendfile)(struct vfs_handle_struct *handle, int tofd, files_struct *fsp, int fromfd, const DATA_BLOB *header, SMB_OFF_T offset, size_t count);
264		int (*rename)(struct vfs_handle_struct *handle, const char *oldname, const char *newname);
265		int (*fsync)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd);
266		int (*stat)(struct vfs_handle_struct *handle, const char *fname, SMB_STRUCT_STAT *sbuf);
267		int (*fstat)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, SMB_STRUCT_STAT *sbuf);
268		int (*lstat)(struct vfs_handle_struct *handle, const char *path, SMB_STRUCT_STAT *sbuf);
269		int (*unlink)(struct vfs_handle_struct *handle, const char *path);
270		int (*chmod)(struct vfs_handle_struct *handle, const char *path, mode_t mode);
271		int (*fchmod)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, mode_t mode);
272		int (*chown)(struct vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid);
273		int (*fchown)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, uid_t uid, gid_t gid);
274		int (*chdir)(struct vfs_handle_struct *handle, const char *path);
275		char *(*getwd)(struct vfs_handle_struct *handle, char *buf);
276		int (*ntimes)(struct vfs_handle_struct *handle, const char *path, const struct timespec ts[2]);
277		int (*ftruncate)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, SMB_OFF_T offset);
278		BOOL (*lock)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type);
279		int (*kernel_flock)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, uint32 share_mode);
280		int (*linux_setlease)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, int leasetype);
281		BOOL (*getlock)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, SMB_OFF_T *poffset, SMB_OFF_T *pcount, int *ptype, pid_t *ppid);
282		int (*symlink)(struct vfs_handle_struct *handle, const char *oldpath, const char *newpath);
283		int (*readlink)(struct vfs_handle_struct *handle, const char *path, char *buf, size_t bufsiz);
284		int (*link)(struct vfs_handle_struct *handle, const char *oldpath, const char *newpath);
285		int (*mknod)(struct vfs_handle_struct *handle, const char *path, mode_t mode, SMB_DEV_T dev);
286		char *(*realpath)(struct vfs_handle_struct *handle, const char *path, char *resolved_path);
287		NTSTATUS (*notify_watch)(struct vfs_handle_struct *handle,
288					 struct sys_notify_context *ctx,
289					 struct notify_entry *e,
290					 void (*callback)(struct sys_notify_context *ctx,
291							  void *private_data,
292							  struct notify_event *ev),
293					 void *private_data, void *handle_p);
294		int (*chflags)(struct vfs_handle_struct *handle, const char *path, uint flags);
295
296		/* NT ACL operations. */
297
298		size_t (*fget_nt_acl)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd,  uint32 security_info, struct security_descriptor_info **ppdesc);
299		size_t (*get_nt_acl)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name,  uint32 security_info, struct security_descriptor_info **ppdesc);
300		BOOL (*fset_nt_acl)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, uint32 security_info_sent, struct security_descriptor_info *psd);
301		BOOL (*set_nt_acl)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, uint32 security_info_sent, struct security_descriptor_info *psd);
302
303		/* POSIX ACL operations. */
304
305		int (*chmod_acl)(struct vfs_handle_struct *handle, const char *name, mode_t mode);
306		int (*fchmod_acl)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, mode_t mode);
307
308		int (*sys_acl_get_entry)(struct vfs_handle_struct *handle, SMB_ACL_T theacl, int entry_id, SMB_ACL_ENTRY_T *entry_p);
309		int (*sys_acl_get_tag_type)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p);
310		int (*sys_acl_get_permset)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d, SMB_ACL_PERMSET_T *permset_p);
311		void * (*sys_acl_get_qualifier)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d);
312		SMB_ACL_T (*sys_acl_get_file)(struct vfs_handle_struct *handle, const char *path_p, SMB_ACL_TYPE_T type);
313		SMB_ACL_T (*sys_acl_get_fd)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd);
314		int (*sys_acl_clear_perms)(struct vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset);
315		int (*sys_acl_add_perm)(struct vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm);
316		char * (*sys_acl_to_text)(struct vfs_handle_struct *handle, SMB_ACL_T theacl, ssize_t *plen);
317		SMB_ACL_T (*sys_acl_init)(struct vfs_handle_struct *handle, int count);
318		int (*sys_acl_create_entry)(struct vfs_handle_struct *handle, SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry);
319		int (*sys_acl_set_tag_type)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tagtype);
320		int (*sys_acl_set_qualifier)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, void *qual);
321		int (*sys_acl_set_permset)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, SMB_ACL_PERMSET_T permset);
322		int (*sys_acl_valid)(struct vfs_handle_struct *handle, SMB_ACL_T theacl );
323		int (*sys_acl_set_file)(struct vfs_handle_struct *handle, const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl);
324		int (*sys_acl_set_fd)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, SMB_ACL_T theacl);
325		int (*sys_acl_delete_def_file)(struct vfs_handle_struct *handle, const char *path);
326		int (*sys_acl_get_perm)(struct vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm);
327		int (*sys_acl_free_text)(struct vfs_handle_struct *handle, char *text);
328		int (*sys_acl_free_acl)(struct vfs_handle_struct *handle, SMB_ACL_T posix_acl);
329		int (*sys_acl_free_qualifier)(struct vfs_handle_struct *handle, void *qualifier, SMB_ACL_TAG_T tagtype);
330
331		/* EA operations. */
332		ssize_t (*getxattr)(struct vfs_handle_struct *handle,const char *path, const char *name, void *value, size_t size);
333		ssize_t (*lgetxattr)(struct vfs_handle_struct *handle,const char *path, const char *name, void *value, size_t size);
334		ssize_t (*fgetxattr)(struct vfs_handle_struct *handle, struct files_struct *fsp,int fd, const char *name, void *value, size_t size);
335		ssize_t (*listxattr)(struct vfs_handle_struct *handle, const char *path, char *list, size_t size);
336		ssize_t (*llistxattr)(struct vfs_handle_struct *handle, const char *path, char *list, size_t size);
337		ssize_t (*flistxattr)(struct vfs_handle_struct *handle, struct files_struct *fsp,int fd, char *list, size_t size);
338		int (*removexattr)(struct vfs_handle_struct *handle, const char *path, const char *name);
339		int (*lremovexattr)(struct vfs_handle_struct *handle, const char *path, const char *name);
340		int (*fremovexattr)(struct vfs_handle_struct *handle, struct files_struct *fsp,int filedes, const char *name);
341		int (*setxattr)(struct vfs_handle_struct *handle, const char *path, const char *name, const void *value, size_t size, int flags);
342		int (*lsetxattr)(struct vfs_handle_struct *handle, const char *path, const char *name, const void *value, size_t size, int flags);
343		int (*fsetxattr)(struct vfs_handle_struct *handle, struct files_struct *fsp,int filedes, const char *name, const void *value, size_t size, int flags);
344
345		/* aio operations */
346		int (*aio_read)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
347		int (*aio_write)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
348		ssize_t (*aio_return_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
349		int (*aio_cancel)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, SMB_STRUCT_AIOCB *aiocb);
350		int (*aio_error_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
351		int (*aio_fsync)(struct vfs_handle_struct *handle, struct files_struct *fsp, int op, SMB_STRUCT_AIOCB *aiocb);
352		int (*aio_suspend)(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_AIOCB * const aiocb[], int n, const struct timespec *timeout);
353
354	} ops;
355
356	struct vfs_handles_pointers {
357		/* Disk operations */
358
359		struct vfs_handle_struct *connect_hnd;
360		struct vfs_handle_struct *disconnect;
361		struct vfs_handle_struct *disk_free;
362		struct vfs_handle_struct *get_quota;
363		struct vfs_handle_struct *set_quota;
364		struct vfs_handle_struct *get_shadow_copy_data;
365		struct vfs_handle_struct *statvfs;
366
367		/* Directory operations */
368
369		struct vfs_handle_struct *opendir;
370		struct vfs_handle_struct *readdir;
371		struct vfs_handle_struct *seekdir;
372		struct vfs_handle_struct *telldir;
373		struct vfs_handle_struct *rewind_dir;
374		struct vfs_handle_struct *mkdir;
375		struct vfs_handle_struct *rmdir;
376		struct vfs_handle_struct *closedir;
377
378		/* File operations */
379
380		struct vfs_handle_struct *open;
381		struct vfs_handle_struct *close_hnd;
382		struct vfs_handle_struct *read;
383		struct vfs_handle_struct *pread;
384		struct vfs_handle_struct *write;
385		struct vfs_handle_struct *pwrite;
386		struct vfs_handle_struct *lseek;
387		struct vfs_handle_struct *sendfile;
388		struct vfs_handle_struct *rename;
389		struct vfs_handle_struct *fsync;
390		struct vfs_handle_struct *stat;
391		struct vfs_handle_struct *fstat;
392		struct vfs_handle_struct *lstat;
393		struct vfs_handle_struct *unlink;
394		struct vfs_handle_struct *chmod;
395		struct vfs_handle_struct *fchmod;
396		struct vfs_handle_struct *chown;
397		struct vfs_handle_struct *fchown;
398		struct vfs_handle_struct *chdir;
399		struct vfs_handle_struct *getwd;
400		struct vfs_handle_struct *ntimes;
401		struct vfs_handle_struct *ftruncate;
402		struct vfs_handle_struct *lock;
403		struct vfs_handle_struct *kernel_flock;
404		struct vfs_handle_struct *linux_setlease;
405		struct vfs_handle_struct *getlock;
406		struct vfs_handle_struct *symlink;
407		struct vfs_handle_struct *readlink;
408		struct vfs_handle_struct *link;
409		struct vfs_handle_struct *mknod;
410		struct vfs_handle_struct *realpath;
411		struct vfs_handle_struct *notify_watch;
412		struct vfs_handle_struct *chflags;
413
414		/* NT ACL operations. */
415
416		struct vfs_handle_struct *fget_nt_acl;
417		struct vfs_handle_struct *get_nt_acl;
418		struct vfs_handle_struct *fset_nt_acl;
419		struct vfs_handle_struct *set_nt_acl;
420
421		/* POSIX ACL operations. */
422
423		struct vfs_handle_struct *chmod_acl;
424		struct vfs_handle_struct *fchmod_acl;
425
426		struct vfs_handle_struct *sys_acl_get_entry;
427		struct vfs_handle_struct *sys_acl_get_tag_type;
428		struct vfs_handle_struct *sys_acl_get_permset;
429		struct vfs_handle_struct *sys_acl_get_qualifier;
430		struct vfs_handle_struct *sys_acl_get_file;
431		struct vfs_handle_struct *sys_acl_get_fd;
432		struct vfs_handle_struct *sys_acl_clear_perms;
433		struct vfs_handle_struct *sys_acl_add_perm;
434		struct vfs_handle_struct *sys_acl_to_text;
435		struct vfs_handle_struct *sys_acl_init;
436		struct vfs_handle_struct *sys_acl_create_entry;
437		struct vfs_handle_struct *sys_acl_set_tag_type;
438		struct vfs_handle_struct *sys_acl_set_qualifier;
439		struct vfs_handle_struct *sys_acl_set_permset;
440		struct vfs_handle_struct *sys_acl_valid;
441		struct vfs_handle_struct *sys_acl_set_file;
442		struct vfs_handle_struct *sys_acl_set_fd;
443		struct vfs_handle_struct *sys_acl_delete_def_file;
444		struct vfs_handle_struct *sys_acl_get_perm;
445		struct vfs_handle_struct *sys_acl_free_text;
446		struct vfs_handle_struct *sys_acl_free_acl;
447		struct vfs_handle_struct *sys_acl_free_qualifier;
448
449		/* EA operations. */
450		struct vfs_handle_struct *getxattr;
451		struct vfs_handle_struct *lgetxattr;
452		struct vfs_handle_struct *fgetxattr;
453		struct vfs_handle_struct *listxattr;
454		struct vfs_handle_struct *llistxattr;
455		struct vfs_handle_struct *flistxattr;
456		struct vfs_handle_struct *removexattr;
457		struct vfs_handle_struct *lremovexattr;
458		struct vfs_handle_struct *fremovexattr;
459		struct vfs_handle_struct *setxattr;
460		struct vfs_handle_struct *lsetxattr;
461		struct vfs_handle_struct *fsetxattr;
462
463		/* aio operations */
464		struct vfs_handle_struct *aio_read;
465		struct vfs_handle_struct *aio_write;
466		struct vfs_handle_struct *aio_return;
467		struct vfs_handle_struct *aio_cancel;
468		struct vfs_handle_struct *aio_error;
469		struct vfs_handle_struct *aio_fsync;
470		struct vfs_handle_struct *aio_suspend;
471	} handles;
472};
473
474/*
475    Possible VFS operation layers (per-operation)
476
477    These values are used by VFS subsystem when building vfs_ops for connection
478    from multiple VFS modules. Internally, Samba differentiates only opaque and
479    transparent layers at this process. Other types are used for providing better
480    diagnosing facilities.
481
482    Most modules will provide transparent layers. Opaque layer is for modules
483    which implement actual file system calls (like DB-based VFS). For example,
484    default POSIX VFS which is built in into Samba is an opaque VFS module.
485
486    Other layer types (audit, splitter, scanner) were designed to provide different
487    degree of transparency and for diagnosing VFS module behaviour.
488
489    Each module can implement several layers at the same time provided that only
490    one layer is used per each operation.
491
492*/
493
494typedef enum _vfs_op_layer {
495	SMB_VFS_LAYER_NOOP = -1,	/* - For using in VFS module to indicate end of array */
496					/*   of operations description */
497	SMB_VFS_LAYER_OPAQUE = 0,	/* - Final level, does not call anything beyond itself */
498	SMB_VFS_LAYER_TRANSPARENT,	/* - Normal operation, calls underlying layer after */
499					/*   possibly changing passed data */
500	SMB_VFS_LAYER_LOGGER,		/* - Logs data, calls underlying layer, logging may not */
501					/*   use Samba VFS */
502	SMB_VFS_LAYER_SPLITTER,		/* - Splits operation, calls underlying layer _and_ own facility, */
503					/*   then combines result */
504	SMB_VFS_LAYER_SCANNER		/* - Checks data and possibly initiates additional */
505					/*   file activity like logging to files _inside_ samba VFS */
506} vfs_op_layer;
507
508/*
509    VFS operation description. Each VFS module registers an array of vfs_op_tuple to VFS subsystem,
510    which describes all operations this module is willing to intercept.
511    VFS subsystem initializes then the conn->vfs_ops and conn->vfs_opaque_ops structs
512    using this information.
513*/
514
515typedef struct vfs_op_tuple {
516	void* op;
517	vfs_op_type type;
518	vfs_op_layer layer;
519} vfs_op_tuple;
520
521
522typedef struct vfs_handle_struct {
523	struct vfs_handle_struct  *next, *prev;
524	const char *param;
525	struct vfs_ops vfs_next;
526	struct connection_struct *conn;
527	void *data;
528	void (*free_data)(void **data);
529} vfs_handle_struct;
530
531
532typedef struct vfs_statvfs_struct {
533	/* For undefined recommended transfer size return -1 in that field */
534	uint32 OptimalTransferSize;  /* bsize on some os, iosize on other os */
535	uint32 BlockSize;
536
537	/*
538	 The next three fields are in terms of the block size.
539	 (above). If block size is unknown, 4096 would be a
540	 reasonable block size for a server to report.
541	 Note that returning the blocks/blocksavail removes need
542	 to make a second call (to QFSInfo level 0x103 to get this info.
543	 UserBlockAvail is typically less than or equal to BlocksAvail,
544	 if no distinction is made return the same value in each.
545	*/
546
547	SMB_BIG_UINT TotalBlocks;
548	SMB_BIG_UINT BlocksAvail;       /* bfree */
549	SMB_BIG_UINT UserBlocksAvail;   /* bavail */
550
551	/* For undefined Node fields or FSID return -1 */
552	SMB_BIG_UINT TotalFileNodes;
553	SMB_BIG_UINT FreeFileNodes;
554	SMB_BIG_UINT FsIdentifier;   /* fsid */
555	/* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */
556	/* NB flags can come from FILE_SYSTEM_DEVICE_INFO call   */
557} vfs_statvfs_struct;
558
559#define VFS_ADD_FSP_EXTENSION(handle, fsp, type) \
560    vfs_add_fsp_extension_notype(handle, (fsp), sizeof(type))
561
562#define VFS_FETCH_FSP_EXTENSION(handle, fsp) \
563    vfs_fetch_fsp_extension(handle, (fsp))
564
565#define VFS_REMOVE_FSP_EXTENSION(handle, fsp) \
566    vfs_remove_fsp_extension((handle), (fsp))
567
568#define SMB_VFS_HANDLE_GET_DATA(handle, datap, type, ret) { \
569	if (!(handle)||((datap=(type *)(handle)->data)==NULL)) { \
570		DEBUG(0,("%s() failed to get vfs_handle->data!\n",FUNCTION_MACRO)); \
571		ret; \
572	} \
573}
574
575#define SMB_VFS_HANDLE_SET_DATA(handle, datap, free_fn, type, ret) { \
576	if (!(handle)) { \
577		DEBUG(0,("%s() failed to set handle->data!\n",FUNCTION_MACRO)); \
578		ret; \
579	} else { \
580		if ((handle)->free_data) { \
581			(handle)->free_data(&(handle)->data); \
582		} \
583		(handle)->data = (void *)datap; \
584		(handle)->free_data = free_fn; \
585	} \
586}
587
588#define SMB_VFS_HANDLE_FREE_DATA(handle) { \
589	if ((handle) && (handle)->free_data) { \
590		(handle)->free_data(&(handle)->data); \
591	} \
592}
593
594/* Check whether module-specific data handle was already allocated or not */
595#define SMB_VFS_HANDLE_TEST_DATA(handle)  ( !(handle) || !(handle)->data ? False : True )
596
597#define SMB_VFS_OP(x) ((void *) x)
598
599#define DEFAULT_VFS_MODULE_NAME "/[Default VFS]/"
600
601#include "vfs_macros.h"
602
603#endif /* _VFS_H */
604