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