Add autogen.sh from distcc via mbp.
[kai/samba.git] / source / modules / vfs_fake_perms.c
1 /* 
2  * Fake Perms VFS module.  Implements passthrough operation of all VFS
3  * calls to disk functions, except for file permissions, which are now
4  * mode 0700 for the current uid/gid.
5  *
6  * Copyright (C) Tim Potter, 1999-2000
7  * Copyright (C) Alexander Bokovoy, 2002
8  * Copyright (C) Andrew Bartlett, 2002
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 2 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, write to the Free Software
22  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23  */
24
25 #include "config.h"
26
27 #include <stdio.h>
28 #include <sys/stat.h>
29 #ifdef HAVE_UTIME_H
30 #include <utime.h>
31 #endif
32 #ifdef HAVE_DIRENT_H
33 #include <dirent.h>
34 #endif
35 #ifdef HAVE_FCNTL_H
36 #include <fcntl.h>
37 #endif
38 #include <errno.h>
39 #include <string.h>
40
41 #include <includes.h>
42 #include <vfs.h>
43
44 static struct vfs_ops default_vfs_ops;   /* For passthrough operation */
45 static struct smb_vfs_handle_struct *fake_perms_handle; /* use fake_perms_handle->data for storing per-instance private data */
46
47 static int fake_perms_connect(struct connection_struct *conn, const char *service, const char *user)    
48 {
49         return default_vfs_ops.connect(conn, service, user);
50 }
51
52 static void fake_perms_disconnect(struct connection_struct *conn)
53 {
54         default_vfs_ops.disconnect(conn);
55 }
56
57 static SMB_BIG_UINT fake_perms_disk_free(struct connection_struct *conn, const char *path,
58         BOOL small_query, SMB_BIG_UINT *bsize,
59         SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize)
60 {
61         return default_vfs_ops.disk_free(conn, path, small_query, bsize, 
62                                          dfree, dsize);
63 }
64
65 static DIR *fake_perms_opendir(struct connection_struct *conn, const char *fname)
66 {
67         return default_vfs_ops.opendir(conn, fname);
68 }
69
70 static struct dirent *fake_perms_readdir(struct connection_struct *conn, DIR *dirp)
71 {
72         return default_vfs_ops.readdir(conn, dirp);
73 }
74
75 static int fake_perms_mkdir(struct connection_struct *conn, const char *path, mode_t mode)
76 {
77         return default_vfs_ops.mkdir(conn, path, mode);
78 }
79
80 static int fake_perms_rmdir(struct connection_struct *conn, const char *path)
81 {
82         return default_vfs_ops.rmdir(conn, path);
83 }
84
85 static int fake_perms_closedir(struct connection_struct *conn, DIR *dir)
86 {
87         return default_vfs_ops.closedir(conn, dir);
88 }
89
90 static int fake_perms_open(struct connection_struct *conn, const char *fname, int flags, mode_t mode)
91 {
92         return default_vfs_ops.open(conn, fname, flags, mode);
93 }
94
95 static int fake_perms_close(struct files_struct *fsp, int fd)
96 {
97         return default_vfs_ops.close(fsp, fd);
98 }
99
100 static ssize_t fake_perms_read(struct files_struct *fsp, int fd, void *data, size_t n)
101 {
102         return default_vfs_ops.read(fsp, fd, data, n);
103 }
104
105 static ssize_t fake_perms_write(struct files_struct *fsp, int fd, const void *data, size_t n)
106 {
107         return default_vfs_ops.write(fsp, fd, data, n);
108 }
109
110 static SMB_OFF_T fake_perms_lseek(struct files_struct *fsp, int filedes, SMB_OFF_T offset, int whence)
111 {
112         return default_vfs_ops.lseek(fsp, filedes, offset, whence);
113 }
114
115 static int fake_perms_rename(struct connection_struct *conn, const char *old, const char *new)
116 {
117         return default_vfs_ops.rename(conn, old, new);
118 }
119
120 static int fake_perms_fsync(struct files_struct *fsp, int fd)
121 {
122         return default_vfs_ops.fsync(fsp, fd);
123 }
124
125 static int fake_perms_stat(struct connection_struct *conn, const char *fname, SMB_STRUCT_STAT *sbuf)
126 {
127         int ret = default_vfs_ops.stat(conn, fname, sbuf);
128         extern struct current_user current_user;
129         
130         if (S_ISDIR(sbuf->st_mode)) {
131                 sbuf->st_mode = S_IFDIR | S_IRWXU;
132         } else {
133                 sbuf->st_mode = S_IRWXU;
134         }
135         sbuf->st_uid = current_user.uid;
136         sbuf->st_gid = current_user.gid;
137         return ret;
138 }
139
140 static int fake_perms_fstat(struct files_struct *fsp, int fd, SMB_STRUCT_STAT *sbuf)
141 {
142         return default_vfs_ops.fstat(fsp, fd, sbuf);
143 }
144
145 static int fake_perms_lstat(struct connection_struct *conn, const char *path, SMB_STRUCT_STAT *sbuf)
146 {
147         return default_vfs_ops.lstat(conn, path, sbuf);
148 }
149
150 static int fake_perms_unlink(struct connection_struct *conn, const char *path)
151 {
152         return default_vfs_ops.unlink(conn, path);
153 }
154
155 static int fake_perms_chmod(struct connection_struct *conn, const char *path, mode_t mode)
156 {
157         return default_vfs_ops.chmod(conn, path, mode);
158 }
159
160 static int fake_perms_fchmod(struct files_struct *fsp, int fd, mode_t mode)
161 {
162         return default_vfs_ops.fchmod(fsp, fd, mode);
163 }
164
165 static int fake_perms_chown(struct connection_struct *conn, const char *path, uid_t uid, gid_t gid)
166 {
167         return default_vfs_ops.chown(conn, path, uid, gid);
168 }
169
170 static int fake_perms_fchown(struct files_struct *fsp, int fd, uid_t uid, gid_t gid)
171 {
172         return default_vfs_ops.fchown(fsp, fd, uid, gid);
173 }
174
175 static int fake_perms_chdir(struct connection_struct *conn, const char *path)
176 {
177         return default_vfs_ops.chdir(conn, path);
178 }
179
180 static char *fake_perms_getwd(struct connection_struct *conn, char *buf)
181 {
182         return default_vfs_ops.getwd(conn, buf);
183 }
184
185 static int fake_perms_utime(struct connection_struct *conn, const char *path, struct utimbuf *times)
186 {
187         return default_vfs_ops.utime(conn, path, times);
188 }
189
190 static int fake_perms_ftruncate(struct files_struct *fsp, int fd, SMB_OFF_T offset)
191 {
192         return default_vfs_ops.ftruncate(fsp, fd, offset);
193 }
194
195 static BOOL fake_perms_lock(struct files_struct *fsp, int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
196 {
197         return default_vfs_ops.lock(fsp, fd, op, offset, count, type);
198 }
199
200 static BOOL fake_perms_symlink(struct connection_struct *conn, const char *oldpath, const char *newpath)
201 {
202         return default_vfs_ops.symlink(conn, oldpath, newpath);
203 }
204
205 static BOOL fake_perms_readlink(struct connection_struct *conn, const char *path, char *buf, size_t bufsiz)
206 {
207         return default_vfs_ops.readlink(conn, path, buf, bufsiz);
208 }
209
210 static int fake_perms_link(struct connection_struct *conn, const char *oldpath, const char *newpath)
211 {
212         return default_vfs_ops.link(conn, oldpath, newpath);
213 }
214
215 static int fake_perms_mknod(struct connection_struct *conn, const char *path, mode_t mode, SMB_DEV_T dev)
216 {
217         return default_vfs_ops.mknod(conn, path, mode, dev);
218 }
219
220 static char *fake_perms_realpath(struct connection_struct *conn, const char *path, char *resolved_path)
221 {
222         return default_vfs_ops.realpath(conn, path, resolved_path);
223 }
224
225 static size_t fake_perms_fget_nt_acl(struct files_struct *fsp, int fd, struct security_descriptor_info **ppdesc)
226 {
227         return default_vfs_ops.fget_nt_acl(fsp, fd, ppdesc);
228 }
229
230 static size_t fake_perms_get_nt_acl(struct files_struct *fsp, const char *name, struct security_descriptor_info **ppdesc)
231 {
232         return default_vfs_ops.get_nt_acl(fsp, name, ppdesc);
233 }
234
235 static BOOL fake_perms_fset_nt_acl(struct files_struct *fsp, int fd, uint32 security_info_sent, struct security_descriptor_info *psd)
236 {
237         return default_vfs_ops.fset_nt_acl(fsp, fd, security_info_sent, psd);
238 }
239
240 static BOOL fake_perms_set_nt_acl(struct files_struct *fsp, const char *name, uint32 security_info_sent, struct security_descriptor_info *psd)
241 {
242         return default_vfs_ops.set_nt_acl(fsp, name, security_info_sent, psd);
243 }
244
245 static BOOL fake_perms_chmod_acl(struct connection_struct *conn, const char *name, mode_t mode)
246 {
247         return default_vfs_ops.chmod_acl(conn, name, mode);
248 }
249
250 static BOOL fake_perms_fchmod_acl(struct files_struct *fsp, int fd, mode_t mode)
251 {
252         return default_vfs_ops.fchmod_acl(fsp, fd, mode);
253 }
254
255 static int fake_perms_sys_acl_get_entry(struct connection_struct *conn, SMB_ACL_T theacl, int entry_id, SMB_ACL_ENTRY_T *entry_p)
256 {
257         return default_vfs_ops.sys_acl_get_entry(conn, theacl, entry_id, entry_p);
258 }
259
260 static int fake_perms_sys_acl_get_tag_type(struct connection_struct *conn, SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p)
261 {
262         return default_vfs_ops.sys_acl_get_tag_type(conn, entry_d, tag_type_p);
263 }
264
265 static int fake_perms_sys_acl_get_permset(struct connection_struct *conn, SMB_ACL_ENTRY_T entry_d, SMB_ACL_PERMSET_T *permset_p)
266 {
267         return default_vfs_ops.sys_acl_get_permset(conn, entry_d, permset_p);
268 }
269
270 static void *fake_perms_sys_acl_get_qualifier(struct connection_struct *conn, SMB_ACL_ENTRY_T entry_d)
271 {
272         return default_vfs_ops.sys_acl_get_qualifier(conn, entry_d);
273 }
274
275 static SMB_ACL_T fake_perms_sys_acl_get_file(struct connection_struct *conn, const char *path_p, SMB_ACL_TYPE_T type)
276 {
277         return default_vfs_ops.sys_acl_get_file(conn, path_p, type);
278 }
279
280 static SMB_ACL_T fake_perms_sys_acl_get_fd(struct files_struct *fsp, int fd)
281 {
282         return default_vfs_ops.sys_acl_get_fd(fsp, fd);
283 }
284
285 static int fake_perms_sys_acl_clear_perms(struct connection_struct *conn, SMB_ACL_PERMSET_T permset)
286 {
287         return default_vfs_ops.sys_acl_clear_perms(conn, permset);
288 }
289
290 static int fake_perms_sys_acl_add_perm(struct connection_struct *conn, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm)
291 {
292         return default_vfs_ops.sys_acl_add_perm(conn, permset, perm);
293 }
294
295 static char *fake_perms_sys_acl_to_text(struct connection_struct *conn, SMB_ACL_T theacl, ssize_t *plen)
296 {
297         return default_vfs_ops.sys_acl_to_text(conn, theacl, plen);
298 }
299
300 static SMB_ACL_T fake_perms_sys_acl_init(struct connection_struct *conn, int count)
301 {
302         return default_vfs_ops.sys_acl_init(conn, count);
303 }
304
305 static int fake_perms_sys_acl_create_entry(struct connection_struct *conn, SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry)
306 {
307         return default_vfs_ops.sys_acl_create_entry(conn, pacl, pentry);
308 }
309
310 static int fake_perms_sys_acl_set_tag_type(struct connection_struct *conn, SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tagtype)
311 {
312         return default_vfs_ops.sys_acl_set_tag_type(conn, entry, tagtype);
313 }
314
315 static int fake_perms_sys_acl_set_qualifier(struct connection_struct *conn, SMB_ACL_ENTRY_T entry, void *qual)
316 {
317         return default_vfs_ops.sys_acl_set_qualifier(conn, entry, qual);
318 }
319
320 static int fake_perms_sys_acl_set_permset(struct connection_struct *conn, SMB_ACL_ENTRY_T entry, SMB_ACL_PERMSET_T permset)
321 {
322         return default_vfs_ops.sys_acl_set_permset(conn, entry, permset);
323 }
324
325 static int fake_perms_sys_acl_valid(struct connection_struct *conn, SMB_ACL_T theacl )
326 {
327         return default_vfs_ops.sys_acl_valid(conn, theacl );
328 }
329
330 static int fake_perms_sys_acl_set_file(struct connection_struct *conn, const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl)
331 {
332         return default_vfs_ops.sys_acl_set_file(conn, name, acltype, theacl);
333 }
334
335 static int fake_perms_sys_acl_set_fd(struct files_struct *fsp, int fd, SMB_ACL_T theacl)
336 {
337         return default_vfs_ops.sys_acl_set_fd(fsp, fd, theacl);
338 }
339
340 static int fake_perms_sys_acl_delete_def_file(struct connection_struct *conn, const char *path)
341 {
342         return default_vfs_ops.sys_acl_delete_def_file(conn, path);
343 }
344
345 static int fake_perms_sys_acl_get_perm(struct connection_struct *conn, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm)
346 {
347         return default_vfs_ops.sys_acl_get_perm(conn, permset, perm);
348 }
349
350 static int fake_perms_sys_acl_free_text(struct connection_struct *conn, char *text)
351 {
352         return default_vfs_ops.sys_acl_free_text(conn, text);
353 }
354
355 static int fake_perms_sys_acl_free_acl(struct connection_struct *conn, SMB_ACL_T posix_acl)
356 {
357         return default_vfs_ops.sys_acl_free_acl(conn, posix_acl);
358 }
359
360 static int fake_perms_sys_acl_free_qualifier(struct connection_struct *conn, void *qualifier, SMB_ACL_TAG_T tagtype)
361 {
362         return default_vfs_ops.sys_acl_free_qualifier(conn, qualifier, tagtype);
363 }
364
365
366 /* VFS operations structure */
367
368 static vfs_op_tuple fake_perms_ops[] = {
369
370         /* Disk operations */
371
372         {fake_perms_connect,                    SMB_VFS_OP_CONNECT,             SMB_VFS_LAYER_TRANSPARENT},
373         {fake_perms_disconnect,         SMB_VFS_OP_DISCONNECT,          SMB_VFS_LAYER_TRANSPARENT},
374         {fake_perms_disk_free,          SMB_VFS_OP_DISK_FREE,           SMB_VFS_LAYER_TRANSPARENT},
375         
376         /* Directory operations */
377
378         {fake_perms_opendir,                    SMB_VFS_OP_OPENDIR,             SMB_VFS_LAYER_TRANSPARENT},
379         {fake_perms_readdir,                    SMB_VFS_OP_READDIR,             SMB_VFS_LAYER_TRANSPARENT},
380         {fake_perms_mkdir,                      SMB_VFS_OP_MKDIR,               SMB_VFS_LAYER_TRANSPARENT},
381         {fake_perms_rmdir,                      SMB_VFS_OP_RMDIR,               SMB_VFS_LAYER_TRANSPARENT},
382         {fake_perms_closedir,                   SMB_VFS_OP_CLOSEDIR,            SMB_VFS_LAYER_TRANSPARENT},
383
384         /* File operations */
385
386         {fake_perms_open,                       SMB_VFS_OP_OPEN,                SMB_VFS_LAYER_TRANSPARENT},
387         {fake_perms_close,                      SMB_VFS_OP_CLOSE,               SMB_VFS_LAYER_TRANSPARENT},
388         {fake_perms_read,                       SMB_VFS_OP_READ,                SMB_VFS_LAYER_TRANSPARENT},
389         {fake_perms_write,                      SMB_VFS_OP_WRITE,               SMB_VFS_LAYER_TRANSPARENT},
390         {fake_perms_lseek,                      SMB_VFS_OP_LSEEK,               SMB_VFS_LAYER_TRANSPARENT},
391         {fake_perms_rename,                     SMB_VFS_OP_RENAME,              SMB_VFS_LAYER_TRANSPARENT},
392         {fake_perms_fsync,                      SMB_VFS_OP_FSYNC,               SMB_VFS_LAYER_TRANSPARENT},
393         {fake_perms_stat,                       SMB_VFS_OP_STAT,                SMB_VFS_LAYER_TRANSPARENT},
394         {fake_perms_fstat,                      SMB_VFS_OP_FSTAT,               SMB_VFS_LAYER_TRANSPARENT},
395         {fake_perms_lstat,                      SMB_VFS_OP_LSTAT,               SMB_VFS_LAYER_TRANSPARENT},
396         {fake_perms_unlink,                     SMB_VFS_OP_UNLINK,              SMB_VFS_LAYER_TRANSPARENT},
397         {fake_perms_chmod,                      SMB_VFS_OP_CHMOD,               SMB_VFS_LAYER_TRANSPARENT},
398         {fake_perms_fchmod,                     SMB_VFS_OP_FCHMOD,              SMB_VFS_LAYER_TRANSPARENT},
399         {fake_perms_chown,                      SMB_VFS_OP_CHOWN,               SMB_VFS_LAYER_TRANSPARENT},
400         {fake_perms_fchown,                     SMB_VFS_OP_FCHOWN,              SMB_VFS_LAYER_TRANSPARENT},
401         {fake_perms_chdir,                      SMB_VFS_OP_CHDIR,               SMB_VFS_LAYER_TRANSPARENT},
402         {fake_perms_getwd,                      SMB_VFS_OP_GETWD,               SMB_VFS_LAYER_TRANSPARENT},
403         {fake_perms_utime,                      SMB_VFS_OP_UTIME,               SMB_VFS_LAYER_TRANSPARENT},
404         {fake_perms_ftruncate,          SMB_VFS_OP_FTRUNCATE,           SMB_VFS_LAYER_TRANSPARENT},
405         {fake_perms_lock,                       SMB_VFS_OP_LOCK,                SMB_VFS_LAYER_TRANSPARENT},
406         {fake_perms_symlink,                    SMB_VFS_OP_SYMLINK,             SMB_VFS_LAYER_TRANSPARENT},
407         {fake_perms_readlink,                   SMB_VFS_OP_READLINK,            SMB_VFS_LAYER_TRANSPARENT},
408         {fake_perms_link,                       SMB_VFS_OP_LINK,                SMB_VFS_LAYER_TRANSPARENT},
409         {fake_perms_mknod,                      SMB_VFS_OP_MKNOD,               SMB_VFS_LAYER_TRANSPARENT},
410         {fake_perms_realpath,                   SMB_VFS_OP_REALPATH,            SMB_VFS_LAYER_TRANSPARENT},
411
412         /* NT File ACL operations */
413
414         {fake_perms_fget_nt_acl,                SMB_VFS_OP_FGET_NT_ACL,         SMB_VFS_LAYER_TRANSPARENT},
415         {fake_perms_get_nt_acl,         SMB_VFS_OP_GET_NT_ACL,          SMB_VFS_LAYER_TRANSPARENT},
416         {fake_perms_fset_nt_acl,                SMB_VFS_OP_FSET_NT_ACL,         SMB_VFS_LAYER_TRANSPARENT},
417         {fake_perms_set_nt_acl,         SMB_VFS_OP_SET_NT_ACL,          SMB_VFS_LAYER_TRANSPARENT},
418
419         /* POSIX ACL operations */
420
421         {fake_perms_chmod_acl,          SMB_VFS_OP_CHMOD_ACL,           SMB_VFS_LAYER_TRANSPARENT},
422         {fake_perms_fchmod_acl,         SMB_VFS_OP_FCHMOD_ACL,          SMB_VFS_LAYER_TRANSPARENT},
423
424         {fake_perms_sys_acl_get_entry,  SMB_VFS_OP_SYS_ACL_GET_ENTRY,           SMB_VFS_LAYER_TRANSPARENT},
425         {fake_perms_sys_acl_get_tag_type,       SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE,        SMB_VFS_LAYER_TRANSPARENT},
426         {fake_perms_sys_acl_get_permset,        SMB_VFS_OP_SYS_ACL_GET_PERMSET,         SMB_VFS_LAYER_TRANSPARENT},
427         {fake_perms_sys_acl_get_qualifier,      SMB_VFS_OP_SYS_ACL_GET_QUALIFIER,       SMB_VFS_LAYER_TRANSPARENT},
428         {fake_perms_sys_acl_get_file,           SMB_VFS_OP_SYS_ACL_GET_FILE,            SMB_VFS_LAYER_TRANSPARENT},
429         {fake_perms_sys_acl_get_fd,             SMB_VFS_OP_SYS_ACL_GET_FD,              SMB_VFS_LAYER_TRANSPARENT},
430         {fake_perms_sys_acl_clear_perms,        SMB_VFS_OP_SYS_ACL_CLEAR_PERMS,         SMB_VFS_LAYER_TRANSPARENT},
431         {fake_perms_sys_acl_add_perm,           SMB_VFS_OP_SYS_ACL_ADD_PERM,            SMB_VFS_LAYER_TRANSPARENT},
432         {fake_perms_sys_acl_to_text,            SMB_VFS_OP_SYS_ACL_TO_TEXT,             SMB_VFS_LAYER_TRANSPARENT},
433         {fake_perms_sys_acl_init,               SMB_VFS_OP_SYS_ACL_INIT,                SMB_VFS_LAYER_TRANSPARENT},
434         {fake_perms_sys_acl_create_entry,       SMB_VFS_OP_SYS_ACL_CREATE_ENTRY,        SMB_VFS_LAYER_TRANSPARENT},
435         {fake_perms_sys_acl_set_tag_type,       SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE,        SMB_VFS_LAYER_TRANSPARENT},
436         {fake_perms_sys_acl_set_qualifier,      SMB_VFS_OP_SYS_ACL_SET_QUALIFIER,       SMB_VFS_LAYER_TRANSPARENT},
437         {fake_perms_sys_acl_set_permset,        SMB_VFS_OP_SYS_ACL_SET_PERMSET,         SMB_VFS_LAYER_TRANSPARENT},
438         {fake_perms_sys_acl_valid,              SMB_VFS_OP_SYS_ACL_VALID,               SMB_VFS_LAYER_TRANSPARENT},
439         {fake_perms_sys_acl_set_file,           SMB_VFS_OP_SYS_ACL_SET_FILE,            SMB_VFS_LAYER_TRANSPARENT},
440         {fake_perms_sys_acl_set_fd,             SMB_VFS_OP_SYS_ACL_SET_FD,              SMB_VFS_LAYER_TRANSPARENT},
441         {fake_perms_sys_acl_delete_def_file,    SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE,     SMB_VFS_LAYER_TRANSPARENT},
442         {fake_perms_sys_acl_get_perm,           SMB_VFS_OP_SYS_ACL_GET_PERM,            SMB_VFS_LAYER_TRANSPARENT},
443         {fake_perms_sys_acl_free_text,  SMB_VFS_OP_SYS_ACL_FREE_TEXT,           SMB_VFS_LAYER_TRANSPARENT},
444         {fake_perms_sys_acl_free_acl,           SMB_VFS_OP_SYS_ACL_FREE_ACL,            SMB_VFS_LAYER_TRANSPARENT},
445         {fake_perms_sys_acl_free_qualifier,     SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER,      SMB_VFS_LAYER_TRANSPARENT},
446         
447         {NULL,  SMB_VFS_OP_NOOP,        SMB_VFS_LAYER_NOOP}
448 };
449
450 /* VFS initialisation - return initialized vfs_op_tuple array back to Samba */
451
452 vfs_op_tuple *vfs_init(int *vfs_version, struct vfs_ops *def_vfs_ops,
453                         struct smb_vfs_handle_struct *vfs_handle)
454 {
455         DEBUG(3, ("Initialising default vfs hooks\n"));
456
457         *vfs_version = SMB_VFS_INTERFACE_VERSION;
458         memcpy(&default_vfs_ops, def_vfs_ops, sizeof(struct vfs_ops));
459         
460         /* Remember vfs_handle for further allocation and referencing of private
461            information in vfs_handle->data
462         */
463         fake_perms_handle = vfs_handle;
464         return fake_perms_ops;
465 }
466
467 /* VFS finalization function */
468 void vfs_done(connection_struct *conn)
469 {
470         DEBUG(3, ("Finalizing default vfs hooks\n"));
471 }