s3: VFS: Change SMB_VFS_MKNOD to use const struct smb_filename * instead of const...
[Samba.git] / source3 / include / vfs.h
blobec7f0d0a731d99bfaf1b6ad1bb679d0ceae9085c
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 * */
187 /* Version 35 - Change chown from const char *, to
188 const struct smb_filename * */
189 /* Version 35 - Change lchown from const char *, to
190 const struct smb_filename * */
191 /* Version 35 - Change streaminfo from const char *, to
192 const struct smb_filename * */
193 /* Version 35 - Add uint32_t flags to struct smb_filename */
194 /* Version 35 - Add get/set/fget/fset dos attribute functions. */
195 /* Version 35 - Add bool use_ofd_locks to struct files_struct */
196 /* Bump to version 36 - Samba 4.6 will ship with that */
197 /* Version 36 - Remove is_offline and set_offline */
198 /* Version 37 - Module init functions now take a TALLOC_CTX * parameter. */
199 /* Version 37 - Add vfs_copy_chunk_flags for DUP_EXTENTS_TO_FILE */
200 /* Version 37 - Change sys_acl_delete_def_file from const char *
201 to const struct smb_filename * */
202 /* Version 37 - Change sys_acl_get_file from const char *
203 to const struct smb_filename * */
204 /* Version 37 - Change sys_acl_blob_get_file from const char *
205 to const struct smb_filename * */
206 /* Version 37 - Change sys_acl_set_file from const char *
207 to const struct smb_filename * */
208 /* Version 37 - Change listxattr from const char *
209 to const struct smb_filename * */
210 /* Version 37 - Change removexattr from const char *
211 to const struct smb_filename * */
212 /* Version 37 - Change setxattr from const char *
213 to const struct smb_filename * */
214 /* Version 37 - Change getxattr from const char *
215 to const struct smb_filename * */
216 /* Version 37 - Change mknod from const char * to const struct smb_filename * */
218 #define SMB_VFS_INTERFACE_VERSION 37
221 All intercepted VFS operations must be declared as static functions inside module source
222 in order to keep smbd namespace unpolluted. See source of audit, extd_audit, fake_perms and recycle
223 example VFS modules for more details.
226 /* VFS operations structure */
228 struct vfs_handle_struct;
229 struct connection_struct;
230 struct files_struct;
231 struct security_descriptor;
232 struct vfs_statvfs_struct;
233 struct smb_request;
234 struct ea_list;
235 struct smb_file_time;
236 struct blocking_lock_record;
237 struct smb_filename;
238 struct dfs_GetDFSReferral;
240 typedef union unid_t {
241 uid_t uid;
242 gid_t gid;
243 } unid_t;
245 struct fd_handle {
246 size_t ref_count;
247 int fd;
248 uint64_t position_information;
249 off_t pos;
250 uint32_t private_options; /* NT Create options, but we only look at
251 * NTCREATEX_OPTIONS_PRIVATE_DENY_DOS and
252 * NTCREATEX_OPTIONS_PRIVATE_DENY_FCB and
253 * NTCREATEX_OPTIONS_PRIVATE_DELETE_ON_CLOSE
254 * for print files *only*, where
255 * DELETE_ON_CLOSE is not stored in the share
256 * mode database.
258 unsigned long gen_id;
261 struct fsp_lease {
262 size_t ref_count;
263 struct smbd_server_connection *sconn;
264 struct tevent_timer *timeout;
265 struct smb2_lease lease;
268 typedef struct files_struct {
269 struct files_struct *next, *prev;
270 uint64_t fnum;
271 struct smbXsrv_open *op;
272 struct connection_struct *conn;
273 struct fd_handle *fh;
274 unsigned int num_smb_operations;
275 struct file_id file_id;
276 uint64_t initial_allocation_size; /* Faked up initial allocation on disk. */
277 uint16_t file_pid;
278 uint64_t vuid; /* SMB2 compat */
279 struct write_cache *wcp;
280 struct timeval open_time;
281 uint32_t access_mask; /* NTCreateX access bits (FILE_READ_DATA etc.) */
282 uint32_t share_access; /* NTCreateX share constants (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE). */
284 bool kernel_share_modes_taken;
286 bool update_write_time_triggered;
287 struct tevent_timer *update_write_time_event;
288 bool update_write_time_on_close;
289 struct timespec close_write_time;
290 bool write_time_forced;
292 int oplock_type;
293 struct fsp_lease *lease;
294 int sent_oplock_break;
295 struct tevent_timer *oplock_timeout;
296 struct lock_struct last_lock_failure;
297 int current_lock_count; /* Count the number of outstanding locks and pending locks. */
299 bool can_lock;
300 bool can_read;
301 bool can_write;
302 bool modified;
303 bool is_directory;
304 bool aio_write_behind;
305 bool initial_delete_on_close; /* Only set at NTCreateX if file was created. */
306 bool delete_on_close;
307 uint64_t posix_flags;
308 bool is_sparse;
309 bool backup_intent; /* Handle was successfully opened with backup intent
310 and opener has privilege to do so. */
311 bool aapl_copyfile_supported;
312 bool use_ofd_locks; /* Are we using open file description locks ? */
313 struct smb_filename *fsp_name;
314 uint32_t name_hash; /* Jenkins hash of full pathname. */
315 uint64_t mid; /* Mid of the operation that created us. */
317 struct vfs_fsp_data *vfs_extension;
318 struct fake_file_handle *fake_file_handle;
320 struct notify_change_buf *notify;
322 struct files_struct *base_fsp; /* placeholder for delete on close */
325 * Read-only cached brlock record, thrown away when the
326 * brlock.tdb seqnum changes. This avoids fetching data from
327 * the brlock.tdb on every read/write call.
329 int brlock_seqnum;
330 struct byte_range_lock *brlock_rec;
332 struct dptr_struct *dptr;
334 /* if not NULL, means this is a print file */
335 struct print_file_data *print_file;
337 unsigned num_aio_requests;
338 struct tevent_req **aio_requests;
341 * If a close request comes in while we still have aio_requests
342 * around, we need to hold back the close. When all aio_requests are
343 * done, the aio completion routines need tevent_wait_done() on
344 * this. A bit ugly, but before we have close_file() fully async
345 * possibly the simplest approach. Thanks, Jeremy for the idea.
347 struct tevent_req *deferred_close;
348 } files_struct;
350 #define FSP_POSIX_FLAGS_OPEN 0x01
351 #define FSP_POSIX_FLAGS_RENAME 0x02
352 #define FSP_POSIX_FLAGS_PATHNAMES 0x04
354 #define FSP_POSIX_FLAGS_ALL \
355 (FSP_POSIX_FLAGS_OPEN | \
356 FSP_POSIX_FLAGS_PATHNAMES | \
357 FSP_POSIX_FLAGS_RENAME)
359 struct vuid_cache_entry {
360 struct auth_session_info *session_info;
361 uint64_t vuid; /* SMB2 compat */
362 bool read_only;
363 uint32_t share_access;
366 struct vuid_cache {
367 unsigned int next_entry;
368 struct vuid_cache_entry array[VUID_CACHE_SIZE];
371 typedef struct {
372 char *name;
373 bool is_wild;
374 } name_compare_entry;
376 struct dfree_cached_info {
377 time_t last_dfree_time;
378 uint64_t dfree_ret;
379 uint64_t bsize;
380 uint64_t dfree;
381 uint64_t dsize;
384 struct share_params {
385 int service;
388 typedef struct connection_struct {
389 struct connection_struct *next, *prev;
390 struct smbd_server_connection *sconn; /* can be NULL */
391 struct smbXsrv_tcon *tcon; /* can be NULL */
392 uint32_t cnum; /* an index passed over the wire */
393 struct share_params *params;
394 bool force_user;
395 struct vuid_cache *vuid_cache;
396 bool printer;
397 bool ipc;
398 bool read_only; /* Attributes for the current user of the share. */
399 uint32_t share_access;
400 /* Does this filesystem honor
401 sub second timestamps on files
402 and directories when setting time ? */
403 enum timestamp_set_resolution ts_res;
404 char *connectpath;
405 char *origpath;
406 char *cwd; /* Working directory. */
408 struct vfs_handle_struct *vfs_handles; /* for the new plugins */
411 * This represents the user information on this connection. Depending
412 * on the vuid using this tid, this might change per SMB request.
414 struct auth_session_info *session_info;
417 * If the "force group" parameter is set, this is the primary gid that
418 * may be used in the users token, depending on the vuid using this tid.
420 gid_t force_group_gid;
422 uint64_t vuid; /* vuid of user who *opened* this connection, or UID_FIELD_INVALID */
424 time_t lastused;
425 time_t lastused_count;
426 int num_files_open;
427 unsigned int num_smb_operations; /* Count of smb operations on this tree. */
428 int encrypt_level;
429 bool encrypted_tid;
431 /* Semantics requested by the client or forced by the server config. */
432 bool case_sensitive;
433 bool case_preserve;
434 bool short_case_preserve;
436 /* Semantics provided by the underlying filesystem. */
437 int fs_capabilities;
438 /* Device number of the directory of the share mount.
439 Used to ensure unique FileIndex returns. */
440 SMB_DEV_T base_share_dev;
442 name_compare_entry *hide_list; /* Per-share list of files to return as hidden. */
443 name_compare_entry *veto_list; /* Per-share list of files to veto (never show). */
444 name_compare_entry *veto_oplock_list; /* Per-share list of files to refuse oplocks on. */
445 name_compare_entry *aio_write_behind_list; /* Per-share list of files to use aio write behind on. */
446 struct dfree_cached_info *dfree_info;
447 struct trans_state *pending_trans;
449 struct rpc_pipe_client *spoolss_pipe;
451 } connection_struct;
453 struct smbd_smb2_request;
454 struct privilege_paths;
456 struct smb_request {
457 uint8_t cmd;
458 uint16_t flags2;
459 uint16_t smbpid;
460 uint64_t mid; /* For compatibility with SMB2. */
461 uint32_t seqnum;
462 uint64_t vuid; /* For compatibility with SMB2. */
463 uint32_t tid;
464 uint8_t wct;
465 const uint16_t *vwv;
466 uint16_t buflen;
467 const uint8_t *buf;
468 const uint8_t *inbuf;
471 * Async handling in the main smb processing loop is directed by
472 * outbuf: reply_xxx routines indicate sync behaviour by putting their
473 * reply into "outbuf". If they leave it as NULL, they take care of it
474 * themselves, possibly later.
476 * If async handling is wanted, the reply_xxx routine must make sure
477 * that it talloc_move()s the smb_req somewhere else.
479 uint8_t *outbuf;
481 size_t unread_bytes;
482 bool encrypted;
483 connection_struct *conn;
484 struct smbd_server_connection *sconn;
485 struct smbXsrv_connection *xconn;
486 struct smb_perfcount_data pcd;
489 * Chained request handling
491 struct files_struct *chain_fsp;
494 * state information for async smb handling
496 void *async_priv;
499 * Back pointer to smb2 request.
501 struct smbd_smb2_request *smb2req;
504 * Pathnames used if request done
505 * under privilege.
507 struct privilege_paths *priv_paths;
510 * Request list for chained requests, we're part of it.
512 struct smb_request **chain;
514 struct timeval request_time;
516 bool posix_pathnames;
520 * Info about an alternate data stream
523 struct stream_struct {
524 off_t size;
525 off_t alloc_size;
526 char *name;
529 /* time info */
530 struct smb_file_time {
531 struct timespec mtime;
532 struct timespec atime;
533 struct timespec ctime;
534 struct timespec create_time;
538 * smb_filename
540 struct smb_filename {
541 char *base_name;
542 char *stream_name;
543 char *original_lcomp;
544 uint32_t flags;
545 SMB_STRUCT_STAT st;
549 * smb_filename flags. Define in terms of the FSP_POSIX_FLAGS_XX
550 * to keep the numeric values consistent.
553 #define SMB_FILENAME_POSIX_PATH FSP_POSIX_FLAGS_PATHNAMES
555 #define VFS_FIND(__fn__) while (handle->fns->__fn__##_fn==NULL) { \
556 handle = handle->next; \
559 enum vfs_translate_direction {
560 vfs_translate_to_unix = 0,
561 vfs_translate_to_windows
564 enum vfs_fallocate_flags {
565 VFS_FALLOCATE_FL_KEEP_SIZE = 0x0001,
566 VFS_FALLOCATE_FL_PUNCH_HOLE = 0x0002,
570 * @VFS_COPY_CHUNK_FL_MUST_CLONE: indicates that copy_chunk_send_fn() copy must
571 * be handled as a COW clone, AKA reflink.
572 * @VFS_COPY_CHUNK_FL_MASK_ALL: all valid copychunk flags.
574 enum vfs_copy_chunk_flags {
575 VFS_COPY_CHUNK_FL_MUST_CLONE = 0x0001,
576 VFS_COPY_CHUNK_FL_IGNORE_LOCKS = 0x0002,
578 VFS_COPY_CHUNK_FL_MASK_ALL =
579 (VFS_COPY_CHUNK_FL_MUST_CLONE
580 | VFS_COPY_CHUNK_FL_IGNORE_LOCKS),
583 struct vfs_aio_state {
584 int error;
585 uint64_t duration;
589 Available VFS operations. These values must be in sync with vfs_ops struct
590 (struct vfs_fn_pointers and struct vfs_handle_pointers inside of struct vfs_ops).
591 In particular, if new operations are added to vfs_ops, appropriate constants
592 should be added to vfs_op_type so that order of them kept same as in vfs_ops.
594 struct shadow_copy_data;
596 struct vfs_fn_pointers {
597 /* Disk operations */
599 int (*connect_fn)(struct vfs_handle_struct *handle, const char *service, const char *user);
600 void (*disconnect_fn)(struct vfs_handle_struct *handle);
601 uint64_t (*disk_free_fn)(struct vfs_handle_struct *handle, const char *path, uint64_t *bsize,
602 uint64_t *dfree, uint64_t *dsize);
603 int (*get_quota_fn)(struct vfs_handle_struct *handle, const char *path,
604 enum SMB_QUOTA_TYPE qtype, unid_t id,
605 SMB_DISK_QUOTA *qt);
606 int (*set_quota_fn)(struct vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *qt);
607 int (*get_shadow_copy_data_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, struct shadow_copy_data *shadow_copy_data, bool labels);
608 int (*statvfs_fn)(struct vfs_handle_struct *handle, const char *path, struct vfs_statvfs_struct *statbuf);
609 uint32_t (*fs_capabilities_fn)(struct vfs_handle_struct *handle, enum timestamp_set_resolution *p_ts_res);
612 * Note: that "struct dfs_GetDFSReferral *r"
613 * needs to be a valid TALLOC_CTX
615 NTSTATUS (*get_dfs_referrals_fn)(struct vfs_handle_struct *handle,
616 struct dfs_GetDFSReferral *r);
618 /* Directory operations */
620 DIR *(*opendir_fn)(struct vfs_handle_struct *handle,
621 const struct smb_filename *smb_fname,
622 const char *mask,
623 uint32_t attributes);
624 DIR *(*fdopendir_fn)(struct vfs_handle_struct *handle, files_struct *fsp, const char *mask, uint32_t attributes);
625 struct dirent *(*readdir_fn)(struct vfs_handle_struct *handle,
626 DIR *dirp,
627 SMB_STRUCT_STAT *sbuf);
628 void (*seekdir_fn)(struct vfs_handle_struct *handle, DIR *dirp, long offset);
629 long (*telldir_fn)(struct vfs_handle_struct *handle, DIR *dirp);
630 void (*rewind_dir_fn)(struct vfs_handle_struct *handle, DIR *dirp);
631 int (*mkdir_fn)(struct vfs_handle_struct *handle,
632 const struct smb_filename *smb_fname,
633 mode_t mode);
634 int (*rmdir_fn)(struct vfs_handle_struct *handle,
635 const struct smb_filename *smb_fname);
636 int (*closedir_fn)(struct vfs_handle_struct *handle, DIR *dir);
637 void (*init_search_op_fn)(struct vfs_handle_struct *handle, DIR *dirp);
639 /* File operations */
641 int (*open_fn)(struct vfs_handle_struct *handle,
642 struct smb_filename *smb_fname, files_struct *fsp,
643 int flags, mode_t mode);
644 NTSTATUS (*create_file_fn)(struct vfs_handle_struct *handle,
645 struct smb_request *req,
646 uint16_t root_dir_fid,
647 struct smb_filename *smb_fname,
648 uint32_t access_mask,
649 uint32_t share_access,
650 uint32_t create_disposition,
651 uint32_t create_options,
652 uint32_t file_attributes,
653 uint32_t oplock_request,
654 struct smb2_lease *lease,
655 uint64_t allocation_size,
656 uint32_t private_flags,
657 struct security_descriptor *sd,
658 struct ea_list *ea_list,
659 files_struct **result,
660 int *pinfo,
661 const struct smb2_create_blobs *in_context_blobs,
662 struct smb2_create_blobs *out_context_blobs);
663 int (*close_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
664 ssize_t (*read_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, void *data, size_t n);
665 ssize_t (*pread_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, void *data, size_t n, off_t offset);
666 struct tevent_req *(*pread_send_fn)(struct vfs_handle_struct *handle,
667 TALLOC_CTX *mem_ctx,
668 struct tevent_context *ev,
669 struct files_struct *fsp,
670 void *data,
671 size_t n, off_t offset);
672 ssize_t (*pread_recv_fn)(struct tevent_req *req, struct vfs_aio_state *state);
673 ssize_t (*write_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const void *data, size_t n);
674 ssize_t (*pwrite_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const void *data, size_t n, off_t offset);
675 struct tevent_req *(*pwrite_send_fn)(struct vfs_handle_struct *handle,
676 TALLOC_CTX *mem_ctx,
677 struct tevent_context *ev,
678 struct files_struct *fsp,
679 const void *data,
680 size_t n, off_t offset);
681 ssize_t (*pwrite_recv_fn)(struct tevent_req *req, struct vfs_aio_state *state);
682 off_t (*lseek_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, off_t offset, int whence);
683 ssize_t (*sendfile_fn)(struct vfs_handle_struct *handle, int tofd, files_struct *fromfsp, const DATA_BLOB *header, off_t offset, size_t count);
684 ssize_t (*recvfile_fn)(struct vfs_handle_struct *handle, int fromfd, files_struct *tofsp, off_t offset, size_t count);
685 int (*rename_fn)(struct vfs_handle_struct *handle,
686 const struct smb_filename *smb_fname_src,
687 const struct smb_filename *smb_fname_dst);
688 int (*fsync_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
689 struct tevent_req *(*fsync_send_fn)(struct vfs_handle_struct *handle,
690 TALLOC_CTX *mem_ctx,
691 struct tevent_context *ev,
692 struct files_struct *fsp);
693 int (*fsync_recv_fn)(struct tevent_req *req, struct vfs_aio_state *state);
694 int (*stat_fn)(struct vfs_handle_struct *handle, struct smb_filename *smb_fname);
695 int (*fstat_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_STAT *sbuf);
696 int (*lstat_fn)(struct vfs_handle_struct *handle, struct smb_filename *smb_filename);
697 uint64_t (*get_alloc_size_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_STAT *sbuf);
698 int (*unlink_fn)(struct vfs_handle_struct *handle,
699 const struct smb_filename *smb_fname);
700 int (*chmod_fn)(struct vfs_handle_struct *handle,
701 const struct smb_filename *smb_fname,
702 mode_t mode);
703 int (*fchmod_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, mode_t mode);
704 int (*chown_fn)(struct vfs_handle_struct *handle,
705 const struct smb_filename *smb_fname,
706 uid_t uid,
707 gid_t gid);
708 int (*fchown_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, uid_t uid, gid_t gid);
709 int (*lchown_fn)(struct vfs_handle_struct *handle,
710 const struct smb_filename *smb_fname,
711 uid_t uid,
712 gid_t gid);
713 int (*chdir_fn)(struct vfs_handle_struct *handle, const char *path);
714 char *(*getwd_fn)(struct vfs_handle_struct *handle);
715 int (*ntimes_fn)(struct vfs_handle_struct *handle,
716 const struct smb_filename *smb_fname,
717 struct smb_file_time *ft);
718 int (*ftruncate_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, off_t offset);
719 int (*fallocate_fn)(struct vfs_handle_struct *handle,
720 struct files_struct *fsp,
721 uint32_t mode,
722 off_t offset,
723 off_t len);
724 bool (*lock_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, int op, off_t offset, off_t count, int type);
725 int (*kernel_flock_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp,
726 uint32_t share_mode, uint32_t access_mask);
727 int (*linux_setlease_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, int leasetype);
728 bool (*getlock_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, off_t *poffset, off_t *pcount, int *ptype, pid_t *ppid);
729 int (*symlink_fn)(struct vfs_handle_struct *handle, const char *oldpath, const char *newpath);
730 int (*readlink_fn)(struct vfs_handle_struct *handle, const char *path, char *buf, size_t bufsiz);
731 int (*link_fn)(struct vfs_handle_struct *handle, const char *oldpath, const char *newpath);
732 int (*mknod_fn)(struct vfs_handle_struct *handle,
733 const struct smb_filename *smb_fname,
734 mode_t mode,
735 SMB_DEV_T dev);
736 char *(*realpath_fn)(struct vfs_handle_struct *handle, const char *path);
737 int (*chflags_fn)(struct vfs_handle_struct *handle, const char *path, unsigned int flags);
738 struct file_id (*file_id_create_fn)(struct vfs_handle_struct *handle,
739 const SMB_STRUCT_STAT *sbuf);
740 struct tevent_req *(*copy_chunk_send_fn)(struct vfs_handle_struct *handle,
741 TALLOC_CTX *mem_ctx,
742 struct tevent_context *ev,
743 struct files_struct *src_fsp,
744 off_t src_off,
745 struct files_struct *dest_fsp,
746 off_t dest_off,
747 off_t to_copy,
748 uint32_t flags);
749 NTSTATUS (*copy_chunk_recv_fn)(struct vfs_handle_struct *handle,
750 struct tevent_req *req,
751 off_t *copied);
752 NTSTATUS (*get_compression_fn)(struct vfs_handle_struct *handle,
753 TALLOC_CTX *mem_ctx,
754 struct files_struct *fsp,
755 struct smb_filename *smb_fname,
756 uint16_t *_compression_fmt);
757 NTSTATUS (*set_compression_fn)(struct vfs_handle_struct *handle,
758 TALLOC_CTX *mem_ctx,
759 struct files_struct *fsp,
760 uint16_t compression_fmt);
761 NTSTATUS (*snap_check_path_fn)(struct vfs_handle_struct *handle,
762 TALLOC_CTX *mem_ctx,
763 const char *service_path,
764 char **base_volume);
765 NTSTATUS (*snap_create_fn)(struct vfs_handle_struct *handle,
766 TALLOC_CTX *mem_ctx,
767 const char *base_volume,
768 time_t *tstamp,
769 bool rw,
770 char **base_path,
771 char **snap_path);
772 NTSTATUS (*snap_delete_fn)(struct vfs_handle_struct *handle,
773 TALLOC_CTX *mem_ctx,
774 char *base_path,
775 char *snap_path);
777 NTSTATUS (*streaminfo_fn)(struct vfs_handle_struct *handle,
778 struct files_struct *fsp,
779 const struct smb_filename *smb_fname,
780 TALLOC_CTX *mem_ctx,
781 unsigned int *num_streams,
782 struct stream_struct **streams);
784 int (*get_real_filename_fn)(struct vfs_handle_struct *handle,
785 const char *path,
786 const char *name,
787 TALLOC_CTX *mem_ctx,
788 char **found_name);
790 const char *(*connectpath_fn)(struct vfs_handle_struct *handle,
791 const char *filename);
793 NTSTATUS (*brl_lock_windows_fn)(struct vfs_handle_struct *handle,
794 struct byte_range_lock *br_lck,
795 struct lock_struct *plock,
796 bool blocking_lock);
798 bool (*brl_unlock_windows_fn)(struct vfs_handle_struct *handle,
799 struct messaging_context *msg_ctx,
800 struct byte_range_lock *br_lck,
801 const struct lock_struct *plock);
803 bool (*brl_cancel_windows_fn)(struct vfs_handle_struct *handle,
804 struct byte_range_lock *br_lck,
805 struct lock_struct *plock);
807 bool (*strict_lock_fn)(struct vfs_handle_struct *handle,
808 struct files_struct *fsp,
809 struct lock_struct *plock);
811 void (*strict_unlock_fn)(struct vfs_handle_struct *handle,
812 struct files_struct *fsp,
813 struct lock_struct *plock);
815 NTSTATUS (*translate_name_fn)(struct vfs_handle_struct *handle,
816 const char *name,
817 enum vfs_translate_direction direction,
818 TALLOC_CTX *mem_ctx,
819 char **mapped_name);
821 NTSTATUS (*fsctl_fn)(struct vfs_handle_struct *handle,
822 struct files_struct *fsp,
823 TALLOC_CTX *ctx,
824 uint32_t function,
825 uint16_t req_flags,
826 const uint8_t *_in_data,
827 uint32_t in_len,
828 uint8_t **_out_data,
829 uint32_t max_out_len,
830 uint32_t *out_len);
832 NTSTATUS (*get_dos_attributes_fn)(struct vfs_handle_struct *handle,
833 struct smb_filename *smb_fname,
834 uint32_t *dosmode);
836 NTSTATUS (*fget_dos_attributes_fn)(struct vfs_handle_struct *handle,
837 struct files_struct *fsp,
838 uint32_t *dosmode);
840 NTSTATUS (*set_dos_attributes_fn)(struct vfs_handle_struct *handle,
841 const struct smb_filename *smb_fname,
842 uint32_t dosmode);
844 NTSTATUS (*fset_dos_attributes_fn)(struct vfs_handle_struct *hande,
845 struct files_struct *fsp,
846 uint32_t dosmode);
848 /* NT ACL operations. */
850 NTSTATUS (*fget_nt_acl_fn)(struct vfs_handle_struct *handle,
851 struct files_struct *fsp,
852 uint32_t security_info,
853 TALLOC_CTX *mem_ctx,
854 struct security_descriptor **ppdesc);
855 NTSTATUS (*get_nt_acl_fn)(struct vfs_handle_struct *handle,
856 const struct smb_filename *smb_fname,
857 uint32_t security_info,
858 TALLOC_CTX *mem_ctx,
859 struct security_descriptor **ppdesc);
860 NTSTATUS (*fset_nt_acl_fn)(struct vfs_handle_struct *handle,
861 struct files_struct *fsp,
862 uint32_t security_info_sent,
863 const struct security_descriptor *psd);
865 NTSTATUS (*audit_file_fn)(struct vfs_handle_struct *handle,
866 struct smb_filename *file,
867 struct security_acl *sacl,
868 uint32_t access_requested,
869 uint32_t access_denied);
871 /* POSIX ACL operations. */
873 int (*chmod_acl_fn)(struct vfs_handle_struct *handle,
874 const struct smb_filename *smb_fname,
875 mode_t mode);
876 int (*fchmod_acl_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, mode_t mode);
878 SMB_ACL_T (*sys_acl_get_file_fn)(struct vfs_handle_struct *handle,
879 const struct smb_filename *smb_fname,
880 SMB_ACL_TYPE_T type,
881 TALLOC_CTX *mem_ctx);
882 SMB_ACL_T (*sys_acl_get_fd_fn)(struct vfs_handle_struct *handle,
883 struct files_struct *fsp,
884 TALLOC_CTX *mem_ctx);
885 int (*sys_acl_blob_get_file_fn)(struct vfs_handle_struct *handle,
886 const struct smb_filename *smb_fname,
887 TALLOC_CTX *mem_ctx,
888 char **blob_description,
889 DATA_BLOB *blob);
890 int (*sys_acl_blob_get_fd_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp,
891 TALLOC_CTX *mem_ctx, char **blob_description,
892 DATA_BLOB *blob);
893 int (*sys_acl_set_file_fn)(struct vfs_handle_struct *handle,
894 const struct smb_filename *smb_fname,
895 SMB_ACL_TYPE_T acltype,
896 SMB_ACL_T theacl);
897 int (*sys_acl_set_fd_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_ACL_T theacl);
898 int (*sys_acl_delete_def_file_fn)(struct vfs_handle_struct *handle,
899 const struct smb_filename *smb_fname);
901 /* EA operations. */
902 ssize_t (*getxattr_fn)(struct vfs_handle_struct *handle,
903 const struct smb_filename *smb_fname,
904 const char *name,
905 void *value,
906 size_t size);
907 ssize_t (*fgetxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, void *value, size_t size);
908 ssize_t (*listxattr_fn)(struct vfs_handle_struct *handle,
909 const struct smb_filename *smb_fname,
910 char *list,
911 size_t size);
912 ssize_t (*flistxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, char *list, size_t size);
913 int (*removexattr_fn)(struct vfs_handle_struct *handle,
914 const struct smb_filename *smb_fname,
915 const char *name);
916 int (*fremovexattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name);
917 int (*setxattr_fn)(struct vfs_handle_struct *handle,
918 const struct smb_filename *smb_fname,
919 const char *name,
920 const void *value,
921 size_t size,
922 int flags);
923 int (*fsetxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, const void *value, size_t size, int flags);
925 /* aio operations */
926 bool (*aio_force_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
928 /* durable handle operations */
929 NTSTATUS (*durable_cookie_fn)(struct vfs_handle_struct *handle,
930 struct files_struct *fsp,
931 TALLOC_CTX *mem_ctx,
932 DATA_BLOB *cookie);
933 NTSTATUS (*durable_disconnect_fn)(struct vfs_handle_struct *handle,
934 struct files_struct *fsp,
935 const DATA_BLOB old_cookie,
936 TALLOC_CTX *mem_ctx,
937 DATA_BLOB *new_cookie);
938 NTSTATUS (*durable_reconnect_fn)(struct vfs_handle_struct *handle,
939 struct smb_request *smb1req,
940 struct smbXsrv_open *op,
941 const DATA_BLOB old_cookie,
942 TALLOC_CTX *mem_ctx,
943 struct files_struct **fsp,
944 DATA_BLOB *new_cookie);
946 NTSTATUS (*readdir_attr_fn)(struct vfs_handle_struct *handle,
947 const struct smb_filename *fname,
948 TALLOC_CTX *mem_ctx,
949 struct readdir_attr_data **attr_data);
953 VFS operation description. Each VFS module registers an array of vfs_op_tuple to VFS subsystem,
954 which describes all operations this module is willing to intercept.
955 VFS subsystem initializes then the conn->vfs_ops and conn->vfs_opaque_ops structs
956 using this information.
959 typedef struct vfs_handle_struct {
960 struct vfs_handle_struct *next, *prev;
961 const char *param;
962 struct connection_struct *conn;
963 const struct vfs_fn_pointers *fns;
964 void *data;
965 void (*free_data)(void **data);
966 } vfs_handle_struct;
969 typedef struct vfs_statvfs_struct {
970 /* For undefined recommended transfer size return -1 in that field */
971 uint32_t OptimalTransferSize; /* bsize on some os, iosize on other os */
972 uint32_t BlockSize;
975 The next three fields are in terms of the block size.
976 (above). If block size is unknown, 4096 would be a
977 reasonable block size for a server to report.
978 Note that returning the blocks/blocksavail removes need
979 to make a second call (to QFSInfo level 0x103 to get this info.
980 UserBlockAvail is typically less than or equal to BlocksAvail,
981 if no distinction is made return the same value in each.
984 uint64_t TotalBlocks;
985 uint64_t BlocksAvail; /* bfree */
986 uint64_t UserBlocksAvail; /* bavail */
988 /* For undefined Node fields or FSID return -1 */
989 uint64_t TotalFileNodes;
990 uint64_t FreeFileNodes;
991 uint64_t FsIdentifier; /* fsid */
992 /* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */
993 /* NB flags can come from FILE_SYSTEM_DEVICE_INFO call */
995 int FsCapabilities;
996 } vfs_statvfs_struct;
998 /* Add a new FSP extension of the given type. Returns a pointer to the
999 * extenstion data.
1001 #define VFS_ADD_FSP_EXTENSION(handle, fsp, type, destroy_fn) \
1002 vfs_add_fsp_extension_notype(handle, (fsp), sizeof(type), (destroy_fn))
1004 /* Return a pointer to the existing FSP extension data. */
1005 #define VFS_FETCH_FSP_EXTENSION(handle, fsp) \
1006 vfs_fetch_fsp_extension(handle, (fsp))
1008 /* Return the talloc context associated with an FSP extension. */
1009 #define VFS_MEMCTX_FSP_EXTENSION(handle, fsp) \
1010 vfs_memctx_fsp_extension(handle, (fsp))
1012 /* Remove and destroy an FSP extension. */
1013 #define VFS_REMOVE_FSP_EXTENSION(handle, fsp) \
1014 vfs_remove_fsp_extension((handle), (fsp))
1016 #define SMB_VFS_HANDLE_GET_DATA(handle, datap, type, ret) { \
1017 if (!(handle)||((datap=(type *)(handle)->data)==NULL)) { \
1018 DEBUG(0,("%s() failed to get vfs_handle->data!\n",__FUNCTION__)); \
1019 ret; \
1023 #define SMB_VFS_HANDLE_SET_DATA(handle, datap, free_fn, type, ret) { \
1024 if (!(handle)) { \
1025 DEBUG(0,("%s() failed to set handle->data!\n",__FUNCTION__)); \
1026 ret; \
1027 } else { \
1028 if ((handle)->free_data) { \
1029 (handle)->free_data(&(handle)->data); \
1031 (handle)->data = (void *)datap; \
1032 (handle)->free_data = free_fn; \
1036 #define SMB_VFS_HANDLE_FREE_DATA(handle) { \
1037 if ((handle) && (handle)->free_data) { \
1038 (handle)->free_data(&(handle)->data); \
1042 /* Check whether module-specific data handle was already allocated or not */
1043 #define SMB_VFS_HANDLE_TEST_DATA(handle) ( !(handle) || !(handle)->data ? False : True )
1045 #define SMB_VFS_OP(x) ((void *) x)
1047 #define DEFAULT_VFS_MODULE_NAME "/[Default VFS]/"
1049 #include "vfs_macros.h"
1051 int smb_vfs_call_connect(struct vfs_handle_struct *handle,
1052 const char *service, const char *user);
1053 void smb_vfs_call_disconnect(struct vfs_handle_struct *handle);
1054 uint64_t smb_vfs_call_disk_free(struct vfs_handle_struct *handle,
1055 const char *path, uint64_t *bsize,
1056 uint64_t *dfree, uint64_t *dsize);
1057 int smb_vfs_call_get_quota(struct vfs_handle_struct *handle, const char *path,
1058 enum SMB_QUOTA_TYPE qtype, unid_t id,
1059 SMB_DISK_QUOTA *qt);
1060 int smb_vfs_call_set_quota(struct vfs_handle_struct *handle,
1061 enum SMB_QUOTA_TYPE qtype, unid_t id,
1062 SMB_DISK_QUOTA *qt);
1063 int smb_vfs_call_get_shadow_copy_data(struct vfs_handle_struct *handle,
1064 struct files_struct *fsp,
1065 struct shadow_copy_data *shadow_copy_data,
1066 bool labels);
1067 int smb_vfs_call_statvfs(struct vfs_handle_struct *handle, const char *path,
1068 struct vfs_statvfs_struct *statbuf);
1069 uint32_t smb_vfs_call_fs_capabilities(struct vfs_handle_struct *handle,
1070 enum timestamp_set_resolution *p_ts_res);
1072 * Note: that "struct dfs_GetDFSReferral *r" needs to be a valid TALLOC_CTX
1074 NTSTATUS smb_vfs_call_get_dfs_referrals(struct vfs_handle_struct *handle,
1075 struct dfs_GetDFSReferral *r);
1076 DIR *smb_vfs_call_opendir(struct vfs_handle_struct *handle,
1077 const struct smb_filename *smb_fname,
1078 const char *mask,
1079 uint32_t attributes);
1080 DIR *smb_vfs_call_fdopendir(struct vfs_handle_struct *handle,
1081 struct files_struct *fsp,
1082 const char *mask,
1083 uint32_t attributes);
1084 struct dirent *smb_vfs_call_readdir(struct vfs_handle_struct *handle,
1085 DIR *dirp,
1086 SMB_STRUCT_STAT *sbuf);
1087 void smb_vfs_call_seekdir(struct vfs_handle_struct *handle,
1088 DIR *dirp, long offset);
1089 long smb_vfs_call_telldir(struct vfs_handle_struct *handle,
1090 DIR *dirp);
1091 void smb_vfs_call_rewind_dir(struct vfs_handle_struct *handle,
1092 DIR *dirp);
1093 int smb_vfs_call_mkdir(struct vfs_handle_struct *handle,
1094 const struct smb_filename *smb_fname,
1095 mode_t mode);
1096 int smb_vfs_call_rmdir(struct vfs_handle_struct *handle,
1097 const struct smb_filename *smb_fname);
1098 int smb_vfs_call_closedir(struct vfs_handle_struct *handle,
1099 DIR *dir);
1100 void smb_vfs_call_init_search_op(struct vfs_handle_struct *handle,
1101 DIR *dirp);
1102 int smb_vfs_call_open(struct vfs_handle_struct *handle,
1103 struct smb_filename *smb_fname, struct files_struct *fsp,
1104 int flags, mode_t mode);
1105 NTSTATUS smb_vfs_call_create_file(struct vfs_handle_struct *handle,
1106 struct smb_request *req,
1107 uint16_t root_dir_fid,
1108 struct smb_filename *smb_fname,
1109 uint32_t access_mask,
1110 uint32_t share_access,
1111 uint32_t create_disposition,
1112 uint32_t create_options,
1113 uint32_t file_attributes,
1114 uint32_t oplock_request,
1115 struct smb2_lease *lease,
1116 uint64_t allocation_size,
1117 uint32_t private_flags,
1118 struct security_descriptor *sd,
1119 struct ea_list *ea_list,
1120 files_struct **result,
1121 int *pinfo,
1122 const struct smb2_create_blobs *in_context_blobs,
1123 struct smb2_create_blobs *out_context_blobs);
1124 int smb_vfs_call_close(struct vfs_handle_struct *handle,
1125 struct files_struct *fsp);
1126 ssize_t smb_vfs_call_read(struct vfs_handle_struct *handle,
1127 struct files_struct *fsp, void *data, size_t n);
1128 ssize_t smb_vfs_call_pread(struct vfs_handle_struct *handle,
1129 struct files_struct *fsp, void *data, size_t n,
1130 off_t offset);
1131 struct tevent_req *smb_vfs_call_pread_send(struct vfs_handle_struct *handle,
1132 TALLOC_CTX *mem_ctx,
1133 struct tevent_context *ev,
1134 struct files_struct *fsp,
1135 void *data,
1136 size_t n, off_t offset);
1137 ssize_t SMB_VFS_PREAD_RECV(struct tevent_req *req, struct vfs_aio_state *state);
1139 ssize_t smb_vfs_call_write(struct vfs_handle_struct *handle,
1140 struct files_struct *fsp, const void *data,
1141 size_t n);
1142 ssize_t smb_vfs_call_pwrite(struct vfs_handle_struct *handle,
1143 struct files_struct *fsp, const void *data,
1144 size_t n, off_t offset);
1145 struct tevent_req *smb_vfs_call_pwrite_send(struct vfs_handle_struct *handle,
1146 TALLOC_CTX *mem_ctx,
1147 struct tevent_context *ev,
1148 struct files_struct *fsp,
1149 const void *data,
1150 size_t n, off_t offset);
1151 ssize_t SMB_VFS_PWRITE_RECV(struct tevent_req *req, struct vfs_aio_state *state);
1153 off_t smb_vfs_call_lseek(struct vfs_handle_struct *handle,
1154 struct files_struct *fsp, off_t offset,
1155 int whence);
1156 ssize_t smb_vfs_call_sendfile(struct vfs_handle_struct *handle, int tofd,
1157 files_struct *fromfsp, const DATA_BLOB *header,
1158 off_t offset, size_t count);
1159 ssize_t smb_vfs_call_recvfile(struct vfs_handle_struct *handle, int fromfd,
1160 files_struct *tofsp, off_t offset,
1161 size_t count);
1162 int smb_vfs_call_rename(struct vfs_handle_struct *handle,
1163 const struct smb_filename *smb_fname_src,
1164 const struct smb_filename *smb_fname_dst);
1165 int smb_vfs_call_fsync(struct vfs_handle_struct *handle,
1166 struct files_struct *fsp);
1168 struct tevent_req *smb_vfs_call_fsync_send(struct vfs_handle_struct *handle,
1169 TALLOC_CTX *mem_ctx,
1170 struct tevent_context *ev,
1171 struct files_struct *fsp);
1172 int SMB_VFS_FSYNC_RECV(struct tevent_req *req, struct vfs_aio_state *state);
1174 int smb_vfs_call_stat(struct vfs_handle_struct *handle,
1175 struct smb_filename *smb_fname);
1176 int smb_vfs_call_fstat(struct vfs_handle_struct *handle,
1177 struct files_struct *fsp, SMB_STRUCT_STAT *sbuf);
1178 int smb_vfs_call_lstat(struct vfs_handle_struct *handle,
1179 struct smb_filename *smb_filename);
1180 uint64_t smb_vfs_call_get_alloc_size(struct vfs_handle_struct *handle,
1181 struct files_struct *fsp,
1182 const SMB_STRUCT_STAT *sbuf);
1183 int smb_vfs_call_unlink(struct vfs_handle_struct *handle,
1184 const struct smb_filename *smb_fname);
1185 int smb_vfs_call_chmod(struct vfs_handle_struct *handle,
1186 const struct smb_filename *smb_fname,
1187 mode_t mode);
1188 int smb_vfs_call_fchmod(struct vfs_handle_struct *handle,
1189 struct files_struct *fsp, mode_t mode);
1190 int smb_vfs_call_chown(struct vfs_handle_struct *handle,
1191 const struct smb_filename *smb_fname,
1192 uid_t uid,
1193 gid_t gid);
1194 int smb_vfs_call_fchown(struct vfs_handle_struct *handle,
1195 struct files_struct *fsp, uid_t uid, gid_t gid);
1196 int smb_vfs_call_lchown(struct vfs_handle_struct *handle,
1197 const struct smb_filename *smb_fname,
1198 uid_t uid,
1199 gid_t gid);
1200 int smb_vfs_call_chdir(struct vfs_handle_struct *handle, const char *path);
1201 char *smb_vfs_call_getwd(struct vfs_handle_struct *handle);
1202 int smb_vfs_call_ntimes(struct vfs_handle_struct *handle,
1203 const struct smb_filename *smb_fname,
1204 struct smb_file_time *ft);
1205 int smb_vfs_call_ftruncate(struct vfs_handle_struct *handle,
1206 struct files_struct *fsp, off_t offset);
1207 int smb_vfs_call_fallocate(struct vfs_handle_struct *handle,
1208 struct files_struct *fsp,
1209 uint32_t mode,
1210 off_t offset,
1211 off_t len);
1212 bool smb_vfs_call_lock(struct vfs_handle_struct *handle,
1213 struct files_struct *fsp, int op, off_t offset,
1214 off_t count, int type);
1215 int smb_vfs_call_kernel_flock(struct vfs_handle_struct *handle,
1216 struct files_struct *fsp, uint32_t share_mode,
1217 uint32_t access_mask);
1218 int smb_vfs_call_linux_setlease(struct vfs_handle_struct *handle,
1219 struct files_struct *fsp, int leasetype);
1220 bool smb_vfs_call_getlock(struct vfs_handle_struct *handle,
1221 struct files_struct *fsp, off_t *poffset,
1222 off_t *pcount, int *ptype, pid_t *ppid);
1223 int smb_vfs_call_symlink(struct vfs_handle_struct *handle, const char *oldpath,
1224 const char *newpath);
1225 int smb_vfs_call_readlink(struct vfs_handle_struct *handle,
1226 const char *path, char *buf, size_t bufsiz);
1227 int smb_vfs_call_link(struct vfs_handle_struct *handle, const char *oldpath,
1228 const char *newpath);
1229 int smb_vfs_call_mknod(struct vfs_handle_struct *handle,
1230 const struct smb_filename *smb_fname,
1231 mode_t mode,
1232 SMB_DEV_T dev);
1233 char *smb_vfs_call_realpath(struct vfs_handle_struct *handle, const char *path);
1234 int smb_vfs_call_chflags(struct vfs_handle_struct *handle, const char *path,
1235 unsigned int flags);
1236 struct file_id smb_vfs_call_file_id_create(struct vfs_handle_struct *handle,
1237 const SMB_STRUCT_STAT *sbuf);
1238 NTSTATUS smb_vfs_call_streaminfo(struct vfs_handle_struct *handle,
1239 struct files_struct *fsp,
1240 const struct smb_filename *smb_fname,
1241 TALLOC_CTX *mem_ctx,
1242 unsigned int *num_streams,
1243 struct stream_struct **streams);
1244 int smb_vfs_call_get_real_filename(struct vfs_handle_struct *handle,
1245 const char *path, const char *name,
1246 TALLOC_CTX *mem_ctx, char **found_name);
1247 const char *smb_vfs_call_connectpath(struct vfs_handle_struct *handle,
1248 const char *filename);
1249 NTSTATUS smb_vfs_call_brl_lock_windows(struct vfs_handle_struct *handle,
1250 struct byte_range_lock *br_lck,
1251 struct lock_struct *plock,
1252 bool blocking_lock);
1253 bool smb_vfs_call_brl_unlock_windows(struct vfs_handle_struct *handle,
1254 struct messaging_context *msg_ctx,
1255 struct byte_range_lock *br_lck,
1256 const struct lock_struct *plock);
1257 bool smb_vfs_call_brl_cancel_windows(struct vfs_handle_struct *handle,
1258 struct byte_range_lock *br_lck,
1259 struct lock_struct *plock);
1260 bool smb_vfs_call_strict_lock(struct vfs_handle_struct *handle,
1261 struct files_struct *fsp,
1262 struct lock_struct *plock);
1263 void smb_vfs_call_strict_unlock(struct vfs_handle_struct *handle,
1264 struct files_struct *fsp,
1265 struct lock_struct *plock);
1266 NTSTATUS smb_vfs_call_translate_name(struct vfs_handle_struct *handle,
1267 const char *name,
1268 enum vfs_translate_direction direction,
1269 TALLOC_CTX *mem_ctx,
1270 char **mapped_name);
1271 NTSTATUS smb_vfs_call_fsctl(struct vfs_handle_struct *handle,
1272 struct files_struct *fsp,
1273 TALLOC_CTX *ctx,
1274 uint32_t function,
1275 uint16_t req_flags,
1276 const uint8_t *_in_data,
1277 uint32_t in_len,
1278 uint8_t **_out_data,
1279 uint32_t max_out_len,
1280 uint32_t *out_len);
1281 NTSTATUS smb_vfs_call_get_dos_attributes(struct vfs_handle_struct *handle,
1282 struct smb_filename *smb_fname,
1283 uint32_t *dosmode);
1284 NTSTATUS smb_vfs_call_fget_dos_attributes(struct vfs_handle_struct *handle,
1285 struct files_struct *fsp,
1286 uint32_t *dosmode);
1287 NTSTATUS smb_vfs_call_set_dos_attributes(struct vfs_handle_struct *handle,
1288 const struct smb_filename *smb_fname,
1289 uint32_t dosmode);
1290 NTSTATUS smb_vfs_call_fset_dos_attributes(struct vfs_handle_struct *handle,
1291 struct files_struct *fsp,
1292 uint32_t dosmode);
1293 struct tevent_req *smb_vfs_call_copy_chunk_send(struct vfs_handle_struct *handle,
1294 TALLOC_CTX *mem_ctx,
1295 struct tevent_context *ev,
1296 struct files_struct *src_fsp,
1297 off_t src_off,
1298 struct files_struct *dest_fsp,
1299 off_t dest_off,
1300 off_t num,
1301 uint32_t flags);
1302 NTSTATUS smb_vfs_call_copy_chunk_recv(struct vfs_handle_struct *handle,
1303 struct tevent_req *req,
1304 off_t *copied);
1305 NTSTATUS smb_vfs_call_get_compression(struct vfs_handle_struct *handle,
1306 TALLOC_CTX *mem_ctx,
1307 struct files_struct *fsp,
1308 struct smb_filename *smb_fname,
1309 uint16_t *_compression_fmt);
1310 NTSTATUS smb_vfs_call_set_compression(struct vfs_handle_struct *handle,
1311 TALLOC_CTX *mem_ctx,
1312 struct files_struct *fsp,
1313 uint16_t compression_fmt);
1314 NTSTATUS smb_vfs_call_snap_check_path(vfs_handle_struct *handle,
1315 TALLOC_CTX *mem_ctx,
1316 const char *service_path,
1317 char **base_volume);
1318 NTSTATUS smb_vfs_call_snap_create(struct vfs_handle_struct *handle,
1319 TALLOC_CTX *mem_ctx,
1320 const char *base_volume,
1321 time_t *tstamp,
1322 bool rw,
1323 char **base_path,
1324 char **snap_path);
1325 NTSTATUS smb_vfs_call_snap_delete(struct vfs_handle_struct *handle,
1326 TALLOC_CTX *mem_ctx,
1327 char *base_path,
1328 char *snap_path);
1329 NTSTATUS smb_vfs_call_fget_nt_acl(struct vfs_handle_struct *handle,
1330 struct files_struct *fsp,
1331 uint32_t security_info,
1332 TALLOC_CTX *mem_ctx,
1333 struct security_descriptor **ppdesc);
1334 NTSTATUS smb_vfs_call_get_nt_acl(struct vfs_handle_struct *handle,
1335 const struct smb_filename *smb_fname,
1336 uint32_t security_info,
1337 TALLOC_CTX *mem_ctx,
1338 struct security_descriptor **ppdesc);
1339 NTSTATUS smb_vfs_call_fset_nt_acl(struct vfs_handle_struct *handle,
1340 struct files_struct *fsp,
1341 uint32_t security_info_sent,
1342 const struct security_descriptor *psd);
1343 NTSTATUS smb_vfs_call_audit_file(struct vfs_handle_struct *handle,
1344 struct smb_filename *file,
1345 struct security_acl *sacl,
1346 uint32_t access_requested,
1347 uint32_t access_denied);
1348 int smb_vfs_call_chmod_acl(struct vfs_handle_struct *handle,
1349 const struct smb_filename *file,
1350 mode_t mode);
1351 int smb_vfs_call_fchmod_acl(struct vfs_handle_struct *handle,
1352 struct files_struct *fsp, mode_t mode);
1353 SMB_ACL_T smb_vfs_call_sys_acl_get_file(struct vfs_handle_struct *handle,
1354 const struct smb_filename *smb_fname,
1355 SMB_ACL_TYPE_T type,
1356 TALLOC_CTX *mem_ctx);
1357 SMB_ACL_T smb_vfs_call_sys_acl_get_fd(struct vfs_handle_struct *handle,
1358 struct files_struct *fsp,
1359 TALLOC_CTX *mem_ctx);
1360 int smb_vfs_call_sys_acl_blob_get_file(struct vfs_handle_struct *handle,
1361 const struct smb_filename *smb_fname,
1362 TALLOC_CTX *mem_ctx,
1363 char **blob_description,
1364 DATA_BLOB *blob);
1365 int smb_vfs_call_sys_acl_blob_get_fd(struct vfs_handle_struct *handle,
1366 struct files_struct *fsp,
1367 TALLOC_CTX *mem_ctx,
1368 char **blob_description,
1369 DATA_BLOB *blob);
1370 int smb_vfs_call_sys_acl_set_file(struct vfs_handle_struct *handle,
1371 const struct smb_filename *smb_fname,
1372 SMB_ACL_TYPE_T acltype,
1373 SMB_ACL_T theacl);
1374 int smb_vfs_call_sys_acl_set_fd(struct vfs_handle_struct *handle,
1375 struct files_struct *fsp, SMB_ACL_T theacl);
1376 int smb_vfs_call_sys_acl_delete_def_file(struct vfs_handle_struct *handle,
1377 const struct smb_filename *smb_fname);
1378 ssize_t smb_vfs_call_getxattr(struct vfs_handle_struct *handle,
1379 const struct smb_filename *smb_fname,
1380 const char *name,
1381 void *value,
1382 size_t size);
1383 ssize_t smb_vfs_call_fgetxattr(struct vfs_handle_struct *handle,
1384 struct files_struct *fsp, const char *name,
1385 void *value, size_t size);
1386 ssize_t smb_vfs_call_listxattr(struct vfs_handle_struct *handle,
1387 const struct smb_filename *smb_fname,
1388 char *list,
1389 size_t size);
1390 ssize_t smb_vfs_call_flistxattr(struct vfs_handle_struct *handle,
1391 struct files_struct *fsp, char *list,
1392 size_t size);
1393 int smb_vfs_call_removexattr(struct vfs_handle_struct *handle,
1394 const struct smb_filename *smb_fname,
1395 const char *name);
1396 int smb_vfs_call_fremovexattr(struct vfs_handle_struct *handle,
1397 struct files_struct *fsp, const char *name);
1398 int smb_vfs_call_setxattr(struct vfs_handle_struct *handle,
1399 const struct smb_filename *smb_fname,
1400 const char *name,
1401 const void *value,
1402 size_t size,
1403 int flags);
1404 int smb_vfs_call_lsetxattr(struct vfs_handle_struct *handle, const char *path,
1405 const char *name, const void *value, size_t size,
1406 int flags);
1407 int smb_vfs_call_fsetxattr(struct vfs_handle_struct *handle,
1408 struct files_struct *fsp, const char *name,
1409 const void *value, size_t size, int flags);
1410 bool smb_vfs_call_aio_force(struct vfs_handle_struct *handle,
1411 struct files_struct *fsp);
1412 bool smb_vfs_call_is_offline(struct vfs_handle_struct *handle,
1413 const struct smb_filename *fname,
1414 SMB_STRUCT_STAT *sbuf);
1415 int smb_vfs_call_set_offline(struct vfs_handle_struct *handle,
1416 const struct smb_filename *fname);
1417 NTSTATUS smb_vfs_call_durable_cookie(struct vfs_handle_struct *handle,
1418 struct files_struct *fsp,
1419 TALLOC_CTX *mem_ctx,
1420 DATA_BLOB *cookie);
1421 NTSTATUS smb_vfs_call_durable_disconnect(struct vfs_handle_struct *handle,
1422 struct files_struct *fsp,
1423 const DATA_BLOB old_cookie,
1424 TALLOC_CTX *mem_ctx,
1425 DATA_BLOB *new_cookie);
1426 NTSTATUS smb_vfs_call_durable_reconnect(struct vfs_handle_struct *handle,
1427 struct smb_request *smb1req,
1428 struct smbXsrv_open *op,
1429 const DATA_BLOB old_cookie,
1430 TALLOC_CTX *mem_ctx,
1431 struct files_struct **fsp,
1432 DATA_BLOB *new_cookie);
1433 NTSTATUS smb_vfs_call_readdir_attr(struct vfs_handle_struct *handle,
1434 const struct smb_filename *fname,
1435 TALLOC_CTX *mem_ctx,
1436 struct readdir_attr_data **attr_data);
1438 NTSTATUS smb_register_vfs(int version, const char *name,
1439 const struct vfs_fn_pointers *fns);
1440 void *vfs_add_fsp_extension_notype(vfs_handle_struct *handle,
1441 files_struct *fsp, size_t ext_size,
1442 void (*destroy_fn)(void *p_data));
1443 void vfs_remove_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
1444 void vfs_remove_all_fsp_extensions(struct files_struct *fsp);
1445 void *vfs_memctx_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
1446 void *vfs_fetch_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
1448 void smb_vfs_assert_all_fns(const struct vfs_fn_pointers* fns,
1449 const char *module);
1451 #endif /* _VFS_H */