2 Unix SMB/CIFS implementation.
3 Wrap disk only vfs functions to sidestep dodgy compilers.
4 Copyright (C) Tim Potter 1998
5 Copyright (C) Jeremy Allison 2007
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
24 #define DBGC_CLASS DBGC_VFS
26 /* Check for NULL pointer parameters in vfswrap_* functions */
28 /* We don't want to have NULL function pointers lying around. Someone
29 is sure to try and execute them. These stubs are used to prevent
32 static int vfswrap_connect(vfs_handle_struct *handle, const char *service, const char *user)
34 return 0; /* Return >= 0 for success */
37 static void vfswrap_disconnect(vfs_handle_struct *handle)
43 static uint64_t vfswrap_disk_free(vfs_handle_struct *handle, const char *path, bool small_query, uint64_t *bsize,
44 uint64_t *dfree, uint64_t *dsize)
48 result = sys_disk_free(handle->conn, path, small_query, bsize, dfree, dsize);
52 static int vfswrap_get_quota(struct vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *qt)
54 #ifdef HAVE_SYS_QUOTAS
57 START_PROFILE(syscall_get_quota);
58 result = sys_get_quota(handle->conn->connectpath, qtype, id, qt);
59 END_PROFILE(syscall_get_quota);
67 static int vfswrap_set_quota(struct vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *qt)
69 #ifdef HAVE_SYS_QUOTAS
72 START_PROFILE(syscall_set_quota);
73 result = sys_set_quota(handle->conn->connectpath, qtype, id, qt);
74 END_PROFILE(syscall_set_quota);
82 static int vfswrap_get_shadow_copy_data(struct vfs_handle_struct *handle, struct files_struct *fsp, SHADOW_COPY_DATA *shadow_copy_data, bool labels)
85 return -1; /* Not implemented. */
88 static int vfswrap_statvfs(struct vfs_handle_struct *handle, const char *path, vfs_statvfs_struct *statbuf)
90 return sys_statvfs(path, statbuf);
93 static uint32_t vfswrap_fs_capabilities(struct vfs_handle_struct *handle)
96 struct vfs_statvfs_struct statbuf;
98 sys_statvfs(handle->conn->connectpath, &statbuf);
99 return statbuf.FsCapabilities;
101 return FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES;
104 /* Directory operations */
106 static SMB_STRUCT_DIR *vfswrap_opendir(vfs_handle_struct *handle, const char *fname, const char *mask, uint32 attr)
108 SMB_STRUCT_DIR *result;
110 START_PROFILE(syscall_opendir);
111 result = sys_opendir(fname);
112 END_PROFILE(syscall_opendir);
116 static SMB_STRUCT_DIRENT *vfswrap_readdir(vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp)
118 SMB_STRUCT_DIRENT *result;
120 START_PROFILE(syscall_readdir);
121 result = sys_readdir(dirp);
122 END_PROFILE(syscall_readdir);
126 static void vfswrap_seekdir(vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp, long offset)
128 START_PROFILE(syscall_seekdir);
129 sys_seekdir(dirp, offset);
130 END_PROFILE(syscall_seekdir);
133 static long vfswrap_telldir(vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp)
136 START_PROFILE(syscall_telldir);
137 result = sys_telldir(dirp);
138 END_PROFILE(syscall_telldir);
142 static void vfswrap_rewinddir(vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp)
144 START_PROFILE(syscall_rewinddir);
146 END_PROFILE(syscall_rewinddir);
149 static int vfswrap_mkdir(vfs_handle_struct *handle, const char *path, mode_t mode)
152 bool has_dacl = False;
155 START_PROFILE(syscall_mkdir);
157 if (lp_inherit_acls(SNUM(handle->conn))
158 && parent_dirname(talloc_tos(), path, &parent, NULL)
159 && (has_dacl = directory_has_default_acl(handle->conn, parent)))
164 result = mkdir(path, mode);
166 if (result == 0 && !has_dacl) {
168 * We need to do this as the default behavior of POSIX ACLs
169 * is to set the mask to be the requested group permission
170 * bits, not the group permission bits to be the requested
171 * group permission bits. This is not what we want, as it will
172 * mess up any inherited ACL bits that were set. JRA.
174 int saved_errno = errno; /* We may get ENOSYS */
175 if ((SMB_VFS_CHMOD_ACL(handle->conn, path, mode) == -1) && (errno == ENOSYS))
179 END_PROFILE(syscall_mkdir);
183 static int vfswrap_rmdir(vfs_handle_struct *handle, const char *path)
187 START_PROFILE(syscall_rmdir);
188 result = rmdir(path);
189 END_PROFILE(syscall_rmdir);
193 static int vfswrap_closedir(vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp)
197 START_PROFILE(syscall_closedir);
198 result = sys_closedir(dirp);
199 END_PROFILE(syscall_closedir);
203 /* File operations */
205 static int vfswrap_open(vfs_handle_struct *handle, const char *fname,
206 files_struct *fsp, int flags, mode_t mode)
210 START_PROFILE(syscall_open);
211 result = sys_open(fname, flags, mode);
212 END_PROFILE(syscall_open);
216 static NTSTATUS vfswrap_create_file(vfs_handle_struct *handle,
217 struct smb_request *req,
218 uint16_t root_dir_fid,
220 uint32_t create_file_flags,
221 uint32_t access_mask,
222 uint32_t share_access,
223 uint32_t create_disposition,
224 uint32_t create_options,
225 uint32_t file_attributes,
226 uint32_t oplock_request,
227 uint64_t allocation_size,
228 struct security_descriptor *sd,
229 struct ea_list *ea_list,
230 files_struct **result,
232 SMB_STRUCT_STAT *psbuf)
234 return create_file_default(handle->conn, req, root_dir_fid, fname,
235 create_file_flags, access_mask, share_access,
236 create_disposition, create_options,
237 file_attributes, oplock_request,
238 allocation_size, sd, ea_list, result, pinfo,
242 static int vfswrap_close(vfs_handle_struct *handle, files_struct *fsp)
246 START_PROFILE(syscall_close);
247 result = fd_close_posix(fsp);
248 END_PROFILE(syscall_close);
252 static ssize_t vfswrap_read(vfs_handle_struct *handle, files_struct *fsp, void *data, size_t n)
256 START_PROFILE_BYTES(syscall_read, n);
257 result = sys_read(fsp->fh->fd, data, n);
258 END_PROFILE(syscall_read);
262 static ssize_t vfswrap_pread(vfs_handle_struct *handle, files_struct *fsp, void *data,
263 size_t n, SMB_OFF_T offset)
267 #if defined(HAVE_PREAD) || defined(HAVE_PREAD64)
268 START_PROFILE_BYTES(syscall_pread, n);
269 result = sys_pread(fsp->fh->fd, data, n, offset);
270 END_PROFILE(syscall_pread);
272 if (result == -1 && errno == ESPIPE) {
273 /* Maintain the fiction that pipes can be seeked (sought?) on. */
274 result = SMB_VFS_READ(fsp, data, n);
278 #else /* HAVE_PREAD */
282 curr = SMB_VFS_LSEEK(fsp, 0, SEEK_CUR);
283 if (curr == -1 && errno == ESPIPE) {
284 /* Maintain the fiction that pipes can be seeked (sought?) on. */
285 result = SMB_VFS_READ(fsp, data, n);
290 if (SMB_VFS_LSEEK(fsp, offset, SEEK_SET) == -1) {
295 result = SMB_VFS_READ(fsp, data, n);
298 SMB_VFS_LSEEK(fsp, curr, SEEK_SET);
301 #endif /* HAVE_PREAD */
306 static ssize_t vfswrap_write(vfs_handle_struct *handle, files_struct *fsp, const void *data, size_t n)
310 START_PROFILE_BYTES(syscall_write, n);
311 result = sys_write(fsp->fh->fd, data, n);
312 END_PROFILE(syscall_write);
316 static ssize_t vfswrap_pwrite(vfs_handle_struct *handle, files_struct *fsp, const void *data,
317 size_t n, SMB_OFF_T offset)
321 #if defined(HAVE_PWRITE) || defined(HAVE_PRWITE64)
322 START_PROFILE_BYTES(syscall_pwrite, n);
323 result = sys_pwrite(fsp->fh->fd, data, n, offset);
324 END_PROFILE(syscall_pwrite);
326 if (result == -1 && errno == ESPIPE) {
327 /* Maintain the fiction that pipes can be sought on. */
328 result = SMB_VFS_WRITE(fsp, data, n);
331 #else /* HAVE_PWRITE */
335 curr = SMB_VFS_LSEEK(fsp, 0, SEEK_CUR);
340 if (SMB_VFS_LSEEK(fsp, offset, SEEK_SET) == -1) {
344 result = SMB_VFS_WRITE(fsp, data, n);
347 SMB_VFS_LSEEK(fsp, curr, SEEK_SET);
350 #endif /* HAVE_PWRITE */
355 static SMB_OFF_T vfswrap_lseek(vfs_handle_struct *handle, files_struct *fsp, SMB_OFF_T offset, int whence)
357 SMB_OFF_T result = 0;
359 START_PROFILE(syscall_lseek);
361 /* Cope with 'stat' file opens. */
362 if (fsp->fh->fd != -1)
363 result = sys_lseek(fsp->fh->fd, offset, whence);
366 * We want to maintain the fiction that we can seek
367 * on a fifo for file system purposes. This allows
368 * people to set up UNIX fifo's that feed data to Windows
372 if((result == -1) && (errno == ESPIPE)) {
377 END_PROFILE(syscall_lseek);
381 static ssize_t vfswrap_sendfile(vfs_handle_struct *handle, int tofd, files_struct *fromfsp, const DATA_BLOB *hdr,
382 SMB_OFF_T offset, size_t n)
386 START_PROFILE_BYTES(syscall_sendfile, n);
387 result = sys_sendfile(tofd, fromfsp->fh->fd, hdr, offset, n);
388 END_PROFILE(syscall_sendfile);
392 static ssize_t vfswrap_recvfile(vfs_handle_struct *handle,
400 START_PROFILE_BYTES(syscall_recvfile, n);
401 result = sys_recvfile(fromfd, tofsp->fh->fd, offset, n);
402 END_PROFILE(syscall_recvfile);
406 /*********************************************************
407 For rename across filesystems Patch from Warren Birnbaum
408 <warrenb@hpcvscdp.cv.hp.com>
409 **********************************************************/
411 static int copy_reg(const char *source, const char *dest)
413 SMB_STRUCT_STAT source_stats;
418 if (sys_lstat (source, &source_stats) == -1)
421 if (!S_ISREG (source_stats.st_mode))
424 if((ifd = sys_open (source, O_RDONLY, 0)) < 0)
427 if (unlink (dest) && errno != ENOENT)
431 if((ofd = sys_open (dest, O_WRONLY | O_CREAT | O_TRUNC | O_NOFOLLOW, 0600)) < 0 )
433 if((ofd = sys_open (dest, O_WRONLY | O_CREAT | O_TRUNC , 0600)) < 0 )
437 if (transfer_file(ifd, ofd, (size_t)-1) == -1)
441 * Try to preserve ownership. For non-root it might fail, but that's ok.
442 * But root probably wants to know, e.g. if NFS disallows it.
446 if ((fchown(ofd, source_stats.st_uid, source_stats.st_gid) == -1) && (errno != EPERM))
448 if ((chown(dest, source_stats.st_uid, source_stats.st_gid) == -1) && (errno != EPERM))
453 * fchown turns off set[ug]id bits for non-root,
454 * so do the chmod last.
457 #if defined(HAVE_FCHMOD)
458 if (fchmod (ofd, source_stats.st_mode & 07777))
460 if (chmod (dest, source_stats.st_mode & 07777))
464 if (close (ifd) == -1)
467 if (close (ofd) == -1)
470 /* Try to copy the old file's modtime and access time. */
474 tv.actime = source_stats.st_atime;
475 tv.modtime = source_stats.st_mtime;
479 if (unlink (source) == -1)
495 static int vfswrap_rename(vfs_handle_struct *handle, const char *oldname, const char *newname)
499 START_PROFILE(syscall_rename);
500 result = rename(oldname, newname);
501 if ((result == -1) && (errno == EXDEV)) {
502 /* Rename across filesystems needed. */
503 result = copy_reg(oldname, newname);
506 END_PROFILE(syscall_rename);
510 static int vfswrap_fsync(vfs_handle_struct *handle, files_struct *fsp)
515 START_PROFILE(syscall_fsync);
516 result = fsync(fsp->fh->fd);
517 END_PROFILE(syscall_fsync);
524 static int vfswrap_stat(vfs_handle_struct *handle, const char *fname, SMB_STRUCT_STAT *sbuf)
528 START_PROFILE(syscall_stat);
529 result = sys_stat(fname, sbuf);
530 END_PROFILE(syscall_stat);
534 static int vfswrap_fstat(vfs_handle_struct *handle, files_struct *fsp, SMB_STRUCT_STAT *sbuf)
538 START_PROFILE(syscall_fstat);
539 result = sys_fstat(fsp->fh->fd, sbuf);
540 END_PROFILE(syscall_fstat);
544 int vfswrap_lstat(vfs_handle_struct *handle, const char *path, SMB_STRUCT_STAT *sbuf)
548 START_PROFILE(syscall_lstat);
549 result = sys_lstat(path, sbuf);
550 END_PROFILE(syscall_lstat);
554 static int vfswrap_unlink(vfs_handle_struct *handle, const char *path)
558 START_PROFILE(syscall_unlink);
559 result = unlink(path);
560 END_PROFILE(syscall_unlink);
564 static int vfswrap_chmod(vfs_handle_struct *handle, const char *path, mode_t mode)
568 START_PROFILE(syscall_chmod);
571 * We need to do this due to the fact that the default POSIX ACL
572 * chmod modifies the ACL *mask* for the group owner, not the
573 * group owner bits directly. JRA.
578 int saved_errno = errno; /* We might get ENOSYS */
579 if ((result = SMB_VFS_CHMOD_ACL(handle->conn, path, mode)) == 0) {
580 END_PROFILE(syscall_chmod);
583 /* Error - return the old errno. */
587 result = chmod(path, mode);
588 END_PROFILE(syscall_chmod);
592 static int vfswrap_fchmod(vfs_handle_struct *handle, files_struct *fsp, mode_t mode)
596 START_PROFILE(syscall_fchmod);
599 * We need to do this due to the fact that the default POSIX ACL
600 * chmod modifies the ACL *mask* for the group owner, not the
601 * group owner bits directly. JRA.
605 int saved_errno = errno; /* We might get ENOSYS */
606 if ((result = SMB_VFS_FCHMOD_ACL(fsp, mode)) == 0) {
607 END_PROFILE(syscall_fchmod);
610 /* Error - return the old errno. */
614 #if defined(HAVE_FCHMOD)
615 result = fchmod(fsp->fh->fd, mode);
621 END_PROFILE(syscall_fchmod);
625 static int vfswrap_chown(vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid)
629 START_PROFILE(syscall_chown);
630 result = chown(path, uid, gid);
631 END_PROFILE(syscall_chown);
635 static int vfswrap_fchown(vfs_handle_struct *handle, files_struct *fsp, uid_t uid, gid_t gid)
640 START_PROFILE(syscall_fchown);
641 result = fchown(fsp->fh->fd, uid, gid);
642 END_PROFILE(syscall_fchown);
650 static int vfswrap_lchown(vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid)
654 START_PROFILE(syscall_lchown);
655 result = lchown(path, uid, gid);
656 END_PROFILE(syscall_lchown);
660 static int vfswrap_chdir(vfs_handle_struct *handle, const char *path)
664 START_PROFILE(syscall_chdir);
665 result = chdir(path);
666 END_PROFILE(syscall_chdir);
670 static char *vfswrap_getwd(vfs_handle_struct *handle, char *path)
674 START_PROFILE(syscall_getwd);
675 result = sys_getwd(path);
676 END_PROFILE(syscall_getwd);
680 /*********************************************************************
681 nsec timestamp resolution call. Convert down to whatever the underlying
683 **********************************************************************/
685 static int vfswrap_ntimes(vfs_handle_struct *handle, const char *path,
686 struct smb_file_time *ft)
690 START_PROFILE(syscall_ntimes);
691 #if defined(HAVE_UTIMES)
693 struct timeval tv[2];
694 tv[0] = convert_timespec_to_timeval(ft->atime);
695 tv[1] = convert_timespec_to_timeval(ft->mtime);
696 result = utimes(path, tv);
698 result = utimes(path, NULL);
700 #elif defined(HAVE_UTIME)
702 struct utimbuf times;
703 times.actime = convert_timespec_to_time_t(ft->atime);
704 times.modtime = convert_timespec_to_time_t(ft->mtime);
705 result = utime(path, times);
707 result = utime(path, NULL);
713 END_PROFILE(syscall_ntimes);
717 /*********************************************************************
718 A version of ftruncate that will write the space on disk if strict
720 **********************************************************************/
722 static int strict_allocate_ftruncate(vfs_handle_struct *handle, files_struct *fsp, SMB_OFF_T len)
725 SMB_OFF_T currpos = SMB_VFS_LSEEK(fsp, 0, SEEK_CUR);
726 unsigned char zero_space[4096];
727 SMB_OFF_T space_to_write;
732 if (SMB_VFS_FSTAT(fsp, &st) == -1)
735 space_to_write = len - st.st_size;
738 if (S_ISFIFO(st.st_mode))
742 if (st.st_size == len)
745 /* Shrink - just ftruncate. */
746 if (st.st_size > len)
747 return sys_ftruncate(fsp->fh->fd, len);
749 /* available disk space is enough or not? */
750 if (lp_strict_allocate(SNUM(fsp->conn))){
751 uint64_t space_avail;
752 uint64_t bsize,dfree,dsize;
754 space_avail = get_dfree_info(fsp->conn,fsp->fsp_name,false,&bsize,&dfree,&dsize);
755 /* space_avail is 1k blocks */
756 if (space_avail == (uint64_t)-1 ||
757 ((uint64_t)space_to_write/1024 > space_avail) ) {
763 /* Write out the real space on disk. */
764 if (SMB_VFS_LSEEK(fsp, st.st_size, SEEK_SET) != st.st_size)
767 space_to_write = len - st.st_size;
769 memset(zero_space, '\0', sizeof(zero_space));
770 while ( space_to_write > 0) {
772 SMB_OFF_T current_len_to_write = MIN(sizeof(zero_space),space_to_write);
774 retlen = SMB_VFS_WRITE(fsp,(char *)zero_space,current_len_to_write);
778 space_to_write -= retlen;
781 /* Seek to where we were */
782 if (SMB_VFS_LSEEK(fsp, currpos, SEEK_SET) != currpos)
788 static int vfswrap_ftruncate(vfs_handle_struct *handle, files_struct *fsp, SMB_OFF_T len)
795 START_PROFILE(syscall_ftruncate);
797 if (lp_strict_allocate(SNUM(fsp->conn))) {
798 result = strict_allocate_ftruncate(handle, fsp, len);
799 END_PROFILE(syscall_ftruncate);
803 /* we used to just check HAVE_FTRUNCATE_EXTEND and only use
804 sys_ftruncate if the system supports it. Then I discovered that
805 you can have some filesystems that support ftruncate
806 expansion and some that don't! On Linux fat can't do
807 ftruncate extend but ext2 can. */
809 result = sys_ftruncate(fsp->fh->fd, len);
813 /* According to W. R. Stevens advanced UNIX prog. Pure 4.3 BSD cannot
814 extend a file with ftruncate. Provide alternate implementation
816 currpos = SMB_VFS_LSEEK(fsp, 0, SEEK_CUR);
821 /* Do an fstat to see if the file is longer than the requested
822 size in which case the ftruncate above should have
823 succeeded or shorter, in which case seek to len - 1 and
824 write 1 byte of zero */
825 if (SMB_VFS_FSTAT(fsp, &st) == -1) {
830 if (S_ISFIFO(st.st_mode)) {
836 if (st.st_size == len) {
841 if (st.st_size > len) {
842 /* the sys_ftruncate should have worked */
846 if (SMB_VFS_LSEEK(fsp, len-1, SEEK_SET) != len -1)
849 if (SMB_VFS_WRITE(fsp, &c, 1)!=1)
852 /* Seek to where we were */
853 if (SMB_VFS_LSEEK(fsp, currpos, SEEK_SET) != currpos)
859 END_PROFILE(syscall_ftruncate);
863 static bool vfswrap_lock(vfs_handle_struct *handle, files_struct *fsp, int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
867 START_PROFILE(syscall_fcntl_lock);
868 result = fcntl_lock(fsp->fh->fd, op, offset, count, type);
869 END_PROFILE(syscall_fcntl_lock);
873 static int vfswrap_kernel_flock(vfs_handle_struct *handle, files_struct *fsp,
876 START_PROFILE(syscall_kernel_flock);
877 kernel_flock(fsp->fh->fd, share_mode);
878 END_PROFILE(syscall_kernel_flock);
882 static bool vfswrap_getlock(vfs_handle_struct *handle, files_struct *fsp, SMB_OFF_T *poffset, SMB_OFF_T *pcount, int *ptype, pid_t *ppid)
886 START_PROFILE(syscall_fcntl_getlock);
887 result = fcntl_getlock(fsp->fh->fd, poffset, pcount, ptype, ppid);
888 END_PROFILE(syscall_fcntl_getlock);
892 static int vfswrap_linux_setlease(vfs_handle_struct *handle, files_struct *fsp,
897 START_PROFILE(syscall_linux_setlease);
899 #ifdef HAVE_KERNEL_OPLOCKS_LINUX
900 /* first set the signal handler */
901 if(linux_set_lease_sighandler(fsp->fh->fd) == -1) {
905 result = linux_setlease(fsp->fh->fd, leasetype);
909 END_PROFILE(syscall_linux_setlease);
913 static int vfswrap_symlink(vfs_handle_struct *handle, const char *oldpath, const char *newpath)
917 START_PROFILE(syscall_symlink);
918 result = symlink(oldpath, newpath);
919 END_PROFILE(syscall_symlink);
923 static int vfswrap_readlink(vfs_handle_struct *handle, const char *path, char *buf, size_t bufsiz)
927 START_PROFILE(syscall_readlink);
928 result = readlink(path, buf, bufsiz);
929 END_PROFILE(syscall_readlink);
933 static int vfswrap_link(vfs_handle_struct *handle, const char *oldpath, const char *newpath)
937 START_PROFILE(syscall_link);
938 result = link(oldpath, newpath);
939 END_PROFILE(syscall_link);
943 static int vfswrap_mknod(vfs_handle_struct *handle, const char *pathname, mode_t mode, SMB_DEV_T dev)
947 START_PROFILE(syscall_mknod);
948 result = sys_mknod(pathname, mode, dev);
949 END_PROFILE(syscall_mknod);
953 static char *vfswrap_realpath(vfs_handle_struct *handle, const char *path, char *resolved_path)
957 START_PROFILE(syscall_realpath);
958 result = realpath(path, resolved_path);
959 END_PROFILE(syscall_realpath);
963 static NTSTATUS vfswrap_notify_watch(vfs_handle_struct *vfs_handle,
964 struct sys_notify_context *ctx,
965 struct notify_entry *e,
966 void (*callback)(struct sys_notify_context *ctx,
968 struct notify_event *ev),
969 void *private_data, void *handle)
972 * So far inotify is the only supported default notify mechanism. If
973 * another platform like the the BSD's or a proprietary Unix comes
974 * along and wants another default, we can play the same trick we
975 * played with Posix ACLs.
977 * Until that is the case, hard-code inotify here.
980 if (lp_kernel_change_notify(ctx->conn->params)) {
981 return inotify_watch(ctx, e, callback, private_data, handle);
985 * Do nothing, leave everything to notify_internal.c
990 static int vfswrap_chflags(vfs_handle_struct *handle, const char *path, int flags)
993 return chflags(path, flags);
1000 static struct file_id vfswrap_file_id_create(struct vfs_handle_struct *handle, SMB_DEV_T dev, SMB_INO_T inode)
1002 return file_id_create_dev(dev, inode);
1005 static NTSTATUS vfswrap_streaminfo(vfs_handle_struct *handle,
1006 struct files_struct *fsp,
1008 TALLOC_CTX *mem_ctx,
1009 unsigned int *pnum_streams,
1010 struct stream_struct **pstreams)
1012 SMB_STRUCT_STAT sbuf;
1013 unsigned int num_streams = 0;
1014 struct stream_struct *streams = NULL;
1017 if ((fsp != NULL) && (fsp->is_directory)) {
1019 * No default streams on directories
1024 if ((fsp != NULL) && (fsp->fh->fd != -1)) {
1025 ret = SMB_VFS_FSTAT(fsp, &sbuf);
1028 ret = SMB_VFS_STAT(handle->conn, fname, &sbuf);
1032 return map_nt_error_from_unix(errno);
1035 if (S_ISDIR(sbuf.st_mode)) {
1039 streams = talloc(mem_ctx, struct stream_struct);
1041 if (streams == NULL) {
1042 return NT_STATUS_NO_MEMORY;
1045 streams->size = sbuf.st_size;
1046 streams->alloc_size = get_allocation_size(handle->conn, fsp, &sbuf);
1048 streams->name = talloc_strdup(streams, "::$DATA");
1049 if (streams->name == NULL) {
1050 TALLOC_FREE(streams);
1051 return NT_STATUS_NO_MEMORY;
1056 *pnum_streams = num_streams;
1057 *pstreams = streams;
1058 return NT_STATUS_OK;
1061 static int vfswrap_get_real_filename(struct vfs_handle_struct *handle,
1064 TALLOC_CTX *mem_ctx,
1067 return get_real_filename(handle->conn, path, name, mem_ctx,
1071 static NTSTATUS vfswrap_fget_nt_acl(vfs_handle_struct *handle,
1073 uint32 security_info, SEC_DESC **ppdesc)
1077 START_PROFILE(fget_nt_acl);
1078 result = posix_fget_nt_acl(fsp, security_info, ppdesc);
1079 END_PROFILE(fget_nt_acl);
1083 static NTSTATUS vfswrap_get_nt_acl(vfs_handle_struct *handle,
1085 uint32 security_info, SEC_DESC **ppdesc)
1089 START_PROFILE(get_nt_acl);
1090 result = posix_get_nt_acl(handle->conn, name, security_info, ppdesc);
1091 END_PROFILE(get_nt_acl);
1095 static NTSTATUS vfswrap_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp, uint32 security_info_sent, const SEC_DESC *psd)
1099 START_PROFILE(fset_nt_acl);
1100 result = set_nt_acl(fsp, security_info_sent, psd);
1101 END_PROFILE(fset_nt_acl);
1105 static int vfswrap_chmod_acl(vfs_handle_struct *handle, const char *name, mode_t mode)
1113 START_PROFILE(chmod_acl);
1114 result = chmod_acl(handle->conn, name, mode);
1115 END_PROFILE(chmod_acl);
1120 static int vfswrap_fchmod_acl(vfs_handle_struct *handle, files_struct *fsp, mode_t mode)
1128 START_PROFILE(fchmod_acl);
1129 result = fchmod_acl(fsp, mode);
1130 END_PROFILE(fchmod_acl);
1135 static int vfswrap_sys_acl_get_entry(vfs_handle_struct *handle, SMB_ACL_T theacl, int entry_id, SMB_ACL_ENTRY_T *entry_p)
1137 return sys_acl_get_entry(theacl, entry_id, entry_p);
1140 static int vfswrap_sys_acl_get_tag_type(vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p)
1142 return sys_acl_get_tag_type(entry_d, tag_type_p);
1145 static int vfswrap_sys_acl_get_permset(vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d, SMB_ACL_PERMSET_T *permset_p)
1147 return sys_acl_get_permset(entry_d, permset_p);
1150 static void * vfswrap_sys_acl_get_qualifier(vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d)
1152 return sys_acl_get_qualifier(entry_d);
1155 static SMB_ACL_T vfswrap_sys_acl_get_file(vfs_handle_struct *handle, const char *path_p, SMB_ACL_TYPE_T type)
1157 return sys_acl_get_file(handle, path_p, type);
1160 static SMB_ACL_T vfswrap_sys_acl_get_fd(vfs_handle_struct *handle, files_struct *fsp)
1162 return sys_acl_get_fd(handle, fsp);
1165 static int vfswrap_sys_acl_clear_perms(vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset)
1167 return sys_acl_clear_perms(permset);
1170 static int vfswrap_sys_acl_add_perm(vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm)
1172 return sys_acl_add_perm(permset, perm);
1175 static char * vfswrap_sys_acl_to_text(vfs_handle_struct *handle, SMB_ACL_T theacl, ssize_t *plen)
1177 return sys_acl_to_text(theacl, plen);
1180 static SMB_ACL_T vfswrap_sys_acl_init(vfs_handle_struct *handle, int count)
1182 return sys_acl_init(count);
1185 static int vfswrap_sys_acl_create_entry(vfs_handle_struct *handle, SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry)
1187 return sys_acl_create_entry(pacl, pentry);
1190 static int vfswrap_sys_acl_set_tag_type(vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tagtype)
1192 return sys_acl_set_tag_type(entry, tagtype);
1195 static int vfswrap_sys_acl_set_qualifier(vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, void *qual)
1197 return sys_acl_set_qualifier(entry, qual);
1200 static int vfswrap_sys_acl_set_permset(vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, SMB_ACL_PERMSET_T permset)
1202 return sys_acl_set_permset(entry, permset);
1205 static int vfswrap_sys_acl_valid(vfs_handle_struct *handle, SMB_ACL_T theacl )
1207 return sys_acl_valid(theacl );
1210 static int vfswrap_sys_acl_set_file(vfs_handle_struct *handle, const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl)
1212 return sys_acl_set_file(handle, name, acltype, theacl);
1215 static int vfswrap_sys_acl_set_fd(vfs_handle_struct *handle, files_struct *fsp, SMB_ACL_T theacl)
1217 return sys_acl_set_fd(handle, fsp, theacl);
1220 static int vfswrap_sys_acl_delete_def_file(vfs_handle_struct *handle, const char *path)
1222 return sys_acl_delete_def_file(handle, path);
1225 static int vfswrap_sys_acl_get_perm(vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm)
1227 return sys_acl_get_perm(permset, perm);
1230 static int vfswrap_sys_acl_free_text(vfs_handle_struct *handle, char *text)
1232 return sys_acl_free_text(text);
1235 static int vfswrap_sys_acl_free_acl(vfs_handle_struct *handle, SMB_ACL_T posix_acl)
1237 return sys_acl_free_acl(posix_acl);
1240 static int vfswrap_sys_acl_free_qualifier(vfs_handle_struct *handle, void *qualifier, SMB_ACL_TAG_T tagtype)
1242 return sys_acl_free_qualifier(qualifier, tagtype);
1245 /****************************************************************
1246 Extended attribute operations.
1247 *****************************************************************/
1249 static ssize_t vfswrap_getxattr(struct vfs_handle_struct *handle,const char *path, const char *name, void *value, size_t size)
1251 return sys_getxattr(path, name, value, size);
1254 static ssize_t vfswrap_lgetxattr(struct vfs_handle_struct *handle,const char *path, const char *name, void *value, size_t size)
1256 return sys_lgetxattr(path, name, value, size);
1259 static ssize_t vfswrap_fgetxattr(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, void *value, size_t size)
1261 return sys_fgetxattr(fsp->fh->fd, name, value, size);
1264 static ssize_t vfswrap_listxattr(struct vfs_handle_struct *handle, const char *path, char *list, size_t size)
1266 return sys_listxattr(path, list, size);
1269 ssize_t vfswrap_llistxattr(struct vfs_handle_struct *handle, const char *path, char *list, size_t size)
1271 return sys_llistxattr(path, list, size);
1274 ssize_t vfswrap_flistxattr(struct vfs_handle_struct *handle, struct files_struct *fsp, char *list, size_t size)
1276 return sys_flistxattr(fsp->fh->fd, list, size);
1279 static int vfswrap_removexattr(struct vfs_handle_struct *handle, const char *path, const char *name)
1281 return sys_removexattr(path, name);
1284 static int vfswrap_lremovexattr(struct vfs_handle_struct *handle, const char *path, const char *name)
1286 return sys_lremovexattr(path, name);
1289 static int vfswrap_fremovexattr(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name)
1291 return sys_fremovexattr(fsp->fh->fd, name);
1294 static int vfswrap_setxattr(struct vfs_handle_struct *handle, const char *path, const char *name, const void *value, size_t size, int flags)
1296 return sys_setxattr(path, name, value, size, flags);
1299 static int vfswrap_lsetxattr(struct vfs_handle_struct *handle, const char *path, const char *name, const void *value, size_t size, int flags)
1301 return sys_lsetxattr(path, name, value, size, flags);
1304 static int vfswrap_fsetxattr(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, const void *value, size_t size, int flags)
1306 return sys_fsetxattr(fsp->fh->fd, name, value, size, flags);
1309 static int vfswrap_aio_read(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)
1311 return sys_aio_read(aiocb);
1314 static int vfswrap_aio_write(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)
1316 return sys_aio_write(aiocb);
1319 static ssize_t vfswrap_aio_return(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)
1321 return sys_aio_return(aiocb);
1324 static int vfswrap_aio_cancel(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)
1326 return sys_aio_cancel(fsp->fh->fd, aiocb);
1329 static int vfswrap_aio_error(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)
1331 return sys_aio_error(aiocb);
1334 static int vfswrap_aio_fsync(struct vfs_handle_struct *handle, struct files_struct *fsp, int op, SMB_STRUCT_AIOCB *aiocb)
1336 return sys_aio_fsync(op, aiocb);
1339 static int vfswrap_aio_suspend(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_AIOCB * const aiocb[], int n, const struct timespec *timeout)
1341 return sys_aio_suspend(aiocb, n, timeout);
1344 static bool vfswrap_aio_force(struct vfs_handle_struct *handle, struct files_struct *fsp)
1349 static bool vfswrap_is_offline(struct vfs_handle_struct *handle, const char *path, SMB_STRUCT_STAT *sbuf)
1351 if (ISDOT(path) || ISDOTDOT(path)) {
1355 if (!lp_dmapi_support(SNUM(handle->conn)) || !dmapi_have_session()) {
1356 #if defined(ENOTSUP)
1362 return (dmapi_file_flags(path) & FILE_ATTRIBUTE_OFFLINE) != 0;
1365 static int vfswrap_set_offline(struct vfs_handle_struct *handle, const char *path)
1367 /* We don't know how to set offline bit by default, needs to be overriden in the vfs modules */
1368 #if defined(ENOTSUP)
1374 static vfs_op_tuple vfs_default_ops[] = {
1376 /* Disk operations */
1378 {SMB_VFS_OP(vfswrap_connect), SMB_VFS_OP_CONNECT,
1379 SMB_VFS_LAYER_OPAQUE},
1380 {SMB_VFS_OP(vfswrap_disconnect), SMB_VFS_OP_DISCONNECT,
1381 SMB_VFS_LAYER_OPAQUE},
1382 {SMB_VFS_OP(vfswrap_disk_free), SMB_VFS_OP_DISK_FREE,
1383 SMB_VFS_LAYER_OPAQUE},
1384 {SMB_VFS_OP(vfswrap_get_quota), SMB_VFS_OP_GET_QUOTA,
1385 SMB_VFS_LAYER_OPAQUE},
1386 {SMB_VFS_OP(vfswrap_set_quota), SMB_VFS_OP_SET_QUOTA,
1387 SMB_VFS_LAYER_OPAQUE},
1388 {SMB_VFS_OP(vfswrap_get_shadow_copy_data), SMB_VFS_OP_GET_SHADOW_COPY_DATA,
1389 SMB_VFS_LAYER_OPAQUE},
1390 {SMB_VFS_OP(vfswrap_statvfs), SMB_VFS_OP_STATVFS,
1391 SMB_VFS_LAYER_OPAQUE},
1392 {SMB_VFS_OP(vfswrap_fs_capabilities), SMB_VFS_OP_FS_CAPABILITIES,
1393 SMB_VFS_LAYER_OPAQUE},
1395 /* Directory operations */
1397 {SMB_VFS_OP(vfswrap_opendir), SMB_VFS_OP_OPENDIR,
1398 SMB_VFS_LAYER_OPAQUE},
1399 {SMB_VFS_OP(vfswrap_readdir), SMB_VFS_OP_READDIR,
1400 SMB_VFS_LAYER_OPAQUE},
1401 {SMB_VFS_OP(vfswrap_seekdir), SMB_VFS_OP_SEEKDIR,
1402 SMB_VFS_LAYER_OPAQUE},
1403 {SMB_VFS_OP(vfswrap_telldir), SMB_VFS_OP_TELLDIR,
1404 SMB_VFS_LAYER_OPAQUE},
1405 {SMB_VFS_OP(vfswrap_rewinddir), SMB_VFS_OP_REWINDDIR,
1406 SMB_VFS_LAYER_OPAQUE},
1407 {SMB_VFS_OP(vfswrap_mkdir), SMB_VFS_OP_MKDIR,
1408 SMB_VFS_LAYER_OPAQUE},
1409 {SMB_VFS_OP(vfswrap_rmdir), SMB_VFS_OP_RMDIR,
1410 SMB_VFS_LAYER_OPAQUE},
1411 {SMB_VFS_OP(vfswrap_closedir), SMB_VFS_OP_CLOSEDIR,
1412 SMB_VFS_LAYER_OPAQUE},
1414 /* File operations */
1416 {SMB_VFS_OP(vfswrap_open), SMB_VFS_OP_OPEN,
1417 SMB_VFS_LAYER_OPAQUE},
1418 {SMB_VFS_OP(vfswrap_create_file), SMB_VFS_OP_CREATE_FILE,
1419 SMB_VFS_LAYER_OPAQUE},
1420 {SMB_VFS_OP(vfswrap_close), SMB_VFS_OP_CLOSE,
1421 SMB_VFS_LAYER_OPAQUE},
1422 {SMB_VFS_OP(vfswrap_read), SMB_VFS_OP_READ,
1423 SMB_VFS_LAYER_OPAQUE},
1424 {SMB_VFS_OP(vfswrap_pread), SMB_VFS_OP_PREAD,
1425 SMB_VFS_LAYER_OPAQUE},
1426 {SMB_VFS_OP(vfswrap_write), SMB_VFS_OP_WRITE,
1427 SMB_VFS_LAYER_OPAQUE},
1428 {SMB_VFS_OP(vfswrap_pwrite), SMB_VFS_OP_PWRITE,
1429 SMB_VFS_LAYER_OPAQUE},
1430 {SMB_VFS_OP(vfswrap_lseek), SMB_VFS_OP_LSEEK,
1431 SMB_VFS_LAYER_OPAQUE},
1432 {SMB_VFS_OP(vfswrap_sendfile), SMB_VFS_OP_SENDFILE,
1433 SMB_VFS_LAYER_OPAQUE},
1434 {SMB_VFS_OP(vfswrap_recvfile), SMB_VFS_OP_RECVFILE,
1435 SMB_VFS_LAYER_OPAQUE},
1436 {SMB_VFS_OP(vfswrap_rename), SMB_VFS_OP_RENAME,
1437 SMB_VFS_LAYER_OPAQUE},
1438 {SMB_VFS_OP(vfswrap_fsync), SMB_VFS_OP_FSYNC,
1439 SMB_VFS_LAYER_OPAQUE},
1440 {SMB_VFS_OP(vfswrap_stat), SMB_VFS_OP_STAT,
1441 SMB_VFS_LAYER_OPAQUE},
1442 {SMB_VFS_OP(vfswrap_fstat), SMB_VFS_OP_FSTAT,
1443 SMB_VFS_LAYER_OPAQUE},
1444 {SMB_VFS_OP(vfswrap_lstat), SMB_VFS_OP_LSTAT,
1445 SMB_VFS_LAYER_OPAQUE},
1446 {SMB_VFS_OP(vfswrap_unlink), SMB_VFS_OP_UNLINK,
1447 SMB_VFS_LAYER_OPAQUE},
1448 {SMB_VFS_OP(vfswrap_chmod), SMB_VFS_OP_CHMOD,
1449 SMB_VFS_LAYER_OPAQUE},
1450 {SMB_VFS_OP(vfswrap_fchmod), SMB_VFS_OP_FCHMOD,
1451 SMB_VFS_LAYER_OPAQUE},
1452 {SMB_VFS_OP(vfswrap_chown), SMB_VFS_OP_CHOWN,
1453 SMB_VFS_LAYER_OPAQUE},
1454 {SMB_VFS_OP(vfswrap_fchown), SMB_VFS_OP_FCHOWN,
1455 SMB_VFS_LAYER_OPAQUE},
1456 {SMB_VFS_OP(vfswrap_lchown), SMB_VFS_OP_LCHOWN,
1457 SMB_VFS_LAYER_OPAQUE},
1458 {SMB_VFS_OP(vfswrap_chdir), SMB_VFS_OP_CHDIR,
1459 SMB_VFS_LAYER_OPAQUE},
1460 {SMB_VFS_OP(vfswrap_getwd), SMB_VFS_OP_GETWD,
1461 SMB_VFS_LAYER_OPAQUE},
1462 {SMB_VFS_OP(vfswrap_ntimes), SMB_VFS_OP_NTIMES,
1463 SMB_VFS_LAYER_OPAQUE},
1464 {SMB_VFS_OP(vfswrap_ftruncate), SMB_VFS_OP_FTRUNCATE,
1465 SMB_VFS_LAYER_OPAQUE},
1466 {SMB_VFS_OP(vfswrap_lock), SMB_VFS_OP_LOCK,
1467 SMB_VFS_LAYER_OPAQUE},
1468 {SMB_VFS_OP(vfswrap_kernel_flock), SMB_VFS_OP_KERNEL_FLOCK,
1469 SMB_VFS_LAYER_OPAQUE},
1470 {SMB_VFS_OP(vfswrap_linux_setlease), SMB_VFS_OP_LINUX_SETLEASE,
1471 SMB_VFS_LAYER_OPAQUE},
1472 {SMB_VFS_OP(vfswrap_getlock), SMB_VFS_OP_GETLOCK,
1473 SMB_VFS_LAYER_OPAQUE},
1474 {SMB_VFS_OP(vfswrap_symlink), SMB_VFS_OP_SYMLINK,
1475 SMB_VFS_LAYER_OPAQUE},
1476 {SMB_VFS_OP(vfswrap_readlink), SMB_VFS_OP_READLINK,
1477 SMB_VFS_LAYER_OPAQUE},
1478 {SMB_VFS_OP(vfswrap_link), SMB_VFS_OP_LINK,
1479 SMB_VFS_LAYER_OPAQUE},
1480 {SMB_VFS_OP(vfswrap_mknod), SMB_VFS_OP_MKNOD,
1481 SMB_VFS_LAYER_OPAQUE},
1482 {SMB_VFS_OP(vfswrap_realpath), SMB_VFS_OP_REALPATH,
1483 SMB_VFS_LAYER_OPAQUE},
1484 {SMB_VFS_OP(vfswrap_notify_watch), SMB_VFS_OP_NOTIFY_WATCH,
1485 SMB_VFS_LAYER_OPAQUE},
1486 {SMB_VFS_OP(vfswrap_chflags), SMB_VFS_OP_CHFLAGS,
1487 SMB_VFS_LAYER_OPAQUE},
1488 {SMB_VFS_OP(vfswrap_file_id_create), SMB_VFS_OP_FILE_ID_CREATE,
1489 SMB_VFS_LAYER_OPAQUE},
1490 {SMB_VFS_OP(vfswrap_streaminfo), SMB_VFS_OP_STREAMINFO,
1491 SMB_VFS_LAYER_OPAQUE},
1492 {SMB_VFS_OP(vfswrap_get_real_filename), SMB_VFS_OP_GET_REAL_FILENAME,
1493 SMB_VFS_LAYER_OPAQUE},
1495 /* NT ACL operations. */
1497 {SMB_VFS_OP(vfswrap_fget_nt_acl), SMB_VFS_OP_FGET_NT_ACL,
1498 SMB_VFS_LAYER_OPAQUE},
1499 {SMB_VFS_OP(vfswrap_get_nt_acl), SMB_VFS_OP_GET_NT_ACL,
1500 SMB_VFS_LAYER_OPAQUE},
1501 {SMB_VFS_OP(vfswrap_fset_nt_acl), SMB_VFS_OP_FSET_NT_ACL,
1502 SMB_VFS_LAYER_OPAQUE},
1504 /* POSIX ACL operations. */
1506 {SMB_VFS_OP(vfswrap_chmod_acl), SMB_VFS_OP_CHMOD_ACL,
1507 SMB_VFS_LAYER_OPAQUE},
1508 {SMB_VFS_OP(vfswrap_fchmod_acl), SMB_VFS_OP_FCHMOD_ACL,
1509 SMB_VFS_LAYER_OPAQUE},
1510 {SMB_VFS_OP(vfswrap_sys_acl_get_entry), SMB_VFS_OP_SYS_ACL_GET_ENTRY,
1511 SMB_VFS_LAYER_OPAQUE},
1512 {SMB_VFS_OP(vfswrap_sys_acl_get_tag_type), SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE,
1513 SMB_VFS_LAYER_OPAQUE},
1514 {SMB_VFS_OP(vfswrap_sys_acl_get_permset), SMB_VFS_OP_SYS_ACL_GET_PERMSET,
1515 SMB_VFS_LAYER_OPAQUE},
1516 {SMB_VFS_OP(vfswrap_sys_acl_get_qualifier), SMB_VFS_OP_SYS_ACL_GET_QUALIFIER,
1517 SMB_VFS_LAYER_OPAQUE},
1518 {SMB_VFS_OP(vfswrap_sys_acl_get_file), SMB_VFS_OP_SYS_ACL_GET_FILE,
1519 SMB_VFS_LAYER_OPAQUE},
1520 {SMB_VFS_OP(vfswrap_sys_acl_get_fd), SMB_VFS_OP_SYS_ACL_GET_FD,
1521 SMB_VFS_LAYER_OPAQUE},
1522 {SMB_VFS_OP(vfswrap_sys_acl_clear_perms), SMB_VFS_OP_SYS_ACL_CLEAR_PERMS,
1523 SMB_VFS_LAYER_OPAQUE},
1524 {SMB_VFS_OP(vfswrap_sys_acl_add_perm), SMB_VFS_OP_SYS_ACL_ADD_PERM,
1525 SMB_VFS_LAYER_OPAQUE},
1526 {SMB_VFS_OP(vfswrap_sys_acl_to_text), SMB_VFS_OP_SYS_ACL_TO_TEXT,
1527 SMB_VFS_LAYER_OPAQUE},
1528 {SMB_VFS_OP(vfswrap_sys_acl_init), SMB_VFS_OP_SYS_ACL_INIT,
1529 SMB_VFS_LAYER_OPAQUE},
1530 {SMB_VFS_OP(vfswrap_sys_acl_create_entry), SMB_VFS_OP_SYS_ACL_CREATE_ENTRY,
1531 SMB_VFS_LAYER_OPAQUE},
1532 {SMB_VFS_OP(vfswrap_sys_acl_set_tag_type), SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE,
1533 SMB_VFS_LAYER_OPAQUE},
1534 {SMB_VFS_OP(vfswrap_sys_acl_set_qualifier), SMB_VFS_OP_SYS_ACL_SET_QUALIFIER,
1535 SMB_VFS_LAYER_OPAQUE},
1536 {SMB_VFS_OP(vfswrap_sys_acl_set_permset), SMB_VFS_OP_SYS_ACL_SET_PERMSET,
1537 SMB_VFS_LAYER_OPAQUE},
1538 {SMB_VFS_OP(vfswrap_sys_acl_valid), SMB_VFS_OP_SYS_ACL_VALID,
1539 SMB_VFS_LAYER_OPAQUE},
1540 {SMB_VFS_OP(vfswrap_sys_acl_set_file), SMB_VFS_OP_SYS_ACL_SET_FILE,
1541 SMB_VFS_LAYER_OPAQUE},
1542 {SMB_VFS_OP(vfswrap_sys_acl_set_fd), SMB_VFS_OP_SYS_ACL_SET_FD,
1543 SMB_VFS_LAYER_OPAQUE},
1544 {SMB_VFS_OP(vfswrap_sys_acl_delete_def_file), SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE,
1545 SMB_VFS_LAYER_OPAQUE},
1546 {SMB_VFS_OP(vfswrap_sys_acl_get_perm), SMB_VFS_OP_SYS_ACL_GET_PERM,
1547 SMB_VFS_LAYER_OPAQUE},
1548 {SMB_VFS_OP(vfswrap_sys_acl_free_text), SMB_VFS_OP_SYS_ACL_FREE_TEXT,
1549 SMB_VFS_LAYER_OPAQUE},
1550 {SMB_VFS_OP(vfswrap_sys_acl_free_acl), SMB_VFS_OP_SYS_ACL_FREE_ACL,
1551 SMB_VFS_LAYER_OPAQUE},
1552 {SMB_VFS_OP(vfswrap_sys_acl_free_qualifier), SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER,
1553 SMB_VFS_LAYER_OPAQUE},
1555 /* EA operations. */
1557 {SMB_VFS_OP(vfswrap_getxattr), SMB_VFS_OP_GETXATTR,
1558 SMB_VFS_LAYER_OPAQUE},
1559 {SMB_VFS_OP(vfswrap_lgetxattr), SMB_VFS_OP_LGETXATTR,
1560 SMB_VFS_LAYER_OPAQUE},
1561 {SMB_VFS_OP(vfswrap_fgetxattr), SMB_VFS_OP_FGETXATTR,
1562 SMB_VFS_LAYER_OPAQUE},
1563 {SMB_VFS_OP(vfswrap_listxattr), SMB_VFS_OP_LISTXATTR,
1564 SMB_VFS_LAYER_OPAQUE},
1565 {SMB_VFS_OP(vfswrap_llistxattr), SMB_VFS_OP_LLISTXATTR,
1566 SMB_VFS_LAYER_OPAQUE},
1567 {SMB_VFS_OP(vfswrap_flistxattr), SMB_VFS_OP_FLISTXATTR,
1568 SMB_VFS_LAYER_OPAQUE},
1569 {SMB_VFS_OP(vfswrap_removexattr), SMB_VFS_OP_REMOVEXATTR,
1570 SMB_VFS_LAYER_OPAQUE},
1571 {SMB_VFS_OP(vfswrap_lremovexattr), SMB_VFS_OP_LREMOVEXATTR,
1572 SMB_VFS_LAYER_OPAQUE},
1573 {SMB_VFS_OP(vfswrap_fremovexattr), SMB_VFS_OP_FREMOVEXATTR,
1574 SMB_VFS_LAYER_OPAQUE},
1575 {SMB_VFS_OP(vfswrap_setxattr), SMB_VFS_OP_SETXATTR,
1576 SMB_VFS_LAYER_OPAQUE},
1577 {SMB_VFS_OP(vfswrap_lsetxattr), SMB_VFS_OP_LSETXATTR,
1578 SMB_VFS_LAYER_OPAQUE},
1579 {SMB_VFS_OP(vfswrap_fsetxattr), SMB_VFS_OP_FSETXATTR,
1580 SMB_VFS_LAYER_OPAQUE},
1582 {SMB_VFS_OP(vfswrap_aio_read), SMB_VFS_OP_AIO_READ,
1583 SMB_VFS_LAYER_OPAQUE},
1584 {SMB_VFS_OP(vfswrap_aio_write), SMB_VFS_OP_AIO_WRITE,
1585 SMB_VFS_LAYER_OPAQUE},
1586 {SMB_VFS_OP(vfswrap_aio_return), SMB_VFS_OP_AIO_RETURN,
1587 SMB_VFS_LAYER_OPAQUE},
1588 {SMB_VFS_OP(vfswrap_aio_cancel), SMB_VFS_OP_AIO_CANCEL,
1589 SMB_VFS_LAYER_OPAQUE},
1590 {SMB_VFS_OP(vfswrap_aio_error), SMB_VFS_OP_AIO_ERROR,
1591 SMB_VFS_LAYER_OPAQUE},
1592 {SMB_VFS_OP(vfswrap_aio_fsync), SMB_VFS_OP_AIO_FSYNC,
1593 SMB_VFS_LAYER_OPAQUE},
1594 {SMB_VFS_OP(vfswrap_aio_suspend),SMB_VFS_OP_AIO_SUSPEND,
1595 SMB_VFS_LAYER_OPAQUE},
1597 {SMB_VFS_OP(vfswrap_aio_force), SMB_VFS_OP_AIO_FORCE,
1598 SMB_VFS_LAYER_OPAQUE},
1600 {SMB_VFS_OP(vfswrap_is_offline),SMB_VFS_OP_IS_OFFLINE,
1601 SMB_VFS_LAYER_OPAQUE},
1602 {SMB_VFS_OP(vfswrap_set_offline),SMB_VFS_OP_SET_OFFLINE,
1603 SMB_VFS_LAYER_OPAQUE},
1605 /* Finish VFS operations definition */
1607 {SMB_VFS_OP(NULL), SMB_VFS_OP_NOOP,
1611 NTSTATUS vfs_default_init(void);
1612 NTSTATUS vfs_default_init(void)
1614 unsigned int needed = SMB_VFS_OP_LAST + 1; /* convert from index to count */
1616 if (ARRAY_SIZE(vfs_default_ops) != needed) {
1617 DEBUG(0, ("%s: %u ops registered, but %u ops are required\n",
1618 DEFAULT_VFS_MODULE_NAME, (unsigned int)ARRAY_SIZE(vfs_default_ops), needed));
1619 smb_panic("operation(s) missing from default VFS module");
1622 return smb_register_vfs(SMB_VFS_INTERFACE_VERSION,
1623 DEFAULT_VFS_MODULE_NAME, vfs_default_ops);