1/* 2 * Skeleton VFS module. Implements passthrough operation of all VFS 3 * calls to disk functions. 4 * 5 * Copyright (C) Tim Potter, 1999-2000 6 * Copyright (C) Alexander Bokovoy, 2002 7 * Copyright (C) Stefan (metze) Metzmacher, 2003 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22 */ 23 24 25#include "includes.h" 26 27/* PLEASE,PLEASE READ THE VFS MODULES CHAPTER OF THE 28 SAMBA DEVELOPERS GUIDE!!!!!! 29 */ 30 31/* If you take this file as template for your module 32 * please make sure that you remove all functions you didn't 33 * want to implement!! 34 * 35 * This passthrough operations are useless in reall vfs modules! 36 * 37 * --metze 38 */ 39 40static int skel_connect(vfs_handle_struct *handle, const char *service, const char *user) 41{ 42 return SMB_VFS_NEXT_CONNECT(handle, service, user); 43} 44 45static void skel_disconnect(vfs_handle_struct *handle) 46{ 47 SMB_VFS_NEXT_DISCONNECT(handle); 48} 49 50static SMB_BIG_UINT skel_disk_free(vfs_handle_struct *handle, const char *path, 51 BOOL small_query, SMB_BIG_UINT *bsize, 52 SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize) 53{ 54 return SMB_VFS_NEXT_DISK_FREE(handle, path, small_query, bsize, 55 dfree, dsize); 56} 57 58static int skel_get_quota(vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dq) 59{ 60 return SMB_VFS_NEXT_GET_QUOTA(handle, qtype, id, dq); 61} 62 63static int skel_set_quota(vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dq) 64{ 65 return SMB_VFS_NEXT_SET_QUOTA(handle, qtype, id, dq); 66} 67 68static int skel_get_shadow_copy_data(vfs_handle_struct *handle, files_struct *fsp, SHADOW_COPY_DATA *shadow_copy_data, BOOL labels) 69{ 70 return SMB_VFS_NEXT_GET_SHADOW_COPY_DATA(handle, fsp, shadow_copy_data, labels); 71} 72 73static int skel_statvfs(struct vfs_handle_struct *handle, const char *path, struct vfs_statvfs_struct *statbuf) 74{ 75 return SMB_VFS_NEXT_STATVFS(handle, path, statbuf); 76} 77 78static SMB_STRUCT_DIR *skel_opendir(vfs_handle_struct *handle, const char *fname, const char *mask, uint32 attr) 79{ 80 return SMB_VFS_NEXT_OPENDIR(handle, fname, mask, attr); 81} 82 83static SMB_STRUCT_DIRENT *skel_readdir(vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp) 84{ 85 return SMB_VFS_NEXT_READDIR(handle, dirp); 86} 87 88static void skel_seekdir(vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp, long offset) 89{ 90 return SMB_VFS_NEXT_SEEKDIR(handle, dirp, offset); 91} 92 93static long skel_telldir(vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp) 94{ 95 return SMB_VFS_NEXT_TELLDIR(handle, dirp); 96} 97 98static void skel_rewinddir(vfs_handle_struct *handle, SMB_STRUCT_DIR *dirp) 99{ 100 return SMB_VFS_NEXT_REWINDDIR(handle, dirp); 101} 102 103static int skel_mkdir(vfs_handle_struct *handle, const char *path, mode_t mode) 104{ 105 return SMB_VFS_NEXT_MKDIR(handle, path, mode); 106} 107 108static int skel_rmdir(vfs_handle_struct *handle, const char *path) 109{ 110 return SMB_VFS_NEXT_RMDIR(handle, path); 111} 112 113static int skel_closedir(vfs_handle_struct *handle, SMB_STRUCT_DIR *dir) 114{ 115 return SMB_VFS_NEXT_CLOSEDIR(handle, dir); 116} 117 118static int skel_open(vfs_handle_struct *handle, const char *fname, files_struct *fsp, int flags, mode_t mode) 119{ 120 return SMB_VFS_NEXT_OPEN(handle, fname, fsp, flags, mode); 121} 122 123static int skel_close(vfs_handle_struct *handle, files_struct *fsp, int fd) 124{ 125 return SMB_VFS_NEXT_CLOSE(handle, fsp, fd); 126} 127 128static ssize_t skel_read(vfs_handle_struct *handle, files_struct *fsp, int fd, void *data, size_t n) 129{ 130 return SMB_VFS_NEXT_READ(handle, fsp, fd, data, n); 131} 132 133static ssize_t skel_pread(vfs_handle_struct *handle, files_struct *fsp, int fd, void *data, size_t n, SMB_OFF_T offset) 134{ 135 return SMB_VFS_NEXT_PREAD(handle, fsp, fd, data, n, offset); 136} 137 138static ssize_t skel_write(vfs_handle_struct *handle, files_struct *fsp, int fd, const void *data, size_t n) 139{ 140 return SMB_VFS_NEXT_WRITE(handle, fsp, fd, data, n); 141} 142 143static ssize_t skel_pwrite(vfs_handle_struct *handle, files_struct *fsp, int fd, const void *data, size_t n, SMB_OFF_T offset) 144{ 145 return SMB_VFS_NEXT_PWRITE(handle, fsp, fd, data, n, offset); 146} 147 148static SMB_OFF_T skel_lseek(vfs_handle_struct *handle, files_struct *fsp, int filedes, SMB_OFF_T offset, int whence) 149{ 150 return SMB_VFS_NEXT_LSEEK(handle, fsp, filedes, offset, whence); 151} 152 153static int skel_rename(vfs_handle_struct *handle, const char *oldname, const char *newname) 154{ 155 return SMB_VFS_NEXT_RENAME(handle, oldname, newname); 156} 157 158static int skel_fsync(vfs_handle_struct *handle, files_struct *fsp, int fd) 159{ 160 return SMB_VFS_NEXT_FSYNC(handle, fsp, fd); 161} 162 163static int skel_stat(vfs_handle_struct *handle, const char *fname, SMB_STRUCT_STAT *sbuf) 164{ 165 return SMB_VFS_NEXT_STAT(handle, fname, sbuf); 166} 167 168static int skel_fstat(vfs_handle_struct *handle, files_struct *fsp, int fd, SMB_STRUCT_STAT *sbuf) 169{ 170 return SMB_VFS_NEXT_FSTAT(handle, fsp, fd, sbuf); 171} 172 173static int skel_lstat(vfs_handle_struct *handle, const char *path, SMB_STRUCT_STAT *sbuf) 174{ 175 return SMB_VFS_NEXT_LSTAT(handle, path, sbuf); 176} 177 178static int skel_unlink(vfs_handle_struct *handle, const char *path) 179{ 180 return SMB_VFS_NEXT_UNLINK(handle, path); 181} 182 183static int skel_chmod(vfs_handle_struct *handle, const char *path, mode_t mode) 184{ 185 return SMB_VFS_NEXT_CHMOD(handle, path, mode); 186} 187 188static int skel_fchmod(vfs_handle_struct *handle, files_struct *fsp, int fd, mode_t mode) 189{ 190 return SMB_VFS_NEXT_FCHMOD(handle, fsp, fd, mode); 191} 192 193static int skel_chown(vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid) 194{ 195 return SMB_VFS_NEXT_CHOWN(handle, path, uid, gid); 196} 197 198static int skel_fchown(vfs_handle_struct *handle, files_struct *fsp, int fd, uid_t uid, gid_t gid) 199{ 200 return SMB_VFS_NEXT_FCHOWN(handle, fsp, fd, uid, gid); 201} 202 203static int skel_chdir(vfs_handle_struct *handle, const char *path) 204{ 205 return SMB_VFS_NEXT_CHDIR(handle, path); 206} 207 208static char *skel_getwd(vfs_handle_struct *handle, char *buf) 209{ 210 return SMB_VFS_NEXT_GETWD(handle, buf); 211} 212 213static int skel_ntimes(vfs_handle_struct *handle, const char *path, const struct timespec ts[2]) 214{ 215 return SMB_VFS_NEXT_NTIMES(handle, path, ts); 216} 217 218static int skel_ftruncate(vfs_handle_struct *handle, files_struct *fsp, int fd, SMB_OFF_T offset) 219{ 220 return SMB_VFS_NEXT_FTRUNCATE(handle, fsp, fd, offset); 221} 222 223static BOOL skel_lock(vfs_handle_struct *handle, files_struct *fsp, int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type) 224{ 225 return SMB_VFS_NEXT_LOCK(handle, fsp, fd, op, offset, count, type); 226} 227 228static BOOL skel_getlock(vfs_handle_struct *handle, files_struct *fsp, int fd, SMB_OFF_T *poffset, SMB_OFF_T *pcount, int *ptype, pid_t *ppid) 229{ 230 return SMB_VFS_NEXT_GETLOCK(handle, fsp, fd, poffset, pcount, ptype, ppid); 231} 232 233static int skel_symlink(vfs_handle_struct *handle, const char *oldpath, const char *newpath) 234{ 235 return SMB_VFS_NEXT_SYMLINK(handle, oldpath, newpath); 236} 237 238static int skel_readlink(vfs_handle_struct *handle, const char *path, char *buf, size_t bufsiz) 239{ 240 return SMB_VFS_NEXT_READLINK(handle, path, buf, bufsiz); 241} 242 243static int skel_link(vfs_handle_struct *handle, const char *oldpath, const char *newpath) 244{ 245 return SMB_VFS_NEXT_LINK(handle, oldpath, newpath); 246} 247 248static int skel_mknod(vfs_handle_struct *handle, const char *path, mode_t mode, SMB_DEV_T dev) 249{ 250 return SMB_VFS_NEXT_MKNOD(handle, path, mode, dev); 251} 252 253static char *skel_realpath(vfs_handle_struct *handle, const char *path, char *resolved_path) 254{ 255 return SMB_VFS_NEXT_REALPATH(handle, path, resolved_path); 256} 257 258static NTSTATUS skel_notify_watch(struct vfs_handle_struct *handle, 259 struct sys_notify_context *ctx, struct notify_entry *e, 260 void (*callback)(struct sys_notify_context *ctx, void *private_data, struct notify_event *ev), 261 void *private_data, void *handle_p) 262{ 263 return SMB_VFS_NEXT_NOTIFY_WATCH(handle, ctx, e, callback, 264 private_data, handle_p); 265} 266 267static int skel_chflags(vfs_handle_struct *handle, const char *path, uint flags) 268{ 269 return SMB_VFS_NEXT_CHFLAGS(handle, path, flags); 270} 271 272static size_t skel_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp, 273 int fd, uint32 security_info, SEC_DESC **ppdesc) 274{ 275 return SMB_VFS_NEXT_FGET_NT_ACL(handle, fsp, fd, security_info, ppdesc); 276} 277 278static size_t skel_get_nt_acl(vfs_handle_struct *handle, files_struct *fsp, 279 const char *name, uint32 security_info, SEC_DESC **ppdesc) 280{ 281 return SMB_VFS_NEXT_GET_NT_ACL(handle, fsp, name, security_info, ppdesc); 282} 283 284static BOOL skel_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp, 285 int fd, uint32 security_info_sent, SEC_DESC *psd) 286{ 287 return SMB_VFS_NEXT_FSET_NT_ACL(handle, fsp, fd, security_info_sent, psd); 288} 289 290static BOOL skel_set_nt_acl(vfs_handle_struct *handle, files_struct *fsp, 291 const char *name, uint32 security_info_sent, SEC_DESC *psd) 292{ 293 return SMB_VFS_NEXT_SET_NT_ACL(handle, fsp, name, security_info_sent, psd); 294} 295 296static int skel_chmod_acl(vfs_handle_struct *handle, const char *name, mode_t mode) 297{ 298 /* If the underlying VFS doesn't have ACL support... */ 299 if (!handle->vfs_next.ops.chmod_acl) { 300 errno = ENOSYS; 301 return -1; 302 } 303 return SMB_VFS_NEXT_CHMOD_ACL(handle, name, mode); 304} 305 306static int skel_fchmod_acl(vfs_handle_struct *handle, files_struct *fsp, int fd, mode_t mode) 307{ 308 /* If the underlying VFS doesn't have ACL support... */ 309 if (!handle->vfs_next.ops.fchmod_acl) { 310 errno = ENOSYS; 311 return -1; 312 } 313 return SMB_VFS_NEXT_FCHMOD_ACL(handle, fsp, fd, mode); 314} 315 316static int skel_sys_acl_get_entry(vfs_handle_struct *handle, SMB_ACL_T theacl, int entry_id, SMB_ACL_ENTRY_T *entry_p) 317{ 318 return SMB_VFS_NEXT_SYS_ACL_GET_ENTRY(handle, theacl, entry_id, entry_p); 319} 320 321static int skel_sys_acl_get_tag_type(vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p) 322{ 323 return SMB_VFS_NEXT_SYS_ACL_GET_TAG_TYPE(handle, entry_d, tag_type_p); 324} 325 326static int skel_sys_acl_get_permset(vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d, SMB_ACL_PERMSET_T *permset_p) 327{ 328 return SMB_VFS_NEXT_SYS_ACL_GET_PERMSET(handle, entry_d, permset_p); 329} 330 331static void *skel_sys_acl_get_qualifier(vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry_d) 332{ 333 return SMB_VFS_NEXT_SYS_ACL_GET_QUALIFIER(handle, entry_d); 334} 335 336static SMB_ACL_T skel_sys_acl_get_file(vfs_handle_struct *handle, const char *path_p, SMB_ACL_TYPE_T type) 337{ 338 return SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, path_p, type); 339} 340 341static SMB_ACL_T skel_sys_acl_get_fd(vfs_handle_struct *handle, files_struct *fsp, int fd) 342{ 343 return SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, fd); 344} 345 346static int skel_sys_acl_clear_perms(vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset) 347{ 348 return SMB_VFS_NEXT_SYS_ACL_CLEAR_PERMS(handle, permset); 349} 350 351static int skel_sys_acl_add_perm(vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm) 352{ 353 return SMB_VFS_NEXT_SYS_ACL_ADD_PERM(handle, permset, perm); 354} 355 356static char *skel_sys_acl_to_text(vfs_handle_struct *handle, SMB_ACL_T theacl, ssize_t *plen) 357{ 358 return SMB_VFS_NEXT_SYS_ACL_TO_TEXT(handle, theacl, plen); 359} 360 361static SMB_ACL_T skel_sys_acl_init(vfs_handle_struct *handle, int count) 362{ 363 return SMB_VFS_NEXT_SYS_ACL_INIT(handle, count); 364} 365 366static int skel_sys_acl_create_entry(vfs_handle_struct *handle, SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry) 367{ 368 return SMB_VFS_NEXT_SYS_ACL_CREATE_ENTRY(handle, pacl, pentry); 369} 370 371static int skel_sys_acl_set_tag_type(vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tagtype) 372{ 373 return SMB_VFS_NEXT_SYS_ACL_SET_TAG_TYPE(handle, entry, tagtype); 374} 375 376static int skel_sys_acl_set_qualifier(vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, void *qual) 377{ 378 return SMB_VFS_NEXT_SYS_ACL_SET_QUALIFIER(handle, entry, qual); 379} 380 381static int skel_sys_acl_set_permset(vfs_handle_struct *handle, SMB_ACL_ENTRY_T entry, SMB_ACL_PERMSET_T permset) 382{ 383 return SMB_VFS_NEXT_SYS_ACL_SET_PERMSET(handle, entry, permset); 384} 385 386static int skel_sys_acl_valid(vfs_handle_struct *handle, SMB_ACL_T theacl ) 387{ 388 return SMB_VFS_NEXT_SYS_ACL_VALID(handle, theacl); 389} 390 391static int skel_sys_acl_set_file(vfs_handle_struct *handle, const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl) 392{ 393 return SMB_VFS_NEXT_SYS_ACL_SET_FILE(handle, name, acltype, theacl); 394} 395 396static int skel_sys_acl_set_fd(vfs_handle_struct *handle, files_struct *fsp, int fd, SMB_ACL_T theacl) 397{ 398 return SMB_VFS_NEXT_SYS_ACL_SET_FD(handle, fsp, fd, theacl); 399} 400 401static int skel_sys_acl_delete_def_file(vfs_handle_struct *handle, const char *path) 402{ 403 return SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle, path); 404} 405 406static int skel_sys_acl_get_perm(vfs_handle_struct *handle, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm) 407{ 408 return SMB_VFS_NEXT_SYS_ACL_GET_PERM(handle, permset, perm); 409} 410 411static int skel_sys_acl_free_text(vfs_handle_struct *handle, char *text) 412{ 413 return SMB_VFS_NEXT_SYS_ACL_FREE_TEXT(handle, text); 414} 415 416static int skel_sys_acl_free_acl(vfs_handle_struct *handle, SMB_ACL_T posix_acl) 417{ 418 return SMB_VFS_NEXT_SYS_ACL_FREE_ACL(handle, posix_acl); 419} 420 421static int skel_sys_acl_free_qualifier(vfs_handle_struct *handle, void *qualifier, SMB_ACL_TAG_T tagtype) 422{ 423 return SMB_VFS_NEXT_SYS_ACL_FREE_QUALIFIER(handle, qualifier, tagtype); 424} 425 426static ssize_t skel_getxattr(vfs_handle_struct *handle, const char *path, const char *name, void *value, size_t size) 427{ 428 return SMB_VFS_NEXT_GETXATTR(handle, path, name, value, size); 429} 430 431static ssize_t skel_lgetxattr(vfs_handle_struct *handle, const char *path, const char *name, void *value, size_t 432size) 433{ 434 return SMB_VFS_NEXT_LGETXATTR(handle, path, name, value, size); 435} 436 437static ssize_t skel_fgetxattr(vfs_handle_struct *handle, struct files_struct *fsp,int fd, const char *name, void *value, size_t size) 438{ 439 return SMB_VFS_NEXT_FGETXATTR(handle, fsp, fd, name, value, size); 440} 441 442static ssize_t skel_listxattr(vfs_handle_struct *handle, const char *path, char *list, size_t size) 443{ 444 return SMB_VFS_NEXT_LISTXATTR(handle, path, list, size); 445} 446 447static ssize_t skel_llistxattr(vfs_handle_struct *handle, const char *path, char *list, size_t size) 448{ 449 return SMB_VFS_NEXT_LLISTXATTR(handle, path, list, size); 450} 451 452static ssize_t skel_flistxattr(vfs_handle_struct *handle, struct files_struct *fsp,int fd, char *list, size_t size) 453{ 454 return SMB_VFS_NEXT_FLISTXATTR(handle, fsp, fd, list, size); 455} 456 457static int skel_removexattr(vfs_handle_struct *handle, const char *path, const char *name) 458{ 459 return SMB_VFS_NEXT_REMOVEXATTR(handle, path, name); 460} 461 462static int skel_lremovexattr(vfs_handle_struct *handle, const char *path, const char *name) 463{ 464 return SMB_VFS_NEXT_LREMOVEXATTR(handle, path, name); 465} 466 467static int skel_fremovexattr(vfs_handle_struct *handle, struct files_struct *fsp,int fd, const char *name) 468{ 469 return SMB_VFS_NEXT_FREMOVEXATTR(handle, fsp, fd, name); 470} 471 472static int skel_setxattr(vfs_handle_struct *handle, const char *path, const char *name, const void *value, size_t size, int flags) 473{ 474 return SMB_VFS_NEXT_SETXATTR(handle, path, name, value, size, flags); 475} 476 477static int skel_lsetxattr(vfs_handle_struct *handle, const char *path, const char *name, const void *value, size_t size, int flags) 478{ 479 return SMB_VFS_NEXT_LSETXATTR(handle, path, name, value, size, flags); 480} 481 482static int skel_fsetxattr(vfs_handle_struct *handle, struct files_struct *fsp,int fd, const char *name, const void *value, size_t size, int flags) 483{ 484 return SMB_VFS_NEXT_FSETXATTR(handle, fsp, fd, name, value, size, flags); 485} 486 487static int skel_aio_read(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb) 488{ 489 return SMB_VFS_NEXT_AIO_READ(handle, fsp, aiocb); 490} 491 492static int skel_aio_write(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb) 493{ 494 return SMB_VFS_NEXT_AIO_WRITE(handle, fsp, aiocb); 495} 496 497static ssize_t skel_aio_return(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb) 498{ 499 return SMB_VFS_NEXT_AIO_RETURN(handle, fsp, aiocb); 500} 501 502static int skel_aio_cancel(struct vfs_handle_struct *handle, struct files_struct *fsp, int fd, SMB_STRUCT_AIOCB *aiocb) 503{ 504 return SMB_VFS_NEXT_AIO_CANCEL(handle, fsp, fd, aiocb); 505} 506 507static int skel_aio_error(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb) 508{ 509 return SMB_VFS_NEXT_AIO_ERROR(handle, fsp, aiocb); 510} 511 512static int skel_aio_fsync(struct vfs_handle_struct *handle, struct files_struct *fsp, int op, SMB_STRUCT_AIOCB *aiocb) 513{ 514 return SMB_VFS_NEXT_AIO_FSYNC(handle, fsp, op, aiocb); 515} 516 517static int skel_aio_suspend(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_AIOCB * const aiocb[], int n, const struct timespec *ts) 518{ 519 return SMB_VFS_NEXT_AIO_SUSPEND(handle, fsp, aiocb, n, ts); 520} 521 522/* VFS operations structure */ 523 524static vfs_op_tuple skel_op_tuples[] = { 525 526 /* Disk operations */ 527 528 {SMB_VFS_OP(skel_connect), SMB_VFS_OP_CONNECT, SMB_VFS_LAYER_TRANSPARENT}, 529 {SMB_VFS_OP(skel_disconnect), SMB_VFS_OP_DISCONNECT, SMB_VFS_LAYER_TRANSPARENT}, 530 {SMB_VFS_OP(skel_disk_free), SMB_VFS_OP_DISK_FREE, SMB_VFS_LAYER_TRANSPARENT}, 531 {SMB_VFS_OP(skel_get_quota), SMB_VFS_OP_GET_QUOTA, SMB_VFS_LAYER_TRANSPARENT}, 532 {SMB_VFS_OP(skel_set_quota), SMB_VFS_OP_SET_QUOTA, SMB_VFS_LAYER_TRANSPARENT}, 533 {SMB_VFS_OP(skel_get_shadow_copy_data), SMB_VFS_OP_GET_SHADOW_COPY_DATA,SMB_VFS_LAYER_TRANSPARENT}, 534 {SMB_VFS_OP(skel_statvfs), SMB_VFS_OP_STATVFS, SMB_VFS_LAYER_TRANSPARENT}, 535 536 /* Directory operations */ 537 538 {SMB_VFS_OP(skel_opendir), SMB_VFS_OP_OPENDIR, SMB_VFS_LAYER_TRANSPARENT}, 539 {SMB_VFS_OP(skel_readdir), SMB_VFS_OP_READDIR, SMB_VFS_LAYER_TRANSPARENT}, 540 {SMB_VFS_OP(skel_seekdir), SMB_VFS_OP_SEEKDIR, SMB_VFS_LAYER_TRANSPARENT}, 541 {SMB_VFS_OP(skel_telldir), SMB_VFS_OP_TELLDIR, SMB_VFS_LAYER_TRANSPARENT}, 542 {SMB_VFS_OP(skel_rewinddir), SMB_VFS_OP_REWINDDIR, SMB_VFS_LAYER_TRANSPARENT}, 543 {SMB_VFS_OP(skel_mkdir), SMB_VFS_OP_MKDIR, SMB_VFS_LAYER_TRANSPARENT}, 544 {SMB_VFS_OP(skel_rmdir), SMB_VFS_OP_RMDIR, SMB_VFS_LAYER_TRANSPARENT}, 545 {SMB_VFS_OP(skel_closedir), SMB_VFS_OP_CLOSEDIR, SMB_VFS_LAYER_TRANSPARENT}, 546 547 /* File operations */ 548 549 {SMB_VFS_OP(skel_open), SMB_VFS_OP_OPEN, SMB_VFS_LAYER_TRANSPARENT}, 550 {SMB_VFS_OP(skel_close), SMB_VFS_OP_CLOSE, SMB_VFS_LAYER_TRANSPARENT}, 551 {SMB_VFS_OP(skel_read), SMB_VFS_OP_READ, SMB_VFS_LAYER_TRANSPARENT}, 552 {SMB_VFS_OP(skel_write), SMB_VFS_OP_WRITE, SMB_VFS_LAYER_TRANSPARENT}, 553 {SMB_VFS_OP(skel_lseek), SMB_VFS_OP_LSEEK, SMB_VFS_LAYER_TRANSPARENT}, 554 {SMB_VFS_OP(skel_rename), SMB_VFS_OP_RENAME, SMB_VFS_LAYER_TRANSPARENT}, 555 {SMB_VFS_OP(skel_fsync), SMB_VFS_OP_FSYNC, SMB_VFS_LAYER_TRANSPARENT}, 556 {SMB_VFS_OP(skel_stat), SMB_VFS_OP_STAT, SMB_VFS_LAYER_TRANSPARENT}, 557 {SMB_VFS_OP(skel_fstat), SMB_VFS_OP_FSTAT, SMB_VFS_LAYER_TRANSPARENT}, 558 {SMB_VFS_OP(skel_lstat), SMB_VFS_OP_LSTAT, SMB_VFS_LAYER_TRANSPARENT}, 559 {SMB_VFS_OP(skel_unlink), SMB_VFS_OP_UNLINK, SMB_VFS_LAYER_TRANSPARENT}, 560 {SMB_VFS_OP(skel_chmod), SMB_VFS_OP_CHMOD, SMB_VFS_LAYER_TRANSPARENT}, 561 {SMB_VFS_OP(skel_fchmod), SMB_VFS_OP_FCHMOD, SMB_VFS_LAYER_TRANSPARENT}, 562 {SMB_VFS_OP(skel_chown), SMB_VFS_OP_CHOWN, SMB_VFS_LAYER_TRANSPARENT}, 563 {SMB_VFS_OP(skel_fchown), SMB_VFS_OP_FCHOWN, SMB_VFS_LAYER_TRANSPARENT}, 564 {SMB_VFS_OP(skel_chdir), SMB_VFS_OP_CHDIR, SMB_VFS_LAYER_TRANSPARENT}, 565 {SMB_VFS_OP(skel_getwd), SMB_VFS_OP_GETWD, SMB_VFS_LAYER_TRANSPARENT}, 566 {SMB_VFS_OP(skel_ntimes), SMB_VFS_OP_NTIMES, SMB_VFS_LAYER_TRANSPARENT}, 567 {SMB_VFS_OP(skel_ftruncate), SMB_VFS_OP_FTRUNCATE, SMB_VFS_LAYER_TRANSPARENT}, 568 {SMB_VFS_OP(skel_lock), SMB_VFS_OP_LOCK, SMB_VFS_LAYER_TRANSPARENT}, 569 {SMB_VFS_OP(skel_getlock), SMB_VFS_OP_GETLOCK, SMB_VFS_LAYER_TRANSPARENT}, 570 {SMB_VFS_OP(skel_symlink), SMB_VFS_OP_SYMLINK, SMB_VFS_LAYER_TRANSPARENT}, 571 {SMB_VFS_OP(skel_readlink), SMB_VFS_OP_READLINK, SMB_VFS_LAYER_TRANSPARENT}, 572 {SMB_VFS_OP(skel_link), SMB_VFS_OP_LINK, SMB_VFS_LAYER_TRANSPARENT}, 573 {SMB_VFS_OP(skel_mknod), SMB_VFS_OP_MKNOD, SMB_VFS_LAYER_TRANSPARENT}, 574 {SMB_VFS_OP(skel_realpath), SMB_VFS_OP_REALPATH, SMB_VFS_LAYER_TRANSPARENT}, 575 {SMB_VFS_OP(skel_notify_watch), SMB_VFS_OP_NOTIFY_WATCH, SMB_VFS_LAYER_TRANSPARENT}, 576 {SMB_VFS_OP(skel_chflags), SMB_VFS_OP_CHFLAGS, SMB_VFS_LAYER_TRANSPARENT}, 577 578 /* NT File ACL operations */ 579 580 {SMB_VFS_OP(skel_fget_nt_acl), SMB_VFS_OP_FGET_NT_ACL, SMB_VFS_LAYER_TRANSPARENT}, 581 {SMB_VFS_OP(skel_get_nt_acl), SMB_VFS_OP_GET_NT_ACL, SMB_VFS_LAYER_TRANSPARENT}, 582 {SMB_VFS_OP(skel_fset_nt_acl), SMB_VFS_OP_FSET_NT_ACL, SMB_VFS_LAYER_TRANSPARENT}, 583 {SMB_VFS_OP(skel_set_nt_acl), SMB_VFS_OP_SET_NT_ACL, SMB_VFS_LAYER_TRANSPARENT}, 584 585 /* POSIX ACL operations */ 586 587 {SMB_VFS_OP(skel_chmod_acl), SMB_VFS_OP_CHMOD_ACL, SMB_VFS_LAYER_TRANSPARENT}, 588 {SMB_VFS_OP(skel_fchmod_acl), SMB_VFS_OP_FCHMOD_ACL, SMB_VFS_LAYER_TRANSPARENT}, 589 590 {SMB_VFS_OP(skel_sys_acl_get_entry), SMB_VFS_OP_SYS_ACL_GET_ENTRY, SMB_VFS_LAYER_TRANSPARENT}, 591 {SMB_VFS_OP(skel_sys_acl_get_tag_type), SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE, SMB_VFS_LAYER_TRANSPARENT}, 592 {SMB_VFS_OP(skel_sys_acl_get_permset), SMB_VFS_OP_SYS_ACL_GET_PERMSET, SMB_VFS_LAYER_TRANSPARENT}, 593 {SMB_VFS_OP(skel_sys_acl_get_qualifier), SMB_VFS_OP_SYS_ACL_GET_QUALIFIER, SMB_VFS_LAYER_TRANSPARENT}, 594 {SMB_VFS_OP(skel_sys_acl_get_file), SMB_VFS_OP_SYS_ACL_GET_FILE, SMB_VFS_LAYER_TRANSPARENT}, 595 {SMB_VFS_OP(skel_sys_acl_get_fd), SMB_VFS_OP_SYS_ACL_GET_FD, SMB_VFS_LAYER_TRANSPARENT}, 596 {SMB_VFS_OP(skel_sys_acl_clear_perms), SMB_VFS_OP_SYS_ACL_CLEAR_PERMS, SMB_VFS_LAYER_TRANSPARENT}, 597 {SMB_VFS_OP(skel_sys_acl_add_perm), SMB_VFS_OP_SYS_ACL_ADD_PERM, SMB_VFS_LAYER_TRANSPARENT}, 598 {SMB_VFS_OP(skel_sys_acl_to_text), SMB_VFS_OP_SYS_ACL_TO_TEXT, SMB_VFS_LAYER_TRANSPARENT}, 599 {SMB_VFS_OP(skel_sys_acl_init), SMB_VFS_OP_SYS_ACL_INIT, SMB_VFS_LAYER_TRANSPARENT}, 600 {SMB_VFS_OP(skel_sys_acl_create_entry), SMB_VFS_OP_SYS_ACL_CREATE_ENTRY, SMB_VFS_LAYER_TRANSPARENT}, 601 {SMB_VFS_OP(skel_sys_acl_set_tag_type), SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE, SMB_VFS_LAYER_TRANSPARENT}, 602 {SMB_VFS_OP(skel_sys_acl_set_qualifier), SMB_VFS_OP_SYS_ACL_SET_QUALIFIER, SMB_VFS_LAYER_TRANSPARENT}, 603 {SMB_VFS_OP(skel_sys_acl_set_permset), SMB_VFS_OP_SYS_ACL_SET_PERMSET, SMB_VFS_LAYER_TRANSPARENT}, 604 {SMB_VFS_OP(skel_sys_acl_valid), SMB_VFS_OP_SYS_ACL_VALID, SMB_VFS_LAYER_TRANSPARENT}, 605 {SMB_VFS_OP(skel_sys_acl_set_file), SMB_VFS_OP_SYS_ACL_SET_FILE, SMB_VFS_LAYER_TRANSPARENT}, 606 {SMB_VFS_OP(skel_sys_acl_set_fd), SMB_VFS_OP_SYS_ACL_SET_FD, SMB_VFS_LAYER_TRANSPARENT}, 607 {SMB_VFS_OP(skel_sys_acl_delete_def_file), SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE, SMB_VFS_LAYER_TRANSPARENT}, 608 {SMB_VFS_OP(skel_sys_acl_get_perm), SMB_VFS_OP_SYS_ACL_GET_PERM, SMB_VFS_LAYER_TRANSPARENT}, 609 {SMB_VFS_OP(skel_sys_acl_free_text), SMB_VFS_OP_SYS_ACL_FREE_TEXT, SMB_VFS_LAYER_TRANSPARENT}, 610 {SMB_VFS_OP(skel_sys_acl_free_acl), SMB_VFS_OP_SYS_ACL_FREE_ACL, SMB_VFS_LAYER_TRANSPARENT}, 611 {SMB_VFS_OP(skel_sys_acl_free_qualifier), SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER, SMB_VFS_LAYER_TRANSPARENT}, 612 613 /* EA operations. */ 614 {SMB_VFS_OP(skel_getxattr), SMB_VFS_OP_GETXATTR, SMB_VFS_LAYER_TRANSPARENT}, 615 {SMB_VFS_OP(skel_lgetxattr), SMB_VFS_OP_LGETXATTR, SMB_VFS_LAYER_TRANSPARENT}, 616 {SMB_VFS_OP(skel_fgetxattr), SMB_VFS_OP_FGETXATTR, SMB_VFS_LAYER_TRANSPARENT}, 617 {SMB_VFS_OP(skel_listxattr), SMB_VFS_OP_LISTXATTR, SMB_VFS_LAYER_TRANSPARENT}, 618 {SMB_VFS_OP(skel_llistxattr), SMB_VFS_OP_LLISTXATTR, SMB_VFS_LAYER_TRANSPARENT}, 619 {SMB_VFS_OP(skel_flistxattr), SMB_VFS_OP_FLISTXATTR, SMB_VFS_LAYER_TRANSPARENT}, 620 {SMB_VFS_OP(skel_removexattr), SMB_VFS_OP_REMOVEXATTR, SMB_VFS_LAYER_TRANSPARENT}, 621 {SMB_VFS_OP(skel_lremovexattr), SMB_VFS_OP_LREMOVEXATTR, SMB_VFS_LAYER_TRANSPARENT}, 622 {SMB_VFS_OP(skel_fremovexattr), SMB_VFS_OP_FREMOVEXATTR, SMB_VFS_LAYER_TRANSPARENT}, 623 {SMB_VFS_OP(skel_setxattr), SMB_VFS_OP_SETXATTR, SMB_VFS_LAYER_TRANSPARENT}, 624 {SMB_VFS_OP(skel_lsetxattr), SMB_VFS_OP_LSETXATTR, SMB_VFS_LAYER_TRANSPARENT}, 625 {SMB_VFS_OP(skel_fsetxattr), SMB_VFS_OP_FSETXATTR, SMB_VFS_LAYER_TRANSPARENT}, 626 627 /* AIO operations. */ 628 {SMB_VFS_OP(skel_aio_read), SMB_VFS_OP_AIO_READ, SMB_VFS_LAYER_TRANSPARENT}, 629 {SMB_VFS_OP(skel_aio_write), SMB_VFS_OP_AIO_WRITE, SMB_VFS_LAYER_TRANSPARENT}, 630 {SMB_VFS_OP(skel_aio_return), SMB_VFS_OP_AIO_RETURN, SMB_VFS_LAYER_TRANSPARENT}, 631 {SMB_VFS_OP(skel_aio_cancel), SMB_VFS_OP_AIO_CANCEL, SMB_VFS_LAYER_TRANSPARENT}, 632 {SMB_VFS_OP(skel_aio_error), SMB_VFS_OP_AIO_ERROR, SMB_VFS_LAYER_TRANSPARENT}, 633 {SMB_VFS_OP(skel_aio_fsync), SMB_VFS_OP_AIO_FSYNC, SMB_VFS_LAYER_TRANSPARENT}, 634 {SMB_VFS_OP(skel_aio_suspend), SMB_VFS_OP_AIO_SUSPEND, SMB_VFS_LAYER_TRANSPARENT}, 635 636 {NULL, SMB_VFS_OP_NOOP, SMB_VFS_LAYER_NOOP} 637}; 638 639NTSTATUS init_module(void) 640{ 641 return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "skel_transparent", skel_op_tuples); 642} 643