vfs: remove an outdate comment from the files_struct definition
[Samba.git] / source3 / include / vfs.h
blobc8e049487dce530361374a71e1f379013e7c4b78
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 /* 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 * */
178 /* Version 35 - Change rmdir from const char *, to
179 const struct smb_filename * */
180 /* Version 35 - Change opendir from const char *, to
181 const struct smb_filename * */
182 /* Version 35 - Wrap aio async funtions args in a struct vfs_aio_state */
183 /* Version 35 - Change chmod from const char *, to
184 const struct smb_filename * */
185 /* Version 35 - Change chmod_acl from const char *, to
186 const struct smb_filename * */
188 #define SMB_VFS_INTERFACE_VERSION 35
191 All intercepted VFS operations must be declared as static functions inside module source
192 in order to keep smbd namespace unpolluted. See source of audit, extd_audit, fake_perms and recycle
193 example VFS modules for more details.
196 /* VFS operations structure */
198 struct vfs_handle_struct;
199 struct connection_struct;
200 struct files_struct;
201 struct security_descriptor;
202 struct vfs_statvfs_struct;
203 struct smb_request;
204 struct ea_list;
205 struct smb_file_time;
206 struct blocking_lock_record;
207 struct smb_filename;
208 struct dfs_GetDFSReferral;
210 typedef union unid_t {
211 uid_t uid;
212 gid_t gid;
213 } unid_t;
215 struct fd_handle {
216 size_t ref_count;
217 int fd;
218 uint64_t position_information;
219 off_t pos;
220 uint32_t private_options; /* NT Create options, but we only look at
221 * NTCREATEX_OPTIONS_PRIVATE_DENY_DOS and
222 * NTCREATEX_OPTIONS_PRIVATE_DENY_FCB and
223 * NTCREATEX_OPTIONS_PRIVATE_DELETE_ON_CLOSE
224 * for print files *only*, where
225 * DELETE_ON_CLOSE is not stored in the share
226 * mode database.
228 unsigned long gen_id;
231 struct fsp_lease {
232 size_t ref_count;
233 struct smbd_server_connection *sconn;
234 struct tevent_timer *timeout;
235 struct smb2_lease lease;
238 typedef struct files_struct {
239 struct files_struct *next, *prev;
240 uint64_t fnum;
241 struct smbXsrv_open *op;
242 struct connection_struct *conn;
243 struct fd_handle *fh;
244 unsigned int num_smb_operations;
245 struct file_id file_id;
246 uint64_t initial_allocation_size; /* Faked up initial allocation on disk. */
247 uint16_t file_pid;
248 uint64_t vuid; /* SMB2 compat */
249 struct write_cache *wcp;
250 struct timeval open_time;
251 uint32_t access_mask; /* NTCreateX access bits (FILE_READ_DATA etc.) */
252 uint32_t share_access; /* NTCreateX share constants (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE). */
254 bool update_write_time_triggered;
255 struct tevent_timer *update_write_time_event;
256 bool update_write_time_on_close;
257 struct timespec close_write_time;
258 bool write_time_forced;
260 int oplock_type;
261 struct fsp_lease *lease;
262 int sent_oplock_break;
263 struct tevent_timer *oplock_timeout;
264 struct lock_struct last_lock_failure;
265 int current_lock_count; /* Count the number of outstanding locks and pending locks. */
267 bool can_lock;
268 bool can_read;
269 bool can_write;
270 bool modified;
271 bool is_directory;
272 bool aio_write_behind;
273 bool initial_delete_on_close; /* Only set at NTCreateX if file was created. */
274 bool delete_on_close;
275 uint64_t posix_flags;
276 bool is_sparse;
277 bool backup_intent; /* Handle was successfully opened with backup intent
278 and opener has privilege to do so. */
279 bool aapl_copyfile_supported;
280 struct smb_filename *fsp_name;
281 uint32_t name_hash; /* Jenkins hash of full pathname. */
282 uint64_t mid; /* Mid of the operation that created us. */
284 struct vfs_fsp_data *vfs_extension;
285 struct fake_file_handle *fake_file_handle;
287 struct notify_change_buf *notify;
289 struct files_struct *base_fsp; /* placeholder for delete on close */
292 * Read-only cached brlock record, thrown away when the
293 * brlock.tdb seqnum changes. This avoids fetching data from
294 * the brlock.tdb on every read/write call.
296 int brlock_seqnum;
297 struct byte_range_lock *brlock_rec;
299 struct dptr_struct *dptr;
301 /* if not NULL, means this is a print file */
302 struct print_file_data *print_file;
304 unsigned num_aio_requests;
305 struct tevent_req **aio_requests;
308 * If a close request comes in while we still have aio_requests
309 * around, we need to hold back the close. When all aio_requests are
310 * done, the aio completion routines need tevent_wait_done() on
311 * this. A bit ugly, but before we have close_file() fully async
312 * possibly the simplest approach. Thanks, Jeremy for the idea.
314 struct tevent_req *deferred_close;
315 } files_struct;
317 #define FSP_POSIX_FLAGS_OPEN 0x01
318 #define FSP_POSIX_FLAGS_RENAME 0x02
319 #define FSP_POSIX_FLAGS_PATHNAMES 0x04
321 #define FSP_POSIX_FLAGS_ALL \
322 (FSP_POSIX_FLAGS_OPEN | \
323 FSP_POSIX_FLAGS_PATHNAMES | \
324 FSP_POSIX_FLAGS_RENAME)
326 struct vuid_cache_entry {
327 struct auth_session_info *session_info;
328 uint64_t vuid; /* SMB2 compat */
329 bool read_only;
330 uint32_t share_access;
333 struct vuid_cache {
334 unsigned int next_entry;
335 struct vuid_cache_entry array[VUID_CACHE_SIZE];
338 typedef struct {
339 char *name;
340 bool is_wild;
341 } name_compare_entry;
343 struct dfree_cached_info {
344 time_t last_dfree_time;
345 uint64_t dfree_ret;
346 uint64_t bsize;
347 uint64_t dfree;
348 uint64_t dsize;
351 struct share_params {
352 int service;
355 typedef struct connection_struct {
356 struct connection_struct *next, *prev;
357 struct smbd_server_connection *sconn; /* can be NULL */
358 struct smbXsrv_tcon *tcon; /* can be NULL */
359 uint32_t cnum; /* an index passed over the wire */
360 struct share_params *params;
361 bool force_user;
362 struct vuid_cache *vuid_cache;
363 bool printer;
364 bool ipc;
365 bool read_only; /* Attributes for the current user of the share. */
366 uint32_t share_access;
367 /* Does this filesystem honor
368 sub second timestamps on files
369 and directories when setting time ? */
370 enum timestamp_set_resolution ts_res;
371 char *connectpath;
372 char *origpath;
373 char *cwd; /* Working directory. */
375 struct vfs_handle_struct *vfs_handles; /* for the new plugins */
378 * This represents the user information on this connection. Depending
379 * on the vuid using this tid, this might change per SMB request.
381 struct auth_session_info *session_info;
384 * If the "force group" parameter is set, this is the primary gid that
385 * may be used in the users token, depending on the vuid using this tid.
387 gid_t force_group_gid;
389 uint64_t vuid; /* vuid of user who *opened* this connection, or UID_FIELD_INVALID */
391 time_t lastused;
392 time_t lastused_count;
393 int num_files_open;
394 unsigned int num_smb_operations; /* Count of smb operations on this tree. */
395 int encrypt_level;
396 bool encrypted_tid;
398 /* Semantics requested by the client or forced by the server config. */
399 bool case_sensitive;
400 bool case_preserve;
401 bool short_case_preserve;
403 /* Semantics provided by the underlying filesystem. */
404 int fs_capabilities;
405 /* Device number of the directory of the share mount.
406 Used to ensure unique FileIndex returns. */
407 SMB_DEV_T base_share_dev;
409 name_compare_entry *hide_list; /* Per-share list of files to return as hidden. */
410 name_compare_entry *veto_list; /* Per-share list of files to veto (never show). */
411 name_compare_entry *veto_oplock_list; /* Per-share list of files to refuse oplocks on. */
412 name_compare_entry *aio_write_behind_list; /* Per-share list of files to use aio write behind on. */
413 struct dfree_cached_info *dfree_info;
414 struct trans_state *pending_trans;
416 struct rpc_pipe_client *spoolss_pipe;
418 } connection_struct;
420 struct smbd_smb2_request;
421 struct privilege_paths;
423 struct smb_request {
424 uint8_t cmd;
425 uint16_t flags2;
426 uint16_t smbpid;
427 uint64_t mid; /* For compatibility with SMB2. */
428 uint32_t seqnum;
429 uint64_t vuid; /* For compatibility with SMB2. */
430 uint32_t tid;
431 uint8_t wct;
432 const uint16_t *vwv;
433 uint16_t buflen;
434 const uint8_t *buf;
435 const uint8_t *inbuf;
438 * Async handling in the main smb processing loop is directed by
439 * outbuf: reply_xxx routines indicate sync behaviour by putting their
440 * reply into "outbuf". If they leave it as NULL, they take care of it
441 * themselves, possibly later.
443 * If async handling is wanted, the reply_xxx routine must make sure
444 * that it talloc_move()s the smb_req somewhere else.
446 uint8_t *outbuf;
448 size_t unread_bytes;
449 bool encrypted;
450 connection_struct *conn;
451 struct smbd_server_connection *sconn;
452 struct smbXsrv_connection *xconn;
453 struct smb_perfcount_data pcd;
456 * Chained request handling
458 struct files_struct *chain_fsp;
461 * state information for async smb handling
463 void *async_priv;
466 * Back pointer to smb2 request.
468 struct smbd_smb2_request *smb2req;
471 * Pathnames used if request done
472 * under privilege.
474 struct privilege_paths *priv_paths;
477 * Request list for chained requests, we're part of it.
479 struct smb_request **chain;
481 struct timeval request_time;
483 bool posix_pathnames;
487 * Info about an alternate data stream
490 struct stream_struct {
491 off_t size;
492 off_t alloc_size;
493 char *name;
496 /* time info */
497 struct smb_file_time {
498 struct timespec mtime;
499 struct timespec atime;
500 struct timespec ctime;
501 struct timespec create_time;
505 * smb_filename
507 struct smb_filename {
508 char *base_name;
509 char *stream_name;
510 char *original_lcomp;
511 SMB_STRUCT_STAT st;
514 #define VFS_FIND(__fn__) while (handle->fns->__fn__##_fn==NULL) { \
515 handle = handle->next; \
518 enum vfs_translate_direction {
519 vfs_translate_to_unix = 0,
520 vfs_translate_to_windows
523 enum vfs_fallocate_flags {
524 VFS_FALLOCATE_FL_KEEP_SIZE = 0x0001,
525 VFS_FALLOCATE_FL_PUNCH_HOLE = 0x0002,
528 struct vfs_aio_state {
529 int error;
530 uint64_t duration;
534 Available VFS operations. These values must be in sync with vfs_ops struct
535 (struct vfs_fn_pointers and struct vfs_handle_pointers inside of struct vfs_ops).
536 In particular, if new operations are added to vfs_ops, appropriate constants
537 should be added to vfs_op_type so that order of them kept same as in vfs_ops.
539 struct shadow_copy_data;
541 struct vfs_fn_pointers {
542 /* Disk operations */
544 int (*connect_fn)(struct vfs_handle_struct *handle, const char *service, const char *user);
545 void (*disconnect_fn)(struct vfs_handle_struct *handle);
546 uint64_t (*disk_free_fn)(struct vfs_handle_struct *handle, const char *path, uint64_t *bsize,
547 uint64_t *dfree, uint64_t *dsize);
548 int (*get_quota_fn)(struct vfs_handle_struct *handle, const char *path,
549 enum SMB_QUOTA_TYPE qtype, unid_t id,
550 SMB_DISK_QUOTA *qt);
551 int (*set_quota_fn)(struct vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *qt);
552 int (*get_shadow_copy_data_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, struct shadow_copy_data *shadow_copy_data, bool labels);
553 int (*statvfs_fn)(struct vfs_handle_struct *handle, const char *path, struct vfs_statvfs_struct *statbuf);
554 uint32_t (*fs_capabilities_fn)(struct vfs_handle_struct *handle, enum timestamp_set_resolution *p_ts_res);
557 * Note: that "struct dfs_GetDFSReferral *r"
558 * needs to be a valid TALLOC_CTX
560 NTSTATUS (*get_dfs_referrals_fn)(struct vfs_handle_struct *handle,
561 struct dfs_GetDFSReferral *r);
563 /* Directory operations */
565 DIR *(*opendir_fn)(struct vfs_handle_struct *handle,
566 const struct smb_filename *smb_fname,
567 const char *mask,
568 uint32_t attributes);
569 DIR *(*fdopendir_fn)(struct vfs_handle_struct *handle, files_struct *fsp, const char *mask, uint32_t attributes);
570 struct dirent *(*readdir_fn)(struct vfs_handle_struct *handle,
571 DIR *dirp,
572 SMB_STRUCT_STAT *sbuf);
573 void (*seekdir_fn)(struct vfs_handle_struct *handle, DIR *dirp, long offset);
574 long (*telldir_fn)(struct vfs_handle_struct *handle, DIR *dirp);
575 void (*rewind_dir_fn)(struct vfs_handle_struct *handle, DIR *dirp);
576 int (*mkdir_fn)(struct vfs_handle_struct *handle,
577 const struct smb_filename *smb_fname,
578 mode_t mode);
579 int (*rmdir_fn)(struct vfs_handle_struct *handle,
580 const struct smb_filename *smb_fname);
581 int (*closedir_fn)(struct vfs_handle_struct *handle, DIR *dir);
582 void (*init_search_op_fn)(struct vfs_handle_struct *handle, DIR *dirp);
584 /* File operations */
586 int (*open_fn)(struct vfs_handle_struct *handle,
587 struct smb_filename *smb_fname, files_struct *fsp,
588 int flags, mode_t mode);
589 NTSTATUS (*create_file_fn)(struct vfs_handle_struct *handle,
590 struct smb_request *req,
591 uint16_t root_dir_fid,
592 struct smb_filename *smb_fname,
593 uint32_t access_mask,
594 uint32_t share_access,
595 uint32_t create_disposition,
596 uint32_t create_options,
597 uint32_t file_attributes,
598 uint32_t oplock_request,
599 struct smb2_lease *lease,
600 uint64_t allocation_size,
601 uint32_t private_flags,
602 struct security_descriptor *sd,
603 struct ea_list *ea_list,
604 files_struct **result,
605 int *pinfo,
606 const struct smb2_create_blobs *in_context_blobs,
607 struct smb2_create_blobs *out_context_blobs);
608 int (*close_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
609 ssize_t (*read_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, void *data, size_t n);
610 ssize_t (*pread_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, void *data, size_t n, off_t offset);
611 struct tevent_req *(*pread_send_fn)(struct vfs_handle_struct *handle,
612 TALLOC_CTX *mem_ctx,
613 struct tevent_context *ev,
614 struct files_struct *fsp,
615 void *data,
616 size_t n, off_t offset);
617 ssize_t (*pread_recv_fn)(struct tevent_req *req, struct vfs_aio_state *state);
618 ssize_t (*write_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const void *data, size_t n);
619 ssize_t (*pwrite_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const void *data, size_t n, off_t offset);
620 struct tevent_req *(*pwrite_send_fn)(struct vfs_handle_struct *handle,
621 TALLOC_CTX *mem_ctx,
622 struct tevent_context *ev,
623 struct files_struct *fsp,
624 const void *data,
625 size_t n, off_t offset);
626 ssize_t (*pwrite_recv_fn)(struct tevent_req *req, struct vfs_aio_state *state);
627 off_t (*lseek_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, off_t offset, int whence);
628 ssize_t (*sendfile_fn)(struct vfs_handle_struct *handle, int tofd, files_struct *fromfsp, const DATA_BLOB *header, off_t offset, size_t count);
629 ssize_t (*recvfile_fn)(struct vfs_handle_struct *handle, int fromfd, files_struct *tofsp, off_t offset, size_t count);
630 int (*rename_fn)(struct vfs_handle_struct *handle,
631 const struct smb_filename *smb_fname_src,
632 const struct smb_filename *smb_fname_dst);
633 int (*fsync_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
634 struct tevent_req *(*fsync_send_fn)(struct vfs_handle_struct *handle,
635 TALLOC_CTX *mem_ctx,
636 struct tevent_context *ev,
637 struct files_struct *fsp);
638 int (*fsync_recv_fn)(struct tevent_req *req, struct vfs_aio_state *state);
639 int (*stat_fn)(struct vfs_handle_struct *handle, struct smb_filename *smb_fname);
640 int (*fstat_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_STAT *sbuf);
641 int (*lstat_fn)(struct vfs_handle_struct *handle, struct smb_filename *smb_filename);
642 uint64_t (*get_alloc_size_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_STAT *sbuf);
643 int (*unlink_fn)(struct vfs_handle_struct *handle,
644 const struct smb_filename *smb_fname);
645 int (*chmod_fn)(struct vfs_handle_struct *handle,
646 const struct smb_filename *smb_fname,
647 mode_t mode);
648 int (*fchmod_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, mode_t mode);
649 int (*chown_fn)(struct vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid);
650 int (*fchown_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, uid_t uid, gid_t gid);
651 int (*lchown_fn)(struct vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid);
652 int (*chdir_fn)(struct vfs_handle_struct *handle, const char *path);
653 char *(*getwd_fn)(struct vfs_handle_struct *handle);
654 int (*ntimes_fn)(struct vfs_handle_struct *handle,
655 const struct smb_filename *smb_fname,
656 struct smb_file_time *ft);
657 int (*ftruncate_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, off_t offset);
658 int (*fallocate_fn)(struct vfs_handle_struct *handle,
659 struct files_struct *fsp,
660 uint32_t mode,
661 off_t offset,
662 off_t len);
663 bool (*lock_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, int op, off_t offset, off_t count, int type);
664 int (*kernel_flock_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp,
665 uint32_t share_mode, uint32_t access_mask);
666 int (*linux_setlease_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, int leasetype);
667 bool (*getlock_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, off_t *poffset, off_t *pcount, int *ptype, pid_t *ppid);
668 int (*symlink_fn)(struct vfs_handle_struct *handle, const char *oldpath, const char *newpath);
669 int (*readlink_fn)(struct vfs_handle_struct *handle, const char *path, char *buf, size_t bufsiz);
670 int (*link_fn)(struct vfs_handle_struct *handle, const char *oldpath, const char *newpath);
671 int (*mknod_fn)(struct vfs_handle_struct *handle, const char *path, mode_t mode, SMB_DEV_T dev);
672 char *(*realpath_fn)(struct vfs_handle_struct *handle, const char *path);
673 int (*chflags_fn)(struct vfs_handle_struct *handle, const char *path, unsigned int flags);
674 struct file_id (*file_id_create_fn)(struct vfs_handle_struct *handle,
675 const SMB_STRUCT_STAT *sbuf);
676 struct tevent_req *(*copy_chunk_send_fn)(struct vfs_handle_struct *handle,
677 TALLOC_CTX *mem_ctx,
678 struct tevent_context *ev,
679 struct files_struct *src_fsp,
680 off_t src_off,
681 struct files_struct *dest_fsp,
682 off_t dest_off,
683 off_t num);
684 NTSTATUS (*copy_chunk_recv_fn)(struct vfs_handle_struct *handle,
685 struct tevent_req *req,
686 off_t *copied);
687 NTSTATUS (*get_compression_fn)(struct vfs_handle_struct *handle,
688 TALLOC_CTX *mem_ctx,
689 struct files_struct *fsp,
690 struct smb_filename *smb_fname,
691 uint16_t *_compression_fmt);
692 NTSTATUS (*set_compression_fn)(struct vfs_handle_struct *handle,
693 TALLOC_CTX *mem_ctx,
694 struct files_struct *fsp,
695 uint16_t compression_fmt);
696 NTSTATUS (*snap_check_path_fn)(struct vfs_handle_struct *handle,
697 TALLOC_CTX *mem_ctx,
698 const char *service_path,
699 char **base_volume);
700 NTSTATUS (*snap_create_fn)(struct vfs_handle_struct *handle,
701 TALLOC_CTX *mem_ctx,
702 const char *base_volume,
703 time_t *tstamp,
704 bool rw,
705 char **base_path,
706 char **snap_path);
707 NTSTATUS (*snap_delete_fn)(struct vfs_handle_struct *handle,
708 TALLOC_CTX *mem_ctx,
709 char *base_path,
710 char *snap_path);
712 NTSTATUS (*streaminfo_fn)(struct vfs_handle_struct *handle,
713 struct files_struct *fsp,
714 const char *fname,
715 TALLOC_CTX *mem_ctx,
716 unsigned int *num_streams,
717 struct stream_struct **streams);
719 int (*get_real_filename_fn)(struct vfs_handle_struct *handle,
720 const char *path,
721 const char *name,
722 TALLOC_CTX *mem_ctx,
723 char **found_name);
725 const char *(*connectpath_fn)(struct vfs_handle_struct *handle,
726 const char *filename);
728 NTSTATUS (*brl_lock_windows_fn)(struct vfs_handle_struct *handle,
729 struct byte_range_lock *br_lck,
730 struct lock_struct *plock,
731 bool blocking_lock);
733 bool (*brl_unlock_windows_fn)(struct vfs_handle_struct *handle,
734 struct messaging_context *msg_ctx,
735 struct byte_range_lock *br_lck,
736 const struct lock_struct *plock);
738 bool (*brl_cancel_windows_fn)(struct vfs_handle_struct *handle,
739 struct byte_range_lock *br_lck,
740 struct lock_struct *plock);
742 bool (*strict_lock_fn)(struct vfs_handle_struct *handle,
743 struct files_struct *fsp,
744 struct lock_struct *plock);
746 void (*strict_unlock_fn)(struct vfs_handle_struct *handle,
747 struct files_struct *fsp,
748 struct lock_struct *plock);
750 NTSTATUS (*translate_name_fn)(struct vfs_handle_struct *handle,
751 const char *name,
752 enum vfs_translate_direction direction,
753 TALLOC_CTX *mem_ctx,
754 char **mapped_name);
756 NTSTATUS (*fsctl_fn)(struct vfs_handle_struct *handle,
757 struct files_struct *fsp,
758 TALLOC_CTX *ctx,
759 uint32_t function,
760 uint16_t req_flags,
761 const uint8_t *_in_data,
762 uint32_t in_len,
763 uint8_t **_out_data,
764 uint32_t max_out_len,
765 uint32_t *out_len);
767 /* NT ACL operations. */
769 NTSTATUS (*fget_nt_acl_fn)(struct vfs_handle_struct *handle,
770 struct files_struct *fsp,
771 uint32_t security_info,
772 TALLOC_CTX *mem_ctx,
773 struct security_descriptor **ppdesc);
774 NTSTATUS (*get_nt_acl_fn)(struct vfs_handle_struct *handle,
775 const struct smb_filename *smb_fname,
776 uint32_t security_info,
777 TALLOC_CTX *mem_ctx,
778 struct security_descriptor **ppdesc);
779 NTSTATUS (*fset_nt_acl_fn)(struct vfs_handle_struct *handle,
780 struct files_struct *fsp,
781 uint32_t security_info_sent,
782 const struct security_descriptor *psd);
784 NTSTATUS (*audit_file_fn)(struct vfs_handle_struct *handle,
785 struct smb_filename *file,
786 struct security_acl *sacl,
787 uint32_t access_requested,
788 uint32_t access_denied);
790 /* POSIX ACL operations. */
792 int (*chmod_acl_fn)(struct vfs_handle_struct *handle,
793 const struct smb_filename *smb_fname,
794 mode_t mode);
795 int (*fchmod_acl_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, mode_t mode);
797 SMB_ACL_T (*sys_acl_get_file_fn)(struct vfs_handle_struct *handle,
798 const char *path_p,
799 SMB_ACL_TYPE_T type,
800 TALLOC_CTX *mem_ctx);
801 SMB_ACL_T (*sys_acl_get_fd_fn)(struct vfs_handle_struct *handle,
802 struct files_struct *fsp,
803 TALLOC_CTX *mem_ctx);
804 int (*sys_acl_blob_get_file_fn)(struct vfs_handle_struct *handle,
805 const char *path_p,
806 TALLOC_CTX *mem_ctx,
807 char **blob_description,
808 DATA_BLOB *blob);
809 int (*sys_acl_blob_get_fd_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp,
810 TALLOC_CTX *mem_ctx, char **blob_description,
811 DATA_BLOB *blob);
812 int (*sys_acl_set_file_fn)(struct vfs_handle_struct *handle, const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl);
813 int (*sys_acl_set_fd_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_ACL_T theacl);
814 int (*sys_acl_delete_def_file_fn)(struct vfs_handle_struct *handle, const char *path);
816 /* EA operations. */
817 ssize_t (*getxattr_fn)(struct vfs_handle_struct *handle,const char *path, const char *name, void *value, size_t size);
818 ssize_t (*fgetxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, void *value, size_t size);
819 ssize_t (*listxattr_fn)(struct vfs_handle_struct *handle, const char *path, char *list, size_t size);
820 ssize_t (*flistxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, char *list, size_t size);
821 int (*removexattr_fn)(struct vfs_handle_struct *handle, const char *path, const char *name);
822 int (*fremovexattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name);
823 int (*setxattr_fn)(struct vfs_handle_struct *handle, const char *path, const char *name, const void *value, size_t size, int flags);
824 int (*fsetxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, const void *value, size_t size, int flags);
826 /* aio operations */
827 bool (*aio_force_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
829 /* offline operations */
830 bool (*is_offline_fn)(struct vfs_handle_struct *handle,
831 const struct smb_filename *fname,
832 SMB_STRUCT_STAT *sbuf);
833 int (*set_offline_fn)(struct vfs_handle_struct *handle,
834 const struct smb_filename *fname);
836 /* durable handle operations */
837 NTSTATUS (*durable_cookie_fn)(struct vfs_handle_struct *handle,
838 struct files_struct *fsp,
839 TALLOC_CTX *mem_ctx,
840 DATA_BLOB *cookie);
841 NTSTATUS (*durable_disconnect_fn)(struct vfs_handle_struct *handle,
842 struct files_struct *fsp,
843 const DATA_BLOB old_cookie,
844 TALLOC_CTX *mem_ctx,
845 DATA_BLOB *new_cookie);
846 NTSTATUS (*durable_reconnect_fn)(struct vfs_handle_struct *handle,
847 struct smb_request *smb1req,
848 struct smbXsrv_open *op,
849 const DATA_BLOB old_cookie,
850 TALLOC_CTX *mem_ctx,
851 struct files_struct **fsp,
852 DATA_BLOB *new_cookie);
854 NTSTATUS (*readdir_attr_fn)(struct vfs_handle_struct *handle,
855 const struct smb_filename *fname,
856 TALLOC_CTX *mem_ctx,
857 struct readdir_attr_data **attr_data);
861 VFS operation description. Each VFS module registers an array of vfs_op_tuple to VFS subsystem,
862 which describes all operations this module is willing to intercept.
863 VFS subsystem initializes then the conn->vfs_ops and conn->vfs_opaque_ops structs
864 using this information.
867 typedef struct vfs_handle_struct {
868 struct vfs_handle_struct *next, *prev;
869 const char *param;
870 struct connection_struct *conn;
871 const struct vfs_fn_pointers *fns;
872 void *data;
873 void (*free_data)(void **data);
874 } vfs_handle_struct;
877 typedef struct vfs_statvfs_struct {
878 /* For undefined recommended transfer size return -1 in that field */
879 uint32_t OptimalTransferSize; /* bsize on some os, iosize on other os */
880 uint32_t BlockSize;
883 The next three fields are in terms of the block size.
884 (above). If block size is unknown, 4096 would be a
885 reasonable block size for a server to report.
886 Note that returning the blocks/blocksavail removes need
887 to make a second call (to QFSInfo level 0x103 to get this info.
888 UserBlockAvail is typically less than or equal to BlocksAvail,
889 if no distinction is made return the same value in each.
892 uint64_t TotalBlocks;
893 uint64_t BlocksAvail; /* bfree */
894 uint64_t UserBlocksAvail; /* bavail */
896 /* For undefined Node fields or FSID return -1 */
897 uint64_t TotalFileNodes;
898 uint64_t FreeFileNodes;
899 uint64_t FsIdentifier; /* fsid */
900 /* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */
901 /* NB flags can come from FILE_SYSTEM_DEVICE_INFO call */
903 int FsCapabilities;
904 } vfs_statvfs_struct;
906 /* Add a new FSP extension of the given type. Returns a pointer to the
907 * extenstion data.
909 #define VFS_ADD_FSP_EXTENSION(handle, fsp, type, destroy_fn) \
910 vfs_add_fsp_extension_notype(handle, (fsp), sizeof(type), (destroy_fn))
912 /* Return a pointer to the existing FSP extension data. */
913 #define VFS_FETCH_FSP_EXTENSION(handle, fsp) \
914 vfs_fetch_fsp_extension(handle, (fsp))
916 /* Return the talloc context associated with an FSP extension. */
917 #define VFS_MEMCTX_FSP_EXTENSION(handle, fsp) \
918 vfs_memctx_fsp_extension(handle, (fsp))
920 /* Remove and destroy an FSP extension. */
921 #define VFS_REMOVE_FSP_EXTENSION(handle, fsp) \
922 vfs_remove_fsp_extension((handle), (fsp))
924 #define SMB_VFS_HANDLE_GET_DATA(handle, datap, type, ret) { \
925 if (!(handle)||((datap=(type *)(handle)->data)==NULL)) { \
926 DEBUG(0,("%s() failed to get vfs_handle->data!\n",__FUNCTION__)); \
927 ret; \
931 #define SMB_VFS_HANDLE_SET_DATA(handle, datap, free_fn, type, ret) { \
932 if (!(handle)) { \
933 DEBUG(0,("%s() failed to set handle->data!\n",__FUNCTION__)); \
934 ret; \
935 } else { \
936 if ((handle)->free_data) { \
937 (handle)->free_data(&(handle)->data); \
939 (handle)->data = (void *)datap; \
940 (handle)->free_data = free_fn; \
944 #define SMB_VFS_HANDLE_FREE_DATA(handle) { \
945 if ((handle) && (handle)->free_data) { \
946 (handle)->free_data(&(handle)->data); \
950 /* Check whether module-specific data handle was already allocated or not */
951 #define SMB_VFS_HANDLE_TEST_DATA(handle) ( !(handle) || !(handle)->data ? False : True )
953 #define SMB_VFS_OP(x) ((void *) x)
955 #define DEFAULT_VFS_MODULE_NAME "/[Default VFS]/"
957 #include "vfs_macros.h"
959 int smb_vfs_call_connect(struct vfs_handle_struct *handle,
960 const char *service, const char *user);
961 void smb_vfs_call_disconnect(struct vfs_handle_struct *handle);
962 uint64_t smb_vfs_call_disk_free(struct vfs_handle_struct *handle,
963 const char *path, uint64_t *bsize,
964 uint64_t *dfree, uint64_t *dsize);
965 int smb_vfs_call_get_quota(struct vfs_handle_struct *handle, const char *path,
966 enum SMB_QUOTA_TYPE qtype, unid_t id,
967 SMB_DISK_QUOTA *qt);
968 int smb_vfs_call_set_quota(struct vfs_handle_struct *handle,
969 enum SMB_QUOTA_TYPE qtype, unid_t id,
970 SMB_DISK_QUOTA *qt);
971 int smb_vfs_call_get_shadow_copy_data(struct vfs_handle_struct *handle,
972 struct files_struct *fsp,
973 struct shadow_copy_data *shadow_copy_data,
974 bool labels);
975 int smb_vfs_call_statvfs(struct vfs_handle_struct *handle, const char *path,
976 struct vfs_statvfs_struct *statbuf);
977 uint32_t smb_vfs_call_fs_capabilities(struct vfs_handle_struct *handle,
978 enum timestamp_set_resolution *p_ts_res);
980 * Note: that "struct dfs_GetDFSReferral *r" needs to be a valid TALLOC_CTX
982 NTSTATUS smb_vfs_call_get_dfs_referrals(struct vfs_handle_struct *handle,
983 struct dfs_GetDFSReferral *r);
984 DIR *smb_vfs_call_opendir(struct vfs_handle_struct *handle,
985 const struct smb_filename *smb_fname,
986 const char *mask,
987 uint32_t attributes);
988 DIR *smb_vfs_call_fdopendir(struct vfs_handle_struct *handle,
989 struct files_struct *fsp,
990 const char *mask,
991 uint32_t attributes);
992 struct dirent *smb_vfs_call_readdir(struct vfs_handle_struct *handle,
993 DIR *dirp,
994 SMB_STRUCT_STAT *sbuf);
995 void smb_vfs_call_seekdir(struct vfs_handle_struct *handle,
996 DIR *dirp, long offset);
997 long smb_vfs_call_telldir(struct vfs_handle_struct *handle,
998 DIR *dirp);
999 void smb_vfs_call_rewind_dir(struct vfs_handle_struct *handle,
1000 DIR *dirp);
1001 int smb_vfs_call_mkdir(struct vfs_handle_struct *handle,
1002 const struct smb_filename *smb_fname,
1003 mode_t mode);
1004 int smb_vfs_call_rmdir(struct vfs_handle_struct *handle,
1005 const struct smb_filename *smb_fname);
1006 int smb_vfs_call_closedir(struct vfs_handle_struct *handle,
1007 DIR *dir);
1008 void smb_vfs_call_init_search_op(struct vfs_handle_struct *handle,
1009 DIR *dirp);
1010 int smb_vfs_call_open(struct vfs_handle_struct *handle,
1011 struct smb_filename *smb_fname, struct files_struct *fsp,
1012 int flags, mode_t mode);
1013 NTSTATUS smb_vfs_call_create_file(struct vfs_handle_struct *handle,
1014 struct smb_request *req,
1015 uint16_t root_dir_fid,
1016 struct smb_filename *smb_fname,
1017 uint32_t access_mask,
1018 uint32_t share_access,
1019 uint32_t create_disposition,
1020 uint32_t create_options,
1021 uint32_t file_attributes,
1022 uint32_t oplock_request,
1023 struct smb2_lease *lease,
1024 uint64_t allocation_size,
1025 uint32_t private_flags,
1026 struct security_descriptor *sd,
1027 struct ea_list *ea_list,
1028 files_struct **result,
1029 int *pinfo,
1030 const struct smb2_create_blobs *in_context_blobs,
1031 struct smb2_create_blobs *out_context_blobs);
1032 int smb_vfs_call_close(struct vfs_handle_struct *handle,
1033 struct files_struct *fsp);
1034 ssize_t smb_vfs_call_read(struct vfs_handle_struct *handle,
1035 struct files_struct *fsp, void *data, size_t n);
1036 ssize_t smb_vfs_call_pread(struct vfs_handle_struct *handle,
1037 struct files_struct *fsp, void *data, size_t n,
1038 off_t offset);
1039 struct tevent_req *smb_vfs_call_pread_send(struct vfs_handle_struct *handle,
1040 TALLOC_CTX *mem_ctx,
1041 struct tevent_context *ev,
1042 struct files_struct *fsp,
1043 void *data,
1044 size_t n, off_t offset);
1045 ssize_t SMB_VFS_PREAD_RECV(struct tevent_req *req, struct vfs_aio_state *state);
1047 ssize_t smb_vfs_call_write(struct vfs_handle_struct *handle,
1048 struct files_struct *fsp, const void *data,
1049 size_t n);
1050 ssize_t smb_vfs_call_pwrite(struct vfs_handle_struct *handle,
1051 struct files_struct *fsp, const void *data,
1052 size_t n, off_t offset);
1053 struct tevent_req *smb_vfs_call_pwrite_send(struct vfs_handle_struct *handle,
1054 TALLOC_CTX *mem_ctx,
1055 struct tevent_context *ev,
1056 struct files_struct *fsp,
1057 const void *data,
1058 size_t n, off_t offset);
1059 ssize_t SMB_VFS_PWRITE_RECV(struct tevent_req *req, struct vfs_aio_state *state);
1061 off_t smb_vfs_call_lseek(struct vfs_handle_struct *handle,
1062 struct files_struct *fsp, off_t offset,
1063 int whence);
1064 ssize_t smb_vfs_call_sendfile(struct vfs_handle_struct *handle, int tofd,
1065 files_struct *fromfsp, const DATA_BLOB *header,
1066 off_t offset, size_t count);
1067 ssize_t smb_vfs_call_recvfile(struct vfs_handle_struct *handle, int fromfd,
1068 files_struct *tofsp, off_t offset,
1069 size_t count);
1070 int smb_vfs_call_rename(struct vfs_handle_struct *handle,
1071 const struct smb_filename *smb_fname_src,
1072 const struct smb_filename *smb_fname_dst);
1073 int smb_vfs_call_fsync(struct vfs_handle_struct *handle,
1074 struct files_struct *fsp);
1076 struct tevent_req *smb_vfs_call_fsync_send(struct vfs_handle_struct *handle,
1077 TALLOC_CTX *mem_ctx,
1078 struct tevent_context *ev,
1079 struct files_struct *fsp);
1080 int SMB_VFS_FSYNC_RECV(struct tevent_req *req, struct vfs_aio_state *state);
1082 int smb_vfs_call_stat(struct vfs_handle_struct *handle,
1083 struct smb_filename *smb_fname);
1084 int smb_vfs_call_fstat(struct vfs_handle_struct *handle,
1085 struct files_struct *fsp, SMB_STRUCT_STAT *sbuf);
1086 int smb_vfs_call_lstat(struct vfs_handle_struct *handle,
1087 struct smb_filename *smb_filename);
1088 uint64_t smb_vfs_call_get_alloc_size(struct vfs_handle_struct *handle,
1089 struct files_struct *fsp,
1090 const SMB_STRUCT_STAT *sbuf);
1091 int smb_vfs_call_unlink(struct vfs_handle_struct *handle,
1092 const struct smb_filename *smb_fname);
1093 int smb_vfs_call_chmod(struct vfs_handle_struct *handle,
1094 const struct smb_filename *smb_fname,
1095 mode_t mode);
1096 int smb_vfs_call_fchmod(struct vfs_handle_struct *handle,
1097 struct files_struct *fsp, mode_t mode);
1098 int smb_vfs_call_chown(struct vfs_handle_struct *handle, const char *path,
1099 uid_t uid, gid_t gid);
1100 int smb_vfs_call_fchown(struct vfs_handle_struct *handle,
1101 struct files_struct *fsp, uid_t uid, gid_t gid);
1102 int smb_vfs_call_lchown(struct vfs_handle_struct *handle, const char *path,
1103 uid_t uid, gid_t gid);
1104 int smb_vfs_call_chdir(struct vfs_handle_struct *handle, const char *path);
1105 char *smb_vfs_call_getwd(struct vfs_handle_struct *handle);
1106 int smb_vfs_call_ntimes(struct vfs_handle_struct *handle,
1107 const struct smb_filename *smb_fname,
1108 struct smb_file_time *ft);
1109 int smb_vfs_call_ftruncate(struct vfs_handle_struct *handle,
1110 struct files_struct *fsp, off_t offset);
1111 int smb_vfs_call_fallocate(struct vfs_handle_struct *handle,
1112 struct files_struct *fsp,
1113 uint32_t mode,
1114 off_t offset,
1115 off_t len);
1116 bool smb_vfs_call_lock(struct vfs_handle_struct *handle,
1117 struct files_struct *fsp, int op, off_t offset,
1118 off_t count, int type);
1119 int smb_vfs_call_kernel_flock(struct vfs_handle_struct *handle,
1120 struct files_struct *fsp, uint32_t share_mode,
1121 uint32_t access_mask);
1122 int smb_vfs_call_linux_setlease(struct vfs_handle_struct *handle,
1123 struct files_struct *fsp, int leasetype);
1124 bool smb_vfs_call_getlock(struct vfs_handle_struct *handle,
1125 struct files_struct *fsp, off_t *poffset,
1126 off_t *pcount, int *ptype, pid_t *ppid);
1127 int smb_vfs_call_symlink(struct vfs_handle_struct *handle, const char *oldpath,
1128 const char *newpath);
1129 int smb_vfs_call_readlink(struct vfs_handle_struct *handle,
1130 const char *path, char *buf, size_t bufsiz);
1131 int smb_vfs_call_link(struct vfs_handle_struct *handle, const char *oldpath,
1132 const char *newpath);
1133 int smb_vfs_call_mknod(struct vfs_handle_struct *handle, const char *path,
1134 mode_t mode, SMB_DEV_T dev);
1135 char *smb_vfs_call_realpath(struct vfs_handle_struct *handle, const char *path);
1136 int smb_vfs_call_chflags(struct vfs_handle_struct *handle, const char *path,
1137 unsigned int flags);
1138 struct file_id smb_vfs_call_file_id_create(struct vfs_handle_struct *handle,
1139 const SMB_STRUCT_STAT *sbuf);
1140 NTSTATUS smb_vfs_call_streaminfo(struct vfs_handle_struct *handle,
1141 struct files_struct *fsp,
1142 const char *fname,
1143 TALLOC_CTX *mem_ctx,
1144 unsigned int *num_streams,
1145 struct stream_struct **streams);
1146 int smb_vfs_call_get_real_filename(struct vfs_handle_struct *handle,
1147 const char *path, const char *name,
1148 TALLOC_CTX *mem_ctx, char **found_name);
1149 const char *smb_vfs_call_connectpath(struct vfs_handle_struct *handle,
1150 const char *filename);
1151 NTSTATUS smb_vfs_call_brl_lock_windows(struct vfs_handle_struct *handle,
1152 struct byte_range_lock *br_lck,
1153 struct lock_struct *plock,
1154 bool blocking_lock);
1155 bool smb_vfs_call_brl_unlock_windows(struct vfs_handle_struct *handle,
1156 struct messaging_context *msg_ctx,
1157 struct byte_range_lock *br_lck,
1158 const struct lock_struct *plock);
1159 bool smb_vfs_call_brl_cancel_windows(struct vfs_handle_struct *handle,
1160 struct byte_range_lock *br_lck,
1161 struct lock_struct *plock);
1162 bool smb_vfs_call_strict_lock(struct vfs_handle_struct *handle,
1163 struct files_struct *fsp,
1164 struct lock_struct *plock);
1165 void smb_vfs_call_strict_unlock(struct vfs_handle_struct *handle,
1166 struct files_struct *fsp,
1167 struct lock_struct *plock);
1168 NTSTATUS smb_vfs_call_translate_name(struct vfs_handle_struct *handle,
1169 const char *name,
1170 enum vfs_translate_direction direction,
1171 TALLOC_CTX *mem_ctx,
1172 char **mapped_name);
1173 NTSTATUS smb_vfs_call_fsctl(struct vfs_handle_struct *handle,
1174 struct files_struct *fsp,
1175 TALLOC_CTX *ctx,
1176 uint32_t function,
1177 uint16_t req_flags,
1178 const uint8_t *_in_data,
1179 uint32_t in_len,
1180 uint8_t **_out_data,
1181 uint32_t max_out_len,
1182 uint32_t *out_len);
1183 struct tevent_req *smb_vfs_call_copy_chunk_send(struct vfs_handle_struct *handle,
1184 TALLOC_CTX *mem_ctx,
1185 struct tevent_context *ev,
1186 struct files_struct *src_fsp,
1187 off_t src_off,
1188 struct files_struct *dest_fsp,
1189 off_t dest_off,
1190 off_t num);
1191 NTSTATUS smb_vfs_call_copy_chunk_recv(struct vfs_handle_struct *handle,
1192 struct tevent_req *req,
1193 off_t *copied);
1194 NTSTATUS smb_vfs_call_get_compression(struct vfs_handle_struct *handle,
1195 TALLOC_CTX *mem_ctx,
1196 struct files_struct *fsp,
1197 struct smb_filename *smb_fname,
1198 uint16_t *_compression_fmt);
1199 NTSTATUS smb_vfs_call_set_compression(struct vfs_handle_struct *handle,
1200 TALLOC_CTX *mem_ctx,
1201 struct files_struct *fsp,
1202 uint16_t compression_fmt);
1203 NTSTATUS smb_vfs_call_snap_check_path(vfs_handle_struct *handle,
1204 TALLOC_CTX *mem_ctx,
1205 const char *service_path,
1206 char **base_volume);
1207 NTSTATUS smb_vfs_call_snap_create(struct vfs_handle_struct *handle,
1208 TALLOC_CTX *mem_ctx,
1209 const char *base_volume,
1210 time_t *tstamp,
1211 bool rw,
1212 char **base_path,
1213 char **snap_path);
1214 NTSTATUS smb_vfs_call_snap_delete(struct vfs_handle_struct *handle,
1215 TALLOC_CTX *mem_ctx,
1216 char *base_path,
1217 char *snap_path);
1218 NTSTATUS smb_vfs_call_fget_nt_acl(struct vfs_handle_struct *handle,
1219 struct files_struct *fsp,
1220 uint32_t security_info,
1221 TALLOC_CTX *mem_ctx,
1222 struct security_descriptor **ppdesc);
1223 NTSTATUS smb_vfs_call_get_nt_acl(struct vfs_handle_struct *handle,
1224 const struct smb_filename *smb_fname,
1225 uint32_t security_info,
1226 TALLOC_CTX *mem_ctx,
1227 struct security_descriptor **ppdesc);
1228 NTSTATUS smb_vfs_call_fset_nt_acl(struct vfs_handle_struct *handle,
1229 struct files_struct *fsp,
1230 uint32_t security_info_sent,
1231 const struct security_descriptor *psd);
1232 NTSTATUS smb_vfs_call_audit_file(struct vfs_handle_struct *handle,
1233 struct smb_filename *file,
1234 struct security_acl *sacl,
1235 uint32_t access_requested,
1236 uint32_t access_denied);
1237 int smb_vfs_call_chmod_acl(struct vfs_handle_struct *handle,
1238 const struct smb_filename *file,
1239 mode_t mode);
1240 int smb_vfs_call_fchmod_acl(struct vfs_handle_struct *handle,
1241 struct files_struct *fsp, mode_t mode);
1242 SMB_ACL_T smb_vfs_call_sys_acl_get_file(struct vfs_handle_struct *handle,
1243 const char *path_p,
1244 SMB_ACL_TYPE_T type,
1245 TALLOC_CTX *mem_ctx);
1246 SMB_ACL_T smb_vfs_call_sys_acl_get_fd(struct vfs_handle_struct *handle,
1247 struct files_struct *fsp,
1248 TALLOC_CTX *mem_ctx);
1249 int smb_vfs_call_sys_acl_blob_get_file(struct vfs_handle_struct *handle,
1250 const char *path_p,
1251 TALLOC_CTX *mem_ctx,
1252 char **blob_description,
1253 DATA_BLOB *blob);
1254 int smb_vfs_call_sys_acl_blob_get_fd(struct vfs_handle_struct *handle,
1255 struct files_struct *fsp,
1256 TALLOC_CTX *mem_ctx,
1257 char **blob_description,
1258 DATA_BLOB *blob);
1259 int smb_vfs_call_sys_acl_set_file(struct vfs_handle_struct *handle,
1260 const char *name, SMB_ACL_TYPE_T acltype,
1261 SMB_ACL_T theacl);
1262 int smb_vfs_call_sys_acl_set_fd(struct vfs_handle_struct *handle,
1263 struct files_struct *fsp, SMB_ACL_T theacl);
1264 int smb_vfs_call_sys_acl_delete_def_file(struct vfs_handle_struct *handle,
1265 const char *path);
1266 ssize_t smb_vfs_call_getxattr(struct vfs_handle_struct *handle,
1267 const char *path, const char *name, void *value,
1268 size_t size);
1269 ssize_t smb_vfs_call_fgetxattr(struct vfs_handle_struct *handle,
1270 struct files_struct *fsp, const char *name,
1271 void *value, size_t size);
1272 ssize_t smb_vfs_call_listxattr(struct vfs_handle_struct *handle,
1273 const char *path, char *list, size_t size);
1274 ssize_t smb_vfs_call_llistxattr(struct vfs_handle_struct *handle,
1275 const char *path, char *list, size_t size);
1276 ssize_t smb_vfs_call_flistxattr(struct vfs_handle_struct *handle,
1277 struct files_struct *fsp, char *list,
1278 size_t size);
1279 int smb_vfs_call_removexattr(struct vfs_handle_struct *handle,
1280 const char *path, const char *name);
1281 int smb_vfs_call_fremovexattr(struct vfs_handle_struct *handle,
1282 struct files_struct *fsp, const char *name);
1283 int smb_vfs_call_setxattr(struct vfs_handle_struct *handle, const char *path,
1284 const char *name, const void *value, size_t size,
1285 int flags);
1286 int smb_vfs_call_lsetxattr(struct vfs_handle_struct *handle, const char *path,
1287 const char *name, const void *value, size_t size,
1288 int flags);
1289 int smb_vfs_call_fsetxattr(struct vfs_handle_struct *handle,
1290 struct files_struct *fsp, const char *name,
1291 const void *value, size_t size, int flags);
1292 bool smb_vfs_call_aio_force(struct vfs_handle_struct *handle,
1293 struct files_struct *fsp);
1294 bool smb_vfs_call_is_offline(struct vfs_handle_struct *handle,
1295 const struct smb_filename *fname,
1296 SMB_STRUCT_STAT *sbuf);
1297 int smb_vfs_call_set_offline(struct vfs_handle_struct *handle,
1298 const struct smb_filename *fname);
1299 NTSTATUS smb_vfs_call_durable_cookie(struct vfs_handle_struct *handle,
1300 struct files_struct *fsp,
1301 TALLOC_CTX *mem_ctx,
1302 DATA_BLOB *cookie);
1303 NTSTATUS smb_vfs_call_durable_disconnect(struct vfs_handle_struct *handle,
1304 struct files_struct *fsp,
1305 const DATA_BLOB old_cookie,
1306 TALLOC_CTX *mem_ctx,
1307 DATA_BLOB *new_cookie);
1308 NTSTATUS smb_vfs_call_durable_reconnect(struct vfs_handle_struct *handle,
1309 struct smb_request *smb1req,
1310 struct smbXsrv_open *op,
1311 const DATA_BLOB old_cookie,
1312 TALLOC_CTX *mem_ctx,
1313 struct files_struct **fsp,
1314 DATA_BLOB *new_cookie);
1315 NTSTATUS smb_vfs_call_readdir_attr(struct vfs_handle_struct *handle,
1316 const struct smb_filename *fname,
1317 TALLOC_CTX *mem_ctx,
1318 struct readdir_attr_data **attr_data);
1320 NTSTATUS smb_register_vfs(int version, const char *name,
1321 const struct vfs_fn_pointers *fns);
1322 void *vfs_add_fsp_extension_notype(vfs_handle_struct *handle,
1323 files_struct *fsp, size_t ext_size,
1324 void (*destroy_fn)(void *p_data));
1325 void vfs_remove_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
1326 void vfs_remove_all_fsp_extensions(struct files_struct *fsp);
1327 void *vfs_memctx_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
1328 void *vfs_fetch_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
1330 #endif /* _VFS_H */