2000-02-03 07:47:50 +03:00
/*
2002-03-22 09:24:38 +03:00
Unix SMB / CIFS implementation .
2000-02-03 07:47:50 +03:00
VFS structures and parameters
2005-06-28 02:53:56 +04:00
Copyright ( C ) Jeremy Allison 1999 - 2005
2002-08-17 21:00:51 +04:00
Copyright ( C ) Tim Potter 1999
2005-10-20 21:33:17 +04:00
Copyright ( C ) Alexander Bokovoy 2002 - 2005
2003-05-12 03:34:18 +04:00
Copyright ( C ) Stefan ( metze ) Metzmacher 2003
2000-02-03 07:47:50 +03:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-09 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
2000-02-03 07:47:50 +03:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
2007-07-10 04:52:41 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2002-08-17 21:00:51 +04:00
This work was sponsored by Optifacio Software Services , Inc .
2000-02-03 07:47:50 +03:00
*/
# ifndef _VFS_H
# define _VFS_H
2000-10-05 23:04:41 +04:00
/* Avoid conflict with an AIX include file */
# ifdef vfs_ops
# undef vfs_ops
# endif
2000-10-06 07:21:49 +04:00
/*
* As we ' re now ( thanks Andrew ! : - ) using file_structs and connection
* structs in the vfs - then anyone writing a vfs must include includes . h . . .
*/
2000-02-03 07:47:50 +03:00
2000-11-07 00:44:33 +03:00
/*
* This next constant specifies the version number of the VFS interface
* this smbd will load . Increment this if * ANY * changes are made to the
* vfs_ops below . JRA .
2004-04-29 16:11:59 +04:00
*
* If you change anything here , please also update modules / vfs_full_audit . c .
* VL .
2000-11-07 00:44:33 +03:00
*/
2002-01-10 03:28:09 +03:00
/* Changed to version 2 for CIFS UNIX extensions (mknod and link added). JRA. */
2002-03-12 03:08:08 +03:00
/* Changed to version 3 for POSIX acl extensions. JRA. */
2002-08-17 21:00:51 +04:00
/* Changed to version 4 for cascaded VFS interface. Alexander Bokovoy. */
2002-09-25 19:19:00 +04:00
/* Changed to version 5 for sendfile addition. JRA. */
2003-05-12 03:34:18 +04:00
/* Changed to version 6 for the new module system, fixed cascading and quota functions. --metze */
2003-06-06 04:04:27 +04:00
/* Changed to version 7 to include the get_nt_acl info parameter. JRA. */
/* Changed to version 8 includes EA calls. JRA. */
2003-08-08 01:47:46 +04:00
/* Changed to version 9 to include the get_shadow_data call. --metze */
2004-01-06 04:22:14 +03:00
/* Changed to version 10 to include pread/pwrite calls. */
2004-11-10 01:49:28 +03:00
/* Changed to version 11 to include seekdir/telldir/rewinddir calls. JRA */
2005-06-28 02:53:56 +04:00
/* Changed to version 12 to add mask and attributes to opendir(). JRA
Also include aio calls . JRA . */
2005-07-08 08:51:27 +04:00
/* Changed to version 13 as the internal structure of files_struct has changed. JRA */
2006-04-10 19:33:04 +04:00
/* Changed to version 14 as we had to change DIR to SMB_STRUCT_DIR. JRA */
/* Changed to version 15 as we added the statvfs call. JRA */
/* Changed to version 16 as we added the getlock call. JRA */
2006-07-11 22:01:26 +04:00
/* Changed to version 17 as we removed redundant connection_struct parameters. --jpeach */
2006-11-10 18:43:29 +03:00
/* Changed to version 18 to add fsp parameter to the open call -- jpeach
Also include kernel_flock call - jmcd */
2007-02-14 05:37:14 +03:00
/* Changed to version 19, kernel change notify has been merged
Also included linux setlease call - jmcd */
2007-03-06 02:40:03 +03:00
/* Changed to version 20, use ntimes call instead of utime (greater
* timestamp resolition . JRA . */
2007-03-08 04:40:49 +03:00
/* Changed to version21 to add chflags operation -- jpeach */
2007-05-24 03:55:12 +04:00
/* Changed to version22 to add lchown operation -- jra */
2007-06-27 02:49:10 +04:00
/* Leave at 22 - not yet released. But change set_nt_acl to return an NTSTATUS. jra. */
2007-08-02 12:53:24 +04:00
/* Leave at 22 - not yet released. Add file_id_create operation. --metze */
2007-10-19 04:40:25 +04:00
/* Leave at 22 - not yet released. Change all BOOL parameters (int) to bool. jra. */
2007-10-30 03:16:13 +03:00
/* Leave at 22 - not yet released. Added recvfile. */
2007-10-13 23:06:49 +04:00
/* Leave at 22 - not yet released. Change get_nt_acl to return NTSTATUS - vl */
2007-12-05 11:53:10 +03:00
/* Leave at 22 - not yet released. Change get_nt_acl to *not* take a
* files_struct . - obnox . */
2008-01-05 04:16:15 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from fget_nt_acl. - obnox */
2008-01-06 20:48:02 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from gset_nt_acl. - obnox */
2008-01-07 02:14:19 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from pread. - obnox */
2008-01-07 11:23:04 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from pwrite. - obnox */
2008-01-07 12:15:08 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from lseek. - obnox */
2008-01-07 14:49:02 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from fsync. - obnox */
2008-01-07 15:21:26 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from fstat. - obnox */
2008-01-07 15:44:37 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from fchmod. - obnox */
2008-01-07 16:26:00 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from fchown. - obnox */
2008-01-07 17:55:09 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from ftruncate. - obnox */
2008-01-07 18:38:23 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from lock. - obnox */
2008-01-07 19:14:20 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from kernel_flock. - obnox */
2008-01-08 00:18:50 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from linux_setlease. - obnox */
/* Leave at 22 - not yet released. Remove parameter fd from getlock. - obnox */
2008-01-08 02:21:58 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from sys_acl_get_fd. - obnox */
2008-01-08 03:14:24 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from fchmod_acl. - obnox */
2008-01-08 03:54:19 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from sys_acl_set_fd. - obnox */
2008-01-08 12:00:47 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from fgetxattr. - obnox */
2008-01-08 12:51:40 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from flistxattr. - obnox */
2008-01-08 13:29:09 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from fremovexattr. - obnox */
2008-01-08 13:47:33 +03:00
/* Leave at 22 - not yet released. Remove parameter fd from fsetxattr. - obnox */
2008-01-08 02:21:58 +03:00
2008-01-07 15:21:26 +03:00
2007-12-05 11:53:10 +03:00
2007-05-24 03:55:12 +04:00
# define SMB_VFS_INTERFACE_VERSION 22
2002-08-17 21:00:51 +04:00
2005-06-28 02:53:56 +04:00
/* to bug old modules which are trying to compile with the old functions */
2003-06-06 04:04:27 +04:00
# 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 };
2003-05-12 03:34:18 +04:00
# define lp_parm_string __ERROR_please_port_lp_parm_string_to_lp_parm_const_string_or_lp_parm_talloc_string { \
__ERROR_please_port_lp_parm_string_to_lp_parm_const_string_or_lp_parm_talloc_string } ;
# define lp_vfs_options __ERROR_please_donot_use_lp_vfs_options_anymore_use_lp_parm_xxxx_functions_instead { \
__ERROR_please_donot_use_lp_vfs_options_anymore_use_lp_parm_xxxx_functions_instead } ;
2002-08-17 21:00:51 +04:00
/*
All intercepted VFS operations must be declared as static functions inside module source
2003-05-12 03:34:18 +04:00
in order to keep smbd namespace unpolluted . See source of audit , extd_audit , fake_perms and recycle
2002-08-17 21:00:51 +04:00
example VFS modules for more details .
*/
2000-11-07 00:44:33 +03:00
2000-02-03 07:47:50 +03:00
/* VFS operations structure */
2003-05-12 03:34:18 +04:00
struct vfs_handle_struct ;
2000-10-06 07:21:49 +04:00
struct connection_struct ;
struct files_struct ;
2006-09-21 02:23:12 +04:00
struct security_descriptor ;
2005-10-20 21:33:17 +04:00
struct vfs_statvfs_struct ;
2000-10-06 07:21:49 +04:00
2002-08-17 21:00:51 +04:00
/*
2003-05-12 03:34:18 +04:00
Available VFS operations . These values must be in sync with vfs_ops struct
( struct vfs_fn_pointers and struct vfs_handle_pointers inside of struct vfs_ops ) .
2002-08-17 21:00:51 +04:00
In particular , if new operations are added to vfs_ops , appropriate constants
should be added to vfs_op_type so that order of them kept same as in vfs_ops .
*/
typedef enum _vfs_op_type {
SMB_VFS_OP_NOOP = - 1 ,
/* Disk operations */
SMB_VFS_OP_CONNECT = 0 ,
SMB_VFS_OP_DISCONNECT ,
SMB_VFS_OP_DISK_FREE ,
2003-05-12 03:34:18 +04:00
SMB_VFS_OP_GET_QUOTA ,
SMB_VFS_OP_SET_QUOTA ,
2003-08-08 01:47:46 +04:00
SMB_VFS_OP_GET_SHADOW_COPY_DATA ,
2005-10-20 21:33:17 +04:00
SMB_VFS_OP_STATVFS ,
2002-08-17 21:00:51 +04:00
/* Directory operations */
SMB_VFS_OP_OPENDIR ,
SMB_VFS_OP_READDIR ,
2004-11-10 01:49:28 +03:00
SMB_VFS_OP_SEEKDIR ,
SMB_VFS_OP_TELLDIR ,
SMB_VFS_OP_REWINDDIR ,
2002-08-17 21:00:51 +04:00
SMB_VFS_OP_MKDIR ,
SMB_VFS_OP_RMDIR ,
SMB_VFS_OP_CLOSEDIR ,
/* File operations */
SMB_VFS_OP_OPEN ,
SMB_VFS_OP_CLOSE ,
SMB_VFS_OP_READ ,
2004-01-06 04:22:14 +03:00
SMB_VFS_OP_PREAD ,
2002-08-17 21:00:51 +04:00
SMB_VFS_OP_WRITE ,
2004-01-06 04:22:14 +03:00
SMB_VFS_OP_PWRITE ,
2002-08-17 21:00:51 +04:00
SMB_VFS_OP_LSEEK ,
2002-09-25 19:19:00 +04:00
SMB_VFS_OP_SENDFILE ,
2007-10-30 03:16:13 +03:00
SMB_VFS_OP_RECVFILE ,
2002-08-17 21:00:51 +04:00
SMB_VFS_OP_RENAME ,
SMB_VFS_OP_FSYNC ,
SMB_VFS_OP_STAT ,
SMB_VFS_OP_FSTAT ,
SMB_VFS_OP_LSTAT ,
SMB_VFS_OP_UNLINK ,
SMB_VFS_OP_CHMOD ,
SMB_VFS_OP_FCHMOD ,
SMB_VFS_OP_CHOWN ,
SMB_VFS_OP_FCHOWN ,
2007-05-24 03:55:12 +04:00
SMB_VFS_OP_LCHOWN ,
2002-08-17 21:00:51 +04:00
SMB_VFS_OP_CHDIR ,
SMB_VFS_OP_GETWD ,
2007-03-06 02:40:03 +03:00
SMB_VFS_OP_NTIMES ,
2002-08-17 21:00:51 +04:00
SMB_VFS_OP_FTRUNCATE ,
SMB_VFS_OP_LOCK ,
2006-11-09 23:29:31 +03:00
SMB_VFS_OP_KERNEL_FLOCK ,
2007-02-14 05:37:14 +03:00
SMB_VFS_OP_LINUX_SETLEASE ,
2006-04-10 19:33:04 +04:00
SMB_VFS_OP_GETLOCK ,
2002-08-17 21:00:51 +04:00
SMB_VFS_OP_SYMLINK ,
SMB_VFS_OP_READLINK ,
SMB_VFS_OP_LINK ,
SMB_VFS_OP_MKNOD ,
SMB_VFS_OP_REALPATH ,
2007-02-01 16:36:02 +03:00
SMB_VFS_OP_NOTIFY_WATCH ,
2007-03-08 04:40:49 +03:00
SMB_VFS_OP_CHFLAGS ,
2007-08-02 12:53:24 +04:00
SMB_VFS_OP_FILE_ID_CREATE ,
2002-08-17 21:00:51 +04:00
/* NT ACL operations. */
SMB_VFS_OP_FGET_NT_ACL ,
SMB_VFS_OP_GET_NT_ACL ,
SMB_VFS_OP_FSET_NT_ACL ,
SMB_VFS_OP_SET_NT_ACL ,
/* POSIX ACL operations. */
SMB_VFS_OP_CHMOD_ACL ,
SMB_VFS_OP_FCHMOD_ACL ,
SMB_VFS_OP_SYS_ACL_GET_ENTRY ,
SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE ,
SMB_VFS_OP_SYS_ACL_GET_PERMSET ,
SMB_VFS_OP_SYS_ACL_GET_QUALIFIER ,
SMB_VFS_OP_SYS_ACL_GET_FILE ,
SMB_VFS_OP_SYS_ACL_GET_FD ,
SMB_VFS_OP_SYS_ACL_CLEAR_PERMS ,
SMB_VFS_OP_SYS_ACL_ADD_PERM ,
SMB_VFS_OP_SYS_ACL_TO_TEXT ,
SMB_VFS_OP_SYS_ACL_INIT ,
SMB_VFS_OP_SYS_ACL_CREATE_ENTRY ,
SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE ,
SMB_VFS_OP_SYS_ACL_SET_QUALIFIER ,
SMB_VFS_OP_SYS_ACL_SET_PERMSET ,
SMB_VFS_OP_SYS_ACL_VALID ,
SMB_VFS_OP_SYS_ACL_SET_FILE ,
SMB_VFS_OP_SYS_ACL_SET_FD ,
SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE ,
SMB_VFS_OP_SYS_ACL_GET_PERM ,
SMB_VFS_OP_SYS_ACL_FREE_TEXT ,
SMB_VFS_OP_SYS_ACL_FREE_ACL ,
SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER ,
2003-06-06 04:04:27 +04:00
/* EA operations. */
SMB_VFS_OP_GETXATTR ,
SMB_VFS_OP_LGETXATTR ,
SMB_VFS_OP_FGETXATTR ,
SMB_VFS_OP_LISTXATTR ,
SMB_VFS_OP_LLISTXATTR ,
SMB_VFS_OP_FLISTXATTR ,
SMB_VFS_OP_REMOVEXATTR ,
SMB_VFS_OP_LREMOVEXATTR ,
SMB_VFS_OP_FREMOVEXATTR ,
SMB_VFS_OP_SETXATTR ,
SMB_VFS_OP_LSETXATTR ,
SMB_VFS_OP_FSETXATTR ,
2005-06-28 02:53:56 +04:00
/* aio operations */
SMB_VFS_OP_AIO_READ ,
SMB_VFS_OP_AIO_WRITE ,
SMB_VFS_OP_AIO_RETURN ,
SMB_VFS_OP_AIO_CANCEL ,
SMB_VFS_OP_AIO_ERROR ,
SMB_VFS_OP_AIO_FSYNC ,
SMB_VFS_OP_AIO_SUSPEND ,
2002-08-17 21:00:51 +04:00
/* This should always be last enum value */
SMB_VFS_OP_LAST
} vfs_op_type ;
2003-05-12 03:34:18 +04:00
/*
Please keep vfs_op_type , struct vfs_fn_pointers and struct vfs_handles_pointers in sync .
*/
struct vfs_ops {
struct vfs_fn_pointers {
/* Disk operations */
2006-07-11 22:01:26 +04:00
int ( * connect_fn ) ( struct vfs_handle_struct * handle , const char * service , const char * user ) ;
void ( * disconnect ) ( struct vfs_handle_struct * handle ) ;
2007-10-19 04:40:25 +04:00
SMB_BIG_UINT ( * disk_free ) ( struct vfs_handle_struct * handle , const char * path , bool small_query , SMB_BIG_UINT * bsize ,
2003-05-12 03:34:18 +04:00
SMB_BIG_UINT * dfree , SMB_BIG_UINT * dsize ) ;
2006-07-11 22:01:26 +04:00
int ( * get_quota ) ( struct vfs_handle_struct * handle , enum SMB_QUOTA_TYPE qtype , unid_t id , SMB_DISK_QUOTA * qt ) ;
int ( * set_quota ) ( struct vfs_handle_struct * handle , enum SMB_QUOTA_TYPE qtype , unid_t id , SMB_DISK_QUOTA * qt ) ;
2007-10-19 04:40:25 +04:00
int ( * get_shadow_copy_data ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , SHADOW_COPY_DATA * shadow_copy_data , bool labels ) ;
2006-07-11 22:01:26 +04:00
int ( * statvfs ) ( struct vfs_handle_struct * handle , const char * path , struct vfs_statvfs_struct * statbuf ) ;
2003-05-12 03:34:18 +04:00
/* Directory operations */
2006-07-11 22:01:26 +04:00
SMB_STRUCT_DIR * ( * opendir ) ( struct vfs_handle_struct * handle , const char * fname , const char * mask , uint32 attributes ) ;
SMB_STRUCT_DIRENT * ( * readdir ) ( struct vfs_handle_struct * handle , SMB_STRUCT_DIR * dirp ) ;
void ( * seekdir ) ( struct vfs_handle_struct * handle , SMB_STRUCT_DIR * dirp , long offset ) ;
long ( * telldir ) ( struct vfs_handle_struct * handle , SMB_STRUCT_DIR * dirp ) ;
void ( * rewind_dir ) ( struct vfs_handle_struct * handle , SMB_STRUCT_DIR * dirp ) ;
int ( * mkdir ) ( struct vfs_handle_struct * handle , const char * path , mode_t mode ) ;
int ( * rmdir ) ( struct vfs_handle_struct * handle , const char * path ) ;
int ( * closedir ) ( struct vfs_handle_struct * handle , SMB_STRUCT_DIR * dir ) ;
2003-05-12 03:34:18 +04:00
/* File operations */
2006-07-11 22:01:26 +04:00
int ( * open ) ( struct vfs_handle_struct * handle , const char * fname , files_struct * fsp , int flags , mode_t mode ) ;
2005-07-03 16:05:07 +04:00
int ( * close_fn ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , int fd ) ;
2003-05-12 03:34:18 +04:00
ssize_t ( * read ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , int fd , void * data , size_t n ) ;
2008-01-07 02:14:19 +03:00
ssize_t ( * pread ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , void * data , size_t n , SMB_OFF_T offset ) ;
2003-05-12 03:34:18 +04:00
ssize_t ( * write ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , int fd , const void * data , size_t n ) ;
2008-01-07 11:23:04 +03:00
ssize_t ( * pwrite ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , const void * data , size_t n , SMB_OFF_T offset ) ;
2008-01-07 12:15:08 +03:00
SMB_OFF_T ( * lseek ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , SMB_OFF_T offset , int whence ) ;
2003-05-12 03:34:18 +04:00
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 ) ;
2007-10-30 03:16:13 +03:00
ssize_t ( * recvfile ) ( struct vfs_handle_struct * handle , int fromfd , files_struct * fsp , int tofd , SMB_OFF_T offset , size_t count ) ;
2006-07-11 22:01:26 +04:00
int ( * rename ) ( struct vfs_handle_struct * handle , const char * oldname , const char * newname ) ;
2008-01-07 14:49:02 +03:00
int ( * fsync ) ( struct vfs_handle_struct * handle , struct files_struct * fsp ) ;
2006-07-11 22:01:26 +04:00
int ( * stat ) ( struct vfs_handle_struct * handle , const char * fname , SMB_STRUCT_STAT * sbuf ) ;
2008-01-07 15:21:26 +03:00
int ( * fstat ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , SMB_STRUCT_STAT * sbuf ) ;
2006-07-11 22:01:26 +04:00
int ( * lstat ) ( struct vfs_handle_struct * handle , const char * path , SMB_STRUCT_STAT * sbuf ) ;
int ( * unlink ) ( struct vfs_handle_struct * handle , const char * path ) ;
int ( * chmod ) ( struct vfs_handle_struct * handle , const char * path , mode_t mode ) ;
2008-01-07 15:44:37 +03:00
int ( * fchmod ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , mode_t mode ) ;
2006-07-11 22:01:26 +04:00
int ( * chown ) ( struct vfs_handle_struct * handle , const char * path , uid_t uid , gid_t gid ) ;
2008-01-07 16:26:00 +03:00
int ( * fchown ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , uid_t uid , gid_t gid ) ;
2007-05-24 03:55:12 +04:00
int ( * lchown ) ( struct vfs_handle_struct * handle , const char * path , uid_t uid , gid_t gid ) ;
2006-07-11 22:01:26 +04:00
int ( * chdir ) ( struct vfs_handle_struct * handle , const char * path ) ;
char * ( * getwd ) ( struct vfs_handle_struct * handle , char * buf ) ;
2007-03-06 02:40:03 +03:00
int ( * ntimes ) ( struct vfs_handle_struct * handle , const char * path , const struct timespec ts [ 2 ] ) ;
2008-01-07 17:55:09 +03:00
int ( * ftruncate ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , SMB_OFF_T offset ) ;
2008-01-07 18:38:23 +03:00
bool ( * lock ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , int op , SMB_OFF_T offset , SMB_OFF_T count , int type ) ;
2008-01-07 19:14:20 +03:00
int ( * kernel_flock ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , uint32 share_mode ) ;
2008-01-07 23:47:53 +03:00
int ( * linux_setlease ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , int leasetype ) ;
2008-01-08 00:18:50 +03:00
bool ( * getlock ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , SMB_OFF_T * poffset , SMB_OFF_T * pcount , int * ptype , pid_t * ppid ) ;
2006-07-11 22:01:26 +04:00
int ( * symlink ) ( struct vfs_handle_struct * handle , const char * oldpath , const char * newpath ) ;
int ( * readlink ) ( struct vfs_handle_struct * handle , const char * path , char * buf , size_t bufsiz ) ;
int ( * link ) ( struct vfs_handle_struct * handle , const char * oldpath , const char * newpath ) ;
int ( * mknod ) ( struct vfs_handle_struct * handle , const char * path , mode_t mode , SMB_DEV_T dev ) ;
char * ( * realpath ) ( struct vfs_handle_struct * handle , const char * path , char * resolved_path ) ;
2007-02-01 16:36:02 +03:00
NTSTATUS ( * notify_watch ) ( struct vfs_handle_struct * handle ,
struct sys_notify_context * ctx ,
struct notify_entry * e ,
void ( * callback ) ( struct sys_notify_context * ctx ,
void * private_data ,
struct notify_event * ev ) ,
void * private_data , void * handle_p ) ;
2007-09-28 05:32:08 +04:00
int ( * chflags ) ( struct vfs_handle_struct * handle , const char * path , unsigned int flags ) ;
2007-08-02 12:53:24 +04:00
struct file_id ( * file_id_create ) ( struct vfs_handle_struct * handle , SMB_DEV_T dev , SMB_INO_T inode ) ;
2003-05-12 03:34:18 +04:00
/* NT ACL operations. */
2007-10-13 23:06:49 +04:00
NTSTATUS ( * fget_nt_acl ) ( struct vfs_handle_struct * handle ,
2008-01-05 04:16:15 +03:00
struct files_struct * fsp ,
2007-10-13 23:06:49 +04:00
uint32 security_info ,
struct security_descriptor * * ppdesc ) ;
NTSTATUS ( * get_nt_acl ) ( struct vfs_handle_struct * handle ,
const char * name ,
uint32 security_info ,
struct security_descriptor * * ppdesc ) ;
2008-01-06 20:03:33 +03:00
NTSTATUS ( * fset_nt_acl ) ( struct vfs_handle_struct * handle ,
struct files_struct * fsp ,
uint32 security_info_sent ,
struct security_descriptor * psd ) ;
NTSTATUS ( * set_nt_acl ) ( struct vfs_handle_struct * handle ,
struct files_struct * fsp ,
const char * name ,
uint32 security_info_sent ,
struct security_descriptor * psd ) ;
2003-05-12 03:34:18 +04:00
/* POSIX ACL operations. */
2006-07-11 22:01:26 +04:00
int ( * chmod_acl ) ( struct vfs_handle_struct * handle , const char * name , mode_t mode ) ;
2008-01-08 03:14:24 +03:00
int ( * fchmod_acl ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , mode_t mode ) ;
2003-05-12 03:34:18 +04:00
2006-07-11 22:01:26 +04:00
int ( * sys_acl_get_entry ) ( struct vfs_handle_struct * handle , SMB_ACL_T theacl , int entry_id , SMB_ACL_ENTRY_T * entry_p ) ;
int ( * sys_acl_get_tag_type ) ( struct vfs_handle_struct * handle , SMB_ACL_ENTRY_T entry_d , SMB_ACL_TAG_T * tag_type_p ) ;
int ( * sys_acl_get_permset ) ( struct vfs_handle_struct * handle , SMB_ACL_ENTRY_T entry_d , SMB_ACL_PERMSET_T * permset_p ) ;
void * ( * sys_acl_get_qualifier ) ( struct vfs_handle_struct * handle , SMB_ACL_ENTRY_T entry_d ) ;
SMB_ACL_T ( * sys_acl_get_file ) ( struct vfs_handle_struct * handle , const char * path_p , SMB_ACL_TYPE_T type ) ;
2008-01-08 01:53:34 +03:00
SMB_ACL_T ( * sys_acl_get_fd ) ( struct vfs_handle_struct * handle , struct files_struct * fsp ) ;
2006-07-11 22:01:26 +04:00
int ( * sys_acl_clear_perms ) ( struct vfs_handle_struct * handle , SMB_ACL_PERMSET_T permset ) ;
int ( * sys_acl_add_perm ) ( struct vfs_handle_struct * handle , SMB_ACL_PERMSET_T permset , SMB_ACL_PERM_T perm ) ;
char * ( * sys_acl_to_text ) ( struct vfs_handle_struct * handle , SMB_ACL_T theacl , ssize_t * plen ) ;
SMB_ACL_T ( * sys_acl_init ) ( struct vfs_handle_struct * handle , int count ) ;
int ( * sys_acl_create_entry ) ( struct vfs_handle_struct * handle , SMB_ACL_T * pacl , SMB_ACL_ENTRY_T * pentry ) ;
int ( * sys_acl_set_tag_type ) ( struct vfs_handle_struct * handle , SMB_ACL_ENTRY_T entry , SMB_ACL_TAG_T tagtype ) ;
int ( * sys_acl_set_qualifier ) ( struct vfs_handle_struct * handle , SMB_ACL_ENTRY_T entry , void * qual ) ;
int ( * sys_acl_set_permset ) ( struct vfs_handle_struct * handle , SMB_ACL_ENTRY_T entry , SMB_ACL_PERMSET_T permset ) ;
int ( * sys_acl_valid ) ( struct vfs_handle_struct * handle , SMB_ACL_T theacl ) ;
int ( * sys_acl_set_file ) ( struct vfs_handle_struct * handle , const char * name , SMB_ACL_TYPE_T acltype , SMB_ACL_T theacl ) ;
2008-01-08 03:54:19 +03:00
int ( * sys_acl_set_fd ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , SMB_ACL_T theacl ) ;
2006-07-11 22:01:26 +04:00
int ( * sys_acl_delete_def_file ) ( struct vfs_handle_struct * handle , const char * path ) ;
int ( * sys_acl_get_perm ) ( struct vfs_handle_struct * handle , SMB_ACL_PERMSET_T permset , SMB_ACL_PERM_T perm ) ;
int ( * sys_acl_free_text ) ( struct vfs_handle_struct * handle , char * text ) ;
int ( * sys_acl_free_acl ) ( struct vfs_handle_struct * handle , SMB_ACL_T posix_acl ) ;
int ( * sys_acl_free_qualifier ) ( struct vfs_handle_struct * handle , void * qualifier , SMB_ACL_TAG_T tagtype ) ;
2003-06-06 04:04:27 +04:00
/* EA operations. */
2006-07-11 22:01:26 +04:00
ssize_t ( * getxattr ) ( struct vfs_handle_struct * handle , const char * path , const char * name , void * value , size_t size ) ;
ssize_t ( * lgetxattr ) ( struct vfs_handle_struct * handle , const char * path , const char * name , void * value , size_t size ) ;
2008-01-08 12:00:47 +03:00
ssize_t ( * fgetxattr ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , const char * name , void * value , size_t size ) ;
2006-07-11 22:01:26 +04:00
ssize_t ( * listxattr ) ( struct vfs_handle_struct * handle , const char * path , char * list , size_t size ) ;
ssize_t ( * llistxattr ) ( struct vfs_handle_struct * handle , const char * path , char * list , size_t size ) ;
2008-01-08 12:51:40 +03:00
ssize_t ( * flistxattr ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , char * list , size_t size ) ;
2006-07-11 22:01:26 +04:00
int ( * removexattr ) ( struct vfs_handle_struct * handle , const char * path , const char * name ) ;
int ( * lremovexattr ) ( struct vfs_handle_struct * handle , const char * path , const char * name ) ;
2008-01-08 13:29:09 +03:00
int ( * fremovexattr ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , const char * name ) ;
2006-07-11 22:01:26 +04:00
int ( * setxattr ) ( struct vfs_handle_struct * handle , const char * path , const char * name , const void * value , size_t size , int flags ) ;
int ( * lsetxattr ) ( struct vfs_handle_struct * handle , const char * path , const char * name , const void * value , size_t size , int flags ) ;
2008-01-08 13:47:33 +03:00
int ( * fsetxattr ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , const char * name , const void * value , size_t size , int flags ) ;
2003-06-06 04:04:27 +04:00
2005-06-28 02:53:56 +04:00
/* aio operations */
int ( * aio_read ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , SMB_STRUCT_AIOCB * aiocb ) ;
int ( * aio_write ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , SMB_STRUCT_AIOCB * aiocb ) ;
2005-08-05 05:23:33 +04:00
ssize_t ( * aio_return_fn ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , SMB_STRUCT_AIOCB * aiocb ) ;
2005-06-28 02:53:56 +04:00
int ( * aio_cancel ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , int fd , SMB_STRUCT_AIOCB * aiocb ) ;
2005-08-05 05:23:33 +04:00
int ( * aio_error_fn ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , SMB_STRUCT_AIOCB * aiocb ) ;
2005-06-28 02:53:56 +04:00
int ( * aio_fsync ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , int op , SMB_STRUCT_AIOCB * aiocb ) ;
int ( * aio_suspend ) ( struct vfs_handle_struct * handle , struct files_struct * fsp , const SMB_STRUCT_AIOCB * const aiocb [ ] , int n , const struct timespec * timeout ) ;
2003-05-12 03:34:18 +04:00
} ops ;
struct vfs_handles_pointers {
/* Disk operations */
2005-07-03 16:05:07 +04:00
struct vfs_handle_struct * connect_hnd ;
2003-05-12 03:34:18 +04:00
struct vfs_handle_struct * disconnect ;
struct vfs_handle_struct * disk_free ;
struct vfs_handle_struct * get_quota ;
struct vfs_handle_struct * set_quota ;
2003-08-08 01:47:46 +04:00
struct vfs_handle_struct * get_shadow_copy_data ;
2005-10-20 21:33:17 +04:00
struct vfs_handle_struct * statvfs ;
2003-05-12 03:34:18 +04:00
/* Directory operations */
struct vfs_handle_struct * opendir ;
struct vfs_handle_struct * readdir ;
2004-11-10 01:49:28 +03:00
struct vfs_handle_struct * seekdir ;
struct vfs_handle_struct * telldir ;
2004-11-18 15:19:16 +03:00
struct vfs_handle_struct * rewind_dir ;
2003-05-12 03:34:18 +04:00
struct vfs_handle_struct * mkdir ;
struct vfs_handle_struct * rmdir ;
struct vfs_handle_struct * closedir ;
/* File operations */
struct vfs_handle_struct * open ;
2005-07-03 16:05:07 +04:00
struct vfs_handle_struct * close_hnd ;
2003-05-12 03:34:18 +04:00
struct vfs_handle_struct * read ;
2004-01-06 04:22:14 +03:00
struct vfs_handle_struct * pread ;
2003-05-12 03:34:18 +04:00
struct vfs_handle_struct * write ;
2004-01-06 04:22:14 +03:00
struct vfs_handle_struct * pwrite ;
2003-05-12 03:34:18 +04:00
struct vfs_handle_struct * lseek ;
struct vfs_handle_struct * sendfile ;
2007-10-30 03:16:13 +03:00
struct vfs_handle_struct * recvfile ;
2003-05-12 03:34:18 +04:00
struct vfs_handle_struct * rename ;
struct vfs_handle_struct * fsync ;
struct vfs_handle_struct * stat ;
struct vfs_handle_struct * fstat ;
struct vfs_handle_struct * lstat ;
struct vfs_handle_struct * unlink ;
struct vfs_handle_struct * chmod ;
struct vfs_handle_struct * fchmod ;
struct vfs_handle_struct * chown ;
struct vfs_handle_struct * fchown ;
2007-05-24 03:55:12 +04:00
struct vfs_handle_struct * lchown ;
2003-05-12 03:34:18 +04:00
struct vfs_handle_struct * chdir ;
struct vfs_handle_struct * getwd ;
2007-03-06 02:40:03 +03:00
struct vfs_handle_struct * ntimes ;
2003-05-12 03:34:18 +04:00
struct vfs_handle_struct * ftruncate ;
struct vfs_handle_struct * lock ;
2006-11-09 23:29:31 +03:00
struct vfs_handle_struct * kernel_flock ;
2007-02-14 05:37:14 +03:00
struct vfs_handle_struct * linux_setlease ;
2006-04-10 19:33:04 +04:00
struct vfs_handle_struct * getlock ;
2003-05-12 03:34:18 +04:00
struct vfs_handle_struct * symlink ;
struct vfs_handle_struct * readlink ;
struct vfs_handle_struct * link ;
struct vfs_handle_struct * mknod ;
struct vfs_handle_struct * realpath ;
2007-02-01 16:36:02 +03:00
struct vfs_handle_struct * notify_watch ;
2007-03-08 04:40:49 +03:00
struct vfs_handle_struct * chflags ;
2007-08-02 12:53:24 +04:00
struct vfs_handle_struct * file_id_create ;
2003-05-12 03:34:18 +04:00
/* NT ACL operations. */
struct vfs_handle_struct * fget_nt_acl ;
struct vfs_handle_struct * get_nt_acl ;
struct vfs_handle_struct * fset_nt_acl ;
struct vfs_handle_struct * set_nt_acl ;
/* POSIX ACL operations. */
struct vfs_handle_struct * chmod_acl ;
struct vfs_handle_struct * fchmod_acl ;
struct vfs_handle_struct * sys_acl_get_entry ;
struct vfs_handle_struct * sys_acl_get_tag_type ;
struct vfs_handle_struct * sys_acl_get_permset ;
struct vfs_handle_struct * sys_acl_get_qualifier ;
struct vfs_handle_struct * sys_acl_get_file ;
struct vfs_handle_struct * sys_acl_get_fd ;
struct vfs_handle_struct * sys_acl_clear_perms ;
struct vfs_handle_struct * sys_acl_add_perm ;
struct vfs_handle_struct * sys_acl_to_text ;
struct vfs_handle_struct * sys_acl_init ;
struct vfs_handle_struct * sys_acl_create_entry ;
struct vfs_handle_struct * sys_acl_set_tag_type ;
struct vfs_handle_struct * sys_acl_set_qualifier ;
struct vfs_handle_struct * sys_acl_set_permset ;
struct vfs_handle_struct * sys_acl_valid ;
struct vfs_handle_struct * sys_acl_set_file ;
struct vfs_handle_struct * sys_acl_set_fd ;
struct vfs_handle_struct * sys_acl_delete_def_file ;
struct vfs_handle_struct * sys_acl_get_perm ;
struct vfs_handle_struct * sys_acl_free_text ;
struct vfs_handle_struct * sys_acl_free_acl ;
struct vfs_handle_struct * sys_acl_free_qualifier ;
2003-06-06 04:04:27 +04:00
/* EA operations. */
struct vfs_handle_struct * getxattr ;
struct vfs_handle_struct * lgetxattr ;
struct vfs_handle_struct * fgetxattr ;
struct vfs_handle_struct * listxattr ;
struct vfs_handle_struct * llistxattr ;
struct vfs_handle_struct * flistxattr ;
struct vfs_handle_struct * removexattr ;
struct vfs_handle_struct * lremovexattr ;
struct vfs_handle_struct * fremovexattr ;
struct vfs_handle_struct * setxattr ;
struct vfs_handle_struct * lsetxattr ;
struct vfs_handle_struct * fsetxattr ;
2003-08-08 01:47:46 +04:00
2005-06-28 02:53:56 +04:00
/* aio operations */
struct vfs_handle_struct * aio_read ;
struct vfs_handle_struct * aio_write ;
struct vfs_handle_struct * aio_return ;
struct vfs_handle_struct * aio_cancel ;
struct vfs_handle_struct * aio_error ;
struct vfs_handle_struct * aio_fsync ;
struct vfs_handle_struct * aio_suspend ;
2003-05-12 03:34:18 +04:00
} handles ;
} ;
2002-08-17 21:00:51 +04:00
/*
Possible VFS operation layers ( per - operation )
These values are used by VFS subsystem when building vfs_ops for connection
from multiple VFS modules . Internally , Samba differentiates only opaque and
transparent layers at this process . Other types are used for providing better
diagnosing facilities .
Most modules will provide transparent layers . Opaque layer is for modules
which implement actual file system calls ( like DB - based VFS ) . For example ,
default POSIX VFS which is built in into Samba is an opaque VFS module .
Other layer types ( audit , splitter , scanner ) were designed to provide different
degree of transparency and for diagnosing VFS module behaviour .
Each module can implement several layers at the same time provided that only
one layer is used per each operation .
*/
typedef enum _vfs_op_layer {
SMB_VFS_LAYER_NOOP = - 1 , /* - For using in VFS module to indicate end of array */
/* of operations description */
SMB_VFS_LAYER_OPAQUE = 0 , /* - Final level, does not call anything beyond itself */
SMB_VFS_LAYER_TRANSPARENT , /* - Normal operation, calls underlying layer after */
/* possibly changing passed data */
2003-05-12 03:34:18 +04:00
SMB_VFS_LAYER_LOGGER , /* - Logs data, calls underlying layer, logging may not */
2002-08-17 21:00:51 +04:00
/* use Samba VFS */
SMB_VFS_LAYER_SPLITTER , /* - Splits operation, calls underlying layer _and_ own facility, */
/* then combines result */
SMB_VFS_LAYER_SCANNER /* - Checks data and possibly initiates additional */
/* file activity like logging to files _inside_ samba VFS */
} vfs_op_layer ;
/*
2003-05-12 03:34:18 +04:00
VFS operation description . Each VFS module registers an array of vfs_op_tuple to VFS subsystem ,
which describes all operations this module is willing to intercept .
VFS subsystem initializes then the conn - > vfs_ops and conn - > vfs_opaque_ops structs
using this information .
2002-08-17 21:00:51 +04:00
*/
2005-10-20 21:33:17 +04:00
typedef struct vfs_op_tuple {
2002-08-17 21:00:51 +04:00
void * op ;
vfs_op_type type ;
vfs_op_layer layer ;
} vfs_op_tuple ;
2003-05-12 03:34:18 +04:00
typedef struct vfs_handle_struct {
struct vfs_handle_struct * next , * prev ;
const char * param ;
struct vfs_ops vfs_next ;
struct connection_struct * conn ;
void * data ;
void ( * free_data ) ( void * * data ) ;
} vfs_handle_struct ;
2005-10-20 21:33:17 +04:00
typedef struct vfs_statvfs_struct {
/* For undefined recommended transfer size return -1 in that field */
uint32 OptimalTransferSize ; /* bsize on some os, iosize on other os */
uint32 BlockSize ;
/*
The next three fields are in terms of the block size .
( above ) . If block size is unknown , 4096 would be a
reasonable block size for a server to report .
Note that returning the blocks / blocksavail removes need
to make a second call ( to QFSInfo level 0x103 to get this info .
UserBlockAvail is typically less than or equal to BlocksAvail ,
if no distinction is made return the same value in each .
*/
SMB_BIG_UINT TotalBlocks ;
SMB_BIG_UINT BlocksAvail ; /* bfree */
SMB_BIG_UINT UserBlocksAvail ; /* bavail */
/* For undefined Node fields or FSID return -1 */
SMB_BIG_UINT TotalFileNodes ;
SMB_BIG_UINT FreeFileNodes ;
SMB_BIG_UINT FsIdentifier ; /* fsid */
/* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */
/* NB flags can come from FILE_SYSTEM_DEVICE_INFO call */
2007-10-16 01:03:40 +04:00
int FsCapabilities ;
2005-10-20 21:33:17 +04:00
} vfs_statvfs_struct ;
2007-10-16 01:01:12 +04:00
/* Add a new FSP extension of the given type. Returns a pointer to the
* extenstion data .
*/
2006-07-11 22:01:26 +04:00
# define VFS_ADD_FSP_EXTENSION(handle, fsp, type) \
vfs_add_fsp_extension_notype ( handle , ( fsp ) , sizeof ( type ) )
2007-10-16 01:01:12 +04:00
/* Return a pointer to the existing FSP extension data. */
2006-07-11 22:01:26 +04:00
# define VFS_FETCH_FSP_EXTENSION(handle, fsp) \
vfs_fetch_fsp_extension ( handle , ( fsp ) )
2007-10-16 01:01:12 +04:00
/* Return the talloc context associated with an FSP extension. */
# define VFS_MEMCTX_FSP_EXTENSION(handle, fsp) \
vfs_memctx_fsp_extension ( handle , ( fsp ) )
/* Remove and destroy an FSP extension. */
2006-07-11 22:01:26 +04:00
# define VFS_REMOVE_FSP_EXTENSION(handle, fsp) \
vfs_remove_fsp_extension ( ( handle ) , ( fsp ) )
2005-10-20 21:33:17 +04:00
2003-05-14 14:59:01 +04:00
# define SMB_VFS_HANDLE_GET_DATA(handle, datap, type, ret) { \
2003-05-12 03:34:18 +04:00
if ( ! ( handle ) | | ( ( datap = ( type * ) ( handle ) - > data ) = = NULL ) ) { \
DEBUG ( 0 , ( " %s() failed to get vfs_handle->data! \n " , FUNCTION_MACRO ) ) ; \
ret ; \
} \
}
2003-05-14 14:59:01 +04:00
# define SMB_VFS_HANDLE_SET_DATA(handle, datap, free_fn, type, ret) { \
2003-05-12 03:34:18 +04:00
if ( ! ( handle ) ) { \
DEBUG ( 0 , ( " %s() failed to set handle->data! \n " , FUNCTION_MACRO ) ) ; \
ret ; \
} else { \
if ( ( handle ) - > free_data ) { \
( handle ) - > free_data ( & ( handle ) - > data ) ; \
} \
( handle ) - > data = ( void * ) datap ; \
( handle ) - > free_data = free_fn ; \
} \
}
2003-05-14 14:59:01 +04:00
# define SMB_VFS_HANDLE_FREE_DATA(handle) { \
2003-05-12 03:34:18 +04:00
if ( ( handle ) & & ( handle ) - > free_data ) { \
( handle ) - > free_data ( & ( handle ) - > data ) ; \
} \
}
2003-07-24 18:23:54 +04:00
/* Check whether module-specific data handle was already allocated or not */
# define SMB_VFS_HANDLE_TEST_DATA(handle) ( !(handle) || !(handle)->data ? False : True )
2003-05-14 14:59:01 +04:00
# define SMB_VFS_OP(x) ((void *) x)
2003-05-12 03:34:18 +04:00
2006-07-11 22:01:26 +04:00
# define DEFAULT_VFS_MODULE_NAME " / [Default VFS] / "
2003-05-12 03:34:18 +04:00
# include "vfs_macros.h"
2002-08-17 21:00:51 +04:00
2000-02-03 07:47:50 +03:00
# endif /* _VFS_H */