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.
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 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
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 /* Changed to version 28 - Add private_flags uint32_t to CREATE call. */
129 /* Leave at 28 - not yet released. Change realpath to assume NULL and return a
130 malloc'ed path. JRA. */
131 /* Leave at 28 - not yet released. Move posix_fallocate into the VFS
132 where it belongs. JRA. */
133 /* Leave at 28 - not yet released. Rename posix_fallocate to fallocate
134 to split out the two possible uses. JRA. */
135 /* Leave at 28 - not yet released. Add fdopendir. JRA. */
136 /* Leave at 28 - not yet released. Rename open function to open_fn. - gd */
137 /* Leave at 28 - not yet released. Make getwd function always return malloced memory. JRA. */
138 /* Bump to version 29 - Samba 3.6.0 will ship with interface version 28. */
139 /* Leave at 29 - not yet releases. Add fsctl. Richard Sharpe */
140 /* Leave at 29 - not yet released. add SMB_VFS_GET_DFS_REFERRAL() - metze */
141 /* Leave at 29 - not yet released. Remove l{list,get,set,remove}xattr - abartlet */
142 /* Leave at 29 - not yet released. move to plain off_t - abartlet */
143 /* Leave at 29 - not yet released. Remove sys_acl functions other than set and get - abartlet */
144 /* Leave at 29 - not yet released. Added backup_intent bool to files_struct - JRA */
145 /* Leave at 29 - not yet released. Add durable handle functions - metze/obnox */
146 /* Leave at 29 - not yet released. Added sys_acl_blob_get_file and sys_acl_blob_get_fd */
147 /* Bump to version 30 - Samba 4.0.0 will ship with interface version 30 */
148 /* Leave at 30 - not yet released. Added conn->cwd to save vfs_GetWd() calls. */
149 /* Leave at 30 - not yet released. Changed sys_acl_blob_get_file interface to remove type */
150 /* Bump to version 31 - Samba 4.1.0 will ship with interface version 31 */
151 /* Leave at 31 - not yet released. Make struct vuid_cache_entry in
152 connection_struct a pointer. */
153 /* Leave at 31 - not yet released. Add share_access to vuid_cache_entry. */
154 /* Leave at 31 - not yet released. add SMB_VFS_COPY_CHUNK() */
155 /* Leave at 31 - not yet released. Remove the unused
156 fsp->pending_break_messages array */
157 /* Leave at 31 - not yet released. add SMB_VFS_[GET/SET]_COMPRESSION() */
159 /* Bump to version 32 - Samba 4.2 will ship with that. */
160 /* Version 32 - Add "lease" to CREATE_FILE operation */
161 /* Version 32 - Add "lease" to struct files_struct */
162 /* Version 32 - Add SMB_VFS_READDIR_ATTR() */
163 /* Version 32 - Add in and out create context blobs to create_file */
164 /* Version 32 - Remove unnecessary SMB_VFS_DISK_FREE() small_query parameter */
165 /* Bump to version 33 - Samba 4.3 will ship with that. */
166 /* Version 33 - change fallocate mode flags param from enum->uint32_t */
167 /* Version 33 - Add snapshot create/delete calls */
168 /* Version 33 - Add OS X SMB2 AAPL copyfile extension flag to fsp */
169 /* Version 33 - Remove notify_watch_fn */
170 /* Bump to version 34 - Samba 4.4 will ship with that */
171 /* Version 34 - Remove bool posix_open, add uint64_t posix_flags */
172 /* Version 34 - Added bool posix_pathnames to struct smb_request */
173 /* Bump to version 35 - Samba 4.5 will ship with that */
174 /* Version 35 - Change get_nt_acl_fn from const char *, to
175 const struct smb_filename * */
176 /* Version 35 - Change mkdir from const char *, to
177 const struct smb_filename * */
179 #define SMB_VFS_INTERFACE_VERSION 35
182 All intercepted VFS operations must be declared as static functions inside module source
183 in order to keep smbd namespace unpolluted. See source of audit, extd_audit, fake_perms and recycle
184 example VFS modules for more details.
187 /* VFS operations structure */
189 struct vfs_handle_struct;
190 struct connection_struct;
192 struct security_descriptor;
193 struct vfs_statvfs_struct;
196 struct smb_file_time;
197 struct blocking_lock_record;
199 struct dfs_GetDFSReferral;
201 typedef union unid_t {
209 uint64_t position_information;
211 uint32_t private_options; /* NT Create options, but we only look at
212 * NTCREATEX_OPTIONS_PRIVATE_DENY_DOS and
213 * NTCREATEX_OPTIONS_PRIVATE_DENY_FCB and
214 * NTCREATEX_OPTIONS_PRIVATE_DELETE_ON_CLOSE
215 * for print files *only*, where
216 * DELETE_ON_CLOSE is not stored in the share
219 unsigned long gen_id;
224 struct smbd_server_connection *sconn;
225 struct tevent_timer *timeout;
226 struct smb2_lease lease;
229 typedef struct files_struct {
230 struct files_struct *next, *prev;
232 struct smbXsrv_open *op;
233 struct connection_struct *conn;
234 struct fd_handle *fh;
235 unsigned int num_smb_operations;
236 struct file_id file_id;
237 uint64_t initial_allocation_size; /* Faked up initial allocation on disk. */
239 uint64_t vuid; /* SMB2 compat */
240 struct write_cache *wcp;
241 struct timeval open_time;
242 uint32_t access_mask; /* NTCreateX access bits (FILE_READ_DATA etc.) */
243 uint32_t share_access; /* NTCreateX share constants (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE). */
245 bool update_write_time_triggered;
246 struct tevent_timer *update_write_time_event;
247 bool update_write_time_on_close;
248 struct timespec close_write_time;
249 bool write_time_forced;
252 struct fsp_lease *lease; /* Not yet used. Placeholder for leases. */
253 int sent_oplock_break;
254 struct tevent_timer *oplock_timeout;
255 struct lock_struct last_lock_failure;
256 int current_lock_count; /* Count the number of outstanding locks and pending locks. */
263 bool aio_write_behind;
264 bool initial_delete_on_close; /* Only set at NTCreateX if file was created. */
265 bool delete_on_close;
266 uint64_t posix_flags;
268 bool backup_intent; /* Handle was successfully opened with backup intent
269 and opener has privilege to do so. */
270 bool aapl_copyfile_supported;
271 struct smb_filename *fsp_name;
272 uint32_t name_hash; /* Jenkins hash of full pathname. */
273 uint64_t mid; /* Mid of the operation that created us. */
275 struct vfs_fsp_data *vfs_extension;
276 struct fake_file_handle *fake_file_handle;
278 struct notify_change_buf *notify;
280 struct files_struct *base_fsp; /* placeholder for delete on close */
283 * Read-only cached brlock record, thrown away when the
284 * brlock.tdb seqnum changes. This avoids fetching data from
285 * the brlock.tdb on every read/write call.
288 struct byte_range_lock *brlock_rec;
290 struct dptr_struct *dptr;
292 /* if not NULL, means this is a print file */
293 struct print_file_data *print_file;
295 unsigned num_aio_requests;
296 struct tevent_req **aio_requests;
299 * If a close request comes in while we still have aio_requests
300 * around, we need to hold back the close. When all aio_requests are
301 * done, the aio completion routines need tevent_wait_done() on
302 * this. A bit ugly, but before we have close_file() fully async
303 * possibly the simplest approach. Thanks, Jeremy for the idea.
305 struct tevent_req *deferred_close;
308 #define FSP_POSIX_FLAGS_OPEN 0x01
309 #define FSP_POSIX_FLAGS_RENAME 0x02
310 #define FSP_POSIX_FLAGS_PATHNAMES 0x04
312 #define FSP_POSIX_FLAGS_ALL \
313 (FSP_POSIX_FLAGS_OPEN | \
314 FSP_POSIX_FLAGS_PATHNAMES | \
315 FSP_POSIX_FLAGS_RENAME)
317 struct vuid_cache_entry {
318 struct auth_session_info *session_info;
319 uint64_t vuid; /* SMB2 compat */
321 uint32_t share_access;
325 unsigned int next_entry;
326 struct vuid_cache_entry array[VUID_CACHE_SIZE];
332 } name_compare_entry;
334 struct dfree_cached_info {
335 time_t last_dfree_time;
342 struct share_params {
346 typedef struct connection_struct {
347 struct connection_struct *next, *prev;
348 struct smbd_server_connection *sconn; /* can be NULL */
349 struct smbXsrv_tcon *tcon; /* can be NULL */
350 uint32_t cnum; /* an index passed over the wire */
351 struct share_params *params;
353 struct vuid_cache *vuid_cache;
356 bool read_only; /* Attributes for the current user of the share. */
357 uint32_t share_access;
358 /* Does this filesystem honor
359 sub second timestamps on files
360 and directories when setting time ? */
361 enum timestamp_set_resolution ts_res;
364 char *cwd; /* Working directory. */
366 struct vfs_handle_struct *vfs_handles; /* for the new plugins */
369 * This represents the user information on this connection. Depending
370 * on the vuid using this tid, this might change per SMB request.
372 struct auth_session_info *session_info;
375 * If the "force group" parameter is set, this is the primary gid that
376 * may be used in the users token, depending on the vuid using this tid.
378 gid_t force_group_gid;
380 uint64_t vuid; /* vuid of user who *opened* this connection, or UID_FIELD_INVALID */
383 time_t lastused_count;
385 unsigned int num_smb_operations; /* Count of smb operations on this tree. */
389 /* Semantics requested by the client or forced by the server config. */
392 bool short_case_preserve;
394 /* Semantics provided by the underlying filesystem. */
396 /* Device number of the directory of the share mount.
397 Used to ensure unique FileIndex returns. */
398 SMB_DEV_T base_share_dev;
400 name_compare_entry *hide_list; /* Per-share list of files to return as hidden. */
401 name_compare_entry *veto_list; /* Per-share list of files to veto (never show). */
402 name_compare_entry *veto_oplock_list; /* Per-share list of files to refuse oplocks on. */
403 name_compare_entry *aio_write_behind_list; /* Per-share list of files to use aio write behind on. */
404 struct dfree_cached_info *dfree_info;
405 struct trans_state *pending_trans;
407 struct rpc_pipe_client *spoolss_pipe;
411 struct smbd_smb2_request;
412 struct privilege_paths;
418 uint64_t mid; /* For compatibility with SMB2. */
420 uint64_t vuid; /* For compatibility with SMB2. */
426 const uint8_t *inbuf;
429 * Async handling in the main smb processing loop is directed by
430 * outbuf: reply_xxx routines indicate sync behaviour by putting their
431 * reply into "outbuf". If they leave it as NULL, they take care of it
432 * themselves, possibly later.
434 * If async handling is wanted, the reply_xxx routine must make sure
435 * that it talloc_move()s the smb_req somewhere else.
441 connection_struct *conn;
442 struct smbd_server_connection *sconn;
443 struct smbXsrv_connection *xconn;
444 struct smb_perfcount_data pcd;
447 * Chained request handling
449 struct files_struct *chain_fsp;
452 * state information for async smb handling
457 * Back pointer to smb2 request.
459 struct smbd_smb2_request *smb2req;
462 * Pathnames used if request done
465 struct privilege_paths *priv_paths;
468 * Request list for chained requests, we're part of it.
470 struct smb_request **chain;
472 struct timeval request_time;
474 bool posix_pathnames;
478 * Info about an alternate data stream
481 struct stream_struct {
488 struct smb_file_time {
489 struct timespec mtime;
490 struct timespec atime;
491 struct timespec ctime;
492 struct timespec create_time;
498 struct smb_filename {
501 char *original_lcomp;
505 #define VFS_FIND(__fn__) while (handle->fns->__fn__##_fn==NULL) { \
506 handle = handle->next; \
509 enum vfs_translate_direction {
510 vfs_translate_to_unix = 0,
511 vfs_translate_to_windows
514 enum vfs_fallocate_flags {
515 VFS_FALLOCATE_FL_KEEP_SIZE = 0x0001,
516 VFS_FALLOCATE_FL_PUNCH_HOLE = 0x0002,
520 Available VFS operations. These values must be in sync with vfs_ops struct
521 (struct vfs_fn_pointers and struct vfs_handle_pointers inside of struct vfs_ops).
522 In particular, if new operations are added to vfs_ops, appropriate constants
523 should be added to vfs_op_type so that order of them kept same as in vfs_ops.
525 struct shadow_copy_data;
527 struct vfs_fn_pointers {
528 /* Disk operations */
530 int (*connect_fn)(struct vfs_handle_struct *handle, const char *service, const char *user);
531 void (*disconnect_fn)(struct vfs_handle_struct *handle);
532 uint64_t (*disk_free_fn)(struct vfs_handle_struct *handle, const char *path, uint64_t *bsize,
533 uint64_t *dfree, uint64_t *dsize);
534 int (*get_quota_fn)(struct vfs_handle_struct *handle, const char *path,
535 enum SMB_QUOTA_TYPE qtype, unid_t id,
537 int (*set_quota_fn)(struct vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *qt);
538 int (*get_shadow_copy_data_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, struct shadow_copy_data *shadow_copy_data, bool labels);
539 int (*statvfs_fn)(struct vfs_handle_struct *handle, const char *path, struct vfs_statvfs_struct *statbuf);
540 uint32_t (*fs_capabilities_fn)(struct vfs_handle_struct *handle, enum timestamp_set_resolution *p_ts_res);
543 * Note: that "struct dfs_GetDFSReferral *r"
544 * needs to be a valid TALLOC_CTX
546 NTSTATUS (*get_dfs_referrals_fn)(struct vfs_handle_struct *handle,
547 struct dfs_GetDFSReferral *r);
549 /* Directory operations */
551 DIR *(*opendir_fn)(struct vfs_handle_struct *handle, const char *fname, const char *mask, uint32_t attributes);
552 DIR *(*fdopendir_fn)(struct vfs_handle_struct *handle, files_struct *fsp, const char *mask, uint32_t attributes);
553 struct dirent *(*readdir_fn)(struct vfs_handle_struct *handle,
555 SMB_STRUCT_STAT *sbuf);
556 void (*seekdir_fn)(struct vfs_handle_struct *handle, DIR *dirp, long offset);
557 long (*telldir_fn)(struct vfs_handle_struct *handle, DIR *dirp);
558 void (*rewind_dir_fn)(struct vfs_handle_struct *handle, DIR *dirp);
559 int (*mkdir_fn)(struct vfs_handle_struct *handle,
560 const struct smb_filename *smb_fname,
562 int (*rmdir_fn)(struct vfs_handle_struct *handle, const char *path);
563 int (*closedir_fn)(struct vfs_handle_struct *handle, DIR *dir);
564 void (*init_search_op_fn)(struct vfs_handle_struct *handle, DIR *dirp);
566 /* File operations */
568 int (*open_fn)(struct vfs_handle_struct *handle,
569 struct smb_filename *smb_fname, files_struct *fsp,
570 int flags, mode_t mode);
571 NTSTATUS (*create_file_fn)(struct vfs_handle_struct *handle,
572 struct smb_request *req,
573 uint16_t root_dir_fid,
574 struct smb_filename *smb_fname,
575 uint32_t access_mask,
576 uint32_t share_access,
577 uint32_t create_disposition,
578 uint32_t create_options,
579 uint32_t file_attributes,
580 uint32_t oplock_request,
581 struct smb2_lease *lease,
582 uint64_t allocation_size,
583 uint32_t private_flags,
584 struct security_descriptor *sd,
585 struct ea_list *ea_list,
586 files_struct **result,
588 const struct smb2_create_blobs *in_context_blobs,
589 struct smb2_create_blobs *out_context_blobs);
590 int (*close_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
591 ssize_t (*read_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, void *data, size_t n);
592 ssize_t (*pread_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, void *data, size_t n, off_t offset);
593 struct tevent_req *(*pread_send_fn)(struct vfs_handle_struct *handle,
595 struct tevent_context *ev,
596 struct files_struct *fsp,
598 size_t n, off_t offset);
599 ssize_t (*pread_recv_fn)(struct tevent_req *req, int *err);
600 ssize_t (*write_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const void *data, size_t n);
601 ssize_t (*pwrite_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const void *data, size_t n, off_t offset);
602 struct tevent_req *(*pwrite_send_fn)(struct vfs_handle_struct *handle,
604 struct tevent_context *ev,
605 struct files_struct *fsp,
607 size_t n, off_t offset);
608 ssize_t (*pwrite_recv_fn)(struct tevent_req *req, int *err);
609 off_t (*lseek_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, off_t offset, int whence);
610 ssize_t (*sendfile_fn)(struct vfs_handle_struct *handle, int tofd, files_struct *fromfsp, const DATA_BLOB *header, off_t offset, size_t count);
611 ssize_t (*recvfile_fn)(struct vfs_handle_struct *handle, int fromfd, files_struct *tofsp, off_t offset, size_t count);
612 int (*rename_fn)(struct vfs_handle_struct *handle,
613 const struct smb_filename *smb_fname_src,
614 const struct smb_filename *smb_fname_dst);
615 int (*fsync_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
616 struct tevent_req *(*fsync_send_fn)(struct vfs_handle_struct *handle,
618 struct tevent_context *ev,
619 struct files_struct *fsp);
620 int (*fsync_recv_fn)(struct tevent_req *req, int *err);
621 int (*stat_fn)(struct vfs_handle_struct *handle, struct smb_filename *smb_fname);
622 int (*fstat_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_STAT *sbuf);
623 int (*lstat_fn)(struct vfs_handle_struct *handle, struct smb_filename *smb_filename);
624 uint64_t (*get_alloc_size_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_STAT *sbuf);
625 int (*unlink_fn)(struct vfs_handle_struct *handle,
626 const struct smb_filename *smb_fname);
627 int (*chmod_fn)(struct vfs_handle_struct *handle, const char *path, mode_t mode);
628 int (*fchmod_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, mode_t mode);
629 int (*chown_fn)(struct vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid);
630 int (*fchown_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, uid_t uid, gid_t gid);
631 int (*lchown_fn)(struct vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid);
632 int (*chdir_fn)(struct vfs_handle_struct *handle, const char *path);
633 char *(*getwd_fn)(struct vfs_handle_struct *handle);
634 int (*ntimes_fn)(struct vfs_handle_struct *handle,
635 const struct smb_filename *smb_fname,
636 struct smb_file_time *ft);
637 int (*ftruncate_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, off_t offset);
638 int (*fallocate_fn)(struct vfs_handle_struct *handle,
639 struct files_struct *fsp,
643 bool (*lock_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, int op, off_t offset, off_t count, int type);
644 int (*kernel_flock_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp,
645 uint32_t share_mode, uint32_t access_mask);
646 int (*linux_setlease_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, int leasetype);
647 bool (*getlock_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, off_t *poffset, off_t *pcount, int *ptype, pid_t *ppid);
648 int (*symlink_fn)(struct vfs_handle_struct *handle, const char *oldpath, const char *newpath);
649 int (*readlink_fn)(struct vfs_handle_struct *handle, const char *path, char *buf, size_t bufsiz);
650 int (*link_fn)(struct vfs_handle_struct *handle, const char *oldpath, const char *newpath);
651 int (*mknod_fn)(struct vfs_handle_struct *handle, const char *path, mode_t mode, SMB_DEV_T dev);
652 char *(*realpath_fn)(struct vfs_handle_struct *handle, const char *path);
653 int (*chflags_fn)(struct vfs_handle_struct *handle, const char *path, unsigned int flags);
654 struct file_id (*file_id_create_fn)(struct vfs_handle_struct *handle,
655 const SMB_STRUCT_STAT *sbuf);
656 struct tevent_req *(*copy_chunk_send_fn)(struct vfs_handle_struct *handle,
658 struct tevent_context *ev,
659 struct files_struct *src_fsp,
661 struct files_struct *dest_fsp,
664 NTSTATUS (*copy_chunk_recv_fn)(struct vfs_handle_struct *handle,
665 struct tevent_req *req,
667 NTSTATUS (*get_compression_fn)(struct vfs_handle_struct *handle,
669 struct files_struct *fsp,
670 struct smb_filename *smb_fname,
671 uint16_t *_compression_fmt);
672 NTSTATUS (*set_compression_fn)(struct vfs_handle_struct *handle,
674 struct files_struct *fsp,
675 uint16_t compression_fmt);
676 NTSTATUS (*snap_check_path_fn)(struct vfs_handle_struct *handle,
678 const char *service_path,
680 NTSTATUS (*snap_create_fn)(struct vfs_handle_struct *handle,
682 const char *base_volume,
687 NTSTATUS (*snap_delete_fn)(struct vfs_handle_struct *handle,
692 NTSTATUS (*streaminfo_fn)(struct vfs_handle_struct *handle,
693 struct files_struct *fsp,
696 unsigned int *num_streams,
697 struct stream_struct **streams);
699 int (*get_real_filename_fn)(struct vfs_handle_struct *handle,
705 const char *(*connectpath_fn)(struct vfs_handle_struct *handle,
706 const char *filename);
708 NTSTATUS (*brl_lock_windows_fn)(struct vfs_handle_struct *handle,
709 struct byte_range_lock *br_lck,
710 struct lock_struct *plock,
713 bool (*brl_unlock_windows_fn)(struct vfs_handle_struct *handle,
714 struct messaging_context *msg_ctx,
715 struct byte_range_lock *br_lck,
716 const struct lock_struct *plock);
718 bool (*brl_cancel_windows_fn)(struct vfs_handle_struct *handle,
719 struct byte_range_lock *br_lck,
720 struct lock_struct *plock);
722 bool (*strict_lock_fn)(struct vfs_handle_struct *handle,
723 struct files_struct *fsp,
724 struct lock_struct *plock);
726 void (*strict_unlock_fn)(struct vfs_handle_struct *handle,
727 struct files_struct *fsp,
728 struct lock_struct *plock);
730 NTSTATUS (*translate_name_fn)(struct vfs_handle_struct *handle,
732 enum vfs_translate_direction direction,
736 NTSTATUS (*fsctl_fn)(struct vfs_handle_struct *handle,
737 struct files_struct *fsp,
741 const uint8_t *_in_data,
744 uint32_t max_out_len,
747 /* NT ACL operations. */
749 NTSTATUS (*fget_nt_acl_fn)(struct vfs_handle_struct *handle,
750 struct files_struct *fsp,
751 uint32_t security_info,
753 struct security_descriptor **ppdesc);
754 NTSTATUS (*get_nt_acl_fn)(struct vfs_handle_struct *handle,
755 const struct smb_filename *smb_fname,
756 uint32_t security_info,
758 struct security_descriptor **ppdesc);
759 NTSTATUS (*fset_nt_acl_fn)(struct vfs_handle_struct *handle,
760 struct files_struct *fsp,
761 uint32_t security_info_sent,
762 const struct security_descriptor *psd);
764 NTSTATUS (*audit_file_fn)(struct vfs_handle_struct *handle,
765 struct smb_filename *file,
766 struct security_acl *sacl,
767 uint32_t access_requested,
768 uint32_t access_denied);
770 /* POSIX ACL operations. */
772 int (*chmod_acl_fn)(struct vfs_handle_struct *handle, const char *name, mode_t mode);
773 int (*fchmod_acl_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, mode_t mode);
775 SMB_ACL_T (*sys_acl_get_file_fn)(struct vfs_handle_struct *handle,
778 TALLOC_CTX *mem_ctx);
779 SMB_ACL_T (*sys_acl_get_fd_fn)(struct vfs_handle_struct *handle,
780 struct files_struct *fsp,
781 TALLOC_CTX *mem_ctx);
782 int (*sys_acl_blob_get_file_fn)(struct vfs_handle_struct *handle,
785 char **blob_description,
787 int (*sys_acl_blob_get_fd_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp,
788 TALLOC_CTX *mem_ctx, char **blob_description,
790 int (*sys_acl_set_file_fn)(struct vfs_handle_struct *handle, const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl);
791 int (*sys_acl_set_fd_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_ACL_T theacl);
792 int (*sys_acl_delete_def_file_fn)(struct vfs_handle_struct *handle, const char *path);
795 ssize_t (*getxattr_fn)(struct vfs_handle_struct *handle,const char *path, const char *name, void *value, size_t size);
796 ssize_t (*fgetxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, void *value, size_t size);
797 ssize_t (*listxattr_fn)(struct vfs_handle_struct *handle, const char *path, char *list, size_t size);
798 ssize_t (*flistxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, char *list, size_t size);
799 int (*removexattr_fn)(struct vfs_handle_struct *handle, const char *path, const char *name);
800 int (*fremovexattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name);
801 int (*setxattr_fn)(struct vfs_handle_struct *handle, const char *path, const char *name, const void *value, size_t size, int flags);
802 int (*fsetxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, const void *value, size_t size, int flags);
805 bool (*aio_force_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
807 /* offline operations */
808 bool (*is_offline_fn)(struct vfs_handle_struct *handle,
809 const struct smb_filename *fname,
810 SMB_STRUCT_STAT *sbuf);
811 int (*set_offline_fn)(struct vfs_handle_struct *handle,
812 const struct smb_filename *fname);
814 /* durable handle operations */
815 NTSTATUS (*durable_cookie_fn)(struct vfs_handle_struct *handle,
816 struct files_struct *fsp,
819 NTSTATUS (*durable_disconnect_fn)(struct vfs_handle_struct *handle,
820 struct files_struct *fsp,
821 const DATA_BLOB old_cookie,
823 DATA_BLOB *new_cookie);
824 NTSTATUS (*durable_reconnect_fn)(struct vfs_handle_struct *handle,
825 struct smb_request *smb1req,
826 struct smbXsrv_open *op,
827 const DATA_BLOB old_cookie,
829 struct files_struct **fsp,
830 DATA_BLOB *new_cookie);
832 NTSTATUS (*readdir_attr_fn)(struct vfs_handle_struct *handle,
833 const struct smb_filename *fname,
835 struct readdir_attr_data **attr_data);
839 VFS operation description. Each VFS module registers an array of vfs_op_tuple to VFS subsystem,
840 which describes all operations this module is willing to intercept.
841 VFS subsystem initializes then the conn->vfs_ops and conn->vfs_opaque_ops structs
842 using this information.
845 typedef struct vfs_handle_struct {
846 struct vfs_handle_struct *next, *prev;
848 struct connection_struct *conn;
849 const struct vfs_fn_pointers *fns;
851 void (*free_data)(void **data);
855 typedef struct vfs_statvfs_struct {
856 /* For undefined recommended transfer size return -1 in that field */
857 uint32_t OptimalTransferSize; /* bsize on some os, iosize on other os */
861 The next three fields are in terms of the block size.
862 (above). If block size is unknown, 4096 would be a
863 reasonable block size for a server to report.
864 Note that returning the blocks/blocksavail removes need
865 to make a second call (to QFSInfo level 0x103 to get this info.
866 UserBlockAvail is typically less than or equal to BlocksAvail,
867 if no distinction is made return the same value in each.
870 uint64_t TotalBlocks;
871 uint64_t BlocksAvail; /* bfree */
872 uint64_t UserBlocksAvail; /* bavail */
874 /* For undefined Node fields or FSID return -1 */
875 uint64_t TotalFileNodes;
876 uint64_t FreeFileNodes;
877 uint64_t FsIdentifier; /* fsid */
878 /* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */
879 /* NB flags can come from FILE_SYSTEM_DEVICE_INFO call */
882 } vfs_statvfs_struct;
884 /* Add a new FSP extension of the given type. Returns a pointer to the
887 #define VFS_ADD_FSP_EXTENSION(handle, fsp, type, destroy_fn) \
888 vfs_add_fsp_extension_notype(handle, (fsp), sizeof(type), (destroy_fn))
890 /* Return a pointer to the existing FSP extension data. */
891 #define VFS_FETCH_FSP_EXTENSION(handle, fsp) \
892 vfs_fetch_fsp_extension(handle, (fsp))
894 /* Return the talloc context associated with an FSP extension. */
895 #define VFS_MEMCTX_FSP_EXTENSION(handle, fsp) \
896 vfs_memctx_fsp_extension(handle, (fsp))
898 /* Remove and destroy an FSP extension. */
899 #define VFS_REMOVE_FSP_EXTENSION(handle, fsp) \
900 vfs_remove_fsp_extension((handle), (fsp))
902 #define SMB_VFS_HANDLE_GET_DATA(handle, datap, type, ret) { \
903 if (!(handle)||((datap=(type *)(handle)->data)==NULL)) { \
904 DEBUG(0,("%s() failed to get vfs_handle->data!\n",__FUNCTION__)); \
909 #define SMB_VFS_HANDLE_SET_DATA(handle, datap, free_fn, type, ret) { \
911 DEBUG(0,("%s() failed to set handle->data!\n",__FUNCTION__)); \
914 if ((handle)->free_data) { \
915 (handle)->free_data(&(handle)->data); \
917 (handle)->data = (void *)datap; \
918 (handle)->free_data = free_fn; \
922 #define SMB_VFS_HANDLE_FREE_DATA(handle) { \
923 if ((handle) && (handle)->free_data) { \
924 (handle)->free_data(&(handle)->data); \
928 /* Check whether module-specific data handle was already allocated or not */
929 #define SMB_VFS_HANDLE_TEST_DATA(handle) ( !(handle) || !(handle)->data ? False : True )
931 #define SMB_VFS_OP(x) ((void *) x)
933 #define DEFAULT_VFS_MODULE_NAME "/[Default VFS]/"
935 #include "vfs_macros.h"
937 int smb_vfs_call_connect(struct vfs_handle_struct *handle,
938 const char *service, const char *user);
939 void smb_vfs_call_disconnect(struct vfs_handle_struct *handle);
940 uint64_t smb_vfs_call_disk_free(struct vfs_handle_struct *handle,
941 const char *path, uint64_t *bsize,
942 uint64_t *dfree, uint64_t *dsize);
943 int smb_vfs_call_get_quota(struct vfs_handle_struct *handle, const char *path,
944 enum SMB_QUOTA_TYPE qtype, unid_t id,
946 int smb_vfs_call_set_quota(struct vfs_handle_struct *handle,
947 enum SMB_QUOTA_TYPE qtype, unid_t id,
949 int smb_vfs_call_get_shadow_copy_data(struct vfs_handle_struct *handle,
950 struct files_struct *fsp,
951 struct shadow_copy_data *shadow_copy_data,
953 int smb_vfs_call_statvfs(struct vfs_handle_struct *handle, const char *path,
954 struct vfs_statvfs_struct *statbuf);
955 uint32_t smb_vfs_call_fs_capabilities(struct vfs_handle_struct *handle,
956 enum timestamp_set_resolution *p_ts_res);
958 * Note: that "struct dfs_GetDFSReferral *r" needs to be a valid TALLOC_CTX
960 NTSTATUS smb_vfs_call_get_dfs_referrals(struct vfs_handle_struct *handle,
961 struct dfs_GetDFSReferral *r);
962 DIR *smb_vfs_call_opendir(struct vfs_handle_struct *handle,
963 const char *fname, const char *mask,
964 uint32_t attributes);
965 DIR *smb_vfs_call_fdopendir(struct vfs_handle_struct *handle,
966 struct files_struct *fsp,
968 uint32_t attributes);
969 struct dirent *smb_vfs_call_readdir(struct vfs_handle_struct *handle,
971 SMB_STRUCT_STAT *sbuf);
972 void smb_vfs_call_seekdir(struct vfs_handle_struct *handle,
973 DIR *dirp, long offset);
974 long smb_vfs_call_telldir(struct vfs_handle_struct *handle,
976 void smb_vfs_call_rewind_dir(struct vfs_handle_struct *handle,
978 int smb_vfs_call_mkdir(struct vfs_handle_struct *handle,
979 const struct smb_filename *smb_fname,
981 int smb_vfs_call_rmdir(struct vfs_handle_struct *handle, const char *path);
982 int smb_vfs_call_closedir(struct vfs_handle_struct *handle,
984 void smb_vfs_call_init_search_op(struct vfs_handle_struct *handle,
986 int smb_vfs_call_open(struct vfs_handle_struct *handle,
987 struct smb_filename *smb_fname, struct files_struct *fsp,
988 int flags, mode_t mode);
989 NTSTATUS smb_vfs_call_create_file(struct vfs_handle_struct *handle,
990 struct smb_request *req,
991 uint16_t root_dir_fid,
992 struct smb_filename *smb_fname,
993 uint32_t access_mask,
994 uint32_t share_access,
995 uint32_t create_disposition,
996 uint32_t create_options,
997 uint32_t file_attributes,
998 uint32_t oplock_request,
999 struct smb2_lease *lease,
1000 uint64_t allocation_size,
1001 uint32_t private_flags,
1002 struct security_descriptor *sd,
1003 struct ea_list *ea_list,
1004 files_struct **result,
1006 const struct smb2_create_blobs *in_context_blobs,
1007 struct smb2_create_blobs *out_context_blobs);
1008 int smb_vfs_call_close(struct vfs_handle_struct *handle,
1009 struct files_struct *fsp);
1010 ssize_t smb_vfs_call_read(struct vfs_handle_struct *handle,
1011 struct files_struct *fsp, void *data, size_t n);
1012 ssize_t smb_vfs_call_pread(struct vfs_handle_struct *handle,
1013 struct files_struct *fsp, void *data, size_t n,
1015 struct tevent_req *smb_vfs_call_pread_send(struct vfs_handle_struct *handle,
1016 TALLOC_CTX *mem_ctx,
1017 struct tevent_context *ev,
1018 struct files_struct *fsp,
1020 size_t n, off_t offset);
1021 ssize_t SMB_VFS_PREAD_RECV(struct tevent_req *req, int *perrno);
1023 ssize_t smb_vfs_call_write(struct vfs_handle_struct *handle,
1024 struct files_struct *fsp, const void *data,
1026 ssize_t smb_vfs_call_pwrite(struct vfs_handle_struct *handle,
1027 struct files_struct *fsp, const void *data,
1028 size_t n, off_t offset);
1029 struct tevent_req *smb_vfs_call_pwrite_send(struct vfs_handle_struct *handle,
1030 TALLOC_CTX *mem_ctx,
1031 struct tevent_context *ev,
1032 struct files_struct *fsp,
1034 size_t n, off_t offset);
1035 ssize_t SMB_VFS_PWRITE_RECV(struct tevent_req *req, int *perrno);
1037 off_t smb_vfs_call_lseek(struct vfs_handle_struct *handle,
1038 struct files_struct *fsp, off_t offset,
1040 ssize_t smb_vfs_call_sendfile(struct vfs_handle_struct *handle, int tofd,
1041 files_struct *fromfsp, const DATA_BLOB *header,
1042 off_t offset, size_t count);
1043 ssize_t smb_vfs_call_recvfile(struct vfs_handle_struct *handle, int fromfd,
1044 files_struct *tofsp, off_t offset,
1046 int smb_vfs_call_rename(struct vfs_handle_struct *handle,
1047 const struct smb_filename *smb_fname_src,
1048 const struct smb_filename *smb_fname_dst);
1049 int smb_vfs_call_fsync(struct vfs_handle_struct *handle,
1050 struct files_struct *fsp);
1052 struct tevent_req *smb_vfs_call_fsync_send(struct vfs_handle_struct *handle,
1053 TALLOC_CTX *mem_ctx,
1054 struct tevent_context *ev,
1055 struct files_struct *fsp);
1056 int SMB_VFS_FSYNC_RECV(struct tevent_req *req, int *perrno);
1058 int smb_vfs_call_stat(struct vfs_handle_struct *handle,
1059 struct smb_filename *smb_fname);
1060 int smb_vfs_call_fstat(struct vfs_handle_struct *handle,
1061 struct files_struct *fsp, SMB_STRUCT_STAT *sbuf);
1062 int smb_vfs_call_lstat(struct vfs_handle_struct *handle,
1063 struct smb_filename *smb_filename);
1064 uint64_t smb_vfs_call_get_alloc_size(struct vfs_handle_struct *handle,
1065 struct files_struct *fsp,
1066 const SMB_STRUCT_STAT *sbuf);
1067 int smb_vfs_call_unlink(struct vfs_handle_struct *handle,
1068 const struct smb_filename *smb_fname);
1069 int smb_vfs_call_chmod(struct vfs_handle_struct *handle, const char *path,
1071 int smb_vfs_call_fchmod(struct vfs_handle_struct *handle,
1072 struct files_struct *fsp, mode_t mode);
1073 int smb_vfs_call_chown(struct vfs_handle_struct *handle, const char *path,
1074 uid_t uid, gid_t gid);
1075 int smb_vfs_call_fchown(struct vfs_handle_struct *handle,
1076 struct files_struct *fsp, uid_t uid, gid_t gid);
1077 int smb_vfs_call_lchown(struct vfs_handle_struct *handle, const char *path,
1078 uid_t uid, gid_t gid);
1079 int smb_vfs_call_chdir(struct vfs_handle_struct *handle, const char *path);
1080 char *smb_vfs_call_getwd(struct vfs_handle_struct *handle);
1081 int smb_vfs_call_ntimes(struct vfs_handle_struct *handle,
1082 const struct smb_filename *smb_fname,
1083 struct smb_file_time *ft);
1084 int smb_vfs_call_ftruncate(struct vfs_handle_struct *handle,
1085 struct files_struct *fsp, off_t offset);
1086 int smb_vfs_call_fallocate(struct vfs_handle_struct *handle,
1087 struct files_struct *fsp,
1091 bool smb_vfs_call_lock(struct vfs_handle_struct *handle,
1092 struct files_struct *fsp, int op, off_t offset,
1093 off_t count, int type);
1094 int smb_vfs_call_kernel_flock(struct vfs_handle_struct *handle,
1095 struct files_struct *fsp, uint32_t share_mode,
1096 uint32_t access_mask);
1097 int smb_vfs_call_linux_setlease(struct vfs_handle_struct *handle,
1098 struct files_struct *fsp, int leasetype);
1099 bool smb_vfs_call_getlock(struct vfs_handle_struct *handle,
1100 struct files_struct *fsp, off_t *poffset,
1101 off_t *pcount, int *ptype, pid_t *ppid);
1102 int smb_vfs_call_symlink(struct vfs_handle_struct *handle, const char *oldpath,
1103 const char *newpath);
1104 int smb_vfs_call_readlink(struct vfs_handle_struct *handle,
1105 const char *path, char *buf, size_t bufsiz);
1106 int smb_vfs_call_link(struct vfs_handle_struct *handle, const char *oldpath,
1107 const char *newpath);
1108 int smb_vfs_call_mknod(struct vfs_handle_struct *handle, const char *path,
1109 mode_t mode, SMB_DEV_T dev);
1110 char *smb_vfs_call_realpath(struct vfs_handle_struct *handle, const char *path);
1111 int smb_vfs_call_chflags(struct vfs_handle_struct *handle, const char *path,
1112 unsigned int flags);
1113 struct file_id smb_vfs_call_file_id_create(struct vfs_handle_struct *handle,
1114 const SMB_STRUCT_STAT *sbuf);
1115 NTSTATUS smb_vfs_call_streaminfo(struct vfs_handle_struct *handle,
1116 struct files_struct *fsp,
1118 TALLOC_CTX *mem_ctx,
1119 unsigned int *num_streams,
1120 struct stream_struct **streams);
1121 int smb_vfs_call_get_real_filename(struct vfs_handle_struct *handle,
1122 const char *path, const char *name,
1123 TALLOC_CTX *mem_ctx, char **found_name);
1124 const char *smb_vfs_call_connectpath(struct vfs_handle_struct *handle,
1125 const char *filename);
1126 NTSTATUS smb_vfs_call_brl_lock_windows(struct vfs_handle_struct *handle,
1127 struct byte_range_lock *br_lck,
1128 struct lock_struct *plock,
1129 bool blocking_lock);
1130 bool smb_vfs_call_brl_unlock_windows(struct vfs_handle_struct *handle,
1131 struct messaging_context *msg_ctx,
1132 struct byte_range_lock *br_lck,
1133 const struct lock_struct *plock);
1134 bool smb_vfs_call_brl_cancel_windows(struct vfs_handle_struct *handle,
1135 struct byte_range_lock *br_lck,
1136 struct lock_struct *plock);
1137 bool smb_vfs_call_strict_lock(struct vfs_handle_struct *handle,
1138 struct files_struct *fsp,
1139 struct lock_struct *plock);
1140 void smb_vfs_call_strict_unlock(struct vfs_handle_struct *handle,
1141 struct files_struct *fsp,
1142 struct lock_struct *plock);
1143 NTSTATUS smb_vfs_call_translate_name(struct vfs_handle_struct *handle,
1145 enum vfs_translate_direction direction,
1146 TALLOC_CTX *mem_ctx,
1147 char **mapped_name);
1148 NTSTATUS smb_vfs_call_fsctl(struct vfs_handle_struct *handle,
1149 struct files_struct *fsp,
1153 const uint8_t *_in_data,
1155 uint8_t **_out_data,
1156 uint32_t max_out_len,
1158 struct tevent_req *smb_vfs_call_copy_chunk_send(struct vfs_handle_struct *handle,
1159 TALLOC_CTX *mem_ctx,
1160 struct tevent_context *ev,
1161 struct files_struct *src_fsp,
1163 struct files_struct *dest_fsp,
1166 NTSTATUS smb_vfs_call_copy_chunk_recv(struct vfs_handle_struct *handle,
1167 struct tevent_req *req,
1169 NTSTATUS smb_vfs_call_get_compression(struct vfs_handle_struct *handle,
1170 TALLOC_CTX *mem_ctx,
1171 struct files_struct *fsp,
1172 struct smb_filename *smb_fname,
1173 uint16_t *_compression_fmt);
1174 NTSTATUS smb_vfs_call_set_compression(struct vfs_handle_struct *handle,
1175 TALLOC_CTX *mem_ctx,
1176 struct files_struct *fsp,
1177 uint16_t compression_fmt);
1178 NTSTATUS smb_vfs_call_snap_check_path(vfs_handle_struct *handle,
1179 TALLOC_CTX *mem_ctx,
1180 const char *service_path,
1181 char **base_volume);
1182 NTSTATUS smb_vfs_call_snap_create(struct vfs_handle_struct *handle,
1183 TALLOC_CTX *mem_ctx,
1184 const char *base_volume,
1189 NTSTATUS smb_vfs_call_snap_delete(struct vfs_handle_struct *handle,
1190 TALLOC_CTX *mem_ctx,
1193 NTSTATUS smb_vfs_call_fget_nt_acl(struct vfs_handle_struct *handle,
1194 struct files_struct *fsp,
1195 uint32_t security_info,
1196 TALLOC_CTX *mem_ctx,
1197 struct security_descriptor **ppdesc);
1198 NTSTATUS smb_vfs_call_get_nt_acl(struct vfs_handle_struct *handle,
1199 const struct smb_filename *smb_fname,
1200 uint32_t security_info,
1201 TALLOC_CTX *mem_ctx,
1202 struct security_descriptor **ppdesc);
1203 NTSTATUS smb_vfs_call_fset_nt_acl(struct vfs_handle_struct *handle,
1204 struct files_struct *fsp,
1205 uint32_t security_info_sent,
1206 const struct security_descriptor *psd);
1207 NTSTATUS smb_vfs_call_audit_file(struct vfs_handle_struct *handle,
1208 struct smb_filename *file,
1209 struct security_acl *sacl,
1210 uint32_t access_requested,
1211 uint32_t access_denied);
1212 int smb_vfs_call_chmod_acl(struct vfs_handle_struct *handle, const char *name,
1214 int smb_vfs_call_fchmod_acl(struct vfs_handle_struct *handle,
1215 struct files_struct *fsp, mode_t mode);
1216 SMB_ACL_T smb_vfs_call_sys_acl_get_file(struct vfs_handle_struct *handle,
1218 SMB_ACL_TYPE_T type,
1219 TALLOC_CTX *mem_ctx);
1220 SMB_ACL_T smb_vfs_call_sys_acl_get_fd(struct vfs_handle_struct *handle,
1221 struct files_struct *fsp,
1222 TALLOC_CTX *mem_ctx);
1223 int smb_vfs_call_sys_acl_blob_get_file(struct vfs_handle_struct *handle,
1225 TALLOC_CTX *mem_ctx,
1226 char **blob_description,
1228 int smb_vfs_call_sys_acl_blob_get_fd(struct vfs_handle_struct *handle,
1229 struct files_struct *fsp,
1230 TALLOC_CTX *mem_ctx,
1231 char **blob_description,
1233 int smb_vfs_call_sys_acl_set_file(struct vfs_handle_struct *handle,
1234 const char *name, SMB_ACL_TYPE_T acltype,
1236 int smb_vfs_call_sys_acl_set_fd(struct vfs_handle_struct *handle,
1237 struct files_struct *fsp, SMB_ACL_T theacl);
1238 int smb_vfs_call_sys_acl_delete_def_file(struct vfs_handle_struct *handle,
1240 ssize_t smb_vfs_call_getxattr(struct vfs_handle_struct *handle,
1241 const char *path, const char *name, void *value,
1243 ssize_t smb_vfs_call_fgetxattr(struct vfs_handle_struct *handle,
1244 struct files_struct *fsp, const char *name,
1245 void *value, size_t size);
1246 ssize_t smb_vfs_call_listxattr(struct vfs_handle_struct *handle,
1247 const char *path, char *list, size_t size);
1248 ssize_t smb_vfs_call_llistxattr(struct vfs_handle_struct *handle,
1249 const char *path, char *list, size_t size);
1250 ssize_t smb_vfs_call_flistxattr(struct vfs_handle_struct *handle,
1251 struct files_struct *fsp, char *list,
1253 int smb_vfs_call_removexattr(struct vfs_handle_struct *handle,
1254 const char *path, const char *name);
1255 int smb_vfs_call_fremovexattr(struct vfs_handle_struct *handle,
1256 struct files_struct *fsp, const char *name);
1257 int smb_vfs_call_setxattr(struct vfs_handle_struct *handle, const char *path,
1258 const char *name, const void *value, size_t size,
1260 int smb_vfs_call_lsetxattr(struct vfs_handle_struct *handle, const char *path,
1261 const char *name, const void *value, size_t size,
1263 int smb_vfs_call_fsetxattr(struct vfs_handle_struct *handle,
1264 struct files_struct *fsp, const char *name,
1265 const void *value, size_t size, int flags);
1266 bool smb_vfs_call_aio_force(struct vfs_handle_struct *handle,
1267 struct files_struct *fsp);
1268 bool smb_vfs_call_is_offline(struct vfs_handle_struct *handle,
1269 const struct smb_filename *fname,
1270 SMB_STRUCT_STAT *sbuf);
1271 int smb_vfs_call_set_offline(struct vfs_handle_struct *handle,
1272 const struct smb_filename *fname);
1273 NTSTATUS smb_vfs_call_durable_cookie(struct vfs_handle_struct *handle,
1274 struct files_struct *fsp,
1275 TALLOC_CTX *mem_ctx,
1277 NTSTATUS smb_vfs_call_durable_disconnect(struct vfs_handle_struct *handle,
1278 struct files_struct *fsp,
1279 const DATA_BLOB old_cookie,
1280 TALLOC_CTX *mem_ctx,
1281 DATA_BLOB *new_cookie);
1282 NTSTATUS smb_vfs_call_durable_reconnect(struct vfs_handle_struct *handle,
1283 struct smb_request *smb1req,
1284 struct smbXsrv_open *op,
1285 const DATA_BLOB old_cookie,
1286 TALLOC_CTX *mem_ctx,
1287 struct files_struct **fsp,
1288 DATA_BLOB *new_cookie);
1289 NTSTATUS smb_vfs_call_readdir_attr(struct vfs_handle_struct *handle,
1290 const struct smb_filename *fname,
1291 TALLOC_CTX *mem_ctx,
1292 struct readdir_attr_data **attr_data);
1294 NTSTATUS smb_register_vfs(int version, const char *name,
1295 const struct vfs_fn_pointers *fns);
1296 void *vfs_add_fsp_extension_notype(vfs_handle_struct *handle,
1297 files_struct *fsp, size_t ext_size,
1298 void (*destroy_fn)(void *p_data));
1299 void vfs_remove_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
1300 void vfs_remove_all_fsp_extensions(struct files_struct *fsp);
1301 void *vfs_memctx_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
1302 void *vfs_fetch_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);