28a3ce6054379e21beb19a5f5418970cb9d1004c
[amitay/samba.git] / source3 / include / vfs.h
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
9
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.
14
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.
19
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/>.
22
23    This work was sponsored by Optifacio Software Services, Inc.
24 */
25
26 #ifndef _VFS_H
27 #define _VFS_H
28
29 /* Avoid conflict with an AIX include file */
30
31 #ifdef vfs_ops
32 #undef vfs_ops
33 #endif
34
35 /*
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...
38  */
39
40 /*
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.
44  *
45  * If you change anything here, please also update modules/vfs_full_audit.c.
46  * VL.
47  */
48
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() */
158
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 * */
217 /* Version 37 - Change chflags from const char *
218                 to const struct smb_filename * */
219 /* Version 37 - Change disk_free from const char *
220                 to const struct smb_filename * */
221 /* Version 37 - Change get_quota from const char *
222                 to const struct smb_filename * */
223 /* Version 37 - Change link from const char *
224                 to const struct smb_filename * */
225 /* Version 37 - Change statvfs from const char *
226                 to const struct smb_filename * */
227 /* Version 37 - Change readlink from const char *
228                 to const struct smb_filename * */
229 /* Version 37 - Change symlink from const char *
230                 to const struct smb_filename * */
231 /* Version 37 - Change chdir from const char *
232                 to const struct smb_filename * */
233 /* Version 37 - Change getwd from char *
234                 to const struct smb_filename * */
235 /* Version 37 - Change conn->cwd from char *
236                 to struct smb_filename * */
237 /* Version 37 - Change realpath from char *
238                 to struct smb_filename * */
239 /* Version 37 - Change connectpath from char *
240                 to struct smb_filename * */
241 /* Version 37 - Add SMB_VFS_OFFLOAD_READ_SEND/RECV */
242 /* Version 37 - Rename SMB_VFS_COPY_CHUNK_SEND/RECV to
243                 SMB_VFS_OFFLOAD_READ_SEND/RECV */
244 /* Version 37 - Remove SMB_VFS_STRICT_UNLOCK */
245 /* Version 37 - Rename SMB_VFS_STRICT_LOCK to
246                 SMB_VFS_STRICT_LOCK_CHECK */
247 /* Version 38 - Remove SMB_VFS_INIT_SEARCH_OP */
248 /* Bump to version 39, Samba 4.9 will ship with that */
249 /* Version 39 - Remove SMB_VFS_FSYNC
250                 Only implement async versions. */
251 /* Version 39 - Remove SMB_VFS_READ
252                 All users are now pread or async versions. */
253 /* Version 39 - Remove SMB_VFS_WRITE
254                 All users are now pwrite or async versions. */
255 /* Version 39 - Remove SMB_VFS_CHMOD_ACL - no longer used. */
256 /* Version 39 - Remove SMB_VFS_FCHMOD_ACL - no longer used. */
257 /* Version 39 - Remove struct dfree_cached_info pointer from
258                 connection struct */
259 /* Bump to version 40, Samba 4.10 will ship with that */
260 /* Version 40 - Add SMB_VFS_GETXATTRAT_SEND/RECV */
261 /* Version 40 - Add SMB_VFS_GET_DOS_ATTRIBUTES_SEND/RECV */
262 /* Bump to version 41, Samba 4.11 will ship with that */
263 /* Version 41 - Remove SMB_VFS_BRL_CANCEL_WINDOWS */
264 /* Version 41 - Remove unused st_ex_mask from struct stat_ex */
265 /* Version 41 - convert struct stat_ex.st_ex_calculated_birthtime to flags */
266 /* Version 41 - add st_ex_itime to struct stat_ex */
267 /* Version 41 - add st_ex_file_id to struct stat_ex */
268 /* Version 41 - add SMB_VFS_FS_FILE_ID */
269 /* Version 41 - Remove "blocking_lock" parameter from
270                 SMB_VFS_BRL_LOCK_WINDOWS */
271 /* Version 41 - Remove "msg_ctx" parameter from SMB_VFS_BRL_UNLOCK_WINDOWS */
272 /* Bump to version 42, Samba 4.12 will ship with that */
273 /* Version 42 - Remove share_access member from struct files_struct */
274 /* Version 42 - Make "lease" a const* in create_file_fn */
275 /* Version 42 - Move SMB_VFS_RENAME -> SMB_VFS_RENAMEAT */
276 /* Version 42 - Move SMB_VFS_LINK -> SMB_VFS_LINKAT. */
277 /* Version 42 - Move SMB_VFS_MKNOD -> SMB_VFS_MKDNODAT. */
278 /* Version 42 - Move SMB_VFS_READLINK -> SMB_VFS_READLINKAT. */
279 /* Version 42 - Move SMB_VFS_SYMLINK -> SMB_VFS_SYMLINKAT. */
280 /* Version 42 - Move SMB_VFS_MKDIR -> SMB_VFS_MKDIRAT. */
281 /* Version 42 - Move change_to_user() -> change_to_user_and_service() */
282 /* Version 42 - Move change_to_user_by_fsp() -> change_to_user_and_service_by_fsp() */
283 /* Version 42 - Move [un]become_user*() -> [un]become_user_without_service*() */
284 /* Version 42 - Move SMB_VFS_UNLINK -> SMB_VFS_UNLINKAT. */
285 /* Version 42 - Add SMB_VFS_FCNTL */
286 /* Version 42 - Remove SMB_VFS_RMDIR.
287                 Use SMB_VFS_UNLINKAT(.., AT_REMOVEDIR) instead. */
288 /* Version 42 - Remove SMB_VFS_CHOWN */
289 /* Version 42 - Remove struct write_cache *wcp from files_struct */
290 /* Version 42 - SMB_VFS_NTIMES() receives null times based on UTIMES_OMIT */
291
292 #define SMB_VFS_INTERFACE_VERSION 42
293
294 /*
295     All intercepted VFS operations must be declared as static functions inside module source
296     in order to keep smbd namespace unpolluted. See source of audit, extd_audit, fake_perms and recycle
297     example VFS modules for more details.
298 */
299
300 /* VFS operations structure */
301
302 struct vfs_handle_struct;
303 struct connection_struct;
304 struct files_struct;
305 struct security_descriptor;
306 struct vfs_statvfs_struct;
307 struct smb_request;
308 struct ea_list;
309 struct smb_file_time;
310 struct smb_filename;
311 struct dfs_GetDFSReferral;
312
313 typedef union unid_t {
314         uid_t uid;
315         gid_t gid;
316 } unid_t;
317
318 struct fd_handle {
319         size_t ref_count;
320         int fd;
321         uint64_t position_information;
322         off_t pos;
323         uint32_t private_options;       /* NT Create options, but we only look at
324                                  * NTCREATEX_OPTIONS_PRIVATE_DENY_DOS and
325                                  * NTCREATEX_OPTIONS_PRIVATE_DENY_FCB and
326                                  * NTCREATEX_OPTIONS_PRIVATE_DELETE_ON_CLOSE
327                                  * for print files *only*, where
328                                  * DELETE_ON_CLOSE is not stored in the share
329                                  * mode database.
330                                  */
331         uint64_t gen_id;
332 };
333
334 struct fsp_lease {
335         size_t ref_count;
336         struct smbd_server_connection *sconn;
337         struct tevent_timer *timeout;
338         struct smb2_lease lease;
339 };
340
341 typedef struct files_struct {
342         struct files_struct *next, *prev;
343         uint64_t fnum;
344         struct smbXsrv_open *op;
345         struct connection_struct *conn;
346         struct fd_handle *fh;
347         unsigned int num_smb_operations;
348         struct file_id file_id;
349         uint64_t initial_allocation_size; /* Faked up initial allocation on disk. */
350         uint16_t file_pid;
351         uint64_t vuid; /* SMB2 compat */
352         struct timeval open_time;
353         uint32_t access_mask;           /* NTCreateX access bits (FILE_READ_DATA etc.) */
354         bool kernel_share_modes_taken;
355
356         bool update_write_time_triggered;
357         struct tevent_timer *update_write_time_event;
358         bool update_write_time_on_close;
359         struct timespec close_write_time;
360         bool write_time_forced;
361
362         int oplock_type;
363
364         /*
365          * Cache of our lease_type, stored as "current_state" in
366          * leases.tdb
367          */
368         int leases_db_seqnum;
369         uint32_t lease_type;
370
371         struct fsp_lease *lease;
372         int sent_oplock_break;
373         struct tevent_timer *oplock_timeout;
374         struct lock_struct last_lock_failure;
375         int current_lock_count; /* Count the number of outstanding locks and pending locks. */
376
377         bool can_lock;
378         bool can_read;
379         bool can_write;
380         bool modified;
381         bool is_directory;
382         bool aio_write_behind;
383         bool initial_delete_on_close; /* Only set at NTCreateX if file was created. */
384         bool delete_on_close;
385         uint64_t posix_flags;
386         bool is_sparse;
387         bool backup_intent; /* Handle was successfully opened with backup intent
388                                 and opener has privilege to do so. */
389         bool use_ofd_locks; /* Are we using open file description locks ? */
390         struct smb_filename *fsp_name;
391         uint32_t name_hash;             /* Jenkins hash of full pathname. */
392         uint64_t mid;                   /* Mid of the operation that created us. */
393
394         struct vfs_fsp_data *vfs_extension;
395         struct fake_file_handle *fake_file_handle;
396
397         struct notify_change_buf *notify;
398
399         struct files_struct *base_fsp; /* placeholder for delete on close */
400
401         /*
402          * Cache of share_mode_data->flags
403          */
404         int share_mode_flags_seqnum;
405         uint16_t share_mode_flags;
406
407         /*
408          * Read-only cached brlock record, thrown away when the
409          * brlock.tdb seqnum changes. This avoids fetching data from
410          * the brlock.tdb on every read/write call.
411          */
412         int brlock_seqnum;
413         struct byte_range_lock *brlock_rec;
414
415         struct dptr_struct *dptr;
416
417         /* if not NULL, means this is a print file */
418         struct print_file_data *print_file;
419
420         /*
421          * Optimize the aio_requests array for high performance: Never
422          * shrink it, maintain num_aio_requests separately
423          */
424         unsigned num_aio_requests;
425         struct tevent_req **aio_requests;
426         bool closing;
427
428         /*
429          * Requests waiting for smb1 byte range locks. They are
430          * generated by smbd_smb1_do_locks_send and are required here,
431          * because lock cancel operations index through reply_lockingX
432          * not based on mid but on the lock type and range.
433          */
434         struct tevent_req **blocked_smb1_lock_reqs;
435
436         /*
437          * SMB1 remembers lock failures and delays repeated blocking
438          * lock attempts on the same offset.
439          */
440         bool lock_failure_seen;
441         uint64_t lock_failure_offset;
442
443         /*
444          * If a close request comes in while we still have aio_requests
445          * around, we need to hold back the close. When all aio_requests are
446          * done, the aio completion routines need tevent_wait_done() on
447          * this. A bit ugly, but before we have close_file() fully async
448          * possibly the simplest approach. Thanks, Jeremy for the idea.
449          */
450         struct tevent_req *deferred_close;
451 } files_struct;
452
453 #define FSP_POSIX_FLAGS_OPEN            0x01
454 #define FSP_POSIX_FLAGS_RENAME          0x02
455 #define FSP_POSIX_FLAGS_PATHNAMES       0x04
456
457 #define FSP_POSIX_FLAGS_ALL                     \
458         (FSP_POSIX_FLAGS_OPEN |                 \
459          FSP_POSIX_FLAGS_PATHNAMES |            \
460          FSP_POSIX_FLAGS_RENAME)
461
462 struct vuid_cache_entry {
463         struct auth_session_info *session_info;
464         uint64_t vuid; /* SMB2 compat */
465         bool read_only;
466         uint32_t share_access;
467 };
468
469 struct vuid_cache {
470         unsigned int next_entry;
471         struct vuid_cache_entry array[VUID_CACHE_SIZE];
472 };
473
474 typedef struct {
475         char *name;
476         bool is_wild;
477 } name_compare_entry;
478
479 struct share_params {
480         int service;
481 };
482
483 typedef struct connection_struct {
484         struct connection_struct *next, *prev;
485         struct smbd_server_connection *sconn; /* can be NULL */
486         struct smbXsrv_tcon *tcon; /* can be NULL */
487         uint32_t cnum; /* an index passed over the wire */
488         struct share_params *params;
489         bool force_user;
490         struct vuid_cache *vuid_cache;
491         bool printer;
492         bool ipc;
493         bool read_only; /* Attributes for the current user of the share. */
494         uint32_t share_access;
495         /* Does this filesystem honor
496            sub second timestamps on files
497            and directories when setting time ? */
498         enum timestamp_set_resolution ts_res;
499         char *connectpath;
500         char *origpath;
501         struct files_struct *cwd_fsp; /* Working directory. */
502         bool tcon_done;
503
504         struct vfs_handle_struct *vfs_handles;          /* for the new plugins */
505
506         /*
507          * This represents the user information on this connection. Depending
508          * on the vuid using this tid, this might change per SMB request.
509          */
510         struct auth_session_info *session_info;
511
512         /*
513          * If the "force group" parameter is set, this is the primary gid that
514          * may be used in the users token, depending on the vuid using this tid.
515          */
516         gid_t force_group_gid;
517
518         uint64_t vuid; /* vuid of user who *opened* this connection, or UID_FIELD_INVALID */
519
520         time_t lastused;
521         time_t lastused_count;
522         int num_files_open;
523         unsigned int num_smb_operations; /* Count of smb operations on this tree. */
524         int encrypt_level;
525         bool encrypted_tid;
526
527         /* Semantics requested by the client or forced by the server config. */
528         bool case_sensitive;
529         bool case_preserve;
530         bool short_case_preserve;
531
532         /* Semantics provided by the underlying filesystem. */
533         int fs_capabilities;
534         /* Device number of the directory of the share mount.
535            Used to ensure unique FileIndex returns. */
536         SMB_DEV_T base_share_dev;
537
538         name_compare_entry *hide_list; /* Per-share list of files to return as hidden. */
539         name_compare_entry *veto_list; /* Per-share list of files to veto (never show). */
540         name_compare_entry *veto_oplock_list; /* Per-share list of files to refuse oplocks on. */       
541         name_compare_entry *aio_write_behind_list; /* Per-share list of files to use aio write behind on. */       
542         struct trans_state *pending_trans;
543
544         struct rpc_pipe_client *spoolss_pipe;
545
546 } connection_struct;
547
548 struct smbd_smb2_request;
549 struct privilege_paths;
550
551 struct smb_request {
552         uint8_t cmd;
553         uint16_t flags2;
554         uint16_t smbpid;
555         uint64_t mid; /* For compatibility with SMB2. */
556         uint32_t seqnum;
557         uint64_t vuid; /* For compatibility with SMB2. */
558         uint32_t tid;
559         uint8_t  wct;
560         const uint16_t *vwv;
561         uint16_t buflen;
562         const uint8_t *buf;
563         const uint8_t *inbuf;
564
565         /*
566          * Async handling in the main smb processing loop is directed by
567          * outbuf: reply_xxx routines indicate sync behaviour by putting their
568          * reply into "outbuf". If they leave it as NULL, they take care of it
569          * themselves, possibly later.
570          *
571          * If async handling is wanted, the reply_xxx routine must make sure
572          * that it talloc_move()s the smb_req somewhere else.
573          */
574         uint8_t *outbuf;
575
576         size_t unread_bytes;
577         bool encrypted;
578         connection_struct *conn;
579         struct smbd_server_connection *sconn;
580         struct smbXsrv_connection *xconn;
581         struct smb_perfcount_data pcd;
582
583         /*
584          * Chained request handling
585          */
586         struct files_struct *chain_fsp;
587
588         /*
589          * state information for async smb handling
590          */
591         void *async_priv;
592
593         /*
594          * Back pointer to smb2 request.
595          */
596         struct smbd_smb2_request *smb2req;
597
598         /*
599          * Pathnames used if request done
600          * under privilege.
601          */
602         struct privilege_paths *priv_paths;
603
604         /*
605          * Request list for chained requests, we're part of it.
606          */
607         struct smb_request **chain;
608
609         struct timeval request_time;
610
611         bool posix_pathnames;
612 };
613
614 /*
615  * Info about an alternate data stream
616  */
617
618 struct stream_struct {
619         off_t size;
620         off_t alloc_size;
621         char *name;
622 };
623
624 /* time info */
625 struct smb_file_time {
626         struct timespec mtime;
627         struct timespec atime;
628         struct timespec ctime;
629         struct timespec create_time;
630 };
631
632 /*
633  * smb_filename
634  */
635 struct smb_filename {
636         char *base_name;
637         char *stream_name;
638         char *original_lcomp;
639         uint32_t flags;
640         SMB_STRUCT_STAT st;
641 };
642
643 /*
644  * smb_filename flags. Define in terms of the FSP_POSIX_FLAGS_XX
645  * to keep the numeric values consistent.
646  */
647
648 #define SMB_FILENAME_POSIX_PATH         FSP_POSIX_FLAGS_PATHNAMES
649
650 #define VFS_FIND(__fn__) while (handle->fns->__fn__##_fn==NULL) { \
651                                 handle = handle->next; \
652                          }
653
654 enum vfs_translate_direction {
655         vfs_translate_to_unix = 0,
656         vfs_translate_to_windows
657 };
658
659 enum vfs_fallocate_flags {
660         VFS_FALLOCATE_FL_KEEP_SIZE              = 0x0001,
661         VFS_FALLOCATE_FL_PUNCH_HOLE             = 0x0002,
662 };
663
664 struct vfs_aio_state {
665         int error;
666         uint64_t duration;
667 };
668
669 /*
670     Available VFS operations. These values must be in sync with vfs_ops struct
671     (struct vfs_fn_pointers and struct vfs_handle_pointers inside of struct vfs_ops).
672     In particular, if new operations are added to vfs_ops, appropriate constants
673     should be added to vfs_op_type so that order of them kept same as in vfs_ops.
674 */
675 struct shadow_copy_data;
676
677 struct vfs_fn_pointers {
678         /* Disk operations */
679
680         int (*connect_fn)(struct vfs_handle_struct *handle, const char *service, const char *user);
681         void (*disconnect_fn)(struct vfs_handle_struct *handle);
682         uint64_t (*disk_free_fn)(struct vfs_handle_struct *handle,
683                                 const struct smb_filename *smb_fname,
684                                 uint64_t *bsize,
685                                 uint64_t *dfree,
686                                 uint64_t *dsize);
687         int (*get_quota_fn)(struct vfs_handle_struct *handle,
688                                 const struct smb_filename *smb_fname,
689                                 enum SMB_QUOTA_TYPE qtype,
690                                 unid_t id,
691                                 SMB_DISK_QUOTA *qt);
692         int (*set_quota_fn)(struct vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *qt);
693         int (*get_shadow_copy_data_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, struct shadow_copy_data *shadow_copy_data, bool labels);
694         int (*statvfs_fn)(struct vfs_handle_struct *handle,
695                                 const struct smb_filename *smb_fname,
696                                 struct vfs_statvfs_struct *statbuf);
697         uint32_t (*fs_capabilities_fn)(struct vfs_handle_struct *handle, enum timestamp_set_resolution *p_ts_res);
698
699         /*
700          * Note: that "struct dfs_GetDFSReferral *r"
701          * needs to be a valid TALLOC_CTX
702          */
703         NTSTATUS (*get_dfs_referrals_fn)(struct vfs_handle_struct *handle,
704                                          struct dfs_GetDFSReferral *r);
705
706         /* Directory operations */
707
708         DIR *(*opendir_fn)(struct vfs_handle_struct *handle,
709                                         const struct smb_filename *smb_fname,
710                                         const char *mask,
711                                         uint32_t attributes);
712         DIR *(*fdopendir_fn)(struct vfs_handle_struct *handle, files_struct *fsp, const char *mask, uint32_t attributes);
713         struct dirent *(*readdir_fn)(struct vfs_handle_struct *handle,
714                                          DIR *dirp,
715                                          SMB_STRUCT_STAT *sbuf);
716         void (*seekdir_fn)(struct vfs_handle_struct *handle, DIR *dirp, long offset);
717         long (*telldir_fn)(struct vfs_handle_struct *handle, DIR *dirp);
718         void (*rewind_dir_fn)(struct vfs_handle_struct *handle, DIR *dirp);
719         int (*mkdirat_fn)(struct vfs_handle_struct *handle,
720                         struct files_struct *dirfsp,
721                         const struct smb_filename *smb_fname,
722                         mode_t mode);
723         int (*closedir_fn)(struct vfs_handle_struct *handle, DIR *dir);
724
725         /* File operations */
726
727         int (*open_fn)(struct vfs_handle_struct *handle,
728                        struct smb_filename *smb_fname, files_struct *fsp,
729                        int flags, mode_t mode);
730         NTSTATUS (*create_file_fn)(struct vfs_handle_struct *handle,
731                                    struct smb_request *req,
732                                    uint16_t root_dir_fid,
733                                    struct smb_filename *smb_fname,
734                                    uint32_t access_mask,
735                                    uint32_t share_access,
736                                    uint32_t create_disposition,
737                                    uint32_t create_options,
738                                    uint32_t file_attributes,
739                                    uint32_t oplock_request,
740                                    const struct smb2_lease *lease,
741                                    uint64_t allocation_size,
742                                    uint32_t private_flags,
743                                    struct security_descriptor *sd,
744                                    struct ea_list *ea_list,
745                                    files_struct **result,
746                                    int *pinfo,
747                                    const struct smb2_create_blobs *in_context_blobs,
748                                    struct smb2_create_blobs *out_context_blobs);
749         int (*close_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
750         ssize_t (*pread_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, void *data, size_t n, off_t offset);
751         struct tevent_req *(*pread_send_fn)(struct vfs_handle_struct *handle,
752                                             TALLOC_CTX *mem_ctx,
753                                             struct tevent_context *ev,
754                                             struct files_struct *fsp,
755                                             void *data,
756                                             size_t n, off_t offset);
757         ssize_t (*pread_recv_fn)(struct tevent_req *req, struct vfs_aio_state *state);
758         ssize_t (*pwrite_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const void *data, size_t n, off_t offset);
759         struct tevent_req *(*pwrite_send_fn)(struct vfs_handle_struct *handle,
760                                              TALLOC_CTX *mem_ctx,
761                                              struct tevent_context *ev,
762                                              struct files_struct *fsp,
763                                              const void *data,
764                                              size_t n, off_t offset);
765         ssize_t (*pwrite_recv_fn)(struct tevent_req *req, struct vfs_aio_state *state);
766         off_t (*lseek_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, off_t offset, int whence);
767         ssize_t (*sendfile_fn)(struct vfs_handle_struct *handle, int tofd, files_struct *fromfsp, const DATA_BLOB *header, off_t offset, size_t count);
768         ssize_t (*recvfile_fn)(struct vfs_handle_struct *handle, int fromfd, files_struct *tofsp, off_t offset, size_t count);
769         int (*renameat_fn)(struct vfs_handle_struct *handle,
770                          struct files_struct *srcdir_fsp,
771                          const struct smb_filename *smb_fname_src,
772                          struct files_struct *dstdir_fsp,
773                          const struct smb_filename *smb_fname_dst);
774         struct tevent_req *(*fsync_send_fn)(struct vfs_handle_struct *handle,
775                                             TALLOC_CTX *mem_ctx,
776                                             struct tevent_context *ev,
777                                             struct files_struct *fsp);
778         int (*fsync_recv_fn)(struct tevent_req *req, struct vfs_aio_state *state);
779         int (*stat_fn)(struct vfs_handle_struct *handle, struct smb_filename *smb_fname);
780         int (*fstat_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_STAT *sbuf);
781         int (*lstat_fn)(struct vfs_handle_struct *handle, struct smb_filename *smb_filename);
782         uint64_t (*get_alloc_size_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_STAT *sbuf);
783         int (*unlinkat_fn)(struct vfs_handle_struct *handle,
784                         struct files_struct *srcdir_fsp,
785                         const struct smb_filename *smb_fname,
786                         int flags);
787         int (*chmod_fn)(struct vfs_handle_struct *handle,
788                         const struct smb_filename *smb_fname,
789                         mode_t mode);
790         int (*fchmod_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, mode_t mode);
791         int (*fchown_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, uid_t uid, gid_t gid);
792         int (*lchown_fn)(struct vfs_handle_struct *handle,
793                         const struct smb_filename *smb_fname,
794                         uid_t uid,
795                         gid_t gid);
796         int (*chdir_fn)(struct vfs_handle_struct *handle,
797                          const struct smb_filename *smb_fname);
798         struct smb_filename *(*getwd_fn)(struct vfs_handle_struct *handle,
799                                 TALLOC_CTX *mem_ctx);
800         int (*ntimes_fn)(struct vfs_handle_struct *handle,
801                          const struct smb_filename *smb_fname,
802                          struct smb_file_time *ft);
803         int (*ftruncate_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, off_t offset);
804         int (*fallocate_fn)(struct vfs_handle_struct *handle,
805                             struct files_struct *fsp,
806                             uint32_t mode,
807                             off_t offset,
808                             off_t len);
809         bool (*lock_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, int op, off_t offset, off_t count, int type);
810         int (*kernel_flock_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp,
811                                uint32_t share_mode, uint32_t access_mask);
812         int (*fcntl_fn)(struct vfs_handle_struct *handle,
813                         struct files_struct *fsp, int cmd, va_list cmd_arg);
814         int (*linux_setlease_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, int leasetype);
815         bool (*getlock_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, off_t *poffset, off_t *pcount, int *ptype, pid_t *ppid);
816         int (*symlinkat_fn)(struct vfs_handle_struct *handle,
817                                 const char *link_contents,
818                                 struct files_struct *dirfsp,
819                                 const struct smb_filename *new_smb_fname);
820         int (*readlinkat_fn)(struct vfs_handle_struct *handle,
821                                 struct files_struct *dirfsp,
822                                 const struct smb_filename *smb_fname,
823                                 char *buf,
824                                 size_t bufsiz);
825         int (*linkat_fn)(struct vfs_handle_struct *handle,
826                                 struct files_struct *srcfsp,
827                                 const struct smb_filename *old_smb_fname,
828                                 struct files_struct *dstfsp,
829                                 const struct smb_filename *new_smb_fname,
830                                 int flags);
831         int (*mknodat_fn)(struct vfs_handle_struct *handle,
832                                 struct files_struct *dirfsp,
833                                 const struct smb_filename *smb_fname,
834                                 mode_t mode,
835                                 SMB_DEV_T dev);
836         struct smb_filename *(*realpath_fn)(struct vfs_handle_struct *handle,
837                                 TALLOC_CTX *ctx,
838                                 const struct smb_filename *smb_fname);
839         int (*chflags_fn)(struct vfs_handle_struct *handle,
840                                 const struct smb_filename *smb_fname,
841                                 unsigned int flags);
842         struct file_id (*file_id_create_fn)(struct vfs_handle_struct *handle,
843                                             const SMB_STRUCT_STAT *sbuf);
844         uint64_t (*fs_file_id_fn)(struct vfs_handle_struct *handle,
845                                   const SMB_STRUCT_STAT *sbuf);
846         struct tevent_req *(*offload_read_send_fn)(TALLOC_CTX *mem_ctx,
847                                                    struct tevent_context *ev,
848                                                    struct vfs_handle_struct *handle,
849                                                    struct files_struct *fsp,
850                                                    uint32_t fsctl,
851                                                    uint32_t ttl,
852                                                    off_t offset,
853                                                    size_t to_copy);
854         NTSTATUS (*offload_read_recv_fn)(struct tevent_req *req,
855                                          struct vfs_handle_struct *handle,
856                                          TALLOC_CTX *mem_ctx,
857                                          DATA_BLOB *token_blob);
858         struct tevent_req *(*offload_write_send_fn)(struct vfs_handle_struct *handle,
859                                                     TALLOC_CTX *mem_ctx,
860                                                     struct tevent_context *ev,
861                                                     uint32_t fsctl,
862                                                     DATA_BLOB *token,
863                                                     off_t transfer_offset,
864                                                     struct files_struct *dest_fsp,
865                                                     off_t dest_off,
866                                                     off_t to_copy);
867         NTSTATUS (*offload_write_recv_fn)(struct vfs_handle_struct *handle,
868                                           struct tevent_req *req,
869                                           off_t *copied);
870         NTSTATUS (*get_compression_fn)(struct vfs_handle_struct *handle,
871                                        TALLOC_CTX *mem_ctx,
872                                        struct files_struct *fsp,
873                                        struct smb_filename *smb_fname,
874                                        uint16_t *_compression_fmt);
875         NTSTATUS (*set_compression_fn)(struct vfs_handle_struct *handle,
876                                        TALLOC_CTX *mem_ctx,
877                                        struct files_struct *fsp,
878                                        uint16_t compression_fmt);
879         NTSTATUS (*snap_check_path_fn)(struct vfs_handle_struct *handle,
880                                        TALLOC_CTX *mem_ctx,
881                                        const char *service_path,
882                                        char **base_volume);
883         NTSTATUS (*snap_create_fn)(struct vfs_handle_struct *handle,
884                                    TALLOC_CTX *mem_ctx,
885                                    const char *base_volume,
886                                    time_t *tstamp,
887                                    bool rw,
888                                    char **base_path,
889                                    char **snap_path);
890         NTSTATUS (*snap_delete_fn)(struct vfs_handle_struct *handle,
891                                    TALLOC_CTX *mem_ctx,
892                                    char *base_path,
893                                    char *snap_path);
894
895         NTSTATUS (*streaminfo_fn)(struct vfs_handle_struct *handle,
896                                   struct files_struct *fsp,
897                                   const struct smb_filename *smb_fname,
898                                   TALLOC_CTX *mem_ctx,
899                                   unsigned int *num_streams,
900                                   struct stream_struct **streams);
901
902         int (*get_real_filename_fn)(struct vfs_handle_struct *handle,
903                                     const char *path,
904                                     const char *name,
905                                     TALLOC_CTX *mem_ctx,
906                                     char **found_name);
907
908         const char *(*connectpath_fn)(struct vfs_handle_struct *handle,
909                                       const struct smb_filename *smb_fname);
910
911         NTSTATUS (*brl_lock_windows_fn)(struct vfs_handle_struct *handle,
912                                         struct byte_range_lock *br_lck,
913                                         struct lock_struct *plock);
914
915         bool (*brl_unlock_windows_fn)(struct vfs_handle_struct *handle,
916                                       struct byte_range_lock *br_lck,
917                                       const struct lock_struct *plock);
918
919         bool (*strict_lock_check_fn)(struct vfs_handle_struct *handle,
920                                      struct files_struct *fsp,
921                                      struct lock_struct *plock);
922
923         NTSTATUS (*translate_name_fn)(struct vfs_handle_struct *handle,
924                                       const char *name,
925                                       enum vfs_translate_direction direction,
926                                       TALLOC_CTX *mem_ctx,
927                                       char **mapped_name);
928
929         NTSTATUS (*fsctl_fn)(struct vfs_handle_struct *handle,
930                              struct files_struct *fsp,
931                              TALLOC_CTX *ctx,
932                              uint32_t function,
933                              uint16_t req_flags,
934                              const uint8_t *_in_data,
935                              uint32_t in_len,
936                              uint8_t **_out_data,
937                              uint32_t max_out_len,
938                              uint32_t *out_len); 
939
940         NTSTATUS (*get_dos_attributes_fn)(struct vfs_handle_struct *handle,
941                                           struct smb_filename *smb_fname,
942                                           uint32_t *dosmode);
943
944         NTSTATUS (*fget_dos_attributes_fn)(struct vfs_handle_struct *handle,
945                                            struct files_struct *fsp,
946                                            uint32_t *dosmode);
947
948         NTSTATUS (*set_dos_attributes_fn)(struct vfs_handle_struct *handle,
949                                           const struct smb_filename *smb_fname,
950                                           uint32_t dosmode);
951
952         NTSTATUS (*fset_dos_attributes_fn)(struct vfs_handle_struct *hande,
953                                            struct files_struct *fsp,
954                                            uint32_t dosmode);
955
956         struct tevent_req *(*get_dos_attributes_send_fn)(
957                                 TALLOC_CTX *mem_ctx,
958                                 struct tevent_context *ev,
959                                 struct vfs_handle_struct *handle,
960                                 files_struct *dir_fsp,
961                                 struct smb_filename *smb_fname);
962
963         NTSTATUS (*get_dos_attributes_recv_fn)(
964                                 struct tevent_req *req,
965                                 struct vfs_aio_state *aio_state,
966                                 uint32_t *dosmode);
967
968         /* NT ACL operations. */
969
970         NTSTATUS (*fget_nt_acl_fn)(struct vfs_handle_struct *handle,
971                                    struct files_struct *fsp,
972                                    uint32_t security_info,
973                                    TALLOC_CTX *mem_ctx,
974                                    struct security_descriptor **ppdesc);
975         NTSTATUS (*get_nt_acl_fn)(struct vfs_handle_struct *handle,
976                                   const struct smb_filename *smb_fname,
977                                   uint32_t security_info,
978                                    TALLOC_CTX *mem_ctx,
979                                   struct security_descriptor **ppdesc);
980         NTSTATUS (*fset_nt_acl_fn)(struct vfs_handle_struct *handle,
981                                    struct files_struct *fsp,
982                                    uint32_t security_info_sent,
983                                    const struct security_descriptor *psd);
984
985         NTSTATUS (*audit_file_fn)(struct vfs_handle_struct *handle,
986                                   struct smb_filename *file,
987                                   struct security_acl *sacl,
988                                   uint32_t access_requested,
989                                   uint32_t access_denied);
990
991         /* POSIX ACL operations. */
992
993         SMB_ACL_T (*sys_acl_get_file_fn)(struct vfs_handle_struct *handle,
994                                          const struct smb_filename *smb_fname,
995                                          SMB_ACL_TYPE_T type,
996                                          TALLOC_CTX *mem_ctx);
997         SMB_ACL_T (*sys_acl_get_fd_fn)(struct vfs_handle_struct *handle,
998                                        struct files_struct *fsp,
999                                        TALLOC_CTX *mem_ctx);
1000         int (*sys_acl_blob_get_file_fn)(struct vfs_handle_struct *handle,
1001                                         const struct smb_filename *smb_fname,
1002                                         TALLOC_CTX *mem_ctx,
1003                                         char **blob_description,
1004                                         DATA_BLOB *blob);
1005         int (*sys_acl_blob_get_fd_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp,
1006                                       TALLOC_CTX *mem_ctx, char **blob_description,
1007                                       DATA_BLOB *blob);
1008         int (*sys_acl_set_file_fn)(struct vfs_handle_struct *handle,
1009                                         const struct smb_filename *smb_fname,
1010                                         SMB_ACL_TYPE_T acltype,
1011                                         SMB_ACL_T theacl);
1012         int (*sys_acl_set_fd_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_ACL_T theacl);
1013         int (*sys_acl_delete_def_file_fn)(struct vfs_handle_struct *handle,
1014                                         const struct smb_filename *smb_fname);
1015
1016         /* EA operations. */
1017         ssize_t (*getxattr_fn)(struct vfs_handle_struct *handle,
1018                                         const struct smb_filename *smb_fname,
1019                                         const char *name,
1020                                         void *value,
1021                                         size_t size);
1022         struct tevent_req *(*getxattrat_send_fn)(
1023                                 TALLOC_CTX *mem_ctx,
1024                                 struct tevent_context *ev,
1025                                 struct vfs_handle_struct *handle,
1026                                 files_struct *dir_fsp,
1027                                 const struct smb_filename *smb_fname,
1028                                 const char *xattr_name,
1029                                 size_t alloc_hint);
1030         ssize_t (*getxattrat_recv_fn)(struct tevent_req *req,
1031                                       struct vfs_aio_state *aio_state,
1032                                       TALLOC_CTX *mem_ctx,
1033                                       uint8_t **xattr_value);
1034         ssize_t (*fgetxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, void *value, size_t size);
1035         ssize_t (*listxattr_fn)(struct vfs_handle_struct *handle,
1036                                         const struct smb_filename *smb_fname,
1037                                         char *list,
1038                                         size_t size);
1039         ssize_t (*flistxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, char *list, size_t size);
1040         int (*removexattr_fn)(struct vfs_handle_struct *handle,
1041                                         const struct smb_filename *smb_fname,
1042                                         const char *name);
1043         int (*fremovexattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name);
1044         int (*setxattr_fn)(struct vfs_handle_struct *handle,
1045                                         const struct smb_filename *smb_fname,
1046                                         const char *name,
1047                                         const void *value,
1048                                         size_t size,
1049                                         int flags);
1050         int (*fsetxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, const void *value, size_t size, int flags);
1051
1052         /* aio operations */
1053         bool (*aio_force_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
1054
1055         /* durable handle operations */
1056         NTSTATUS (*durable_cookie_fn)(struct vfs_handle_struct *handle,
1057                                       struct files_struct *fsp,
1058                                       TALLOC_CTX *mem_ctx,
1059                                       DATA_BLOB *cookie);
1060         NTSTATUS (*durable_disconnect_fn)(struct vfs_handle_struct *handle,
1061                                           struct files_struct *fsp,
1062                                           const DATA_BLOB old_cookie,
1063                                           TALLOC_CTX *mem_ctx,
1064                                           DATA_BLOB *new_cookie);
1065         NTSTATUS (*durable_reconnect_fn)(struct vfs_handle_struct *handle,
1066                                          struct smb_request *smb1req,
1067                                          struct smbXsrv_open *op,
1068                                          const DATA_BLOB old_cookie,
1069                                          TALLOC_CTX *mem_ctx,
1070                                          struct files_struct **fsp,
1071                                          DATA_BLOB *new_cookie);
1072
1073         NTSTATUS (*readdir_attr_fn)(struct vfs_handle_struct *handle,
1074                                     const struct smb_filename *fname,
1075                                     TALLOC_CTX *mem_ctx,
1076                                     struct readdir_attr_data **attr_data);
1077 };
1078
1079 /*
1080     VFS operation description. Each VFS module registers an array of vfs_op_tuple to VFS subsystem,
1081     which describes all operations this module is willing to intercept.
1082     VFS subsystem initializes then the conn->vfs_ops and conn->vfs_opaque_ops structs
1083     using this information.
1084 */
1085
1086 typedef struct vfs_handle_struct {
1087         struct vfs_handle_struct  *next, *prev;
1088         const char *param;
1089         struct connection_struct *conn;
1090         const struct vfs_fn_pointers *fns;
1091         void *data;
1092         void (*free_data)(void **data);
1093 } vfs_handle_struct;
1094
1095
1096 typedef struct vfs_statvfs_struct {
1097         /* For undefined recommended transfer size return -1 in that field */
1098         uint32_t OptimalTransferSize;  /* bsize on some os, iosize on other os */
1099         uint32_t BlockSize;
1100
1101         /*
1102          The next three fields are in terms of the block size.
1103          (above). If block size is unknown, 4096 would be a
1104          reasonable block size for a server to report.
1105          Note that returning the blocks/blocksavail removes need
1106          to make a second call (to QFSInfo level 0x103 to get this info.
1107          UserBlockAvail is typically less than or equal to BlocksAvail,
1108          if no distinction is made return the same value in each.
1109         */
1110
1111         uint64_t TotalBlocks;
1112         uint64_t BlocksAvail;       /* bfree */
1113         uint64_t UserBlocksAvail;   /* bavail */
1114
1115         /* For undefined Node fields or FSID return -1 */
1116         uint64_t TotalFileNodes;
1117         uint64_t FreeFileNodes;
1118         uint64_t FsIdentifier;   /* fsid */
1119         /* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */
1120         /* NB flags can come from FILE_SYSTEM_DEVICE_INFO call   */
1121
1122         int FsCapabilities;
1123 } vfs_statvfs_struct;
1124
1125 /* Add a new FSP extension of the given type. Returns a pointer to the
1126  * extenstion data.
1127  */
1128 #define VFS_ADD_FSP_EXTENSION(handle, fsp, type, destroy_fn)            \
1129     (type *)vfs_add_fsp_extension_notype(handle, (fsp), sizeof(type), (destroy_fn))
1130
1131 /* Return a pointer to the existing FSP extension data. */
1132 #define VFS_FETCH_FSP_EXTENSION(handle, fsp) \
1133     vfs_fetch_fsp_extension(handle, (fsp))
1134
1135 /* Return the talloc context associated with an FSP extension. */
1136 #define VFS_MEMCTX_FSP_EXTENSION(handle, fsp) \
1137     vfs_memctx_fsp_extension(handle, (fsp))
1138
1139 /* Remove and destroy an FSP extension. */
1140 #define VFS_REMOVE_FSP_EXTENSION(handle, fsp) \
1141     vfs_remove_fsp_extension((handle), (fsp))
1142
1143 #define SMB_VFS_HANDLE_GET_DATA(handle, datap, type, ret) { \
1144         if (!(handle)||((datap=(type *)(handle)->data)==NULL)) { \
1145                 DEBUG(0,("%s() failed to get vfs_handle->data!\n",__FUNCTION__)); \
1146                 ret; \
1147         } \
1148 }
1149
1150 #define SMB_VFS_HANDLE_SET_DATA(handle, datap, free_fn, type, ret) { \
1151         if (!(handle)) { \
1152                 DEBUG(0,("%s() failed to set handle->data!\n",__FUNCTION__)); \
1153                 ret; \
1154         } else { \
1155                 if ((handle)->free_data) { \
1156                         (handle)->free_data(&(handle)->data); \
1157                 } \
1158                 (handle)->data = (void *)datap; \
1159                 (handle)->free_data = free_fn; \
1160         } \
1161 }
1162
1163 #define SMB_VFS_HANDLE_FREE_DATA(handle) { \
1164         if ((handle) && (handle)->free_data) { \
1165                 (handle)->free_data(&(handle)->data); \
1166         } \
1167 }
1168
1169 /* Check whether module-specific data handle was already allocated or not */
1170 #define SMB_VFS_HANDLE_TEST_DATA(handle)  ( !(handle) || !(handle)->data ? False : True )
1171
1172 #define SMB_VFS_OP(x) ((void *) x)
1173
1174 #define DEFAULT_VFS_MODULE_NAME "/[Default VFS]/"
1175
1176 #include "vfs_macros.h"
1177
1178 int smb_vfs_call_connect(struct vfs_handle_struct *handle,
1179                          const char *service, const char *user);
1180 void smb_vfs_call_disconnect(struct vfs_handle_struct *handle);
1181 uint64_t smb_vfs_call_disk_free(struct vfs_handle_struct *handle,
1182                                 const struct smb_filename *smb_filename,
1183                                 uint64_t *bsize,
1184                                 uint64_t *dfree,
1185                                 uint64_t *dsize);
1186 int smb_vfs_call_get_quota(struct vfs_handle_struct *handle,
1187                                 const struct smb_filename *smb_filename,
1188                                 enum SMB_QUOTA_TYPE qtype,
1189                                 unid_t id,
1190                                 SMB_DISK_QUOTA *qt);
1191 int smb_vfs_call_set_quota(struct vfs_handle_struct *handle,
1192                            enum SMB_QUOTA_TYPE qtype, unid_t id,
1193                            SMB_DISK_QUOTA *qt);
1194 int smb_vfs_call_get_shadow_copy_data(struct vfs_handle_struct *handle,
1195                                       struct files_struct *fsp,
1196                                       struct shadow_copy_data *shadow_copy_data,
1197                                       bool labels);
1198 int smb_vfs_call_statvfs(struct vfs_handle_struct *handle,
1199                         const struct smb_filename *smb_fname,
1200                         struct vfs_statvfs_struct *statbuf);
1201 uint32_t smb_vfs_call_fs_capabilities(struct vfs_handle_struct *handle,
1202                                       enum timestamp_set_resolution *p_ts_res);
1203 /*
1204  * Note: that "struct dfs_GetDFSReferral *r" needs to be a valid TALLOC_CTX
1205  */
1206 NTSTATUS smb_vfs_call_get_dfs_referrals(struct vfs_handle_struct *handle,
1207                                         struct dfs_GetDFSReferral *r);
1208 DIR *smb_vfs_call_opendir(struct vfs_handle_struct *handle,
1209                         const struct smb_filename *smb_fname,
1210                         const char *mask,
1211                         uint32_t attributes);
1212 DIR *smb_vfs_call_fdopendir(struct vfs_handle_struct *handle,
1213                                         struct files_struct *fsp,
1214                                         const char *mask,
1215                                         uint32_t attributes);
1216 struct dirent *smb_vfs_call_readdir(struct vfs_handle_struct *handle,
1217                                         DIR *dirp,
1218                                         SMB_STRUCT_STAT *sbuf);
1219 void smb_vfs_call_seekdir(struct vfs_handle_struct *handle,
1220                           DIR *dirp, long offset);
1221 long smb_vfs_call_telldir(struct vfs_handle_struct *handle,
1222                           DIR *dirp);
1223 void smb_vfs_call_rewind_dir(struct vfs_handle_struct *handle,
1224                              DIR *dirp);
1225 int smb_vfs_call_mkdirat(struct vfs_handle_struct *handle,
1226                         struct files_struct *dirfsp,
1227                         const struct smb_filename *smb_fname,
1228                         mode_t mode);
1229 int smb_vfs_call_closedir(struct vfs_handle_struct *handle,
1230                           DIR *dir);
1231 int smb_vfs_call_open(struct vfs_handle_struct *handle,
1232                       struct smb_filename *smb_fname, struct files_struct *fsp,
1233                       int flags, mode_t mode);
1234 NTSTATUS smb_vfs_call_create_file(struct vfs_handle_struct *handle,
1235                                   struct smb_request *req,
1236                                   uint16_t root_dir_fid,
1237                                   struct smb_filename *smb_fname,
1238                                   uint32_t access_mask,
1239                                   uint32_t share_access,
1240                                   uint32_t create_disposition,
1241                                   uint32_t create_options,
1242                                   uint32_t file_attributes,
1243                                   uint32_t oplock_request,
1244                                   const struct smb2_lease *lease,
1245                                   uint64_t allocation_size,
1246                                   uint32_t private_flags,
1247                                   struct security_descriptor *sd,
1248                                   struct ea_list *ea_list,
1249                                   files_struct **result,
1250                                   int *pinfo,
1251                                   const struct smb2_create_blobs *in_context_blobs,
1252                                   struct smb2_create_blobs *out_context_blobs);
1253 int smb_vfs_call_close(struct vfs_handle_struct *handle,
1254                        struct files_struct *fsp);
1255 ssize_t smb_vfs_call_pread(struct vfs_handle_struct *handle,
1256                            struct files_struct *fsp, void *data, size_t n,
1257                            off_t offset);
1258 struct tevent_req *smb_vfs_call_pread_send(struct vfs_handle_struct *handle,
1259                                            TALLOC_CTX *mem_ctx,
1260                                            struct tevent_context *ev,
1261                                            struct files_struct *fsp,
1262                                            void *data,
1263                                            size_t n, off_t offset);
1264 ssize_t SMB_VFS_PREAD_RECV(struct tevent_req *req, struct vfs_aio_state *state);
1265
1266 ssize_t smb_vfs_call_pwrite(struct vfs_handle_struct *handle,
1267                             struct files_struct *fsp, const void *data,
1268                             size_t n, off_t offset);
1269 struct tevent_req *smb_vfs_call_pwrite_send(struct vfs_handle_struct *handle,
1270                                             TALLOC_CTX *mem_ctx,
1271                                             struct tevent_context *ev,
1272                                             struct files_struct *fsp,
1273                                             const void *data,
1274                                             size_t n, off_t offset);
1275 ssize_t SMB_VFS_PWRITE_RECV(struct tevent_req *req, struct vfs_aio_state *state);
1276
1277 off_t smb_vfs_call_lseek(struct vfs_handle_struct *handle,
1278                              struct files_struct *fsp, off_t offset,
1279                              int whence);
1280 ssize_t smb_vfs_call_sendfile(struct vfs_handle_struct *handle, int tofd,
1281                               files_struct *fromfsp, const DATA_BLOB *header,
1282                               off_t offset, size_t count);
1283 ssize_t smb_vfs_call_recvfile(struct vfs_handle_struct *handle, int fromfd,
1284                               files_struct *tofsp, off_t offset,
1285                               size_t count);
1286 int smb_vfs_call_renameat(struct vfs_handle_struct *handle,
1287                         struct files_struct *srcfsp,
1288                         const struct smb_filename *smb_fname_src,
1289                         struct files_struct *dstfsp,
1290                         const struct smb_filename *smb_fname_dst);
1291
1292 struct tevent_req *smb_vfs_call_fsync_send(struct vfs_handle_struct *handle,
1293                                            TALLOC_CTX *mem_ctx,
1294                                            struct tevent_context *ev,
1295                                            struct files_struct *fsp);
1296 int SMB_VFS_FSYNC_RECV(struct tevent_req *req, struct vfs_aio_state *state);
1297
1298 int smb_vfs_fsync_sync(files_struct *fsp);
1299 int smb_vfs_call_stat(struct vfs_handle_struct *handle,
1300                       struct smb_filename *smb_fname);
1301 int smb_vfs_call_fstat(struct vfs_handle_struct *handle,
1302                        struct files_struct *fsp, SMB_STRUCT_STAT *sbuf);
1303 int smb_vfs_call_lstat(struct vfs_handle_struct *handle,
1304                        struct smb_filename *smb_filename);
1305 uint64_t smb_vfs_call_get_alloc_size(struct vfs_handle_struct *handle,
1306                                      struct files_struct *fsp,
1307                                      const SMB_STRUCT_STAT *sbuf);
1308 int smb_vfs_call_unlinkat(struct vfs_handle_struct *handle,
1309                         struct files_struct *dirfsp,
1310                         const struct smb_filename *smb_fname,
1311                         int flags);
1312 int smb_vfs_call_chmod(struct vfs_handle_struct *handle,
1313                         const struct smb_filename *smb_fname,
1314                         mode_t mode);
1315 int smb_vfs_call_fchmod(struct vfs_handle_struct *handle,
1316                         struct files_struct *fsp, mode_t mode);
1317 int smb_vfs_call_fchown(struct vfs_handle_struct *handle,
1318                         struct files_struct *fsp, uid_t uid, gid_t gid);
1319 int smb_vfs_call_lchown(struct vfs_handle_struct *handle,
1320                         const struct smb_filename *smb_fname,
1321                         uid_t uid,
1322                         gid_t gid);
1323 int smb_vfs_call_chdir(struct vfs_handle_struct *handle,
1324                         const struct smb_filename *smb_fname);
1325 struct smb_filename *smb_vfs_call_getwd(struct vfs_handle_struct *handle,
1326                                 TALLOC_CTX *ctx);
1327 int smb_vfs_call_ntimes(struct vfs_handle_struct *handle,
1328                         const struct smb_filename *smb_fname,
1329                         struct smb_file_time *ft);
1330 int smb_vfs_call_ftruncate(struct vfs_handle_struct *handle,
1331                            struct files_struct *fsp, off_t offset);
1332 int smb_vfs_call_fallocate(struct vfs_handle_struct *handle,
1333                            struct files_struct *fsp,
1334                            uint32_t mode,
1335                            off_t offset,
1336                            off_t len);
1337 bool smb_vfs_call_lock(struct vfs_handle_struct *handle,
1338                        struct files_struct *fsp, int op, off_t offset,
1339                        off_t count, int type);
1340 int smb_vfs_call_kernel_flock(struct vfs_handle_struct *handle,
1341                               struct files_struct *fsp, uint32_t share_mode,
1342                               uint32_t access_mask);
1343 int smb_vfs_call_fcntl(struct vfs_handle_struct *handle,
1344                        struct files_struct *fsp, int cmd, ...);
1345 int smb_vfs_call_linux_setlease(struct vfs_handle_struct *handle,
1346                                 struct files_struct *fsp, int leasetype);
1347 bool smb_vfs_call_getlock(struct vfs_handle_struct *handle,
1348                           struct files_struct *fsp, off_t *poffset,
1349                           off_t *pcount, int *ptype, pid_t *ppid);
1350 int smb_vfs_call_symlinkat(struct vfs_handle_struct *handle,
1351                         const char *link_contents,
1352                         struct files_struct *dirfsp,
1353                         const struct smb_filename *new_smb_fname);
1354 int smb_vfs_call_readlinkat(struct vfs_handle_struct *handle,
1355                         struct files_struct *dirfsp,
1356                         const struct smb_filename *smb_fname,
1357                         char *buf,
1358                         size_t bufsiz);
1359 int smb_vfs_call_linkat(struct vfs_handle_struct *handle,
1360                         struct files_struct *srcfsp,
1361                         const struct smb_filename *old_smb_fname,
1362                         struct files_struct *dstfsp,
1363                         const struct smb_filename *new_smb_fname,
1364                         int flags);
1365 int smb_vfs_call_mknodat(struct vfs_handle_struct *handle,
1366                         struct files_struct *dirfsp,
1367                         const struct smb_filename *smb_fname,
1368                         mode_t mode,
1369                         SMB_DEV_T dev);
1370 struct smb_filename *smb_vfs_call_realpath(struct vfs_handle_struct *handle,
1371                         TALLOC_CTX *ctx,
1372                         const struct smb_filename *smb_fname);
1373 int smb_vfs_call_chflags(struct vfs_handle_struct *handle,
1374                         const struct smb_filename *smb_fname,
1375                         unsigned int flags);
1376 struct file_id smb_vfs_call_file_id_create(struct vfs_handle_struct *handle,
1377                                            const SMB_STRUCT_STAT *sbuf);
1378 uint64_t smb_vfs_call_fs_file_id(struct vfs_handle_struct *handle,
1379                                  const SMB_STRUCT_STAT *sbuf);
1380 NTSTATUS smb_vfs_call_streaminfo(struct vfs_handle_struct *handle,
1381                                  struct files_struct *fsp,
1382                                  const struct smb_filename *smb_fname,
1383                                  TALLOC_CTX *mem_ctx,
1384                                  unsigned int *num_streams,
1385                                  struct stream_struct **streams);
1386 int smb_vfs_call_get_real_filename(struct vfs_handle_struct *handle,
1387                                    const char *path, const char *name,
1388                                    TALLOC_CTX *mem_ctx, char **found_name);
1389 const char *smb_vfs_call_connectpath(struct vfs_handle_struct *handle,
1390                                      const struct smb_filename *smb_fname);
1391 NTSTATUS smb_vfs_call_brl_lock_windows(struct vfs_handle_struct *handle,
1392                                        struct byte_range_lock *br_lck,
1393                                        struct lock_struct *plock);
1394 bool smb_vfs_call_brl_unlock_windows(struct vfs_handle_struct *handle,
1395                                      struct byte_range_lock *br_lck,
1396                                      const struct lock_struct *plock);
1397 bool smb_vfs_call_strict_lock_check(struct vfs_handle_struct *handle,
1398                                     struct files_struct *fsp,
1399                                     struct lock_struct *plock);
1400 NTSTATUS smb_vfs_call_translate_name(struct vfs_handle_struct *handle,
1401                                      const char *name,
1402                                      enum vfs_translate_direction direction,
1403                                      TALLOC_CTX *mem_ctx,
1404                                      char **mapped_name);
1405 NTSTATUS smb_vfs_call_fsctl(struct vfs_handle_struct *handle,
1406                             struct files_struct *fsp,
1407                             TALLOC_CTX *ctx,
1408                             uint32_t function,
1409                             uint16_t req_flags,
1410                             const uint8_t *_in_data,
1411                             uint32_t in_len,
1412                             uint8_t **_out_data,
1413                             uint32_t max_out_len,
1414                             uint32_t *out_len);
1415 NTSTATUS smb_vfs_call_get_dos_attributes(struct vfs_handle_struct *handle,
1416                                          struct smb_filename *smb_fname,
1417                                          uint32_t *dosmode);
1418 NTSTATUS smb_vfs_call_fget_dos_attributes(struct vfs_handle_struct *handle,
1419                                           struct files_struct *fsp,
1420                                           uint32_t *dosmode);
1421 NTSTATUS smb_vfs_call_set_dos_attributes(struct vfs_handle_struct *handle,
1422                                          const struct smb_filename *smb_fname,
1423                                          uint32_t dosmode);
1424 NTSTATUS smb_vfs_call_fset_dos_attributes(struct vfs_handle_struct *handle,
1425                                           struct files_struct *fsp,
1426                                           uint32_t dosmode);
1427 struct tevent_req *smb_vfs_call_get_dos_attributes_send(
1428                         TALLOC_CTX *mem_ctx,
1429                         struct tevent_context *ev,
1430                         struct vfs_handle_struct *handle,
1431                         files_struct *dir_fsp,
1432                         struct smb_filename *smb_fname);
1433 NTSTATUS smb_vfs_call_get_dos_attributes_recv(
1434                         struct tevent_req *req,
1435                         struct vfs_aio_state *aio_state,
1436                         uint32_t *dosmode);
1437 struct tevent_req *smb_vfs_call_offload_read_send(
1438         TALLOC_CTX *mem_ctx,
1439         struct tevent_context *ev,
1440         struct vfs_handle_struct *handle,
1441         struct files_struct *fsp,
1442         uint32_t fsctl,
1443         uint32_t ttl,
1444         off_t offset,
1445         size_t to_copy);
1446 NTSTATUS smb_vfs_call_offload_read_recv(struct tevent_req *req,
1447                                         struct vfs_handle_struct *handle,
1448                                         TALLOC_CTX *mem_ctx,
1449                                         DATA_BLOB *token_blob);
1450 struct tevent_req *smb_vfs_call_offload_write_send(struct vfs_handle_struct *handle,
1451                                                    TALLOC_CTX *mem_ctx,
1452                                                    struct tevent_context *ev,
1453                                                    uint32_t fsctl,
1454                                                    DATA_BLOB *token,
1455                                                    off_t transfer_offset,
1456                                                    struct files_struct *dest_fsp,
1457                                                    off_t dest_off,
1458                                                    off_t num);
1459 NTSTATUS smb_vfs_call_offload_write_recv(struct vfs_handle_struct *handle,
1460                                          struct tevent_req *req,
1461                                          off_t *copied);
1462 NTSTATUS smb_vfs_call_get_compression(struct vfs_handle_struct *handle,
1463                                       TALLOC_CTX *mem_ctx,
1464                                       struct files_struct *fsp,
1465                                       struct smb_filename *smb_fname,
1466                                       uint16_t *_compression_fmt);
1467 NTSTATUS smb_vfs_call_set_compression(struct vfs_handle_struct *handle,
1468                                       TALLOC_CTX *mem_ctx,
1469                                       struct files_struct *fsp,
1470                                       uint16_t compression_fmt);
1471 NTSTATUS smb_vfs_call_snap_check_path(vfs_handle_struct *handle,
1472                                       TALLOC_CTX *mem_ctx,
1473                                       const char *service_path,
1474                                       char **base_volume);
1475 NTSTATUS smb_vfs_call_snap_create(struct vfs_handle_struct *handle,
1476                                   TALLOC_CTX *mem_ctx,
1477                                   const char *base_volume,
1478                                   time_t *tstamp,
1479                                   bool rw,
1480                                   char **base_path,
1481                                   char **snap_path);
1482 NTSTATUS smb_vfs_call_snap_delete(struct vfs_handle_struct *handle,
1483                                   TALLOC_CTX *mem_ctx,
1484                                   char *base_path,
1485                                   char *snap_path);
1486 NTSTATUS smb_vfs_call_fget_nt_acl(struct vfs_handle_struct *handle,
1487                                   struct files_struct *fsp,
1488                                   uint32_t security_info,
1489                                   TALLOC_CTX *mem_ctx,
1490                                   struct security_descriptor **ppdesc);
1491 NTSTATUS smb_vfs_call_get_nt_acl(struct vfs_handle_struct *handle,
1492                                  const struct smb_filename *smb_fname,
1493                                  uint32_t security_info,
1494                                  TALLOC_CTX *mem_ctx,
1495                                  struct security_descriptor **ppdesc);
1496 NTSTATUS smb_vfs_call_fset_nt_acl(struct vfs_handle_struct *handle,
1497                                   struct files_struct *fsp,
1498                                   uint32_t security_info_sent,
1499                                   const struct security_descriptor *psd);
1500 NTSTATUS smb_vfs_call_audit_file(struct vfs_handle_struct *handle,
1501                                  struct smb_filename *file,
1502                                  struct security_acl *sacl,
1503                                  uint32_t access_requested,
1504                                  uint32_t access_denied);
1505 int smb_vfs_call_chmod_acl(struct vfs_handle_struct *handle,
1506                                 const struct smb_filename *file,
1507                                 mode_t mode);
1508 SMB_ACL_T smb_vfs_call_sys_acl_get_file(struct vfs_handle_struct *handle,
1509                                         const struct smb_filename *smb_fname,
1510                                         SMB_ACL_TYPE_T type,
1511                                         TALLOC_CTX *mem_ctx);
1512 SMB_ACL_T smb_vfs_call_sys_acl_get_fd(struct vfs_handle_struct *handle,
1513                                       struct files_struct *fsp,
1514                                       TALLOC_CTX *mem_ctx);
1515 int smb_vfs_call_sys_acl_blob_get_file(struct vfs_handle_struct *handle,
1516                                        const struct smb_filename *smb_fname,
1517                                        TALLOC_CTX *mem_ctx,
1518                                        char **blob_description,
1519                                        DATA_BLOB *blob);
1520 int smb_vfs_call_sys_acl_blob_get_fd(struct vfs_handle_struct *handle,
1521                                      struct files_struct *fsp,  
1522                                      TALLOC_CTX *mem_ctx,
1523                                      char **blob_description,
1524                                      DATA_BLOB *blob);
1525 int smb_vfs_call_sys_acl_set_file(struct vfs_handle_struct *handle,
1526                                 const struct smb_filename *smb_fname,
1527                                 SMB_ACL_TYPE_T acltype,
1528                                 SMB_ACL_T theacl);
1529 int smb_vfs_call_sys_acl_set_fd(struct vfs_handle_struct *handle,
1530                                 struct files_struct *fsp, SMB_ACL_T theacl);
1531 int smb_vfs_call_sys_acl_delete_def_file(struct vfs_handle_struct *handle,
1532                                 const struct smb_filename *smb_fname);
1533 ssize_t smb_vfs_call_getxattr(struct vfs_handle_struct *handle,
1534                                 const struct smb_filename *smb_fname,
1535                                 const char *name,
1536                                 void *value,
1537                                 size_t size);
1538 struct tevent_req *smb_vfs_call_getxattrat_send(
1539                         TALLOC_CTX *mem_ctx,
1540                         struct tevent_context *ev,
1541                         struct vfs_handle_struct *handle,
1542                         files_struct *dir_fsp,
1543                         const struct smb_filename *smb_fname,
1544                         const char *xattr_name,
1545                         size_t alloc_hint);
1546 ssize_t smb_vfs_call_getxattrat_recv(struct tevent_req *req,
1547                                      struct vfs_aio_state *aio_state,
1548                                      TALLOC_CTX *mem_ctx,
1549                                      uint8_t **xattr_value);
1550 ssize_t smb_vfs_call_fgetxattr(struct vfs_handle_struct *handle,
1551                                struct files_struct *fsp, const char *name,
1552                                void *value, size_t size);
1553 ssize_t smb_vfs_call_listxattr(struct vfs_handle_struct *handle,
1554                                 const struct smb_filename *smb_fname,
1555                                 char *list,
1556                                 size_t size);
1557 ssize_t smb_vfs_call_flistxattr(struct vfs_handle_struct *handle,
1558                                 struct files_struct *fsp, char *list,
1559                                 size_t size);
1560 int smb_vfs_call_removexattr(struct vfs_handle_struct *handle,
1561                                 const struct smb_filename *smb_fname,
1562                                 const char *name);
1563 int smb_vfs_call_fremovexattr(struct vfs_handle_struct *handle,
1564                               struct files_struct *fsp, const char *name);
1565 int smb_vfs_call_setxattr(struct vfs_handle_struct *handle,
1566                                 const struct smb_filename *smb_fname,
1567                                 const char *name,
1568                                 const void *value,
1569                                 size_t size,
1570                                 int flags);
1571 int smb_vfs_call_lsetxattr(struct vfs_handle_struct *handle, const char *path,
1572                            const char *name, const void *value, size_t size,
1573                            int flags);
1574 int smb_vfs_call_fsetxattr(struct vfs_handle_struct *handle,
1575                            struct files_struct *fsp, const char *name,
1576                            const void *value, size_t size, int flags);
1577 bool smb_vfs_call_aio_force(struct vfs_handle_struct *handle,
1578                             struct files_struct *fsp);
1579 NTSTATUS smb_vfs_call_durable_cookie(struct vfs_handle_struct *handle,
1580                                      struct files_struct *fsp,
1581                                      TALLOC_CTX *mem_ctx,
1582                                      DATA_BLOB *cookie);
1583 NTSTATUS smb_vfs_call_durable_disconnect(struct vfs_handle_struct *handle,
1584                                          struct files_struct *fsp,
1585                                          const DATA_BLOB old_cookie,
1586                                          TALLOC_CTX *mem_ctx,
1587                                          DATA_BLOB *new_cookie);
1588 NTSTATUS smb_vfs_call_durable_reconnect(struct vfs_handle_struct *handle,
1589                                         struct smb_request *smb1req,
1590                                         struct smbXsrv_open *op,
1591                                         const DATA_BLOB old_cookie,
1592                                         TALLOC_CTX *mem_ctx,
1593                                         struct files_struct **fsp,
1594                                         DATA_BLOB *new_cookie);
1595 NTSTATUS smb_vfs_call_readdir_attr(struct vfs_handle_struct *handle,
1596                                    const struct smb_filename *fname,
1597                                    TALLOC_CTX *mem_ctx,
1598                                    struct readdir_attr_data **attr_data);
1599
1600 NTSTATUS smb_register_vfs(int version, const char *name,
1601                           const struct vfs_fn_pointers *fns);
1602 void *vfs_add_fsp_extension_notype(vfs_handle_struct *handle,
1603                                    files_struct *fsp, size_t ext_size,
1604                                    void (*destroy_fn)(void *p_data));
1605 void vfs_remove_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
1606 void vfs_remove_all_fsp_extensions(struct files_struct *fsp);
1607 void *vfs_memctx_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
1608 void *vfs_fetch_fsp_extension(vfs_handle_struct *handle, files_struct *fsp);
1609
1610 void smb_vfs_assert_all_fns(const struct vfs_fn_pointers* fns,
1611                             const char *module);
1612
1613 /*
1614  * Helper functions from source3/modules/vfs_not_implemented.c
1615  */
1616 int vfs_not_implemented_connect(
1617                         vfs_handle_struct *handle,
1618                         const char *service,
1619                         const char *user);
1620 void vfs_not_implemented_disconnect(vfs_handle_struct *handle);
1621 uint64_t vfs_not_implemented_disk_free(vfs_handle_struct *handle,
1622                                 const struct smb_filename *smb_fname,
1623                                 uint64_t *bsize,
1624                                 uint64_t *dfree,
1625                                 uint64_t *dsize);
1626 int vfs_not_implemented_get_quota(vfs_handle_struct *handle,
1627                                 const struct smb_filename *smb_fname,
1628                                 enum SMB_QUOTA_TYPE qtype,
1629                                 unid_t id,
1630                                 SMB_DISK_QUOTA *dq);
1631 int vfs_not_implemented_set_quota(vfs_handle_struct *handle,
1632                                   enum SMB_QUOTA_TYPE qtype,
1633                                   unid_t id, SMB_DISK_QUOTA *dq);
1634 int vfs_not_implemented_get_shadow_copy_data(vfs_handle_struct *handle,
1635                                 files_struct *fsp,
1636                                 struct shadow_copy_data *shadow_copy_data,
1637                                 bool labels);
1638 int vfs_not_implemented_statvfs(struct vfs_handle_struct *handle,
1639                                 const struct smb_filename *smb_fname,
1640                                 struct vfs_statvfs_struct *statbuf);
1641 uint32_t vfs_not_implemented_fs_capabilities(struct vfs_handle_struct *handle,
1642                                 enum timestamp_set_resolution *p_ts_res);
1643 NTSTATUS vfs_not_implemented_get_dfs_referrals(struct vfs_handle_struct *handle,
1644                                                struct dfs_GetDFSReferral *r);
1645 DIR *vfs_not_implemented_opendir(vfs_handle_struct *handle,
1646                         const struct smb_filename *smb_fname,
1647                         const char *mask,
1648                         uint32_t attr);
1649 NTSTATUS vfs_not_implemented_snap_check_path(struct vfs_handle_struct *handle,
1650                                 TALLOC_CTX *mem_ctx,
1651                                 const char *service_path,
1652                                 char **base_volume);
1653 NTSTATUS vfs_not_implemented_snap_create(struct vfs_handle_struct *handle,
1654                                          TALLOC_CTX *mem_ctx,
1655                                          const char *base_volume,
1656                                          time_t *tstamp,
1657                                          bool rw,
1658                                          char **base_path,
1659                                          char **snap_path);
1660 NTSTATUS vfs_not_implemented_snap_delete(struct vfs_handle_struct *handle,
1661                                          TALLOC_CTX *mem_ctx,
1662                                          char *base_path,
1663                                          char *snap_path);
1664 DIR *vfs_not_implemented_fdopendir(vfs_handle_struct *handle, files_struct *fsp,
1665                                    const char *mask, uint32_t attr);
1666 struct dirent *vfs_not_implemented_readdir(vfs_handle_struct *handle,
1667                                            DIR *dirp, SMB_STRUCT_STAT *sbuf);
1668 void vfs_not_implemented_seekdir(vfs_handle_struct *handle, DIR *dirp, long offset);
1669 long vfs_not_implemented_telldir(vfs_handle_struct *handle, DIR *dirp);
1670 void vfs_not_implemented_rewind_dir(vfs_handle_struct *handle, DIR *dirp);
1671 int vfs_not_implemented_mkdirat(vfs_handle_struct *handle,
1672                 struct files_struct *dirfsp,
1673                 const struct smb_filename *smb_fname,
1674                 mode_t mode);
1675 int vfs_not_implemented_closedir(vfs_handle_struct *handle, DIR *dir);
1676 int vfs_not_implemented_open(vfs_handle_struct *handle,
1677                              struct smb_filename *smb_fname,
1678                              files_struct *fsp, int flags, mode_t mode);
1679 NTSTATUS vfs_not_implemented_create_file(struct vfs_handle_struct *handle,
1680                                 struct smb_request *req,
1681                                 uint16_t root_dir_fid,
1682                                 struct smb_filename *smb_fname,
1683                                 uint32_t access_mask,
1684                                 uint32_t share_access,
1685                                 uint32_t create_disposition,
1686                                 uint32_t create_options,
1687                                 uint32_t file_attributes,
1688                                 uint32_t oplock_request,
1689                                 const struct smb2_lease *lease,
1690                                 uint64_t allocation_size,
1691                                 uint32_t private_flags,
1692                                 struct security_descriptor *sd,
1693                                 struct ea_list *ea_list,
1694                                 files_struct **result, int *pinfo,
1695                                 const struct smb2_create_blobs *in_context_blobs,
1696                                 struct smb2_create_blobs *out_context_blobs);
1697 int vfs_not_implemented_close_fn(vfs_handle_struct *handle, files_struct *fsp);
1698 ssize_t vfs_not_implemented_pread(vfs_handle_struct *handle, files_struct *fsp,
1699                                   void *data, size_t n, off_t offset);
1700 struct tevent_req *vfs_not_implemented_pread_send(struct vfs_handle_struct *handle,
1701                                                   TALLOC_CTX *mem_ctx,
1702                                                   struct tevent_context *ev,
1703                                                   struct files_struct *fsp,
1704                                                   void *data, size_t n, off_t offset);
1705 ssize_t vfs_not_implemented_pread_recv(struct tevent_req *req,
1706                                        struct vfs_aio_state *vfs_aio_state);
1707 ssize_t vfs_not_implemented_pwrite(vfs_handle_struct *handle, files_struct *fsp,
1708                                    const void *data, size_t n, off_t offset);
1709 struct tevent_req *vfs_not_implemented_pwrite_send(struct vfs_handle_struct *handle,
1710                                                    TALLOC_CTX *mem_ctx,
1711                                                    struct tevent_context *ev,
1712                                                    struct files_struct *fsp,
1713                                                    const void *data,
1714                                                    size_t n, off_t offset);
1715 ssize_t vfs_not_implemented_pwrite_recv(struct tevent_req *req,
1716                                 struct vfs_aio_state *vfs_aio_state);
1717 off_t vfs_not_implemented_lseek(vfs_handle_struct *handle, files_struct *fsp,
1718                         off_t offset, int whence);
1719 ssize_t vfs_not_implemented_sendfile(vfs_handle_struct *handle, int tofd,
1720                                      files_struct *fromfsp, const DATA_BLOB *hdr,
1721                                      off_t offset, size_t n);
1722 ssize_t vfs_not_implemented_recvfile(vfs_handle_struct *handle, int fromfd,
1723                                      files_struct *tofsp, off_t offset, size_t n);
1724 int vfs_not_implemented_renameat(vfs_handle_struct *handle,
1725                                files_struct *srcfsp,
1726                                const struct smb_filename *smb_fname_src,
1727                                files_struct *dstfsp,
1728                                const struct smb_filename *smb_fname_dst);
1729 struct tevent_req *vfs_not_implemented_fsync_send(struct vfs_handle_struct *handle,
1730                                                   TALLOC_CTX *mem_ctx,
1731                                                   struct tevent_context *ev,
1732                                                   struct files_struct *fsp);
1733 int vfs_not_implemented_fsync_recv(struct tevent_req *req,
1734                                    struct vfs_aio_state *vfs_aio_state);
1735 int vfs_not_implemented_stat(vfs_handle_struct *handle, struct smb_filename *smb_fname);
1736 int vfs_not_implemented_fstat(vfs_handle_struct *handle, files_struct *fsp,
1737                         SMB_STRUCT_STAT *sbuf);
1738 int vfs_not_implemented_lstat(vfs_handle_struct *handle,
1739                               struct smb_filename *smb_fname);
1740 uint64_t vfs_not_implemented_get_alloc_size(struct vfs_handle_struct *handle,
1741                                             struct files_struct *fsp,
1742                                             const SMB_STRUCT_STAT *sbuf);
1743 int vfs_not_implemented_unlinkat(vfs_handle_struct *handle,
1744                                 struct files_struct *dirfsp,
1745                                 const struct smb_filename *smb_fname,
1746                                 int flags);
1747 int vfs_not_implemented_chmod(vfs_handle_struct *handle,
1748                               const struct smb_filename *smb_fname,
1749                               mode_t mode);
1750 int vfs_not_implemented_fchmod(vfs_handle_struct *handle, files_struct *fsp,
1751                                mode_t mode);
1752 int vfs_not_implemented_fchown(vfs_handle_struct *handle, files_struct *fsp,
1753                                uid_t uid, gid_t gid);
1754 int vfs_not_implemented_lchown(vfs_handle_struct *handle,
1755                                const struct smb_filename *smb_fname,
1756                                uid_t uid,
1757                                gid_t gid);
1758 int vfs_not_implemented_chdir(vfs_handle_struct *handle,
1759                               const struct smb_filename *smb_fname);
1760 struct smb_filename *vfs_not_implemented_getwd(vfs_handle_struct *handle,
1761                                                TALLOC_CTX *ctx);
1762 int vfs_not_implemented_ntimes(vfs_handle_struct *handle,
1763                                const struct smb_filename *smb_fname,
1764                                struct smb_file_time *ft);
1765 int vfs_not_implemented_ftruncate(vfs_handle_struct *handle, files_struct *fsp,
1766                                   off_t offset);
1767 int vfs_not_implemented_fallocate(vfs_handle_struct *handle, files_struct *fsp,
1768                                   uint32_t mode, off_t offset, off_t len);
1769 bool vfs_not_implemented_lock(vfs_handle_struct *handle, files_struct *fsp, int op,
1770                               off_t offset, off_t count, int type);
1771 int vfs_not_implemented_kernel_flock(struct vfs_handle_struct *handle,
1772                                      struct files_struct *fsp,
1773                                      uint32_t share_mode, uint32_t access_mask);
1774 int vfs_not_implemented_fcntl(struct vfs_handle_struct *handle,
1775                               struct files_struct *fsp, int cmd, va_list cmd_arg);
1776 int vfs_not_implemented_linux_setlease(struct vfs_handle_struct *handle,
1777                                        struct files_struct *fsp, int leasetype);
1778 bool vfs_not_implemented_getlock(vfs_handle_struct *handle, files_struct *fsp,
1779                                  off_t *poffset, off_t *pcount, int *ptype,
1780                                  pid_t *ppid);
1781 int vfs_not_implemented_symlinkat(vfs_handle_struct *handle,
1782                                 const char *link_contents,
1783                                 struct files_struct *dirfsp,
1784                                 const struct smb_filename *new_smb_fname);
1785 int vfs_not_implemented_vfs_readlinkat(vfs_handle_struct *handle,
1786                         struct files_struct *dirfsp,
1787                         const struct smb_filename *smb_fname,
1788                         char *buf,
1789                         size_t bufsiz);
1790 int vfs_not_implemented_linkat(vfs_handle_struct *handle,
1791                         struct files_struct *srcfsp,
1792                         const struct smb_filename *old_smb_fname,
1793                         struct files_struct *dstfsp,
1794                         const struct smb_filename *new_smb_fname,
1795                         int flags);
1796 int vfs_not_implemented_mknodat(vfs_handle_struct *handle,
1797                         struct files_struct *dirfsp,
1798                         const struct smb_filename *smb_fname,
1799                         mode_t mode,
1800                         SMB_DEV_T dev);
1801 struct smb_filename *vfs_not_implemented_realpath(vfs_handle_struct *handle,
1802                                                   TALLOC_CTX *ctx,
1803                                                   const struct smb_filename *smb_fname);
1804 int vfs_not_implemented_chflags(vfs_handle_struct *handle,
1805                                 const struct smb_filename *smb_fname,
1806                                 uint flags);
1807 struct file_id vfs_not_implemented_file_id_create(vfs_handle_struct *handle,
1808                                                   const SMB_STRUCT_STAT *sbuf);
1809 uint64_t vfs_not_implemented_fs_file_id(vfs_handle_struct *handle,
1810                                         const SMB_STRUCT_STAT *sbuf);
1811 struct tevent_req *vfs_not_implemented_offload_read_send(
1812                         TALLOC_CTX *mem_ctx,
1813                         struct tevent_context *ev,
1814                         struct vfs_handle_struct *handle,
1815                         struct files_struct *fsp,
1816                         uint32_t fsctl,
1817                         uint32_t ttl,
1818                         off_t offset,
1819                         size_t to_copy);
1820 NTSTATUS vfs_not_implemented_offload_read_recv(struct tevent_req *req,
1821                                        struct vfs_handle_struct *handle,
1822                                        TALLOC_CTX *mem_ctx,
1823                                        DATA_BLOB *_token_blob);
1824 struct tevent_req *vfs_not_implemented_offload_write_send(
1825                         struct vfs_handle_struct *handle,
1826                         TALLOC_CTX *mem_ctx,
1827                         struct tevent_context *ev,
1828                         uint32_t fsctl,
1829                         DATA_BLOB *token,
1830                         off_t transfer_offset,
1831                         struct files_struct *dest_fsp,
1832                         off_t dest_off,
1833                         off_t num);
1834 NTSTATUS vfs_not_implemented_offload_write_recv(struct vfs_handle_struct *handle,
1835                                                 struct tevent_req *req,
1836                                                 off_t *copied);
1837 NTSTATUS vfs_not_implemented_get_compression(struct vfs_handle_struct *handle,
1838                                              TALLOC_CTX *mem_ctx,
1839                                              struct files_struct *fsp,
1840                                              struct smb_filename *smb_fname,
1841                                              uint16_t *_compression_fmt);
1842 NTSTATUS vfs_not_implemented_set_compression(struct vfs_handle_struct *handle,
1843                                              TALLOC_CTX *mem_ctx,
1844                                              struct files_struct *fsp,
1845                                              uint16_t compression_fmt);
1846 NTSTATUS vfs_not_implemented_streaminfo(struct vfs_handle_struct *handle,
1847                                         struct files_struct *fsp,
1848                                         const struct smb_filename *smb_fname,
1849                                         TALLOC_CTX *mem_ctx,
1850                                         unsigned int *num_streams,
1851                                         struct stream_struct **streams);
1852 int vfs_not_implemented_get_real_filename(struct vfs_handle_struct *handle,
1853                                           const char *path,
1854                                           const char *name,
1855                                           TALLOC_CTX *mem_ctx,
1856                                           char **found_name);
1857 const char *vfs_not_implemented_connectpath(struct vfs_handle_struct *handle,
1858                                             const struct smb_filename *smb_fname);
1859 NTSTATUS vfs_not_implemented_brl_lock_windows(struct vfs_handle_struct *handle,
1860                                               struct byte_range_lock *br_lck,
1861                                               struct lock_struct *plock);
1862 bool vfs_not_implemented_brl_unlock_windows(struct vfs_handle_struct *handle,
1863                                             struct byte_range_lock *br_lck,
1864                                             const struct lock_struct *plock);
1865 bool vfs_not_implemented_strict_lock_check(struct vfs_handle_struct *handle,
1866                                            struct files_struct *fsp,
1867                                            struct lock_struct *plock);
1868 NTSTATUS vfs_not_implemented_translate_name(struct vfs_handle_struct *handle,
1869                                             const char *mapped_name,
1870                                             enum vfs_translate_direction direction,
1871                                             TALLOC_CTX *mem_ctx, char **pmapped_name);
1872 NTSTATUS vfs_not_implemented_fsctl(struct vfs_handle_struct *handle,
1873                                    struct files_struct *fsp,
1874                                    TALLOC_CTX *ctx,
1875                                    uint32_t function,
1876                                    uint16_t req_flags,  /* Needed for UNICODE ... */
1877                                    const uint8_t *_in_data,
1878                                    uint32_t in_len,
1879                                    uint8_t **_out_data,
1880                                    uint32_t max_out_len, uint32_t *out_len);
1881 NTSTATUS vfs_not_implemented_readdir_attr(struct vfs_handle_struct *handle,
1882                                           const struct smb_filename *fname,
1883                                           TALLOC_CTX *mem_ctx,
1884                                           struct readdir_attr_data **pattr_data);
1885 NTSTATUS vfs_not_implemented_get_dos_attributes(struct vfs_handle_struct *handle,
1886                                                 struct smb_filename *smb_fname,
1887                                                 uint32_t *dosmode);
1888 struct tevent_req *vfs_not_implemented_get_dos_attributes_send(
1889                         TALLOC_CTX *mem_ctx,
1890                         struct tevent_context *ev,
1891                         struct vfs_handle_struct *handle,
1892                         files_struct *dir_fsp,
1893                         struct smb_filename *smb_fname);
1894 NTSTATUS vfs_not_implemented_get_dos_attributes_recv(
1895                         struct tevent_req *req,
1896                         struct vfs_aio_state *aio_state,
1897                         uint32_t *dosmode);
1898 NTSTATUS vfs_not_implemented_fget_dos_attributes(struct vfs_handle_struct *handle,
1899                                                  struct files_struct *fsp,
1900                                                  uint32_t *dosmode);
1901 NTSTATUS vfs_not_implemented_set_dos_attributes(struct vfs_handle_struct *handle,
1902                                                 const struct smb_filename *smb_fname,
1903                                                 uint32_t dosmode);
1904 NTSTATUS vfs_not_implemented_fset_dos_attributes(struct vfs_handle_struct *handle,
1905                                                  struct files_struct *fsp,
1906                                                  uint32_t dosmode);
1907 NTSTATUS vfs_not_implemented_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
1908                                          uint32_t security_info,
1909                                          TALLOC_CTX *mem_ctx,
1910                                          struct security_descriptor **ppdesc);
1911 NTSTATUS vfs_not_implemented_get_nt_acl(vfs_handle_struct *handle,
1912                                         const struct smb_filename *smb_fname,
1913                                         uint32_t security_info,
1914                                         TALLOC_CTX *mem_ctx,
1915                                         struct security_descriptor **ppdesc);
1916 NTSTATUS vfs_not_implemented_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
1917                                          uint32_t security_info_sent,
1918                                          const struct security_descriptor *psd);
1919 SMB_ACL_T vfs_not_implemented_sys_acl_get_file(vfs_handle_struct *handle,
1920                                                const struct smb_filename *smb_fname,
1921                                                SMB_ACL_TYPE_T type,
1922                                                TALLOC_CTX *mem_ctx);
1923 SMB_ACL_T vfs_not_implemented_sys_acl_get_fd(vfs_handle_struct *handle,
1924                                              files_struct *fsp, TALLOC_CTX *mem_ctx);
1925 int vfs_not_implemented_sys_acl_blob_get_file(vfs_handle_struct *handle,
1926                                 const struct smb_filename *smb_fname,
1927                                 TALLOC_CTX *mem_ctx,
1928                                 char **blob_description,
1929                                 DATA_BLOB *blob);
1930 int vfs_not_implemented_sys_acl_blob_get_fd(vfs_handle_struct *handle,
1931                                 files_struct *fsp, TALLOC_CTX *mem_ctx,
1932                                 char **blob_description, DATA_BLOB *blob);
1933 int vfs_not_implemented_sys_acl_set_file(vfs_handle_struct *handle,
1934                                 const struct smb_filename *smb_fname,
1935                                 SMB_ACL_TYPE_T acltype,
1936                                 SMB_ACL_T theacl);
1937 int vfs_not_implemented_sys_acl_set_fd(vfs_handle_struct *handle, files_struct *fsp,
1938                                        SMB_ACL_T theacl);
1939 int vfs_not_implemented_sys_acl_delete_def_file(vfs_handle_struct *handle,
1940                                         const struct smb_filename *smb_fname);
1941 ssize_t vfs_not_implemented_getxattr(vfs_handle_struct *handle,
1942                                 const struct smb_filename *smb_fname,
1943                                 const char *name,
1944                                 void *value,
1945                                 size_t size);
1946 struct tevent_req *vfs_not_implemented_getxattrat_send(
1947                         TALLOC_CTX *mem_ctx,
1948                         struct tevent_context *ev,
1949                         struct vfs_handle_struct *handle,
1950                         files_struct *dir_fsp,
1951                         const struct smb_filename *smb_fname,
1952                         const char *xattr_name,
1953                         size_t alloc_hint);
1954 ssize_t vfs_not_implemented_getxattrat_recv(struct tevent_req *req,
1955                                     struct vfs_aio_state *aio_state,
1956                                     TALLOC_CTX *mem_ctx,
1957                                     uint8_t **xattr_value);
1958 ssize_t vfs_not_implemented_fgetxattr(vfs_handle_struct *handle,
1959                               struct files_struct *fsp, const char *name,
1960                               void *value, size_t size);
1961 ssize_t vfs_not_implemented_listxattr(vfs_handle_struct *handle,
1962                                       const struct smb_filename *smb_fname,
1963                                       char *list,
1964                                       size_t size);
1965 ssize_t vfs_not_implemented_flistxattr(vfs_handle_struct *handle,
1966                                        struct files_struct *fsp, char *list,
1967                                        size_t size);
1968 int vfs_not_implemented_removexattr(vfs_handle_struct *handle,
1969                                     const struct smb_filename *smb_fname,
1970                                     const char *name);
1971 int vfs_not_implemented_fremovexattr(vfs_handle_struct *handle,
1972                                      struct files_struct *fsp, const char *name);
1973 int vfs_not_implemented_setxattr(vfs_handle_struct *handle,
1974                                  const struct smb_filename *smb_fname,
1975                                  const char *name,
1976                                  const void *value,
1977                                  size_t size,
1978                                  int flags);
1979 int vfs_not_implemented_fsetxattr(vfs_handle_struct *handle, struct files_struct *fsp,
1980                                   const char *name, const void *value, size_t size,
1981                                   int flags);
1982 bool vfs_not_implemented_aio_force(struct vfs_handle_struct *handle,
1983                                    struct files_struct *fsp);
1984 NTSTATUS vfs_not_implemented_audit_file(struct vfs_handle_struct *handle,
1985                                         struct smb_filename *file,
1986                                         struct security_acl *sacl,
1987                                         uint32_t access_requested,
1988                                         uint32_t access_denied);
1989 NTSTATUS vfs_not_implemented_durable_cookie(struct vfs_handle_struct *handle,
1990                                             struct files_struct *fsp,
1991                                             TALLOC_CTX *mem_ctx,
1992                                             DATA_BLOB *cookie);
1993 NTSTATUS vfs_not_implemented_durable_disconnect(struct vfs_handle_struct *handle,
1994                                                 struct files_struct *fsp,
1995                                                 const DATA_BLOB old_cookie,
1996                                                 TALLOC_CTX *mem_ctx,
1997                                                 DATA_BLOB *new_cookie);
1998 NTSTATUS vfs_not_implemented_durable_reconnect(struct vfs_handle_struct *handle,
1999                                                struct smb_request *smb1req,
2000                                                struct smbXsrv_open *op,
2001                                                const DATA_BLOB old_cookie,
2002                                                TALLOC_CTX *mem_ctx,
2003                                                struct files_struct **fsp,
2004                                                DATA_BLOB *new_cookie);
2005 #endif /* _VFS_H */