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
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.
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.
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.
23
This work was sponsored by Optifacio Software Services, Inc.
29
/* Avoid conflict with an AIX include file */
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...
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
45
* If you change anything here, please also update modules/vfs_full_audit.c.
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
#define SMB_VFS_INTERFACE_VERSION 18
70
/* to bug old modules which are trying to compile with the old functions */
71
#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 };
72
#define lp_parm_string __ERROR_please_port_lp_parm_string_to_lp_parm_const_string_or_lp_parm_talloc_string { \
73
__ERROR_please_port_lp_parm_string_to_lp_parm_const_string_or_lp_parm_talloc_string };
74
#define lp_vfs_options __ERROR_please_donot_use_lp_vfs_options_anymore_use_lp_parm_xxxx_functions_instead { \
75
__ERROR_please_donot_use_lp_vfs_options_anymore_use_lp_parm_xxxx_functions_instead };
78
All intercepted VFS operations must be declared as static functions inside module source
79
in order to keep smbd namespace unpolluted. See source of audit, extd_audit, fake_perms and recycle
80
example VFS modules for more details.
83
/* VFS operations structure */
85
struct vfs_handle_struct;
86
struct connection_struct;
88
struct security_descriptor_info;
89
struct vfs_statvfs_struct;
92
Available VFS operations. These values must be in sync with vfs_ops struct
93
(struct vfs_fn_pointers and struct vfs_handle_pointers inside of struct vfs_ops).
94
In particular, if new operations are added to vfs_ops, appropriate constants
95
should be added to vfs_op_type so that order of them kept same as in vfs_ops.
98
typedef enum _vfs_op_type {
101
/* Disk operations */
103
SMB_VFS_OP_CONNECT = 0,
104
SMB_VFS_OP_DISCONNECT,
105
SMB_VFS_OP_DISK_FREE,
106
SMB_VFS_OP_GET_QUOTA,
107
SMB_VFS_OP_SET_QUOTA,
108
SMB_VFS_OP_GET_SHADOW_COPY_DATA,
111
/* Directory operations */
117
SMB_VFS_OP_REWINDDIR,
122
/* File operations */
145
SMB_VFS_OP_FTRUNCATE,
154
/* NT ACL operations. */
156
SMB_VFS_OP_FGET_NT_ACL,
157
SMB_VFS_OP_GET_NT_ACL,
158
SMB_VFS_OP_FSET_NT_ACL,
159
SMB_VFS_OP_SET_NT_ACL,
161
/* POSIX ACL operations. */
163
SMB_VFS_OP_CHMOD_ACL,
164
SMB_VFS_OP_FCHMOD_ACL,
166
SMB_VFS_OP_SYS_ACL_GET_ENTRY,
167
SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE,
168
SMB_VFS_OP_SYS_ACL_GET_PERMSET,
169
SMB_VFS_OP_SYS_ACL_GET_QUALIFIER,
170
SMB_VFS_OP_SYS_ACL_GET_FILE,
171
SMB_VFS_OP_SYS_ACL_GET_FD,
172
SMB_VFS_OP_SYS_ACL_CLEAR_PERMS,
173
SMB_VFS_OP_SYS_ACL_ADD_PERM,
174
SMB_VFS_OP_SYS_ACL_TO_TEXT,
175
SMB_VFS_OP_SYS_ACL_INIT,
176
SMB_VFS_OP_SYS_ACL_CREATE_ENTRY,
177
SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE,
178
SMB_VFS_OP_SYS_ACL_SET_QUALIFIER,
179
SMB_VFS_OP_SYS_ACL_SET_PERMSET,
180
SMB_VFS_OP_SYS_ACL_VALID,
181
SMB_VFS_OP_SYS_ACL_SET_FILE,
182
SMB_VFS_OP_SYS_ACL_SET_FD,
183
SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE,
184
SMB_VFS_OP_SYS_ACL_GET_PERM,
185
SMB_VFS_OP_SYS_ACL_FREE_TEXT,
186
SMB_VFS_OP_SYS_ACL_FREE_ACL,
187
SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER,
191
SMB_VFS_OP_LGETXATTR,
192
SMB_VFS_OP_FGETXATTR,
193
SMB_VFS_OP_LISTXATTR,
194
SMB_VFS_OP_LLISTXATTR,
195
SMB_VFS_OP_FLISTXATTR,
196
SMB_VFS_OP_REMOVEXATTR,
197
SMB_VFS_OP_LREMOVEXATTR,
198
SMB_VFS_OP_FREMOVEXATTR,
200
SMB_VFS_OP_LSETXATTR,
201
SMB_VFS_OP_FSETXATTR,
205
SMB_VFS_OP_AIO_WRITE,
206
SMB_VFS_OP_AIO_RETURN,
207
SMB_VFS_OP_AIO_CANCEL,
208
SMB_VFS_OP_AIO_ERROR,
209
SMB_VFS_OP_AIO_FSYNC,
210
SMB_VFS_OP_AIO_SUSPEND,
212
/* This should always be last enum value */
218
Please keep vfs_op_type, struct vfs_fn_pointers and struct vfs_handles_pointers in sync.
221
struct vfs_fn_pointers {
222
/* Disk operations */
224
int (*connect_fn)(struct vfs_handle_struct *handle, const char *service, const char *user);
225
void (*disconnect)(struct vfs_handle_struct *handle);
226
SMB_BIG_UINT (*disk_free)(struct vfs_handle_struct *handle, const char *path, BOOL small_query, SMB_BIG_UINT *bsize,
227
SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize);
228
int (*get_quota)(struct vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *qt);
229
int (*set_quota)(struct vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *qt);
230
int (*get_shadow_copy_data)(struct vfs_handle_struct *handle, struct files_struct *fsp, SHADOW_COPY_DATA *shadow_copy_data, BOOL labels);
231
int (*statvfs)(struct vfs_handle_struct *handle, const char *path, struct vfs_statvfs_struct *statbuf);
233
/* Directory operations */
235
SMB_STRUCT_DIR *(*opendir)(struct vfs_handle_struct *handle, const char *fname, const char *mask, uint32 attributes);
236
SMB_STRUCT_DIRENT *(*readdir)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp);
237
void (*seekdir)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp, long offset);
238
long (*telldir)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp);
239
void (*rewind_dir)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp);
240
int (*mkdir)(struct vfs_handle_struct *handle, const char *path, mode_t mode);
241
int (*rmdir)(struct vfs_handle_struct *handle, const char *path);
242
int (*closedir)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dir);
244
/* File operations */
246
int (*open)(struct vfs_handle_struct *handle, const char *fname, files_struct *fsp, int flags, mode_t mode);
247
int (*close_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd);
248
ssize_t (*read)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, void *data, size_t n);
249
ssize_t (*pread)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, void *data, size_t n, SMB_OFF_T offset);
250
ssize_t (*write)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, const void *data, size_t n);
251
ssize_t (*pwrite)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, const void *data, size_t n, SMB_OFF_T offset);
252
SMB_OFF_T (*lseek)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, SMB_OFF_T offset, int whence);
253
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);
254
int (*rename)(struct vfs_handle_struct *handle, const char *oldname, const char *newname);
255
int (*fsync)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd);
256
int (*stat)(struct vfs_handle_struct *handle, const char *fname, SMB_STRUCT_STAT *sbuf);
257
int (*fstat)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, SMB_STRUCT_STAT *sbuf);
258
int (*lstat)(struct vfs_handle_struct *handle, const char *path, SMB_STRUCT_STAT *sbuf);
259
int (*unlink)(struct vfs_handle_struct *handle, const char *path);
260
int (*chmod)(struct vfs_handle_struct *handle, const char *path, mode_t mode);
261
int (*fchmod)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, mode_t mode);
262
int (*chown)(struct vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid);
263
int (*fchown)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, uid_t uid, gid_t gid);
264
int (*chdir)(struct vfs_handle_struct *handle, const char *path);
265
char *(*getwd)(struct vfs_handle_struct *handle, char *buf);
266
int (*utime)(struct vfs_handle_struct *handle, const char *path, struct utimbuf *times);
267
int (*ftruncate)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, SMB_OFF_T offset);
268
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);
269
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);
270
int (*symlink)(struct vfs_handle_struct *handle, const char *oldpath, const char *newpath);
271
int (*readlink)(struct vfs_handle_struct *handle, const char *path, char *buf, size_t bufsiz);
272
int (*link)(struct vfs_handle_struct *handle, const char *oldpath, const char *newpath);
273
int (*mknod)(struct vfs_handle_struct *handle, const char *path, mode_t mode, SMB_DEV_T dev);
274
char *(*realpath)(struct vfs_handle_struct *handle, const char *path, char *resolved_path);
276
/* NT ACL operations. */
278
size_t (*fget_nt_acl)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, uint32 security_info, struct security_descriptor_info **ppdesc);
279
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);
280
BOOL (*fset_nt_acl)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, uint32 security_info_sent, struct security_descriptor_info *psd);
281
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);
283
/* POSIX ACL operations. */
285
int (*chmod_acl)(struct vfs_handle_struct *handle, const char *name, mode_t mode);
286
int (*fchmod_acl)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, mode_t mode);
288
int (*sys_acl_get_entry)(struct vfs_handle_struct *handle, SMB_ACL_T theacl, int entry_id, SMB_ACL_ENTRY_T *entry_p);
289
int (*sys_acl_get_tag_type)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p);
290
int (*sys_acl_get_permset)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d, SMB_ACL_PERMSET_T *permset_p);
291
void * (*sys_acl_get_qualifier)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d);
292
SMB_ACL_T (*sys_acl_get_file)(struct vfs_handle_struct *handle, const char *path_p, SMB_ACL_TYPE_T type);
293
SMB_ACL_T (*sys_acl_get_fd)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd);
294
int (*sys_acl_clear_perms)(struct vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset);
295
int (*sys_acl_add_perm)(struct vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm);
296
char * (*sys_acl_to_text)(struct vfs_handle_struct *handle, SMB_ACL_T theacl, ssize_t *plen);
297
SMB_ACL_T (*sys_acl_init)(struct vfs_handle_struct *handle, int count);
298
int (*sys_acl_create_entry)(struct vfs_handle_struct *handle, SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry);
299
int (*sys_acl_set_tag_type)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tagtype);
300
int (*sys_acl_set_qualifier)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, void *qual);
301
int (*sys_acl_set_permset)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, SMB_ACL_PERMSET_T permset);
302
int (*sys_acl_valid)(struct vfs_handle_struct *handle, SMB_ACL_T theacl );
303
int (*sys_acl_set_file)(struct vfs_handle_struct *handle, const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl);
304
int (*sys_acl_set_fd)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, SMB_ACL_T theacl);
305
int (*sys_acl_delete_def_file)(struct vfs_handle_struct *handle, const char *path);
306
int (*sys_acl_get_perm)(struct vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm);
307
int (*sys_acl_free_text)(struct vfs_handle_struct *handle, char *text);
308
int (*sys_acl_free_acl)(struct vfs_handle_struct *handle, SMB_ACL_T posix_acl);
309
int (*sys_acl_free_qualifier)(struct vfs_handle_struct *handle, void *qualifier, SMB_ACL_TAG_T tagtype);
312
ssize_t (*getxattr)(struct vfs_handle_struct *handle,const char *path, const char *name, void *value, size_t size);
313
ssize_t (*lgetxattr)(struct vfs_handle_struct *handle,const char *path, const char *name, void *value, size_t size);
314
ssize_t (*fgetxattr)(struct vfs_handle_struct *handle, struct files_struct *fsp,int fd, const char *name, void *value, size_t size);
315
ssize_t (*listxattr)(struct vfs_handle_struct *handle, const char *path, char *list, size_t size);
316
ssize_t (*llistxattr)(struct vfs_handle_struct *handle, const char *path, char *list, size_t size);
317
ssize_t (*flistxattr)(struct vfs_handle_struct *handle, struct files_struct *fsp,int fd, char *list, size_t size);
318
int (*removexattr)(struct vfs_handle_struct *handle, const char *path, const char *name);
319
int (*lremovexattr)(struct vfs_handle_struct *handle, const char *path, const char *name);
320
int (*fremovexattr)(struct vfs_handle_struct *handle, struct files_struct *fsp,int filedes, const char *name);
321
int (*setxattr)(struct vfs_handle_struct *handle, const char *path, const char *name, const void *value, size_t size, int flags);
322
int (*lsetxattr)(struct vfs_handle_struct *handle, const char *path, const char *name, const void *value, size_t size, int flags);
323
int (*fsetxattr)(struct vfs_handle_struct *handle, struct files_struct *fsp,int filedes, const char *name, const void *value, size_t size, int flags);
326
int (*aio_read)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
327
int (*aio_write)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
328
ssize_t (*aio_return_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
329
int (*aio_cancel)(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, SMB_STRUCT_AIOCB *aiocb);
330
int (*aio_error_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
331
int (*aio_fsync)(struct vfs_handle_struct *handle, struct files_struct *fsp, int op, SMB_STRUCT_AIOCB *aiocb);
332
int (*aio_suspend)(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_AIOCB * const aiocb[], int n, const struct timespec *timeout);
336
struct vfs_handles_pointers {
337
/* Disk operations */
339
struct vfs_handle_struct *connect_hnd;
340
struct vfs_handle_struct *disconnect;
341
struct vfs_handle_struct *disk_free;
342
struct vfs_handle_struct *get_quota;
343
struct vfs_handle_struct *set_quota;
344
struct vfs_handle_struct *get_shadow_copy_data;
345
struct vfs_handle_struct *statvfs;
347
/* Directory operations */
349
struct vfs_handle_struct *opendir;
350
struct vfs_handle_struct *readdir;
351
struct vfs_handle_struct *seekdir;
352
struct vfs_handle_struct *telldir;
353
struct vfs_handle_struct *rewind_dir;
354
struct vfs_handle_struct *mkdir;
355
struct vfs_handle_struct *rmdir;
356
struct vfs_handle_struct *closedir;
358
/* File operations */
360
struct vfs_handle_struct *open;
361
struct vfs_handle_struct *close_hnd;
362
struct vfs_handle_struct *read;
363
struct vfs_handle_struct *pread;
364
struct vfs_handle_struct *write;
365
struct vfs_handle_struct *pwrite;
366
struct vfs_handle_struct *lseek;
367
struct vfs_handle_struct *sendfile;
368
struct vfs_handle_struct *rename;
369
struct vfs_handle_struct *fsync;
370
struct vfs_handle_struct *stat;
371
struct vfs_handle_struct *fstat;
372
struct vfs_handle_struct *lstat;
373
struct vfs_handle_struct *unlink;
374
struct vfs_handle_struct *chmod;
375
struct vfs_handle_struct *fchmod;
376
struct vfs_handle_struct *chown;
377
struct vfs_handle_struct *fchown;
378
struct vfs_handle_struct *chdir;
379
struct vfs_handle_struct *getwd;
380
struct vfs_handle_struct *utime;
381
struct vfs_handle_struct *ftruncate;
382
struct vfs_handle_struct *lock;
383
struct vfs_handle_struct *getlock;
384
struct vfs_handle_struct *symlink;
385
struct vfs_handle_struct *readlink;
386
struct vfs_handle_struct *link;
387
struct vfs_handle_struct *mknod;
388
struct vfs_handle_struct *realpath;
390
/* NT ACL operations. */
392
struct vfs_handle_struct *fget_nt_acl;
393
struct vfs_handle_struct *get_nt_acl;
394
struct vfs_handle_struct *fset_nt_acl;
395
struct vfs_handle_struct *set_nt_acl;
397
/* POSIX ACL operations. */
399
struct vfs_handle_struct *chmod_acl;
400
struct vfs_handle_struct *fchmod_acl;
402
struct vfs_handle_struct *sys_acl_get_entry;
403
struct vfs_handle_struct *sys_acl_get_tag_type;
404
struct vfs_handle_struct *sys_acl_get_permset;
405
struct vfs_handle_struct *sys_acl_get_qualifier;
406
struct vfs_handle_struct *sys_acl_get_file;
407
struct vfs_handle_struct *sys_acl_get_fd;
408
struct vfs_handle_struct *sys_acl_clear_perms;
409
struct vfs_handle_struct *sys_acl_add_perm;
410
struct vfs_handle_struct *sys_acl_to_text;
411
struct vfs_handle_struct *sys_acl_init;
412
struct vfs_handle_struct *sys_acl_create_entry;
413
struct vfs_handle_struct *sys_acl_set_tag_type;
414
struct vfs_handle_struct *sys_acl_set_qualifier;
415
struct vfs_handle_struct *sys_acl_set_permset;
416
struct vfs_handle_struct *sys_acl_valid;
417
struct vfs_handle_struct *sys_acl_set_file;
418
struct vfs_handle_struct *sys_acl_set_fd;
419
struct vfs_handle_struct *sys_acl_delete_def_file;
420
struct vfs_handle_struct *sys_acl_get_perm;
421
struct vfs_handle_struct *sys_acl_free_text;
422
struct vfs_handle_struct *sys_acl_free_acl;
423
struct vfs_handle_struct *sys_acl_free_qualifier;
426
struct vfs_handle_struct *getxattr;
427
struct vfs_handle_struct *lgetxattr;
428
struct vfs_handle_struct *fgetxattr;
429
struct vfs_handle_struct *listxattr;
430
struct vfs_handle_struct *llistxattr;
431
struct vfs_handle_struct *flistxattr;
432
struct vfs_handle_struct *removexattr;
433
struct vfs_handle_struct *lremovexattr;
434
struct vfs_handle_struct *fremovexattr;
435
struct vfs_handle_struct *setxattr;
436
struct vfs_handle_struct *lsetxattr;
437
struct vfs_handle_struct *fsetxattr;
440
struct vfs_handle_struct *aio_read;
441
struct vfs_handle_struct *aio_write;
442
struct vfs_handle_struct *aio_return;
443
struct vfs_handle_struct *aio_cancel;
444
struct vfs_handle_struct *aio_error;
445
struct vfs_handle_struct *aio_fsync;
446
struct vfs_handle_struct *aio_suspend;
451
Possible VFS operation layers (per-operation)
453
These values are used by VFS subsystem when building vfs_ops for connection
454
from multiple VFS modules. Internally, Samba differentiates only opaque and
455
transparent layers at this process. Other types are used for providing better
456
diagnosing facilities.
458
Most modules will provide transparent layers. Opaque layer is for modules
459
which implement actual file system calls (like DB-based VFS). For example,
460
default POSIX VFS which is built in into Samba is an opaque VFS module.
462
Other layer types (audit, splitter, scanner) were designed to provide different
463
degree of transparency and for diagnosing VFS module behaviour.
465
Each module can implement several layers at the same time provided that only
466
one layer is used per each operation.
470
typedef enum _vfs_op_layer {
471
SMB_VFS_LAYER_NOOP = -1, /* - For using in VFS module to indicate end of array */
472
/* of operations description */
473
SMB_VFS_LAYER_OPAQUE = 0, /* - Final level, does not call anything beyond itself */
474
SMB_VFS_LAYER_TRANSPARENT, /* - Normal operation, calls underlying layer after */
475
/* possibly changing passed data */
476
SMB_VFS_LAYER_LOGGER, /* - Logs data, calls underlying layer, logging may not */
478
SMB_VFS_LAYER_SPLITTER, /* - Splits operation, calls underlying layer _and_ own facility, */
479
/* then combines result */
480
SMB_VFS_LAYER_SCANNER /* - Checks data and possibly initiates additional */
481
/* file activity like logging to files _inside_ samba VFS */
485
VFS operation description. Each VFS module registers an array of vfs_op_tuple to VFS subsystem,
486
which describes all operations this module is willing to intercept.
487
VFS subsystem initializes then the conn->vfs_ops and conn->vfs_opaque_ops structs
488
using this information.
491
typedef struct vfs_op_tuple {
498
typedef struct vfs_handle_struct {
499
struct vfs_handle_struct *next, *prev;
501
struct vfs_ops vfs_next;
502
struct connection_struct *conn;
504
void (*free_data)(void **data);
508
typedef struct vfs_statvfs_struct {
509
/* For undefined recommended transfer size return -1 in that field */
510
uint32 OptimalTransferSize; /* bsize on some os, iosize on other os */
514
The next three fields are in terms of the block size.
515
(above). If block size is unknown, 4096 would be a
516
reasonable block size for a server to report.
517
Note that returning the blocks/blocksavail removes need
518
to make a second call (to QFSInfo level 0x103 to get this info.
519
UserBlockAvail is typically less than or equal to BlocksAvail,
520
if no distinction is made return the same value in each.
523
SMB_BIG_UINT TotalBlocks;
524
SMB_BIG_UINT BlocksAvail; /* bfree */
525
SMB_BIG_UINT UserBlocksAvail; /* bavail */
527
/* For undefined Node fields or FSID return -1 */
528
SMB_BIG_UINT TotalFileNodes;
529
SMB_BIG_UINT FreeFileNodes;
530
SMB_BIG_UINT FsIdentifier; /* fsid */
531
/* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */
532
/* NB flags can come from FILE_SYSTEM_DEVICE_INFO call */
533
} vfs_statvfs_struct;
535
#define VFS_ADD_FSP_EXTENSION(handle, fsp, type) \
536
vfs_add_fsp_extension_notype(handle, (fsp), sizeof(type))
538
#define VFS_FETCH_FSP_EXTENSION(handle, fsp) \
539
vfs_fetch_fsp_extension(handle, (fsp))
541
#define VFS_REMOVE_FSP_EXTENSION(handle, fsp) \
542
vfs_remove_fsp_extension((handle), (fsp))
544
#define SMB_VFS_HANDLE_GET_DATA(handle, datap, type, ret) { \
545
if (!(handle)||((datap=(type *)(handle)->data)==NULL)) { \
546
DEBUG(0,("%s() failed to get vfs_handle->data!\n",FUNCTION_MACRO)); \
551
#define SMB_VFS_HANDLE_SET_DATA(handle, datap, free_fn, type, ret) { \
553
DEBUG(0,("%s() failed to set handle->data!\n",FUNCTION_MACRO)); \
556
if ((handle)->free_data) { \
557
(handle)->free_data(&(handle)->data); \
559
(handle)->data = (void *)datap; \
560
(handle)->free_data = free_fn; \
564
#define SMB_VFS_HANDLE_FREE_DATA(handle) { \
565
if ((handle) && (handle)->free_data) { \
566
(handle)->free_data(&(handle)->data); \
570
/* Check whether module-specific data handle was already allocated or not */
571
#define SMB_VFS_HANDLE_TEST_DATA(handle) ( !(handle) || !(handle)->data ? False : True )
573
#define SMB_VFS_OP(x) ((void *) x)
575
#define DEFAULT_VFS_MODULE_NAME "/[Default VFS]/"
577
#include "vfs_macros.h"