s4-smbtorture: pick correct last packet while checking backchannel replies in RPC...
[Samba/fernandojvsilva.git] / source3 / include / vfs.h
blobaee84a70b7d9c48554d175d1a84fce56ad4a6966
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 Copyright (C) Volker Lendecke 2009
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 This work was sponsored by Optifacio Software Services, Inc.
26 #ifndef _VFS_H
27 #define _VFS_H
29 /* Avoid conflict with an AIX include file */
31 #ifdef vfs_ops
32 #undef vfs_ops
33 #endif
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
43 * vfs_ops below. JRA.
45 * If you change anything here, please also update modules/vfs_full_audit.c.
46 * VL.
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 /* Changed to version22 to add lchown operation -- jra */
74 /* Leave at 22 - not yet released. But change set_nt_acl to return an NTSTATUS. jra. */
75 /* Leave at 22 - not yet released. Add file_id_create operation. --metze */
76 /* Leave at 22 - not yet released. Change all BOOL parameters (int) to bool. jra. */
77 /* Leave at 22 - not yet released. Added recvfile. */
78 /* Leave at 22 - not yet released. Change get_nt_acl to return NTSTATUS - vl */
79 /* Leave at 22 - not yet released. Change get_nt_acl to *not* take a
80 * files_struct. - obnox.*/
81 /* Leave at 22 - not yet released. Remove parameter fd from fget_nt_acl. - obnox */
82 /* Leave at 22 - not yet released. Remove parameter fd from gset_nt_acl. - obnox */
83 /* Leave at 22 - not yet released. Remove parameter fd from pread. - obnox */
84 /* Leave at 22 - not yet released. Remove parameter fd from pwrite. - obnox */
85 /* Leave at 22 - not yet released. Remove parameter fd from lseek. - obnox */
86 /* Leave at 22 - not yet released. Remove parameter fd from fsync. - obnox */
87 /* Leave at 22 - not yet released. Remove parameter fd from fstat. - obnox */
88 /* Leave at 22 - not yet released. Remove parameter fd from fchmod. - obnox */
89 /* Leave at 22 - not yet released. Remove parameter fd from fchown. - obnox */
90 /* Leave at 22 - not yet released. Remove parameter fd from ftruncate. - obnox */
91 /* Leave at 22 - not yet released. Remove parameter fd from lock. - obnox */
92 /* Leave at 22 - not yet released. Remove parameter fd from kernel_flock. - obnox */
93 /* Leave at 22 - not yet released. Remove parameter fd from linux_setlease. - obnox */
94 /* Leave at 22 - not yet released. Remove parameter fd from getlock. - obnox */
95 /* Leave at 22 - not yet released. Remove parameter fd from sys_acl_get_fd. - obnox */
96 /* Leave at 22 - not yet released. Remove parameter fd from fchmod_acl. - obnox */
97 /* Leave at 22 - not yet released. Remove parameter fd from sys_acl_set_fd. - obnox */
98 /* Leave at 22 - not yet released. Remove parameter fd from fgetxattr. - obnox */
99 /* Leave at 22 - not yet released. Remove parameter fd from flistxattr. - obnox */
100 /* Leave at 22 - not yet released. Remove parameter fd from fremovexattr. - obnox */
101 /* Leave at 22 - not yet released. Remove parameter fd from fsetxattr. - obnox */
102 /* Leave at 22 - not yet released. Remove parameter fd from aio_cancel. - obnox */
103 /* Leave at 22 - not yet released. Remove parameter fd from read. - obnox */
104 /* Leave at 22 - not yet released. Remove parameter fd from write. - obnox */
105 /* Leave at 22 - not yet released. Remove parameter fromfd from sendfile. - obnox */
106 /* Leave at 22 - not yet released. Remove parameter fromfd from recvfile. - obnox */
107 /* Leave at 22 - not yet released. Additional change: add operations for offline files -- ab */
108 /* Leave at 22 - not yet released. Add the streaminfo call. -- jpeach, vl */
109 /* Leave at 22 - not yet released. Remove parameter fd from close_fn. - obnox */
110 /* Changed to version 23 - remove set_nt_acl call. This can only be done via an
111 open handle. JRA. */
112 /* Changed to version 24 - make security descriptor const in fset_nt_acl. JRA. */
113 /* Changed to version 25 - Jelmer's change from SMB_BIG_UINT to uint64_t. */
114 /* Leave at 25 - not yet released. Add create_file call. -- tprouty. */
115 /* Leave at 25 - not yet released. Add create time to ntimes. -- tstecher. */
116 /* Leave at 25 - not yet released. Add get_alloc_size call. -- tprouty. */
117 /* Leave at 25 - not yet released. Add SMB_STRUCT_STAT to readdir. - sdann */
118 /* Leave at 25 - not yet released. Add init_search_op call. - sdann */
119 /* Leave at 25 - not yet released. Add locking calls. -- zkirsch. */
120 /* Leave at 25 - not yet released. Add strict locking calls. -- drichards. */
121 /* Changed to version 26 - Plumb struct smb_filename to SMB_VFS_CREATE_FILE,
122 SMB_VFS_OPEN, SMB_VFS_STAT, SMB_VFS_LSTAT,
123 SMB_VFS_RENAME, SMB_VFS_UNLINK, SMB_VFS_NTIMES. */
124 /* Changed to version 27 - not yet released. Added enum timestamp_set_resolution
125 * return to fs_capabilities call. JRA. */
126 /* Leave at 27 - not yet released. Add translate_name VFS call to convert
127 UNIX names to Windows supported names -- asrinivasan. */
128 #define SMB_VFS_INTERFACE_VERSION 27
131 /* to bug old modules which are trying to compile with the old functions */
132 #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 };
133 #define lp_parm_string __ERROR_please_port_lp_parm_string_to_lp_parm_const_string_or_lp_parm_talloc_string { \
134 __ERROR_please_port_lp_parm_string_to_lp_parm_const_string_or_lp_parm_talloc_string };
135 #define lp_vfs_options __ERROR_please_donot_use_lp_vfs_options_anymore_use_lp_parm_xxxx_functions_instead { \
136 __ERROR_please_donot_use_lp_vfs_options_anymore_use_lp_parm_xxxx_functions_instead };
139 All intercepted VFS operations must be declared as static functions inside module source
140 in order to keep smbd namespace unpolluted. See source of audit, extd_audit, fake_perms and recycle
141 example VFS modules for more details.
144 /* VFS operations structure */
146 struct vfs_handle_struct;
147 struct connection_struct;
148 struct files_struct;
149 struct security_descriptor;
150 struct vfs_statvfs_struct;
151 struct smb_request;
152 struct ea_list;
153 struct smb_file_time;
154 struct blocking_lock_record;
155 struct smb_filename;
157 #define VFS_FIND(__fn__) while (handle->fns->__fn__==NULL) { \
158 handle = handle->next; \
161 enum vfs_translate_direction {
162 vfs_translate_to_unix = 0,
163 vfs_translate_to_windows
167 Available VFS operations. These values must be in sync with vfs_ops struct
168 (struct vfs_fn_pointers and struct vfs_handle_pointers inside of struct vfs_ops).
169 In particular, if new operations are added to vfs_ops, appropriate constants
170 should be added to vfs_op_type so that order of them kept same as in vfs_ops.
173 struct vfs_fn_pointers {
174 /* Disk operations */
176 int (*connect_fn)(struct vfs_handle_struct *handle, const char *service, const char *user);
177 void (*disconnect)(struct vfs_handle_struct *handle);
178 uint64_t (*disk_free)(struct vfs_handle_struct *handle, const char *path, bool small_query, uint64_t *bsize,
179 uint64_t *dfree, uint64_t *dsize);
180 int (*get_quota)(struct vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *qt);
181 int (*set_quota)(struct vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *qt);
182 int (*get_shadow_copy_data)(struct vfs_handle_struct *handle, struct files_struct *fsp, SHADOW_COPY_DATA *shadow_copy_data, bool labels);
183 int (*statvfs)(struct vfs_handle_struct *handle, const char *path, struct vfs_statvfs_struct *statbuf);
184 uint32_t (*fs_capabilities)(struct vfs_handle_struct *handle, enum timestamp_set_resolution *p_ts_res);
186 /* Directory operations */
188 SMB_STRUCT_DIR *(*opendir)(struct vfs_handle_struct *handle, const char *fname, const char *mask, uint32 attributes);
189 SMB_STRUCT_DIRENT *(*readdir)(struct vfs_handle_struct *handle,
190 SMB_STRUCT_DIR *dirp,
191 SMB_STRUCT_STAT *sbuf);
192 void (*seekdir)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp, long offset);
193 long (*telldir)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp);
194 void (*rewind_dir)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp);
195 int (*mkdir)(struct vfs_handle_struct *handle, const char *path, mode_t mode);
196 int (*rmdir)(struct vfs_handle_struct *handle, const char *path);
197 int (*closedir)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dir);
198 void (*init_search_op)(struct vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp);
200 /* File operations */
202 int (*open)(struct vfs_handle_struct *handle,
203 struct smb_filename *smb_fname, files_struct *fsp,
204 int flags, mode_t mode);
205 NTSTATUS (*create_file)(struct vfs_handle_struct *handle,
206 struct smb_request *req,
207 uint16_t root_dir_fid,
208 struct smb_filename *smb_fname,
209 uint32_t access_mask,
210 uint32_t share_access,
211 uint32_t create_disposition,
212 uint32_t create_options,
213 uint32_t file_attributes,
214 uint32_t oplock_request,
215 uint64_t allocation_size,
216 struct security_descriptor *sd,
217 struct ea_list *ea_list,
218 files_struct **result,
219 int *pinfo);
220 int (*close_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
221 ssize_t (*vfs_read)(struct vfs_handle_struct *handle, struct files_struct *fsp, void *data, size_t n);
222 ssize_t (*pread)(struct vfs_handle_struct *handle, struct files_struct *fsp, void *data, size_t n, SMB_OFF_T offset);
223 ssize_t (*write)(struct vfs_handle_struct *handle, struct files_struct *fsp, const void *data, size_t n);
224 ssize_t (*pwrite)(struct vfs_handle_struct *handle, struct files_struct *fsp, const void *data, size_t n, SMB_OFF_T offset);
225 SMB_OFF_T (*lseek)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_OFF_T offset, int whence);
226 ssize_t (*sendfile)(struct vfs_handle_struct *handle, int tofd, files_struct *fromfsp, const DATA_BLOB *header, SMB_OFF_T offset, size_t count);
227 ssize_t (*recvfile)(struct vfs_handle_struct *handle, int fromfd, files_struct *tofsp, SMB_OFF_T offset, size_t count);
228 int (*rename)(struct vfs_handle_struct *handle,
229 const struct smb_filename *smb_fname_src,
230 const struct smb_filename *smb_fname_dst);
231 int (*fsync)(struct vfs_handle_struct *handle, struct files_struct *fsp);
232 int (*stat)(struct vfs_handle_struct *handle, struct smb_filename *smb_fname);
233 int (*fstat)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_STAT *sbuf);
234 int (*lstat)(struct vfs_handle_struct *handle, struct smb_filename *smb_filename);
235 uint64_t (*get_alloc_size)(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_STAT *sbuf);
236 int (*unlink)(struct vfs_handle_struct *handle,
237 const struct smb_filename *smb_fname);
238 int (*chmod)(struct vfs_handle_struct *handle, const char *path, mode_t mode);
239 int (*fchmod)(struct vfs_handle_struct *handle, struct files_struct *fsp, mode_t mode);
240 int (*chown)(struct vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid);
241 int (*fchown)(struct vfs_handle_struct *handle, struct files_struct *fsp, uid_t uid, gid_t gid);
242 int (*lchown)(struct vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid);
243 int (*chdir)(struct vfs_handle_struct *handle, const char *path);
244 char *(*getwd)(struct vfs_handle_struct *handle, char *buf);
245 int (*ntimes)(struct vfs_handle_struct *handle,
246 const struct smb_filename *smb_fname,
247 struct smb_file_time *ft);
248 int (*ftruncate)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_OFF_T offset);
249 bool (*lock)(struct vfs_handle_struct *handle, struct files_struct *fsp, int op, SMB_OFF_T offset, SMB_OFF_T count, int type);
250 int (*kernel_flock)(struct vfs_handle_struct *handle, struct files_struct *fsp,
251 uint32 share_mode, uint32_t access_mask);
252 int (*linux_setlease)(struct vfs_handle_struct *handle, struct files_struct *fsp, int leasetype);
253 bool (*getlock)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_OFF_T *poffset, SMB_OFF_T *pcount, int *ptype, pid_t *ppid);
254 int (*symlink)(struct vfs_handle_struct *handle, const char *oldpath, const char *newpath);
255 int (*vfs_readlink)(struct vfs_handle_struct *handle, const char *path, char *buf, size_t bufsiz);
256 int (*link)(struct vfs_handle_struct *handle, const char *oldpath, const char *newpath);
257 int (*mknod)(struct vfs_handle_struct *handle, const char *path, mode_t mode, SMB_DEV_T dev);
258 char *(*realpath)(struct vfs_handle_struct *handle, const char *path, char *resolved_path);
259 NTSTATUS (*notify_watch)(struct vfs_handle_struct *handle,
260 struct sys_notify_context *ctx,
261 struct notify_entry *e,
262 void (*callback)(struct sys_notify_context *ctx,
263 void *private_data,
264 struct notify_event *ev),
265 void *private_data, void *handle_p);
266 int (*chflags)(struct vfs_handle_struct *handle, const char *path, unsigned int flags);
267 struct file_id (*file_id_create)(struct vfs_handle_struct *handle,
268 const SMB_STRUCT_STAT *sbuf);
270 NTSTATUS (*streaminfo)(struct vfs_handle_struct *handle,
271 struct files_struct *fsp,
272 const char *fname,
273 TALLOC_CTX *mem_ctx,
274 unsigned int *num_streams,
275 struct stream_struct **streams);
277 int (*get_real_filename)(struct vfs_handle_struct *handle,
278 const char *path,
279 const char *name,
280 TALLOC_CTX *mem_ctx,
281 char **found_name);
283 const char *(*connectpath)(struct vfs_handle_struct *handle,
284 const char *filename);
286 NTSTATUS (*brl_lock_windows)(struct vfs_handle_struct *handle,
287 struct byte_range_lock *br_lck,
288 struct lock_struct *plock,
289 bool blocking_lock,
290 struct blocking_lock_record *blr);
292 bool (*brl_unlock_windows)(struct vfs_handle_struct *handle,
293 struct messaging_context *msg_ctx,
294 struct byte_range_lock *br_lck,
295 const struct lock_struct *plock);
297 bool (*brl_cancel_windows)(struct vfs_handle_struct *handle,
298 struct byte_range_lock *br_lck,
299 struct lock_struct *plock,
300 struct blocking_lock_record *blr);
302 bool (*strict_lock)(struct vfs_handle_struct *handle,
303 struct files_struct *fsp,
304 struct lock_struct *plock);
306 void (*strict_unlock)(struct vfs_handle_struct *handle,
307 struct files_struct *fsp,
308 struct lock_struct *plock);
310 NTSTATUS (*translate_name)(struct vfs_handle_struct *handle,
311 const char *name,
312 enum vfs_translate_direction direction,
313 TALLOC_CTX *mem_ctx,
314 char **mapped_name);
316 /* NT ACL operations. */
318 NTSTATUS (*fget_nt_acl)(struct vfs_handle_struct *handle,
319 struct files_struct *fsp,
320 uint32 security_info,
321 struct security_descriptor **ppdesc);
322 NTSTATUS (*get_nt_acl)(struct vfs_handle_struct *handle,
323 const char *name,
324 uint32 security_info,
325 struct security_descriptor **ppdesc);
326 NTSTATUS (*fset_nt_acl)(struct vfs_handle_struct *handle,
327 struct files_struct *fsp,
328 uint32 security_info_sent,
329 const struct security_descriptor *psd);
331 /* POSIX ACL operations. */
333 int (*chmod_acl)(struct vfs_handle_struct *handle, const char *name, mode_t mode);
334 int (*fchmod_acl)(struct vfs_handle_struct *handle, struct files_struct *fsp, mode_t mode);
336 int (*sys_acl_get_entry)(struct vfs_handle_struct *handle, SMB_ACL_T theacl, int entry_id, SMB_ACL_ENTRY_T *entry_p);
337 int (*sys_acl_get_tag_type)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p);
338 int (*sys_acl_get_permset)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d, SMB_ACL_PERMSET_T *permset_p);
339 void * (*sys_acl_get_qualifier)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d);
340 SMB_ACL_T (*sys_acl_get_file)(struct vfs_handle_struct *handle, const char *path_p, SMB_ACL_TYPE_T type);
341 SMB_ACL_T (*sys_acl_get_fd)(struct vfs_handle_struct *handle, struct files_struct *fsp);
342 int (*sys_acl_clear_perms)(struct vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset);
343 int (*sys_acl_add_perm)(struct vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm);
344 char * (*sys_acl_to_text)(struct vfs_handle_struct *handle, SMB_ACL_T theacl, ssize_t *plen);
345 SMB_ACL_T (*sys_acl_init)(struct vfs_handle_struct *handle, int count);
346 int (*sys_acl_create_entry)(struct vfs_handle_struct *handle, SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry);
347 int (*sys_acl_set_tag_type)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tagtype);
348 int (*sys_acl_set_qualifier)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, void *qual);
349 int (*sys_acl_set_permset)(struct vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, SMB_ACL_PERMSET_T permset);
350 int (*sys_acl_valid)(struct vfs_handle_struct *handle, SMB_ACL_T theacl );
351 int (*sys_acl_set_file)(struct vfs_handle_struct *handle, const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl);
352 int (*sys_acl_set_fd)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_ACL_T theacl);
353 int (*sys_acl_delete_def_file)(struct vfs_handle_struct *handle, const char *path);
354 int (*sys_acl_get_perm)(struct vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm);
355 int (*sys_acl_free_text)(struct vfs_handle_struct *handle, char *text);
356 int (*sys_acl_free_acl)(struct vfs_handle_struct *handle, SMB_ACL_T posix_acl);
357 int (*sys_acl_free_qualifier)(struct vfs_handle_struct *handle, void *qualifier, SMB_ACL_TAG_T tagtype);
359 /* EA operations. */
360 ssize_t (*getxattr)(struct vfs_handle_struct *handle,const char *path, const char *name, void *value, size_t size);
361 ssize_t (*lgetxattr)(struct vfs_handle_struct *handle,const char *path, const char *name, void *value, size_t size);
362 ssize_t (*fgetxattr)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, void *value, size_t size);
363 ssize_t (*listxattr)(struct vfs_handle_struct *handle, const char *path, char *list, size_t size);
364 ssize_t (*llistxattr)(struct vfs_handle_struct *handle, const char *path, char *list, size_t size);
365 ssize_t (*flistxattr)(struct vfs_handle_struct *handle, struct files_struct *fsp, char *list, size_t size);
366 int (*removexattr)(struct vfs_handle_struct *handle, const char *path, const char *name);
367 int (*lremovexattr)(struct vfs_handle_struct *handle, const char *path, const char *name);
368 int (*fremovexattr)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name);
369 int (*setxattr)(struct vfs_handle_struct *handle, const char *path, const char *name, const void *value, size_t size, int flags);
370 int (*lsetxattr)(struct vfs_handle_struct *handle, const char *path, const char *name, const void *value, size_t size, int flags);
371 int (*fsetxattr)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, const void *value, size_t size, int flags);
373 /* aio operations */
374 int (*aio_read)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
375 int (*aio_write)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
376 ssize_t (*aio_return_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
377 int (*aio_cancel)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
378 int (*aio_error_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
379 int (*aio_fsync)(struct vfs_handle_struct *handle, struct files_struct *fsp, int op, SMB_STRUCT_AIOCB *aiocb);
380 int (*aio_suspend)(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_AIOCB * const aiocb[], int n, const struct timespec *timeout);
381 bool (*aio_force)(struct vfs_handle_struct *handle, struct files_struct *fsp);
383 /* offline operations */
384 bool (*is_offline)(struct vfs_handle_struct *handle, const char *path, SMB_STRUCT_STAT *sbuf);
385 int (*set_offline)(struct vfs_handle_struct *handle, const char *path);
389 VFS operation description. Each VFS module registers an array of vfs_op_tuple to VFS subsystem,
390 which describes all operations this module is willing to intercept.
391 VFS subsystem initializes then the conn->vfs_ops and conn->vfs_opaque_ops structs
392 using this information.
395 typedef struct vfs_handle_struct {
396 struct vfs_handle_struct *next, *prev;
397 const char *param;
398 struct connection_struct *conn;
399 const struct vfs_fn_pointers *fns;
400 void *data;
401 void (*free_data)(void **data);
402 } vfs_handle_struct;
405 typedef struct vfs_statvfs_struct {
406 /* For undefined recommended transfer size return -1 in that field */
407 uint32 OptimalTransferSize; /* bsize on some os, iosize on other os */
408 uint32 BlockSize;
411 The next three fields are in terms of the block size.
412 (above). If block size is unknown, 4096 would be a
413 reasonable block size for a server to report.
414 Note that returning the blocks/blocksavail removes need
415 to make a second call (to QFSInfo level 0x103 to get this info.
416 UserBlockAvail is typically less than or equal to BlocksAvail,
417 if no distinction is made return the same value in each.
420 uint64_t TotalBlocks;
421 uint64_t BlocksAvail; /* bfree */
422 uint64_t UserBlocksAvail; /* bavail */
424 /* For undefined Node fields or FSID return -1 */
425 uint64_t TotalFileNodes;
426 uint64_t FreeFileNodes;
427 uint64_t FsIdentifier; /* fsid */
428 /* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */
429 /* NB flags can come from FILE_SYSTEM_DEVICE_INFO call */
431 int FsCapabilities;
432 } vfs_statvfs_struct;
434 /* Add a new FSP extension of the given type. Returns a pointer to the
435 * extenstion data.
437 #define VFS_ADD_FSP_EXTENSION(handle, fsp, type, destroy_fn) \
438 vfs_add_fsp_extension_notype(handle, (fsp), sizeof(type), (destroy_fn))
440 /* Return a pointer to the existing FSP extension data. */
441 #define VFS_FETCH_FSP_EXTENSION(handle, fsp) \
442 vfs_fetch_fsp_extension(handle, (fsp))
444 /* Return the talloc context associated with an FSP extension. */
445 #define VFS_MEMCTX_FSP_EXTENSION(handle, fsp) \
446 vfs_memctx_fsp_extension(handle, (fsp))
448 /* Remove and destroy an FSP extension. */
449 #define VFS_REMOVE_FSP_EXTENSION(handle, fsp) \
450 vfs_remove_fsp_extension((handle), (fsp))
452 #define SMB_VFS_HANDLE_GET_DATA(handle, datap, type, ret) { \
453 if (!(handle)||((datap=(type *)(handle)->data)==NULL)) { \
454 DEBUG(0,("%s() failed to get vfs_handle->data!\n",FUNCTION_MACRO)); \
455 ret; \
459 #define SMB_VFS_HANDLE_SET_DATA(handle, datap, free_fn, type, ret) { \
460 if (!(handle)) { \
461 DEBUG(0,("%s() failed to set handle->data!\n",FUNCTION_MACRO)); \
462 ret; \
463 } else { \
464 if ((handle)->free_data) { \
465 (handle)->free_data(&(handle)->data); \
467 (handle)->data = (void *)datap; \
468 (handle)->free_data = free_fn; \
472 #define SMB_VFS_HANDLE_FREE_DATA(handle) { \
473 if ((handle) && (handle)->free_data) { \
474 (handle)->free_data(&(handle)->data); \
478 /* Check whether module-specific data handle was already allocated or not */
479 #define SMB_VFS_HANDLE_TEST_DATA(handle) ( !(handle) || !(handle)->data ? False : True )
481 #define SMB_VFS_OP(x) ((void *) x)
483 #define DEFAULT_VFS_MODULE_NAME "/[Default VFS]/"
485 #include "vfs_macros.h"
487 int smb_vfs_call_connect(struct vfs_handle_struct *handle,
488 const char *service, const char *user);
489 void smb_vfs_call_disconnect(struct vfs_handle_struct *handle);
490 uint64_t smb_vfs_call_disk_free(struct vfs_handle_struct *handle,
491 const char *path, bool small_query,
492 uint64_t *bsize, uint64_t *dfree,
493 uint64_t *dsize);
494 int smb_vfs_call_get_quota(struct vfs_handle_struct *handle,
495 enum SMB_QUOTA_TYPE qtype, unid_t id,
496 SMB_DISK_QUOTA *qt);
497 int smb_vfs_call_set_quota(struct vfs_handle_struct *handle,
498 enum SMB_QUOTA_TYPE qtype, unid_t id,
499 SMB_DISK_QUOTA *qt);
500 int smb_vfs_call_get_shadow_copy_data(struct vfs_handle_struct *handle,
501 struct files_struct *fsp,
502 SHADOW_COPY_DATA *shadow_copy_data,
503 bool labels);
504 int smb_vfs_call_statvfs(struct vfs_handle_struct *handle, const char *path,
505 struct vfs_statvfs_struct *statbuf);
506 uint32_t smb_vfs_call_fs_capabilities(struct vfs_handle_struct *handle,
507 enum timestamp_set_resolution *p_ts_res);
508 SMB_STRUCT_DIR *smb_vfs_call_opendir(struct vfs_handle_struct *handle,
509 const char *fname, const char *mask,
510 uint32 attributes);
511 SMB_STRUCT_DIRENT *smb_vfs_call_readdir(struct vfs_handle_struct *handle,
512 SMB_STRUCT_DIR *dirp,
513 SMB_STRUCT_STAT *sbuf);
514 void smb_vfs_call_seekdir(struct vfs_handle_struct *handle,
515 SMB_STRUCT_DIR *dirp, long offset);
516 long smb_vfs_call_telldir(struct vfs_handle_struct *handle,
517 SMB_STRUCT_DIR *dirp);
518 void smb_vfs_call_rewind_dir(struct vfs_handle_struct *handle,
519 SMB_STRUCT_DIR *dirp);
520 int smb_vfs_call_mkdir(struct vfs_handle_struct *handle, const char *path,
521 mode_t mode);
522 int smb_vfs_call_rmdir(struct vfs_handle_struct *handle, const char *path);
523 int smb_vfs_call_closedir(struct vfs_handle_struct *handle,
524 SMB_STRUCT_DIR *dir);
525 void smb_vfs_call_init_search_op(struct vfs_handle_struct *handle,
526 SMB_STRUCT_DIR *dirp);
527 int smb_vfs_call_open(struct vfs_handle_struct *handle,
528 struct smb_filename *smb_fname, struct files_struct *fsp,
529 int flags, mode_t mode);
530 NTSTATUS smb_vfs_call_create_file(struct vfs_handle_struct *handle,
531 struct smb_request *req,
532 uint16_t root_dir_fid,
533 struct smb_filename *smb_fname,
534 uint32_t access_mask,
535 uint32_t share_access,
536 uint32_t create_disposition,
537 uint32_t create_options,
538 uint32_t file_attributes,
539 uint32_t oplock_request,
540 uint64_t allocation_size,
541 struct security_descriptor *sd,
542 struct ea_list *ea_list,
543 files_struct **result,
544 int *pinfo);
545 int smb_vfs_call_close_fn(struct vfs_handle_struct *handle,
546 struct files_struct *fsp);
547 ssize_t smb_vfs_call_vfs_read(struct vfs_handle_struct *handle,
548 struct files_struct *fsp, void *data, size_t n);
549 ssize_t smb_vfs_call_pread(struct vfs_handle_struct *handle,
550 struct files_struct *fsp, void *data, size_t n,
551 SMB_OFF_T offset);
552 ssize_t smb_vfs_call_write(struct vfs_handle_struct *handle,
553 struct files_struct *fsp, const void *data,
554 size_t n);
555 ssize_t smb_vfs_call_pwrite(struct vfs_handle_struct *handle,
556 struct files_struct *fsp, const void *data,
557 size_t n, SMB_OFF_T offset);
558 SMB_OFF_T smb_vfs_call_lseek(struct vfs_handle_struct *handle,
559 struct files_struct *fsp, SMB_OFF_T offset,
560 int whence);
561 ssize_t smb_vfs_call_sendfile(struct vfs_handle_struct *handle, int tofd,
562 files_struct *fromfsp, const DATA_BLOB *header,
563 SMB_OFF_T offset, size_t count);
564 ssize_t smb_vfs_call_recvfile(struct vfs_handle_struct *handle, int fromfd,
565 files_struct *tofsp, SMB_OFF_T offset,
566 size_t count);
567 int smb_vfs_call_rename(struct vfs_handle_struct *handle,
568 const struct smb_filename *smb_fname_src,
569 const struct smb_filename *smb_fname_dst);
570 int smb_vfs_call_fsync(struct vfs_handle_struct *handle,
571 struct files_struct *fsp);
572 int smb_vfs_call_stat(struct vfs_handle_struct *handle,
573 struct smb_filename *smb_fname);
574 int smb_vfs_call_fstat(struct vfs_handle_struct *handle,
575 struct files_struct *fsp, SMB_STRUCT_STAT *sbuf);
576 int smb_vfs_call_lstat(struct vfs_handle_struct *handle,
577 struct smb_filename *smb_filename);
578 uint64_t smb_vfs_call_get_alloc_size(struct vfs_handle_struct *handle,
579 struct files_struct *fsp,
580 const SMB_STRUCT_STAT *sbuf);
581 int smb_vfs_call_unlink(struct vfs_handle_struct *handle,
582 const struct smb_filename *smb_fname);
583 int smb_vfs_call_chmod(struct vfs_handle_struct *handle, const char *path,
584 mode_t mode);
585 int smb_vfs_call_fchmod(struct vfs_handle_struct *handle,
586 struct files_struct *fsp, mode_t mode);
587 int smb_vfs_call_chown(struct vfs_handle_struct *handle, const char *path,
588 uid_t uid, gid_t gid);
589 int smb_vfs_call_fchown(struct vfs_handle_struct *handle,
590 struct files_struct *fsp, uid_t uid, gid_t gid);
591 int smb_vfs_call_lchown(struct vfs_handle_struct *handle, const char *path,
592 uid_t uid, gid_t gid);
593 int smb_vfs_call_chdir(struct vfs_handle_struct *handle, const char *path);
594 char *smb_vfs_call_getwd(struct vfs_handle_struct *handle, char *buf);
595 int smb_vfs_call_ntimes(struct vfs_handle_struct *handle,
596 const struct smb_filename *smb_fname,
597 struct smb_file_time *ft);
598 int smb_vfs_call_ftruncate(struct vfs_handle_struct *handle,
599 struct files_struct *fsp, SMB_OFF_T offset);
600 bool smb_vfs_call_lock(struct vfs_handle_struct *handle,
601 struct files_struct *fsp, int op, SMB_OFF_T offset,
602 SMB_OFF_T count, int type);
603 int smb_vfs_call_kernel_flock(struct vfs_handle_struct *handle,
604 struct files_struct *fsp, uint32 share_mode,
605 uint32_t access_mask);
606 int smb_vfs_call_linux_setlease(struct vfs_handle_struct *handle,
607 struct files_struct *fsp, int leasetype);
608 bool smb_vfs_call_getlock(struct vfs_handle_struct *handle,
609 struct files_struct *fsp, SMB_OFF_T *poffset,
610 SMB_OFF_T *pcount, int *ptype, pid_t *ppid);
611 int smb_vfs_call_symlink(struct vfs_handle_struct *handle, const char *oldpath,
612 const char *newpath);
613 int smb_vfs_call_vfs_readlink(struct vfs_handle_struct *handle,
614 const char *path, char *buf, size_t bufsiz);
615 int smb_vfs_call_link(struct vfs_handle_struct *handle, const char *oldpath,
616 const char *newpath);
617 int smb_vfs_call_mknod(struct vfs_handle_struct *handle, const char *path,
618 mode_t mode, SMB_DEV_T dev);
619 char *smb_vfs_call_realpath(struct vfs_handle_struct *handle,
620 const char *path, char *resolved_path);
621 NTSTATUS smb_vfs_call_notify_watch(struct vfs_handle_struct *handle,
622 struct sys_notify_context *ctx,
623 struct notify_entry *e,
624 void (*callback)(struct sys_notify_context *ctx,
625 void *private_data,
626 struct notify_event *ev),
627 void *private_data, void *handle_p);
628 int smb_vfs_call_chflags(struct vfs_handle_struct *handle, const char *path,
629 unsigned int flags);
630 struct file_id smb_vfs_call_file_id_create(struct vfs_handle_struct *handle,
631 const SMB_STRUCT_STAT *sbuf);
632 NTSTATUS smb_vfs_call_streaminfo(struct vfs_handle_struct *handle,
633 struct files_struct *fsp,
634 const char *fname,
635 TALLOC_CTX *mem_ctx,
636 unsigned int *num_streams,
637 struct stream_struct **streams);
638 int smb_vfs_call_get_real_filename(struct vfs_handle_struct *handle,
639 const char *path, const char *name,
640 TALLOC_CTX *mem_ctx, char **found_name);
641 const char *smb_vfs_call_connectpath(struct vfs_handle_struct *handle,
642 const char *filename);
643 NTSTATUS smb_vfs_call_brl_lock_windows(struct vfs_handle_struct *handle,
644 struct byte_range_lock *br_lck,
645 struct lock_struct *plock,
646 bool blocking_lock,
647 struct blocking_lock_record *blr);
648 bool smb_vfs_call_brl_unlock_windows(struct vfs_handle_struct *handle,
649 struct messaging_context *msg_ctx,
650 struct byte_range_lock *br_lck,
651 const struct lock_struct *plock);
652 bool smb_vfs_call_brl_cancel_windows(struct vfs_handle_struct *handle,
653 struct byte_range_lock *br_lck,
654 struct lock_struct *plock,
655 struct blocking_lock_record *blr);
656 bool smb_vfs_call_strict_lock(struct vfs_handle_struct *handle,
657 struct files_struct *fsp,
658 struct lock_struct *plock);
659 void smb_vfs_call_strict_unlock(struct vfs_handle_struct *handle,
660 struct files_struct *fsp,
661 struct lock_struct *plock);
662 NTSTATUS smb_vfs_call_translate_name(struct vfs_handle_struct *handle,
663 const char *name,
664 enum vfs_translate_direction direction,
665 TALLOC_CTX *mem_ctx,
666 char **mapped_name);
667 NTSTATUS smb_vfs_call_fget_nt_acl(struct vfs_handle_struct *handle,
668 struct files_struct *fsp,
669 uint32 security_info,
670 struct security_descriptor **ppdesc);
671 NTSTATUS smb_vfs_call_get_nt_acl(struct vfs_handle_struct *handle,
672 const char *name,
673 uint32 security_info,
674 struct security_descriptor **ppdesc);
675 NTSTATUS smb_vfs_call_fset_nt_acl(struct vfs_handle_struct *handle,
676 struct files_struct *fsp,
677 uint32 security_info_sent,
678 const struct security_descriptor *psd);
679 int smb_vfs_call_chmod_acl(struct vfs_handle_struct *handle, const char *name,
680 mode_t mode);
681 int smb_vfs_call_fchmod_acl(struct vfs_handle_struct *handle,
682 struct files_struct *fsp, mode_t mode);
683 int smb_vfs_call_sys_acl_get_entry(struct vfs_handle_struct *handle,
684 SMB_ACL_T theacl, int entry_id,
685 SMB_ACL_ENTRY_T *entry_p);
686 int smb_vfs_call_sys_acl_get_tag_type(struct vfs_handle_struct *handle,
687 SMB_ACL_ENTRY_T entry_d,
688 SMB_ACL_TAG_T *tag_type_p);
689 int smb_vfs_call_sys_acl_get_permset(struct vfs_handle_struct *handle,
690 SMB_ACL_ENTRY_T entry_d,
691 SMB_ACL_PERMSET_T *permset_p);
692 void * smb_vfs_call_sys_acl_get_qualifier(struct vfs_handle_struct *handle,
693 SMB_ACL_ENTRY_T entry_d);
694 SMB_ACL_T smb_vfs_call_sys_acl_get_file(struct vfs_handle_struct *handle,
695 const char *path_p,
696 SMB_ACL_TYPE_T type);
697 SMB_ACL_T smb_vfs_call_sys_acl_get_fd(struct vfs_handle_struct *handle,
698 struct files_struct *fsp);
699 int smb_vfs_call_sys_acl_clear_perms(struct vfs_handle_struct *handle,
700 SMB_ACL_PERMSET_T permset);
701 int smb_vfs_call_sys_acl_add_perm(struct vfs_handle_struct *handle,
702 SMB_ACL_PERMSET_T permset,
703 SMB_ACL_PERM_T perm);
704 char * smb_vfs_call_sys_acl_to_text(struct vfs_handle_struct *handle,
705 SMB_ACL_T theacl, ssize_t *plen);
706 SMB_ACL_T smb_vfs_call_sys_acl_init(struct vfs_handle_struct *handle,
707 int count);
708 int smb_vfs_call_sys_acl_create_entry(struct vfs_handle_struct *handle,
709 SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry);
710 int smb_vfs_call_sys_acl_set_tag_type(struct vfs_handle_struct *handle,
711 SMB_ACL_ENTRY_T entry,
712 SMB_ACL_TAG_T tagtype);
713 int smb_vfs_call_sys_acl_set_qualifier(struct vfs_handle_struct *handle,
714 SMB_ACL_ENTRY_T entry, void *qual);
715 int smb_vfs_call_sys_acl_set_permset(struct vfs_handle_struct *handle,
716 SMB_ACL_ENTRY_T entry,
717 SMB_ACL_PERMSET_T permset);
718 int smb_vfs_call_sys_acl_valid(struct vfs_handle_struct *handle,
719 SMB_ACL_T theacl);
720 int smb_vfs_call_sys_acl_set_file(struct vfs_handle_struct *handle,
721 const char *name, SMB_ACL_TYPE_T acltype,
722 SMB_ACL_T theacl);
723 int smb_vfs_call_sys_acl_set_fd(struct vfs_handle_struct *handle,
724 struct files_struct *fsp, SMB_ACL_T theacl);
725 int smb_vfs_call_sys_acl_delete_def_file(struct vfs_handle_struct *handle,
726 const char *path);
727 int smb_vfs_call_sys_acl_get_perm(struct vfs_handle_struct *handle,
728 SMB_ACL_PERMSET_T permset,
729 SMB_ACL_PERM_T perm);
730 int smb_vfs_call_sys_acl_free_text(struct vfs_handle_struct *handle,
731 char *text);
732 int smb_vfs_call_sys_acl_free_acl(struct vfs_handle_struct *handle,
733 SMB_ACL_T posix_acl);
734 int smb_vfs_call_sys_acl_free_qualifier(struct vfs_handle_struct *handle,
735 void *qualifier, SMB_ACL_TAG_T tagtype);
736 ssize_t smb_vfs_call_getxattr(struct vfs_handle_struct *handle,
737 const char *path, const char *name, void *value,
738 size_t size);
739 ssize_t smb_vfs_call_lgetxattr(struct vfs_handle_struct *handle,
740 const char *path, const char *name, void *value,
741 size_t size);
742 ssize_t smb_vfs_call_fgetxattr(struct vfs_handle_struct *handle,
743 struct files_struct *fsp, const char *name,
744 void *value, size_t size);
745 ssize_t smb_vfs_call_listxattr(struct vfs_handle_struct *handle,
746 const char *path, char *list, size_t size);
747 ssize_t smb_vfs_call_llistxattr(struct vfs_handle_struct *handle,
748 const char *path, char *list, size_t size);
749 ssize_t smb_vfs_call_flistxattr(struct vfs_handle_struct *handle,
750 struct files_struct *fsp, char *list,
751 size_t size);
752 int smb_vfs_call_removexattr(struct vfs_handle_struct *handle,
753 const char *path, const char *name);
754 int smb_vfs_call_lremovexattr(struct vfs_handle_struct *handle,
755 const char *path, const char *name);
756 int smb_vfs_call_fremovexattr(struct vfs_handle_struct *handle,
757 struct files_struct *fsp, const char *name);
758 int smb_vfs_call_setxattr(struct vfs_handle_struct *handle, const char *path,
759 const char *name, const void *value, size_t size,
760 int flags);
761 int smb_vfs_call_lsetxattr(struct vfs_handle_struct *handle, const char *path,
762 const char *name, const void *value, size_t size,
763 int flags);
764 int smb_vfs_call_fsetxattr(struct vfs_handle_struct *handle,
765 struct files_struct *fsp, const char *name,
766 const void *value, size_t size, int flags);
767 int smb_vfs_call_aio_read(struct vfs_handle_struct *handle,
768 struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
769 int smb_vfs_call_aio_write(struct vfs_handle_struct *handle,
770 struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
771 ssize_t smb_vfs_call_aio_return_fn(struct vfs_handle_struct *handle,
772 struct files_struct *fsp,
773 SMB_STRUCT_AIOCB *aiocb);
774 int smb_vfs_call_aio_cancel(struct vfs_handle_struct *handle,
775 struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
776 int smb_vfs_call_aio_error_fn(struct vfs_handle_struct *handle,
777 struct files_struct *fsp,
778 SMB_STRUCT_AIOCB *aiocb);
779 int smb_vfs_call_aio_fsync(struct vfs_handle_struct *handle,
780 struct files_struct *fsp, int op,
781 SMB_STRUCT_AIOCB *aiocb);
782 int smb_vfs_call_aio_suspend(struct vfs_handle_struct *handle,
783 struct files_struct *fsp,
784 const SMB_STRUCT_AIOCB * const aiocb[], int n,
785 const struct timespec *timeout);
786 bool smb_vfs_call_aio_force(struct vfs_handle_struct *handle,
787 struct files_struct *fsp);
788 bool smb_vfs_call_is_offline(struct vfs_handle_struct *handle,
789 const char *path, SMB_STRUCT_STAT *sbuf);
790 int smb_vfs_call_set_offline(struct vfs_handle_struct *handle,
791 const char *path);
793 #endif /* _VFS_H */