r10458: Patches from Jiri Sasek <Jiri.Sasek@Sun.COM> to help
[Samba/nascimento.git] / source3 / smbd / vfs-wrap.c
blob9ae1592a8e19e79ecceb84a1b67479a7fd88851f
1 /*
2 Unix SMB/CIFS implementation.
3 Wrap disk only vfs functions to sidestep dodgy compilers.
4 Copyright (C) Tim Potter 1998
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "includes.h"
23 #undef DBGC_CLASS
24 #define DBGC_CLASS DBGC_VFS
27 /* Check for NULL pointer parameters in vfswrap_* functions */
29 /* We don't want to have NULL function pointers lying around. Someone
30 is sure to try and execute them. These stubs are used to prevent
31 this possibility. */
33 int vfswrap_dummy_connect(vfs_handle_struct *handle, connection_struct *conn, const char *service, const char *user)
35 return 0; /* Return >= 0 for success */
38 void vfswrap_dummy_disconnect(vfs_handle_struct *handle, connection_struct *conn)
42 /* Disk operations */
44 SMB_BIG_UINT vfswrap_disk_free(vfs_handle_struct *handle, connection_struct *conn, const char *path, BOOL small_query, SMB_BIG_UINT *bsize,
45 SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize)
47 SMB_BIG_UINT result;
49 result = sys_disk_free(path, small_query, bsize, dfree, dsize);
50 return result;
53 int vfswrap_get_quota(struct vfs_handle_struct *handle, struct connection_struct *conn, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *qt)
55 #ifdef HAVE_SYS_QUOTAS
56 int result;
58 START_PROFILE(syscall_get_quota);
59 result = sys_get_quota(conn->connectpath, qtype, id, qt);
60 END_PROFILE(syscall_get_quota);
61 return result;
62 #else
63 errno = ENOSYS;
64 return -1;
65 #endif
68 int vfswrap_set_quota(struct vfs_handle_struct *handle, struct connection_struct *conn, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *qt)
70 #ifdef HAVE_SYS_QUOTAS
71 int result;
73 START_PROFILE(syscall_set_quota);
74 result = sys_set_quota(conn->connectpath, qtype, id, qt);
75 END_PROFILE(syscall_set_quota);
76 return result;
77 #else
78 errno = ENOSYS;
79 return -1;
80 #endif
83 int vfswrap_get_shadow_copy_data(struct vfs_handle_struct *handle, struct files_struct *fsp, SHADOW_COPY_DATA *shadow_copy_data, BOOL labels)
85 errno = ENOSYS;
86 return -1; /* Not implemented. */
89 /* Directory operations */
91 SMB_STRUCT_DIR *vfswrap_opendir(vfs_handle_struct *handle, connection_struct *conn, const char *fname, const char *mask, uint32 attr)
93 SMB_STRUCT_DIR *result;
95 START_PROFILE(syscall_opendir);
96 result = sys_opendir(fname);
97 END_PROFILE(syscall_opendir);
98 return result;
101 SMB_STRUCT_DIRENT *vfswrap_readdir(vfs_handle_struct *handle, connection_struct *conn, SMB_STRUCT_DIR *dirp)
103 SMB_STRUCT_DIRENT *result;
105 START_PROFILE(syscall_readdir);
106 result = sys_readdir(dirp);
107 END_PROFILE(syscall_readdir);
108 return result;
111 void vfswrap_seekdir(vfs_handle_struct *handle, connection_struct *conn, SMB_STRUCT_DIR *dirp, long offset)
113 START_PROFILE(syscall_seekdir);
114 sys_seekdir(dirp, offset);
115 END_PROFILE(syscall_seekdir);
118 long vfswrap_telldir(vfs_handle_struct *handle, connection_struct *conn, SMB_STRUCT_DIR *dirp)
120 long result;
121 START_PROFILE(syscall_telldir);
122 result = sys_telldir(dirp);
123 END_PROFILE(syscall_telldir);
124 return result;
127 void vfswrap_rewinddir(vfs_handle_struct *handle, connection_struct *conn, SMB_STRUCT_DIR *dirp)
129 START_PROFILE(syscall_rewinddir);
130 sys_rewinddir(dirp);
131 END_PROFILE(syscall_rewinddir);
134 int vfswrap_mkdir(vfs_handle_struct *handle, connection_struct *conn, const char *path, mode_t mode)
136 int result;
137 BOOL has_dacl = False;
139 START_PROFILE(syscall_mkdir);
141 if (lp_inherit_acls(SNUM(conn)) && (has_dacl = directory_has_default_acl(conn, parent_dirname(path))))
142 mode = 0777;
144 result = mkdir(path, mode);
146 if (result == 0 && !has_dacl) {
148 * We need to do this as the default behavior of POSIX ACLs
149 * is to set the mask to be the requested group permission
150 * bits, not the group permission bits to be the requested
151 * group permission bits. This is not what we want, as it will
152 * mess up any inherited ACL bits that were set. JRA.
154 int saved_errno = errno; /* We may get ENOSYS */
155 if ((SMB_VFS_CHMOD_ACL(conn, path, mode) == -1) && (errno == ENOSYS))
156 errno = saved_errno;
159 END_PROFILE(syscall_mkdir);
160 return result;
163 int vfswrap_rmdir(vfs_handle_struct *handle, connection_struct *conn, const char *path)
165 int result;
167 START_PROFILE(syscall_rmdir);
168 result = rmdir(path);
169 END_PROFILE(syscall_rmdir);
170 return result;
173 int vfswrap_closedir(vfs_handle_struct *handle, connection_struct *conn, SMB_STRUCT_DIR *dirp)
175 int result;
177 START_PROFILE(syscall_closedir);
178 result = sys_closedir(dirp);
179 END_PROFILE(syscall_closedir);
180 return result;
183 /* File operations */
185 int vfswrap_open(vfs_handle_struct *handle, connection_struct *conn, const char *fname, int flags, mode_t mode)
187 int result;
189 START_PROFILE(syscall_open);
190 result = sys_open(fname, flags, mode);
191 END_PROFILE(syscall_open);
192 return result;
195 int vfswrap_close(vfs_handle_struct *handle, files_struct *fsp, int fd)
197 int result;
199 START_PROFILE(syscall_close);
201 result = close(fd);
202 END_PROFILE(syscall_close);
203 return result;
206 ssize_t vfswrap_read(vfs_handle_struct *handle, files_struct *fsp, int fd, void *data, size_t n)
208 ssize_t result;
210 START_PROFILE_BYTES(syscall_read, n);
211 result = sys_read(fd, data, n);
212 END_PROFILE(syscall_read);
213 return result;
216 ssize_t vfswrap_pread(vfs_handle_struct *handle, files_struct *fsp, int fd, void *data,
217 size_t n, SMB_OFF_T offset)
219 ssize_t result;
221 #if defined(HAVE_PREAD) || defined(HAVE_PREAD64)
222 START_PROFILE_BYTES(syscall_pread, n);
223 result = sys_pread(fd, data, n, offset);
224 END_PROFILE(syscall_pread);
226 if (result == -1 && errno == ESPIPE) {
227 /* Maintain the fiction that pipes can be seeked (sought?) on. */
228 result = SMB_VFS_READ(fsp, fd, data, n);
229 fsp->fh->pos = 0;
232 #else /* HAVE_PREAD */
233 SMB_OFF_T curr;
234 int lerrno;
236 curr = SMB_VFS_LSEEK(fsp, fd, 0, SEEK_CUR);
237 if (curr == -1 && errno == ESPIPE) {
238 /* Maintain the fiction that pipes can be seeked (sought?) on. */
239 result = SMB_VFS_READ(fsp, fd, data, n);
240 fsp->fh->pos = 0;
241 return result;
244 if (SMB_VFS_LSEEK(fsp, fd, offset, SEEK_SET) == -1) {
245 return -1;
248 errno = 0;
249 result = SMB_VFS_READ(fsp, fd, data, n);
250 lerrno = errno;
252 SMB_VFS_LSEEK(fsp, fd, curr, SEEK_SET);
253 errno = lerrno;
255 #endif /* HAVE_PREAD */
257 return result;
260 ssize_t vfswrap_write(vfs_handle_struct *handle, files_struct *fsp, int fd, const void *data, size_t n)
262 ssize_t result;
264 START_PROFILE_BYTES(syscall_write, n);
265 result = sys_write(fd, data, n);
266 END_PROFILE(syscall_write);
267 return result;
270 ssize_t vfswrap_pwrite(vfs_handle_struct *handle, files_struct *fsp, int fd, const void *data,
271 size_t n, SMB_OFF_T offset)
273 ssize_t result;
275 #if defined(HAVE_PWRITE) || defined(HAVE_PRWITE64)
276 START_PROFILE_BYTES(syscall_pwrite, n);
277 result = sys_pwrite(fd, data, n, offset);
278 END_PROFILE(syscall_pwrite);
280 if (result == -1 && errno == ESPIPE) {
281 /* Maintain the fiction that pipes can be sought on. */
282 result = SMB_VFS_WRITE(fsp, fd, data, n);
285 #else /* HAVE_PWRITE */
286 SMB_OFF_T curr;
287 int lerrno;
289 curr = SMB_VFS_LSEEK(fsp, fd, 0, SEEK_CUR);
290 if (curr == -1) {
291 return -1;
294 if (SMB_VFS_LSEEK(fsp, fd, offset, SEEK_SET) == -1) {
295 return -1;
298 result = SMB_VFS_WRITE(fsp, fd, data, n);
299 lerrno = errno;
301 SMB_VFS_LSEEK(fsp, fd, curr, SEEK_SET);
302 errno = lerrno;
304 #endif /* HAVE_PWRITE */
306 return result;
309 SMB_OFF_T vfswrap_lseek(vfs_handle_struct *handle, files_struct *fsp, int filedes, SMB_OFF_T offset, int whence)
311 SMB_OFF_T result = 0;
313 START_PROFILE(syscall_lseek);
315 /* Cope with 'stat' file opens. */
316 if (filedes != -1)
317 result = sys_lseek(filedes, offset, whence);
320 * We want to maintain the fiction that we can seek
321 * on a fifo for file system purposes. This allows
322 * people to set up UNIX fifo's that feed data to Windows
323 * applications. JRA.
326 if((result == -1) && (errno == ESPIPE)) {
327 result = 0;
328 errno = 0;
331 END_PROFILE(syscall_lseek);
332 return result;
335 ssize_t vfswrap_sendfile(vfs_handle_struct *handle, int tofd, files_struct *fsp, int fromfd, const DATA_BLOB *hdr,
336 SMB_OFF_T offset, size_t n)
338 ssize_t result;
340 START_PROFILE_BYTES(syscall_sendfile, n);
341 result = sys_sendfile(tofd, fromfd, hdr, offset, n);
342 END_PROFILE(syscall_sendfile);
343 return result;
346 /*********************************************************
347 For rename across filesystems Patch from Warren Birnbaum
348 <warrenb@hpcvscdp.cv.hp.com>
349 **********************************************************/
351 static int copy_reg(const char *source, const char *dest)
353 SMB_STRUCT_STAT source_stats;
354 int saved_errno;
355 int ifd = -1;
356 int ofd = -1;
358 if (sys_lstat (source, &source_stats) == -1)
359 return -1;
361 if (!S_ISREG (source_stats.st_mode))
362 return -1;
364 if((ifd = sys_open (source, O_RDONLY, 0)) < 0)
365 return -1;
367 if (unlink (dest) && errno != ENOENT)
368 return -1;
370 #ifdef O_NOFOLLOW
371 if((ofd = sys_open (dest, O_WRONLY | O_CREAT | O_TRUNC | O_NOFOLLOW, 0600)) < 0 )
372 #else
373 if((ofd = sys_open (dest, O_WRONLY | O_CREAT | O_TRUNC , 0600)) < 0 )
374 #endif
375 goto err;
377 if (transfer_file(ifd, ofd, (size_t)-1) == -1)
378 goto err;
381 * Try to preserve ownership. For non-root it might fail, but that's ok.
382 * But root probably wants to know, e.g. if NFS disallows it.
385 #ifdef HAVE_FCHOWN
386 if ((fchown(ofd, source_stats.st_uid, source_stats.st_gid) == -1) && (errno != EPERM))
387 #else
388 if ((chown(dest, source_stats.st_uid, source_stats.st_gid) == -1) && (errno != EPERM))
389 #endif
390 goto err;
393 * fchown turns off set[ug]id bits for non-root,
394 * so do the chmod last.
397 #if defined(HAVE_FCHMOD)
398 if (fchmod (ofd, source_stats.st_mode & 07777))
399 #else
400 if (chmod (dest, source_stats.st_mode & 07777))
401 #endif
402 goto err;
404 if (close (ifd) == -1)
405 goto err;
407 if (close (ofd) == -1)
408 return -1;
410 /* Try to copy the old file's modtime and access time. */
412 struct utimbuf tv;
414 tv.actime = source_stats.st_atime;
415 tv.modtime = source_stats.st_mtime;
416 utime(dest, &tv);
419 if (unlink (source) == -1)
420 return -1;
422 return 0;
424 err:
426 saved_errno = errno;
427 if (ifd != -1)
428 close(ifd);
429 if (ofd != -1)
430 close(ofd);
431 errno = saved_errno;
432 return -1;
435 int vfswrap_rename(vfs_handle_struct *handle, connection_struct *conn, const char *oldname, const char *newname)
437 int result;
439 START_PROFILE(syscall_rename);
440 result = rename(oldname, newname);
441 if (errno == EXDEV) {
442 /* Rename across filesystems needed. */
443 result = copy_reg(oldname, newname);
446 END_PROFILE(syscall_rename);
447 return result;
450 int vfswrap_fsync(vfs_handle_struct *handle, files_struct *fsp, int fd)
452 #ifdef HAVE_FSYNC
453 int result;
455 START_PROFILE(syscall_fsync);
456 result = fsync(fd);
457 END_PROFILE(syscall_fsync);
458 return result;
459 #else
460 return 0;
461 #endif
464 int vfswrap_stat(vfs_handle_struct *handle, connection_struct *conn, const char *fname, SMB_STRUCT_STAT *sbuf)
466 int result;
468 START_PROFILE(syscall_stat);
469 result = sys_stat(fname, sbuf);
470 END_PROFILE(syscall_stat);
471 return result;
474 int vfswrap_fstat(vfs_handle_struct *handle, files_struct *fsp, int fd, SMB_STRUCT_STAT *sbuf)
476 int result;
478 START_PROFILE(syscall_fstat);
479 result = sys_fstat(fd, sbuf);
480 END_PROFILE(syscall_fstat);
481 return result;
484 int vfswrap_lstat(vfs_handle_struct *handle, connection_struct *conn, const char *path, SMB_STRUCT_STAT *sbuf)
486 int result;
488 START_PROFILE(syscall_lstat);
489 result = sys_lstat(path, sbuf);
490 END_PROFILE(syscall_lstat);
491 return result;
494 int vfswrap_unlink(vfs_handle_struct *handle, connection_struct *conn, const char *path)
496 int result;
498 START_PROFILE(syscall_unlink);
499 result = unlink(path);
500 END_PROFILE(syscall_unlink);
501 return result;
504 int vfswrap_chmod(vfs_handle_struct *handle, connection_struct *conn, const char *path, mode_t mode)
506 int result;
508 START_PROFILE(syscall_chmod);
511 * We need to do this due to the fact that the default POSIX ACL
512 * chmod modifies the ACL *mask* for the group owner, not the
513 * group owner bits directly. JRA.
518 int saved_errno = errno; /* We might get ENOSYS */
519 if ((result = SMB_VFS_CHMOD_ACL(conn, path, mode)) == 0) {
520 END_PROFILE(syscall_chmod);
521 return result;
523 /* Error - return the old errno. */
524 errno = saved_errno;
527 result = chmod(path, mode);
528 END_PROFILE(syscall_chmod);
529 return result;
532 int vfswrap_fchmod(vfs_handle_struct *handle, files_struct *fsp, int fd, mode_t mode)
534 int result;
536 START_PROFILE(syscall_fchmod);
539 * We need to do this due to the fact that the default POSIX ACL
540 * chmod modifies the ACL *mask* for the group owner, not the
541 * group owner bits directly. JRA.
545 int saved_errno = errno; /* We might get ENOSYS */
546 if ((result = SMB_VFS_FCHMOD_ACL(fsp, fd, mode)) == 0) {
547 END_PROFILE(syscall_chmod);
548 return result;
550 /* Error - return the old errno. */
551 errno = saved_errno;
554 #if defined(HAVE_FCHMOD)
555 result = fchmod(fd, mode);
556 #else
557 result = -1;
558 errno = ENOSYS;
559 #endif
561 END_PROFILE(syscall_fchmod);
562 return result;
565 int vfswrap_chown(vfs_handle_struct *handle, connection_struct *conn, const char *path, uid_t uid, gid_t gid)
567 int result;
569 START_PROFILE(syscall_chown);
570 result = sys_chown(path, uid, gid);
571 END_PROFILE(syscall_chown);
572 return result;
575 int vfswrap_fchown(vfs_handle_struct *handle, files_struct *fsp, int fd, uid_t uid, gid_t gid)
577 #ifdef HAVE_FCHOWN
578 int result;
580 START_PROFILE(syscall_fchown);
581 result = fchown(fd, uid, gid);
582 END_PROFILE(syscall_fchown);
583 return result;
584 #else
585 errno = ENOSYS;
586 return -1;
587 #endif
590 int vfswrap_chdir(vfs_handle_struct *handle, connection_struct *conn, const char *path)
592 int result;
594 START_PROFILE(syscall_chdir);
595 result = chdir(path);
596 END_PROFILE(syscall_chdir);
597 return result;
600 char *vfswrap_getwd(vfs_handle_struct *handle, connection_struct *conn, char *path)
602 char *result;
604 START_PROFILE(syscall_getwd);
605 result = sys_getwd(path);
606 END_PROFILE(syscall_getwd);
607 return result;
610 int vfswrap_utime(vfs_handle_struct *handle, connection_struct *conn, const char *path, struct utimbuf *times)
612 int result;
614 START_PROFILE(syscall_utime);
615 result = utime(path, times);
616 END_PROFILE(syscall_utime);
617 return result;
620 /*********************************************************************
621 A version of ftruncate that will write the space on disk if strict
622 allocate is set.
623 **********************************************************************/
625 static int strict_allocate_ftruncate(vfs_handle_struct *handle, files_struct *fsp, int fd, SMB_OFF_T len)
627 SMB_STRUCT_STAT st;
628 SMB_OFF_T currpos = SMB_VFS_LSEEK(fsp, fd, 0, SEEK_CUR);
629 unsigned char zero_space[4096];
630 SMB_OFF_T space_to_write;
632 if (currpos == -1)
633 return -1;
635 if (SMB_VFS_FSTAT(fsp, fd, &st) == -1)
636 return -1;
638 space_to_write = len - st.st_size;
640 #ifdef S_ISFIFO
641 if (S_ISFIFO(st.st_mode))
642 return 0;
643 #endif
645 if (st.st_size == len)
646 return 0;
648 /* Shrink - just ftruncate. */
649 if (st.st_size > len)
650 return sys_ftruncate(fd, len);
652 /* Write out the real space on disk. */
653 if (SMB_VFS_LSEEK(fsp, fd, st.st_size, SEEK_SET) != st.st_size)
654 return -1;
656 space_to_write = len - st.st_size;
658 memset(zero_space, '\0', sizeof(zero_space));
659 while ( space_to_write > 0) {
660 SMB_OFF_T retlen;
661 SMB_OFF_T current_len_to_write = MIN(sizeof(zero_space),space_to_write);
663 retlen = SMB_VFS_WRITE(fsp,fsp->fh->fd,(char *)zero_space,current_len_to_write);
664 if (retlen <= 0)
665 return -1;
667 space_to_write -= retlen;
670 /* Seek to where we were */
671 if (SMB_VFS_LSEEK(fsp, fd, currpos, SEEK_SET) != currpos)
672 return -1;
674 return 0;
677 int vfswrap_ftruncate(vfs_handle_struct *handle, files_struct *fsp, int fd, SMB_OFF_T len)
679 int result = -1;
680 SMB_STRUCT_STAT st;
681 char c = 0;
682 SMB_OFF_T currpos;
684 START_PROFILE(syscall_ftruncate);
686 if (lp_strict_allocate(SNUM(fsp->conn))) {
687 result = strict_allocate_ftruncate(handle, fsp, fd, len);
688 END_PROFILE(syscall_ftruncate);
689 return result;
692 /* we used to just check HAVE_FTRUNCATE_EXTEND and only use
693 sys_ftruncate if the system supports it. Then I discovered that
694 you can have some filesystems that support ftruncate
695 expansion and some that don't! On Linux fat can't do
696 ftruncate extend but ext2 can. */
698 result = sys_ftruncate(fd, len);
699 if (result == 0)
700 goto done;
702 /* According to W. R. Stevens advanced UNIX prog. Pure 4.3 BSD cannot
703 extend a file with ftruncate. Provide alternate implementation
704 for this */
705 currpos = SMB_VFS_LSEEK(fsp, fd, 0, SEEK_CUR);
706 if (currpos == -1) {
707 goto done;
710 /* Do an fstat to see if the file is longer than the requested
711 size in which case the ftruncate above should have
712 succeeded or shorter, in which case seek to len - 1 and
713 write 1 byte of zero */
714 if (SMB_VFS_FSTAT(fsp, fd, &st) == -1) {
715 goto done;
718 #ifdef S_ISFIFO
719 if (S_ISFIFO(st.st_mode)) {
720 result = 0;
721 goto done;
723 #endif
725 if (st.st_size == len) {
726 result = 0;
727 goto done;
730 if (st.st_size > len) {
731 /* the sys_ftruncate should have worked */
732 goto done;
735 if (SMB_VFS_LSEEK(fsp, fd, len-1, SEEK_SET) != len -1)
736 goto done;
738 if (SMB_VFS_WRITE(fsp, fd, &c, 1)!=1)
739 goto done;
741 /* Seek to where we were */
742 if (SMB_VFS_LSEEK(fsp, fd, currpos, SEEK_SET) != currpos)
743 goto done;
744 result = 0;
746 done:
748 END_PROFILE(syscall_ftruncate);
749 return result;
752 BOOL vfswrap_lock(vfs_handle_struct *handle, files_struct *fsp, int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
754 BOOL result;
756 START_PROFILE(syscall_fcntl_lock);
757 result = fcntl_lock(fd, op, offset, count,type);
758 END_PROFILE(syscall_fcntl_lock);
759 return result;
762 int vfswrap_symlink(vfs_handle_struct *handle, connection_struct *conn, const char *oldpath, const char *newpath)
764 int result;
766 START_PROFILE(syscall_symlink);
767 result = sys_symlink(oldpath, newpath);
768 END_PROFILE(syscall_symlink);
769 return result;
772 int vfswrap_readlink(vfs_handle_struct *handle, connection_struct *conn, const char *path, char *buf, size_t bufsiz)
774 int result;
776 START_PROFILE(syscall_readlink);
777 result = sys_readlink(path, buf, bufsiz);
778 END_PROFILE(syscall_readlink);
779 return result;
782 int vfswrap_link(vfs_handle_struct *handle, connection_struct *conn, const char *oldpath, const char *newpath)
784 int result;
786 START_PROFILE(syscall_link);
787 result = sys_link(oldpath, newpath);
788 END_PROFILE(syscall_link);
789 return result;
792 int vfswrap_mknod(vfs_handle_struct *handle, connection_struct *conn, const char *pathname, mode_t mode, SMB_DEV_T dev)
794 int result;
796 START_PROFILE(syscall_mknod);
797 result = sys_mknod(pathname, mode, dev);
798 END_PROFILE(syscall_mknod);
799 return result;
802 char *vfswrap_realpath(vfs_handle_struct *handle, connection_struct *conn, const char *path, char *resolved_path)
804 char *result;
806 START_PROFILE(syscall_realpath);
807 result = sys_realpath(path, resolved_path);
808 END_PROFILE(syscall_realpath);
809 return result;
812 size_t vfswrap_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp, int fd, uint32 security_info, SEC_DESC **ppdesc)
814 size_t result;
816 START_PROFILE(fget_nt_acl);
817 result = get_nt_acl(fsp, security_info, ppdesc);
818 END_PROFILE(fget_nt_acl);
819 return result;
822 size_t vfswrap_get_nt_acl(vfs_handle_struct *handle, files_struct *fsp, const char *name, uint32 security_info, SEC_DESC **ppdesc)
824 size_t result;
826 START_PROFILE(get_nt_acl);
827 result = get_nt_acl(fsp, security_info, ppdesc);
828 END_PROFILE(get_nt_acl);
829 return result;
832 BOOL vfswrap_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp, int fd, uint32 security_info_sent, SEC_DESC *psd)
834 BOOL result;
836 START_PROFILE(fset_nt_acl);
837 result = set_nt_acl(fsp, security_info_sent, psd);
838 END_PROFILE(fset_nt_acl);
839 return result;
842 BOOL vfswrap_set_nt_acl(vfs_handle_struct *handle, files_struct *fsp, const char *name, uint32 security_info_sent, SEC_DESC *psd)
844 BOOL result;
846 START_PROFILE(set_nt_acl);
847 result = set_nt_acl(fsp, security_info_sent, psd);
848 END_PROFILE(set_nt_acl);
849 return result;
852 int vfswrap_chmod_acl(vfs_handle_struct *handle, connection_struct *conn, const char *name, mode_t mode)
854 #ifdef HAVE_NO_ACL
855 errno = ENOSYS;
856 return -1;
857 #else
858 int result;
860 START_PROFILE(chmod_acl);
861 result = chmod_acl(conn, name, mode);
862 END_PROFILE(chmod_acl);
863 return result;
864 #endif
867 int vfswrap_fchmod_acl(vfs_handle_struct *handle, files_struct *fsp, int fd, mode_t mode)
869 #ifdef HAVE_NO_ACL
870 errno = ENOSYS;
871 return -1;
872 #else
873 int result;
875 START_PROFILE(fchmod_acl);
876 result = fchmod_acl(fsp, fd, mode);
877 END_PROFILE(fchmod_acl);
878 return result;
879 #endif
882 int vfswrap_sys_acl_get_entry(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T theacl, int entry_id, SMB_ACL_ENTRY_T *entry_p)
884 return sys_acl_get_entry(theacl, entry_id, entry_p);
887 int vfswrap_sys_acl_get_tag_type(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p)
889 return sys_acl_get_tag_type(entry_d, tag_type_p);
892 int vfswrap_sys_acl_get_permset(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry_d, SMB_ACL_PERMSET_T *permset_p)
894 return sys_acl_get_permset(entry_d, permset_p);
897 void * vfswrap_sys_acl_get_qualifier(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry_d)
899 return sys_acl_get_qualifier(entry_d);
902 SMB_ACL_T vfswrap_sys_acl_get_file(vfs_handle_struct *handle, connection_struct *conn, const char *path_p, SMB_ACL_TYPE_T type)
904 return sys_acl_get_file(path_p, type);
907 SMB_ACL_T vfswrap_sys_acl_get_fd(vfs_handle_struct *handle, files_struct *fsp, int fd)
909 return sys_acl_get_fd(fd);
912 int vfswrap_sys_acl_clear_perms(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_PERMSET_T permset)
914 return sys_acl_clear_perms(permset);
917 int vfswrap_sys_acl_add_perm(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm)
919 return sys_acl_add_perm(permset, perm);
922 char * vfswrap_sys_acl_to_text(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T theacl, ssize_t *plen)
924 return sys_acl_to_text(theacl, plen);
927 SMB_ACL_T vfswrap_sys_acl_init(vfs_handle_struct *handle, connection_struct *conn, int count)
929 return sys_acl_init(count);
932 int vfswrap_sys_acl_create_entry(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry)
934 return sys_acl_create_entry(pacl, pentry);
937 int vfswrap_sys_acl_set_tag_type(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tagtype)
939 return sys_acl_set_tag_type(entry, tagtype);
942 int vfswrap_sys_acl_set_qualifier(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry, void *qual)
944 return sys_acl_set_qualifier(entry, qual);
947 int vfswrap_sys_acl_set_permset(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry, SMB_ACL_PERMSET_T permset)
949 return sys_acl_set_permset(entry, permset);
952 int vfswrap_sys_acl_valid(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T theacl )
954 return sys_acl_valid(theacl );
957 int vfswrap_sys_acl_set_file(vfs_handle_struct *handle, connection_struct *conn, const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl)
959 return sys_acl_set_file(name, acltype, theacl);
962 int vfswrap_sys_acl_set_fd(vfs_handle_struct *handle, files_struct *fsp, int fd, SMB_ACL_T theacl)
964 return sys_acl_set_fd(fd, theacl);
967 int vfswrap_sys_acl_delete_def_file(vfs_handle_struct *handle, connection_struct *conn, const char *path)
969 return sys_acl_delete_def_file(path);
972 int vfswrap_sys_acl_get_perm(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm)
974 return sys_acl_get_perm(permset, perm);
977 int vfswrap_sys_acl_free_text(vfs_handle_struct *handle, connection_struct *conn, char *text)
979 return sys_acl_free_text(text);
982 int vfswrap_sys_acl_free_acl(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T posix_acl)
984 return sys_acl_free_acl(posix_acl);
987 int vfswrap_sys_acl_free_qualifier(vfs_handle_struct *handle, connection_struct *conn, void *qualifier, SMB_ACL_TAG_T tagtype)
989 return sys_acl_free_qualifier(qualifier, tagtype);
992 /****************************************************************
993 Extended attribute operations.
994 *****************************************************************/
996 ssize_t vfswrap_getxattr(struct vfs_handle_struct *handle,struct connection_struct *conn,const char *path, const char *name, void *value, size_t size)
998 return sys_getxattr(path, name, value, size);
1001 ssize_t vfswrap_lgetxattr(struct vfs_handle_struct *handle,struct connection_struct *conn,const char *path, const char *name, void *value, size_t size)
1003 return sys_lgetxattr(path, name, value, size);
1006 ssize_t vfswrap_fgetxattr(struct vfs_handle_struct *handle, struct files_struct *fsp,int fd, const char *name, void *value, size_t size)
1008 return sys_fgetxattr(fd, name, value, size);
1011 ssize_t vfswrap_listxattr(struct vfs_handle_struct *handle, struct connection_struct *conn,const char *path, char *list, size_t size)
1013 return sys_listxattr(path, list, size);
1016 ssize_t vfswrap_llistxattr(struct vfs_handle_struct *handle, struct connection_struct *conn,const char *path, char *list, size_t size)
1018 return sys_llistxattr(path, list, size);
1021 ssize_t vfswrap_flistxattr(struct vfs_handle_struct *handle, struct files_struct *fsp,int fd, char *list, size_t size)
1023 return sys_flistxattr(fd, list, size);
1026 int vfswrap_removexattr(struct vfs_handle_struct *handle, struct connection_struct *conn,const char *path, const char *name)
1028 return sys_removexattr(path, name);
1031 int vfswrap_lremovexattr(struct vfs_handle_struct *handle, struct connection_struct *conn,const char *path, const char *name)
1033 return sys_lremovexattr(path, name);
1036 int vfswrap_fremovexattr(struct vfs_handle_struct *handle, struct files_struct *fsp,int fd, const char *name)
1038 return sys_fremovexattr(fd, name);
1041 int vfswrap_setxattr(struct vfs_handle_struct *handle, struct connection_struct *conn,const char *path, const char *name, const void *value, size_t size, int flags)
1043 return sys_setxattr(path, name, value, size, flags);
1046 int vfswrap_lsetxattr(struct vfs_handle_struct *handle, struct connection_struct *conn,const char *path, const char *name, const void *value, size_t size, int flags)
1048 return sys_lsetxattr(path, name, value, size, flags);
1051 int vfswrap_fsetxattr(struct vfs_handle_struct *handle, struct files_struct *fsp,int fd, const char *name, const void *value, size_t size, int flags)
1053 return sys_fsetxattr(fd, name, value, size, flags);
1056 int vfswrap_aio_read(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)
1058 return sys_aio_read(aiocb);
1061 int vfswrap_aio_write(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)
1063 return sys_aio_write(aiocb);
1066 ssize_t vfswrap_aio_return(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)
1068 return sys_aio_return(aiocb);
1071 int vfswrap_aio_cancel(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, SMB_STRUCT_AIOCB *aiocb)
1073 return sys_aio_cancel(fd, aiocb);
1076 int vfswrap_aio_error(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)
1078 return sys_aio_error(aiocb);
1081 int vfswrap_aio_fsync(struct vfs_handle_struct *handle, struct files_struct *fsp, int op, SMB_STRUCT_AIOCB *aiocb)
1083 return sys_aio_fsync(op, aiocb);
1086 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)
1088 return sys_aio_suspend(aiocb, n, timeout);