Move VFS example skel.c to two different examples: one for opaque operations and...
authorAlexander Bokovoy <ab@samba.org>
Wed, 4 Jun 2003 13:13:41 +0000 (13:13 +0000)
committerAlexander Bokovoy <ab@samba.org>
Wed, 4 Jun 2003 13:13:41 +0000 (13:13 +0000)
examples/VFS/.cvsignore
examples/VFS/Makefile [deleted file]
examples/VFS/Makefile.in [new file with mode: 0644]
examples/VFS/README
examples/VFS/autogen.sh [new file with mode: 0755]
examples/VFS/configure.in [new file with mode: 0644]
examples/VFS/install-sh [new file with mode: 0644]
examples/VFS/skel.c [deleted file]
examples/VFS/skel_opaque.c [new file with mode: 0644]
examples/VFS/skel_transparent.c [new file with mode: 0644]

index 92b494f978a1f2ec6cb7a136c044fcb17c7150ae..f269c98273c72551f709d558f10a7e3bbce3dc63 100644 (file)
@@ -1,4 +1,9 @@
 .libs
 *.so
 *.o
+*.bak
+autom4te.cache
+autom4te-2.53.cache
 Makefile
+configure
+config.*
diff --git a/examples/VFS/Makefile b/examples/VFS/Makefile
deleted file mode 100644 (file)
index ac5a93b..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-CFLAGS         = 
-CPPFLAGS       =
-LDFLAGS                =
-LDSHFLAGS      = -shared
-srcdir         = ../../source/
-FLAGS          =  $(CFLAGS) -Iinclude -I$(srcdir)/include -I$(srcdir)/ubiqx -I$(srcdir)/smbwrapper  -I. $(CPPFLAGS) -I$(srcdir)
-
-# Auto target
-default: $(patsubst %.c,%.so,$(wildcard *.c))
-
-# Pattern rules
-
-%.so: %.o
-       $(CC) $(LDSHFLAGS) $(LDFLAGS) -o $@ $<
-
-%.o: %.c
-       $(CC) $(FLAGS) -c $<
-
-# Misc targets
-
-clean:
-       rm -rf .libs
-       rm -f core *~ *% *.bak *.o *.so
diff --git a/examples/VFS/Makefile.in b/examples/VFS/Makefile.in
new file mode 100644 (file)
index 0000000..c368974
--- /dev/null
@@ -0,0 +1,43 @@
+CC             = @CC@
+CFLAGS         = @CFLAGS@
+CPPFLAGS       = @CPPFLAGS@
+LDFLAGS                = @LDFLAGS@
+LDSHFLAGS      = @LDSHFLAGS@
+INSTALLCMD     = @INSTALL@
+SAMBA_SOURCE   = @SAMBA_SOURCE@
+SHLIBEXT       = @SHLIBEXT@
+OBJEXT         = @OBJEXT@ 
+FLAGS          =  $(CFLAGS) -Iinclude -I$(SAMBA_SOURCE)/include -I$(SAMBA_SOURCE)/ubiqx -I$(SAMBA_SOURCE)/smbwrapper  -I. $(CPPFLAGS) -I$(SAMBA_SOURCE)
+
+
+prefix         = @prefix@
+libdir         = @libdir@
+
+VFS_LIBDIR     = $(libdir)/vfs
+
+# Auto target
+default: $(patsubst %.c,%.$(SHLIBEXT),$(wildcard *.c))
+
+# Pattern rules
+
+%.$(SHLIBEXT): %.$(OBJEXT)
+       @echo "Linking $@"
+       @$(CC) $(LDSHFLAGS) $(LDFLAGS) -o $@ $<
+
+%.$(OBJEXT): %.c
+       @echo "Compiling $<"
+       @$(CC) $(FLAGS) -c $<
+
+
+install: default
+       $(INSTALLCMD) -d $(VFS_LIBDIR)
+       $(INSTALLCMD) -m 755 *.$(SHLIBEXT) $(VFS_LIBDIR)
+
+# Misc targets
+clean:
+       rm -rf .libs
+       rm -f core *~ *% *.bak *.o *.$(SHLIBEXT)
+
+distclean: clean
+       rm config.* Makefile
+
index 25254c1ffc607c9332dcb7079e78d1856a8ef38d..2f6196d1178ebd432e8a038feff6a0eab3fc643f 100644 (file)
@@ -1,12 +1,18 @@
 README for Samba Virtual File System (VFS) Example
 ===================================================
 
-This directory contains a skeleton VFS module.  When used,
+This directory contains skeleton VFS modules.  When used,
 this module simply passes all requests back to the disk functions
 (i.e it operates as a passthrough filter).  It should be
 useful as a starting point for developing new VFS
 modules. 
 
+Please look at skel_opaque.c when you want your module to provide
+final functions, like a database filesystem.
+
+Please look at skel_transport.c when you want your module to provide
+passthrough functions, like audit modules. 
+
 Please read the VFS chapter in the HOWTO collection for general help 
 on the usage of VFS modules.
 
diff --git a/examples/VFS/autogen.sh b/examples/VFS/autogen.sh
new file mode 100755 (executable)
index 0000000..fcae16e
--- /dev/null
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Run this script to build samba from CVS.
+
+## insert all possible names (only works with 
+## autoconf 2.x
+#TESTAUTOHEADER="autoheader autoheader-2.53"
+TESTAUTOCONF="autoconf autoconf-2.53"
+
+#AUTOHEADERFOUND="0"
+AUTOCONFFOUND="0"
+
+
+##
+## Look for autoheader 
+##
+#for i in $TESTAUTOHEADER; do
+#      if which $i > /dev/null 2>&1; then
+#              if [ `$i --version | head -n 1 | cut -d.  -f 2` -ge 53 ]; then
+#                      AUTOHEADER=$i
+#                      AUTOHEADERFOUND="1"
+#                      break
+#              fi
+#      fi
+#done
+
+## 
+## Look for autoconf
+##
+
+for i in $TESTAUTOCONF; do
+       if which $i > /dev/null 2>&1; then
+               if [ `$i --version | head -n 1 | cut -d.  -f 2` -ge 53 ]; then
+                       AUTOCONF=$i
+                       AUTOCONFFOUND="1"
+                       break
+               fi
+       fi
+done
+
+
+## 
+## do we have it?
+##
+if [ "$AUTOCONFFOUND" = "0" -o "$AUTOHEADERFOUND" = "0" ]; then
+       echo "$0: need autoconf 2.53 or later to build samba from CVS" >&2
+       exit 1
+fi
+
+
+
+#echo "$0: running $AUTOHEADER"
+#$AUTOHEADER || exit 1
+
+echo "$0: running $AUTOCONF"
+$AUTOCONF || exit 1
+
+echo "Now run ./configure and then make."
+exit 0
+
diff --git a/examples/VFS/configure.in b/examples/VFS/configure.in
new file mode 100644 (file)
index 0000000..8e6c517
--- /dev/null
@@ -0,0 +1,275 @@
+dnl -*- mode: m4-mode -*-
+dnl Process this file with autoconf to produce a configure script.
+
+dnl We must use autotools 2.53 or above
+AC_PREREQ(2.53)
+AC_INIT(Makefile.in)
+
+#dnl Uncomment this if you want to use your own define's too
+#AC_CONFIG_HEADER(module_config.h)
+#dnl To make sure that didn't get #define PACKAGE_* in modules_config.h
+#echo "" > confdefs.h
+
+dnl Checks for programs.
+AC_PROG_CC
+AC_PROG_INSTALL
+
+#################################################
+# Directory handling stuff to support both the
+# legacy SAMBA directories and FHS compliant
+# ones...
+AC_PREFIX_DEFAULT(/usr/local/samba)
+
+AC_ARG_WITH(fhs, 
+[  --with-fhs              Use FHS-compliant paths (default=no)],
+    libdir="\${prefix}/lib/samba",
+    libdir="\${prefix}/lib")
+
+AC_SUBST(libdir)
+
+SAMBA_SOURCE="../../source"
+####################################################
+# set the location location of the samba source tree
+AC_ARG_WITH(samba-source,
+[  --with-samba-source=DIR Where is the samba source tree (../../source)],
+[ case "$withval" in
+  yes|no)
+  #
+  # Just in case anybody calls it without argument
+  #
+    AC_MSG_WARN([--with-samba-source called without argument - will use default])
+  ;;
+  * )
+    SAMBA_SOURCE="$withval"
+    ;;
+  esac])
+
+AC_SUBST(SAMBA_SOURCE)
+
+dnl Unique-to-Samba variables we'll be playing with.
+AC_SUBST(CC)
+AC_SUBST(SHELL)
+AC_SUBST(LDSHFLAGS)
+AC_SUBST(SONAMEFLAG)
+AC_SUBST(SHLD)
+AC_SUBST(HOST_OS)
+AC_SUBST(PICFLAG)
+AC_SUBST(PICSUFFIX)
+AC_SUBST(POBAD_CC)
+AC_SUBST(SHLIBEXT)
+AC_SUBST(INSTALLCLIENTCMD_SH)
+AC_SUBST(INSTALLCLIENTCMD_A)
+AC_SUBST(SHLIB_PROGS)
+AC_SUBST(EXTRA_BIN_PROGS)
+AC_SUBST(EXTRA_SBIN_PROGS)
+AC_SUBST(EXTRA_ALL_TARGETS)
+
+AC_ARG_ENABLE(debug, 
+[  --enable-debug          Turn on compiler debugging information (default=no)],
+    [if eval "test x$enable_debug = xyes"; then
+       CFLAGS="${CFLAGS} -g"
+    fi])
+
+AC_ARG_ENABLE(developer, [  --enable-developer      Turn on developer warnings and debugging (default=no)],
+    [if eval "test x$enable_developer = xyes"; then
+        developer=yes
+       CFLAGS="${CFLAGS} -g -Wall -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -DDEBUG_PASSWORD -DDEVELOPER"
+    fi])
+
+# compile with optimization and without debugging by default, but
+# allow people to set their own preference.
+if test "x$CFLAGS" = x
+then
+  CFLAGS="-O ${CFLAGS}"
+fi
+
+#dnl Check if we use GNU ld
+#LD=ld
+#AC_PROG_LD_GNU
+
+#dnl look for executable suffix
+#AC_EXEEXT
+
+builddir=`pwd`
+AC_SUBST(builddir)
+
+# Assume non-shared by default and override below
+BLDSHARED="false"
+
+# these are the defaults, good for lots of systems
+HOST_OS="$host_os"
+LDSHFLAGS="-shared"
+SONAMEFLAG="#"
+SHLD="\${CC}"
+PICFLAG=""
+PICSUFFIX="po"
+POBAD_CC="#"
+SHLIBEXT="so"
+
+if test "$enable_shared" = "yes"; then
+  # this bit needs to be modified for each OS that is suported by
+  # smbwrapper. You need to specify how to created a shared library and
+  # how to compile C code to produce PIC object files
+
+  AC_MSG_CHECKING([ability to build shared libraries])
+
+  # and these are for particular systems
+  case "$host_os" in
+               *linux*)
+                       BLDSHARED="true"
+                       LDSHFLAGS="-shared" 
+                       DYNEXP="-Wl,--export-dynamic"
+                       PICFLAG="-fPIC"
+                       SONAMEFLAG="-Wl,-soname="
+                       ;;
+               *solaris*)
+                       BLDSHARED="true"
+                       LDSHFLAGS="-G"
+                       SONAMEFLAG="-h "
+                       if test "${GCC}" = "yes"; then
+                               PICFLAG="-fPIC"
+                               if test "${ac_cv_prog_gnu_ld}" = "yes"; then
+                                       DYNEXP="-Wl,-E"
+                               fi
+                       else
+                               PICFLAG="-KPIC"
+                               ## ${CFLAGS} added for building 64-bit shared 
+                               ## libs using Sun's Compiler
+                               LDSHFLAGS="-G \${CFLAGS}"
+                               POBAD_CC=""
+                               PICSUFFIX="po.o"
+                       fi
+                       ;;
+               *sunos*)
+                       BLDSHARED="true"
+                       LDSHFLAGS="-G"
+                       SONAMEFLAG="-Wl,-h,"
+                       PICFLAG="-KPIC"   # Is this correct for SunOS
+                       ;;
+               *netbsd* | *freebsd*)  BLDSHARED="true"
+                       LDSHFLAGS="-shared"
+                       DYNEXP="-Wl,--export-dynamic"
+                       SONAMEFLAG="-Wl,-soname,"
+                       PICFLAG="-fPIC -DPIC"
+                       ;;
+               *openbsd*)  BLDSHARED="true"
+                       LDSHFLAGS="-shared"
+                       DYNEXP="-Wl,-Bdynamic"
+                       SONAMEFLAG="-Wl,-soname,"
+                       PICFLAG="-fPIC"
+                       ;;
+               *irix*)
+                       case "$host_os" in
+                       *irix6*)
+                       ;;
+                       esac
+                       ATTEMPT_WRAP32_BUILD=yes
+                       BLDSHARED="true"
+                       LDSHFLAGS="-set_version sgi1.0 -shared"
+                       SONAMEFLAG="-soname "
+                       SHLD="\${LD}"
+                       if test "${GCC}" = "yes"; then
+                               PICFLAG="-fPIC"
+                       else 
+                               PICFLAG="-KPIC"
+                       fi
+                       ;;
+               *aix*)
+                       BLDSHARED="true"
+                       LDSHFLAGS="-Wl,-bexpall,-bM:SRE,-bnoentry,-berok"
+                       DYNEXP="-Wl,-brtl,-bexpall"
+                       PICFLAG="-O2"
+                       if test "${GCC}" != "yes"; then
+                               ## for funky AIX compiler using strncpy()
+                               CFLAGS="$CFLAGS -D_LINUX_SOURCE_COMPAT -qmaxmem=32000"
+                       fi
+                       ;;
+               *hpux*)
+                       SHLIBEXT="sl"
+                       # Use special PIC flags for the native HP-UX compiler.
+                       if test $ac_cv_prog_cc_Ae = yes; then
+                               BLDSHARED="true"
+                               SHLD="/usr/bin/ld"
+                               LDSHFLAGS="-B symbolic -b -z"
+                               SONAMEFLAG="+h "
+                               PICFLAG="+z"
+                       fi
+                       DYNEXP="-Wl,-E"
+                       ;;
+               *qnx*)
+                       ;;
+               *osf*)
+                       BLDSHARED="true"
+                       LDSHFLAGS="-shared"
+                       SONAMEFLAG="-Wl,-soname,"
+                       PICFLAG="-fPIC"
+                       ;;
+               *sco*)
+                       ;;
+               *unixware*)
+                       BLDSHARED="true"
+                       LDSHFLAGS="-shared"
+                       SONAMEFLAG="-Wl,-soname,"
+                       PICFLAG="-KPIC"
+                       ;;
+               *next2*)
+                       ;;
+               *dgux*) AC_CHECK_PROG( ROFF, groff, [groff -etpsR -Tascii -man])
+                       ;;
+               *sysv4*)
+                       case "$host" in
+                               *-univel-*)
+                                       LDSHFLAGS="-G"
+                                       DYNEXP="-Bexport"
+                               ;;
+                               *mips-sni-sysv4*) 
+                               ;;
+                       esac
+                       ;;
+
+               *sysv5*)
+                       LDSHFLAGS="-G"
+                       ;;
+               *vos*)
+                       BLDSHARED="false"
+                       LDSHFLAGS=""
+                       ;;
+               *)
+                       ;;
+  esac
+  AC_SUBST(DYNEXP)
+  AC_MSG_RESULT($BLDSHARED)
+  AC_MSG_CHECKING([linker flags for shared libraries])
+  AC_MSG_RESULT([$LDSHFLAGS])
+  AC_MSG_CHECKING([compiler flags for position-independent code])
+  AC_MSG_RESULT([$PICFLAGS])
+fi
+
+#######################################################
+# test whether building a shared library actually works
+if test $BLDSHARED = true; then
+AC_CACHE_CHECK([whether building shared libraries actually works], 
+               [ac_cv_shlib_works],[
+   ac_cv_shlib_works=no
+   # try building a trivial shared library
+   if test "$PICSUFFIX" = "po"; then
+     $CC $CPPFLAGS $CFLAGS $PICFLAG -c -o shlib.po ${srcdir-.}/tests/shlib.c &&
+       $CC $CPPFLAGS $CFLAGS `eval echo $LDSHFLAGS` -o "shlib.$SHLIBEXT" shlib.po &&
+       ac_cv_shlib_works=yes
+   else
+     $CC $CPPFLAGS $CFLAGS $PICFLAG -c -o shlib.$PICSUFFIX ${srcdir-.}/tests/shlib.c &&
+       mv shlib.$PICSUFFIX shlib.po &&
+       $CC $CPPFLAGS $CFLAGS `eval echo $LDSHFLAGS` -o "shlib.$SHLIBEXT" shlib.po &&
+       ac_cv_shlib_works=yes
+   fi
+   rm -f "shlib.$SHLIBEXT" shlib.po
+])
+if test $ac_cv_shlib_works = no; then
+   BLDSHARED=false
+fi
+fi
+
+
+
+
+AC_OUTPUT(Makefile)
diff --git a/examples/VFS/install-sh b/examples/VFS/install-sh
new file mode 100644 (file)
index 0000000..5871924
--- /dev/null
@@ -0,0 +1,238 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/examples/VFS/skel.c b/examples/VFS/skel.c
deleted file mode 100644 (file)
index 0742caa..0000000
+++ /dev/null
@@ -1,467 +0,0 @@
-/* 
- * Skeleton VFS module.  Implements passthrough operation of all VFS
- * calls to disk functions.
- *
- * Copyright (C) Tim Potter, 1999-2000
- * Copyright (C) Alexander Bokovoy, 2002
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *  
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *  
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "config.h"
-
-#include <stdio.h>
-#include <sys/stat.h>
-#ifdef HAVE_UTIME_H
-#include <utime.h>
-#endif
-#ifdef HAVE_DIRENT_H
-#include <dirent.h>
-#endif
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
-#include <errno.h>
-#include <string.h>
-
-#include <includes.h>
-#include <vfs.h>
-
-static struct vfs_ops default_vfs_ops;   /* For passthrough operation */
-static struct smb_vfs_handle_struct *skel_handle; /* use skel_handle->data for storing per-instance private data */
-
-static int skel_connect(struct connection_struct *conn, const char *service, const char *user)    
-{
-       return default_vfs_ops.connect(conn, service, user);
-}
-
-static void skel_disconnect(struct connection_struct *conn)
-{
-       default_vfs_ops.disconnect(conn);
-}
-
-static SMB_BIG_UINT skel_disk_free(struct connection_struct *conn, const char *path,
-       BOOL small_query, SMB_BIG_UINT *bsize,
-       SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize)
-{
-       return default_vfs_ops.disk_free(conn, path, small_query, bsize, 
-                                        dfree, dsize);
-}
-
-static DIR *skel_opendir(struct connection_struct *conn, const char *fname)
-{
-       return default_vfs_ops.opendir(conn, fname);
-}
-
-static struct dirent *skel_readdir(struct connection_struct *conn, DIR *dirp)
-{
-       return default_vfs_ops.readdir(conn, dirp);
-}
-
-static int skel_mkdir(struct connection_struct *conn, const char *path, mode_t mode)
-{
-       return default_vfs_ops.mkdir(conn, path, mode);
-}
-
-static int skel_rmdir(struct connection_struct *conn, const char *path)
-{
-       return default_vfs_ops.rmdir(conn, path);
-}
-
-static int skel_closedir(struct connection_struct *conn, DIR *dir)
-{
-       return default_vfs_ops.closedir(conn, dir);
-}
-
-static int skel_open(struct connection_struct *conn, const char *fname, int flags, mode_t mode)
-{
-       return default_vfs_ops.open(conn, fname, flags, mode);
-}
-
-static int skel_close(struct files_struct *fsp, int fd)
-{
-       return default_vfs_ops.close(fsp, fd);
-}
-
-static ssize_t skel_read(struct files_struct *fsp, int fd, void *data, size_t n)
-{
-       return default_vfs_ops.read(fsp, fd, data, n);
-}
-
-static ssize_t skel_write(struct files_struct *fsp, int fd, const void *data, size_t n)
-{
-       return default_vfs_ops.write(fsp, fd, data, n);
-}
-
-static SMB_OFF_T skel_lseek(struct files_struct *fsp, int filedes, SMB_OFF_T offset, int whence)
-{
-       return default_vfs_ops.lseek(fsp, filedes, offset, whence);
-}
-
-static int skel_rename(struct connection_struct *conn, const char *old, const char *new)
-{
-       return default_vfs_ops.rename(conn, old, new);
-}
-
-static int skel_fsync(struct files_struct *fsp, int fd)
-{
-       return default_vfs_ops.fsync(fsp, fd);
-}
-
-static int skel_stat(struct connection_struct *conn, const char *fname, SMB_STRUCT_STAT *sbuf)
-{
-       return default_vfs_ops.stat(conn, fname, sbuf);
-}
-
-static int skel_fstat(struct files_struct *fsp, int fd, SMB_STRUCT_STAT *sbuf)
-{
-       return default_vfs_ops.fstat(fsp, fd, sbuf);
-}
-
-static int skel_lstat(struct connection_struct *conn, const char *path, SMB_STRUCT_STAT *sbuf)
-{
-       return default_vfs_ops.lstat(conn, path, sbuf);
-}
-
-static int skel_unlink(struct connection_struct *conn, const char *path)
-{
-       return default_vfs_ops.unlink(conn, path);
-}
-
-static int skel_chmod(struct connection_struct *conn, const char *path, mode_t mode)
-{
-       return default_vfs_ops.chmod(conn, path, mode);
-}
-
-static int skel_fchmod(struct files_struct *fsp, int fd, mode_t mode)
-{
-       return default_vfs_ops.fchmod(fsp, fd, mode);
-}
-
-static int skel_chown(struct connection_struct *conn, const char *path, uid_t uid, gid_t gid)
-{
-       return default_vfs_ops.chown(conn, path, uid, gid);
-}
-
-static int skel_fchown(struct files_struct *fsp, int fd, uid_t uid, gid_t gid)
-{
-       return default_vfs_ops.fchown(fsp, fd, uid, gid);
-}
-
-static int skel_chdir(struct connection_struct *conn, const char *path)
-{
-       return default_vfs_ops.chdir(conn, path);
-}
-
-static char *skel_getwd(struct connection_struct *conn, char *buf)
-{
-       return default_vfs_ops.getwd(conn, buf);
-}
-
-static int skel_utime(struct connection_struct *conn, const char *path, struct utimbuf *times)
-{
-       return default_vfs_ops.utime(conn, path, times);
-}
-
-static int skel_ftruncate(struct files_struct *fsp, int fd, SMB_OFF_T offset)
-{
-       return default_vfs_ops.ftruncate(fsp, fd, offset);
-}
-
-static BOOL skel_lock(struct files_struct *fsp, int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
-{
-       return default_vfs_ops.lock(fsp, fd, op, offset, count, type);
-}
-
-static BOOL skel_symlink(struct connection_struct *conn, const char *oldpath, const char *newpath)
-{
-       return default_vfs_ops.symlink(conn, oldpath, newpath);
-}
-
-static BOOL skel_readlink(struct connection_struct *conn, const char *path, char *buf, size_t bufsiz)
-{
-       return default_vfs_ops.readlink(conn, path, buf, bufsiz);
-}
-
-static int skel_link(struct connection_struct *conn, const char *oldpath, const char *newpath)
-{
-       return default_vfs_ops.link(conn, oldpath, newpath);
-}
-
-static int skel_mknod(struct connection_struct *conn, const char *path, mode_t mode, SMB_DEV_T dev)
-{
-       return default_vfs_ops.mknod(conn, path, mode, dev);
-}
-
-static char *skel_realpath(struct connection_struct *conn, const char *path, char *resolved_path)
-{
-       return default_vfs_ops.realpath(conn, path, resolved_path);
-}
-
-static size_t skel_fget_nt_acl(struct files_struct *fsp, int fd, struct security_descriptor_info **ppdesc)
-{
-       return default_vfs_ops.fget_nt_acl(fsp, fd, ppdesc);
-}
-
-static size_t skel_get_nt_acl(struct files_struct *fsp, const char *name, struct security_descriptor_info **ppdesc)
-{
-       return default_vfs_ops.get_nt_acl(fsp, name, ppdesc);
-}
-
-static BOOL skel_fset_nt_acl(struct files_struct *fsp, int fd, uint32 security_info_sent, struct security_descriptor_info *psd)
-{
-       return default_vfs_ops.fset_nt_acl(fsp, fd, security_info_sent, psd);
-}
-
-static BOOL skel_set_nt_acl(struct files_struct *fsp, const char *name, uint32 security_info_sent, struct security_descriptor_info *psd)
-{
-       return default_vfs_ops.set_nt_acl(fsp, name, security_info_sent, psd);
-}
-
-static BOOL skel_chmod_acl(struct connection_struct *conn, const char *name, mode_t mode)
-{
-       /* If the underlying VFS doesn't have ACL support... */
-       if (!default_vfs_ops.chmod_acl) {
-               errno = ENOSYS;
-               return -1;
-       }
-       return default_vfs_ops.chmod_acl(conn, name, mode);
-}
-
-static BOOL skel_fchmod_acl(struct files_struct *fsp, int fd, mode_t mode)
-{
-       /* If the underlying VFS doesn't have ACL support... */
-       if (!default_vfs_ops.fchmod_acl) {
-               errno = ENOSYS;
-               return -1;
-       }
-       return default_vfs_ops.fchmod_acl(fsp, fd, mode);
-}
-
-static int skel_sys_acl_get_entry(struct connection_struct *conn, SMB_ACL_T theacl, int entry_id, SMB_ACL_ENTRY_T *entry_p)
-{
-       return default_vfs_ops.sys_acl_get_entry(conn, theacl, entry_id, entry_p);
-}
-
-static int skel_sys_acl_get_tag_type(struct connection_struct *conn, SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p)
-{
-       return default_vfs_ops.sys_acl_get_tag_type(conn, entry_d, tag_type_p);
-}
-
-static int skel_sys_acl_get_permset(struct connection_struct *conn, SMB_ACL_ENTRY_T entry_d, SMB_ACL_PERMSET_T *permset_p)
-{
-       return default_vfs_ops.sys_acl_get_permset(conn, entry_d, permset_p);
-}
-
-static void *skel_sys_acl_get_qualifier(struct connection_struct *conn, SMB_ACL_ENTRY_T entry_d)
-{
-       return default_vfs_ops.sys_acl_get_qualifier(conn, entry_d);
-}
-
-static SMB_ACL_T skel_sys_acl_get_file(struct connection_struct *conn, const char *path_p, SMB_ACL_TYPE_T type)
-{
-       return default_vfs_ops.sys_acl_get_file(conn, path_p, type);
-}
-
-static SMB_ACL_T skel_sys_acl_get_fd(struct files_struct *fsp, int fd)
-{
-       return default_vfs_ops.sys_acl_get_fd(fsp, fd);
-}
-
-static int skel_sys_acl_clear_perms(struct connection_struct *conn, SMB_ACL_PERMSET_T permset)
-{
-       return default_vfs_ops.sys_acl_clear_perms(conn, permset);
-}
-
-static int skel_sys_acl_add_perm(struct connection_struct *conn, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm)
-{
-       return default_vfs_ops.sys_acl_add_perm(conn, permset, perm);
-}
-
-static char *skel_sys_acl_to_text(struct connection_struct *conn, SMB_ACL_T theacl, ssize_t *plen)
-{
-       return default_vfs_ops.sys_acl_to_text(conn, theacl, plen);
-}
-
-static SMB_ACL_T skel_sys_acl_init(struct connection_struct *conn, int count)
-{
-       return default_vfs_ops.sys_acl_init(conn, count);
-}
-
-static int skel_sys_acl_create_entry(struct connection_struct *conn, SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry)
-{
-       return default_vfs_ops.sys_acl_create_entry(conn, pacl, pentry);
-}
-
-static int skel_sys_acl_set_tag_type(struct connection_struct *conn, SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tagtype)
-{
-       return default_vfs_ops.sys_acl_set_tag_type(conn, entry, tagtype);
-}
-
-static int skel_sys_acl_set_qualifier(struct connection_struct *conn, SMB_ACL_ENTRY_T entry, void *qual)
-{
-       return default_vfs_ops.sys_acl_set_qualifier(conn, entry, qual);
-}
-
-static int skel_sys_acl_set_permset(struct connection_struct *conn, SMB_ACL_ENTRY_T entry, SMB_ACL_PERMSET_T permset)
-{
-       return default_vfs_ops.sys_acl_set_permset(conn, entry, permset);
-}
-
-static int skel_sys_acl_valid(struct connection_struct *conn, SMB_ACL_T theacl )
-{
-       return default_vfs_ops.sys_acl_valid(conn, theacl );
-}
-
-static int skel_sys_acl_set_file(struct connection_struct *conn, const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl)
-{
-       return default_vfs_ops.sys_acl_set_file(conn, name, acltype, theacl);
-}
-
-static int skel_sys_acl_set_fd(struct files_struct *fsp, int fd, SMB_ACL_T theacl)
-{
-       return default_vfs_ops.sys_acl_set_fd(fsp, fd, theacl);
-}
-
-static int skel_sys_acl_delete_def_file(struct connection_struct *conn, const char *path)
-{
-       return default_vfs_ops.sys_acl_delete_def_file(conn, path);
-}
-
-static int skel_sys_acl_get_perm(struct connection_struct *conn, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm)
-{
-       return default_vfs_ops.sys_acl_get_perm(conn, permset, perm);
-}
-
-static int skel_sys_acl_free_text(struct connection_struct *conn, char *text)
-{
-       return default_vfs_ops.sys_acl_free_text(conn, text);
-}
-
-static int skel_sys_acl_free_acl(struct connection_struct *conn, SMB_ACL_T posix_acl)
-{
-       return default_vfs_ops.sys_acl_free_acl(conn, posix_acl);
-}
-
-static int skel_sys_acl_free_qualifier(struct connection_struct *conn, void *qualifier, SMB_ACL_TAG_T tagtype)
-{
-       return default_vfs_ops.sys_acl_free_qualifier(conn, qualifier, tagtype);
-}
-
-
-/* VFS operations structure */
-
-static vfs_op_tuple skel_ops[] = {
-
-       /* Disk operations */
-
-       {skel_connect,                  SMB_VFS_OP_CONNECT,             SMB_VFS_LAYER_TRANSPARENT},
-       {skel_disconnect,               SMB_VFS_OP_DISCONNECT,          SMB_VFS_LAYER_TRANSPARENT},
-       {skel_disk_free,                SMB_VFS_OP_DISK_FREE,           SMB_VFS_LAYER_TRANSPARENT},
-       
-       /* Directory operations */
-
-       {skel_opendir,                  SMB_VFS_OP_OPENDIR,             SMB_VFS_LAYER_TRANSPARENT},
-       {skel_readdir,                  SMB_VFS_OP_READDIR,             SMB_VFS_LAYER_TRANSPARENT},
-       {skel_mkdir,                    SMB_VFS_OP_MKDIR,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_rmdir,                    SMB_VFS_OP_RMDIR,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_closedir,                 SMB_VFS_OP_CLOSEDIR,            SMB_VFS_LAYER_TRANSPARENT},
-
-       /* File operations */
-
-       {skel_open,                     SMB_VFS_OP_OPEN,                SMB_VFS_LAYER_TRANSPARENT},
-       {skel_close,                    SMB_VFS_OP_CLOSE,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_read,                     SMB_VFS_OP_READ,                SMB_VFS_LAYER_TRANSPARENT},
-       {skel_write,                    SMB_VFS_OP_WRITE,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_lseek,                    SMB_VFS_OP_LSEEK,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_rename,                   SMB_VFS_OP_RENAME,              SMB_VFS_LAYER_TRANSPARENT},
-       {skel_fsync,                    SMB_VFS_OP_FSYNC,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_stat,                     SMB_VFS_OP_STAT,                SMB_VFS_LAYER_TRANSPARENT},
-       {skel_fstat,                    SMB_VFS_OP_FSTAT,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_lstat,                    SMB_VFS_OP_LSTAT,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_unlink,                   SMB_VFS_OP_UNLINK,              SMB_VFS_LAYER_TRANSPARENT},
-       {skel_chmod,                    SMB_VFS_OP_CHMOD,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_fchmod,                   SMB_VFS_OP_FCHMOD,              SMB_VFS_LAYER_TRANSPARENT},
-       {skel_chown,                    SMB_VFS_OP_CHOWN,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_fchown,                   SMB_VFS_OP_FCHOWN,              SMB_VFS_LAYER_TRANSPARENT},
-       {skel_chdir,                    SMB_VFS_OP_CHDIR,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_getwd,                    SMB_VFS_OP_GETWD,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_utime,                    SMB_VFS_OP_UTIME,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_ftruncate,                SMB_VFS_OP_FTRUNCATE,           SMB_VFS_LAYER_TRANSPARENT},
-       {skel_lock,                     SMB_VFS_OP_LOCK,                SMB_VFS_LAYER_TRANSPARENT},
-       {skel_symlink,                  SMB_VFS_OP_SYMLINK,             SMB_VFS_LAYER_TRANSPARENT},
-       {skel_readlink,                 SMB_VFS_OP_READLINK,            SMB_VFS_LAYER_TRANSPARENT},
-       {skel_link,                     SMB_VFS_OP_LINK,                SMB_VFS_LAYER_TRANSPARENT},
-       {skel_mknod,                    SMB_VFS_OP_MKNOD,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_realpath,                 SMB_VFS_OP_REALPATH,            SMB_VFS_LAYER_TRANSPARENT},
-
-       /* NT File ACL operations */
-
-       {skel_fget_nt_acl,              SMB_VFS_OP_FGET_NT_ACL,         SMB_VFS_LAYER_TRANSPARENT},
-       {skel_get_nt_acl,               SMB_VFS_OP_GET_NT_ACL,          SMB_VFS_LAYER_TRANSPARENT},
-       {skel_fset_nt_acl,              SMB_VFS_OP_FSET_NT_ACL,         SMB_VFS_LAYER_TRANSPARENT},
-       {skel_set_nt_acl,               SMB_VFS_OP_SET_NT_ACL,          SMB_VFS_LAYER_TRANSPARENT},
-
-       /* POSIX ACL operations */
-
-       {skel_chmod_acl,                SMB_VFS_OP_CHMOD_ACL,           SMB_VFS_LAYER_TRANSPARENT},
-       {skel_fchmod_acl,               SMB_VFS_OP_FCHMOD_ACL,          SMB_VFS_LAYER_TRANSPARENT},
-
-       {skel_sys_acl_get_entry,        SMB_VFS_OP_SYS_ACL_GET_ENTRY,           SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_get_tag_type,     SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE,        SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_get_permset,      SMB_VFS_OP_SYS_ACL_GET_PERMSET,         SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_get_qualifier,    SMB_VFS_OP_SYS_ACL_GET_QUALIFIER,       SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_get_file,         SMB_VFS_OP_SYS_ACL_GET_FILE,            SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_get_fd,           SMB_VFS_OP_SYS_ACL_GET_FD,              SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_clear_perms,      SMB_VFS_OP_SYS_ACL_CLEAR_PERMS,         SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_add_perm,         SMB_VFS_OP_SYS_ACL_ADD_PERM,            SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_to_text,          SMB_VFS_OP_SYS_ACL_TO_TEXT,             SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_init,             SMB_VFS_OP_SYS_ACL_INIT,                SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_create_entry,     SMB_VFS_OP_SYS_ACL_CREATE_ENTRY,        SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_set_tag_type,     SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE,        SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_set_qualifier,    SMB_VFS_OP_SYS_ACL_SET_QUALIFIER,       SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_set_permset,      SMB_VFS_OP_SYS_ACL_SET_PERMSET,         SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_valid,            SMB_VFS_OP_SYS_ACL_VALID,               SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_set_file,         SMB_VFS_OP_SYS_ACL_SET_FILE,            SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_set_fd,           SMB_VFS_OP_SYS_ACL_SET_FD,              SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_delete_def_file,  SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE,     SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_get_perm,         SMB_VFS_OP_SYS_ACL_GET_PERM,            SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_free_text,        SMB_VFS_OP_SYS_ACL_FREE_TEXT,           SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_free_acl,         SMB_VFS_OP_SYS_ACL_FREE_ACL,            SMB_VFS_LAYER_TRANSPARENT},
-       {skel_sys_acl_free_qualifier,   SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER,      SMB_VFS_LAYER_TRANSPARENT},
-       
-       {NULL,  SMB_VFS_OP_NOOP,        SMB_VFS_LAYER_NOOP}
-};
-
-/* VFS initialisation - return initialized vfs_op_tuple array back to Samba */
-
-static vfs_op_tuple *skel_init(const struct vfs_ops *def_vfs_ops,
-                       struct smb_vfs_handle_struct *vfs_handle)
-{
-       DEBUG(3, ("Initialising default vfs hooks\n"));
-
-       memcpy(&default_vfs_ops, def_vfs_ops, sizeof(struct vfs_ops));
-       
-       /* Remember vfs_handle for further allocation and referencing of private
-          information in vfs_handle->data
-       */
-       skel_handle = vfs_handle;
-       return skel_ops;
-}
-
-NTSTATUS init_module(void)
-{
-       return smb_register_vfs("skel", skel_init, SMB_VFS_INTERFACE_VERSION);
-}
diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c
new file mode 100644 (file)
index 0000000..c985ec4
--- /dev/null
@@ -0,0 +1,477 @@
+/* 
+ * Skeleton VFS module.  Implements passthrough operation of all VFS
+ * calls to disk functions.
+ *
+ * Copyright (C) Tim Potter, 1999-2000
+ * Copyright (C) Alexander Bokovoy, 2002
+ * Copyright (C) Stefan (metze) Metzmacher, 2003
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *  
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *  
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "includes.h"
+
+/* PLEASE,PLEASE READ THE VFS MODULES CHAPTER OF THE 
+   SAMBA DEVELOPERS GUIDE!!!!!!
+ */
+
+/* If you take this file as template for your module
+ * please make sure that you remove all vfswrap_* functions and 
+ * implement your own function!!
+ *
+ * for functions you didn't want to provide implement dummy functions
+ * witch return ERROR and errno = ENOSYS; !
+ *
+ * --metze
+ */
+
+static int skel_connect(vfs_handle_struct *handle, connection_struct *conn, const char *service, const char *user)    
+{
+       return 0;
+}
+
+static void skel_disconnect(vfs_handle_struct *handle, connection_struct *conn)
+{
+       return;
+}
+
+static SMB_BIG_UINT skel_disk_free(vfs_handle_struct *handle, connection_struct *conn, const char *path,
+       BOOL small_query, SMB_BIG_UINT *bsize,
+       SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize)
+{
+       return vfswrap_disk_free(NULL, conn, path, small_query, bsize, 
+                                        dfree, dsize);
+}
+
+static int skel_get_quota(vfs_handle_struct *handle, connection_struct *conn, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dq)
+{
+       return vfswrap_get_quota(NULL, conn, qtype, id, dq);
+}
+
+static int skel_set_quota(vfs_handle_struct *handle, connection_struct *conn, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dq)
+{
+       return vfswrap_set_quota(NULL, conn, qtype, id, dq);
+}
+
+static DIR *skel_opendir(vfs_handle_struct *handle, connection_struct *conn, const char *fname)
+{
+       return vfswrap_opendir(NULL, conn, fname);
+}
+
+static struct dirent *skel_readdir(vfs_handle_struct *handle, connection_struct *conn, DIR *dirp)
+{
+       return vfswrap_readdir(NULL, conn, dirp);
+}
+
+static int skel_mkdir(vfs_handle_struct *handle, connection_struct *conn, const char *path, mode_t mode)
+{
+       return vfswrap_mkdir(NULL, conn, path, mode);
+}
+
+static int skel_rmdir(vfs_handle_struct *handle, connection_struct *conn, const char *path)
+{
+       return vfswrap_rmdir(NULL, conn, path);
+}
+
+static int skel_closedir(vfs_handle_struct *handle, connection_struct *conn, DIR *dir)
+{
+       return vfswrap_closedir(NULL, conn, dir);
+}
+
+static int skel_open(vfs_handle_struct *handle, connection_struct *conn, const char *fname, int flags, mode_t mode)
+{
+       return vfswrap_open(NULL, conn, fname, flags, mode);
+}
+
+static int skel_close(vfs_handle_struct *handle, files_struct *fsp, int fd)
+{
+       return vfswrap_close(NULL, fsp, fd);
+}
+
+static ssize_t skel_read(vfs_handle_struct *handle, files_struct *fsp, int fd, void *data, size_t n)
+{
+       return vfswrap_read(NULL, fsp, fd, data, n);
+}
+
+static ssize_t skel_write(vfs_handle_struct *handle, files_struct *fsp, int fd, const void *data, size_t n)
+{
+       return vfswrap_write(NULL, fsp, fd, data, n);
+}
+
+static SMB_OFF_T skel_lseek(vfs_handle_struct *handle, files_struct *fsp, int filedes, SMB_OFF_T offset, int whence)
+{
+       return vfswrap_lseek(NULL, fsp, filedes, offset, whence);
+}
+
+static int skel_rename(vfs_handle_struct *handle, connection_struct *conn, const char *old, const char *new)
+{
+       return vfswrap_rename(NULL, conn, old, new);
+}
+
+static int skel_fsync(vfs_handle_struct *handle, files_struct *fsp, int fd)
+{
+       return vfswrap_fsync(NULL, fsp, fd);
+}
+
+static int skel_stat(vfs_handle_struct *handle, connection_struct *conn, const char *fname, SMB_STRUCT_STAT *sbuf)
+{
+       return vfswrap_stat(NULL, conn, fname, sbuf);
+}
+
+static int skel_fstat(vfs_handle_struct *handle, files_struct *fsp, int fd, SMB_STRUCT_STAT *sbuf)
+{
+       return vfswrap_fstat(NULL, fsp, fd, sbuf);
+}
+
+static int skel_lstat(vfs_handle_struct *handle, connection_struct *conn, const char *path, SMB_STRUCT_STAT *sbuf)
+{
+       return vfswrap_lstat(NULL, conn, path, sbuf);
+}
+
+static int skel_unlink(vfs_handle_struct *handle, connection_struct *conn, const char *path)
+{
+       return vfswrap_unlink(NULL, conn, path);
+}
+
+static int skel_chmod(vfs_handle_struct *handle, connection_struct *conn, const char *path, mode_t mode)
+{
+       return vfswrap_chmod(NULL, conn, path, mode);
+}
+
+static int skel_fchmod(vfs_handle_struct *handle, files_struct *fsp, int fd, mode_t mode)
+{
+       return vfswrap_fchmod(NULL, fsp, fd, mode);
+}
+
+static int skel_chown(vfs_handle_struct *handle, connection_struct *conn, const char *path, uid_t uid, gid_t gid)
+{
+       return vfswrap_chown(NULL, conn, path, uid, gid);
+}
+
+static int skel_fchown(vfs_handle_struct *handle, files_struct *fsp, int fd, uid_t uid, gid_t gid)
+{
+       return vfswrap_fchown(NULL, fsp, fd, uid, gid);
+}
+
+static int skel_chdir(vfs_handle_struct *handle, connection_struct *conn, const char *path)
+{
+       return vfswrap_chdir(NULL, conn, path);
+}
+
+static char *skel_getwd(vfs_handle_struct *handle, connection_struct *conn, char *buf)
+{
+       return vfswrap_getwd(NULL, conn, buf);
+}
+
+static int skel_utime(vfs_handle_struct *handle, connection_struct *conn, const char *path, struct utimbuf *times)
+{
+       return vfswrap_utime(NULL, conn, path, times);
+}
+
+static int skel_ftruncate(vfs_handle_struct *handle, files_struct *fsp, int fd, SMB_OFF_T offset)
+{
+       return vfswrap_ftruncate(NULL, fsp, fd, offset);
+}
+
+static BOOL skel_lock(vfs_handle_struct *handle, files_struct *fsp, int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
+{
+       return vfswrap_lock(NULL, fsp, fd, op, offset, count, type);
+}
+
+static BOOL skel_symlink(vfs_handle_struct *handle, connection_struct *conn, const char *oldpath, const char *newpath)
+{
+       return vfswrap_symlink(NULL, conn, oldpath, newpath);
+}
+
+static BOOL skel_readlink(vfs_handle_struct *handle, connection_struct *conn, const char *path, char *buf, size_t bufsiz)
+{
+       return vfswrap_readlink(NULL, conn, path, buf, bufsiz);
+}
+
+static int skel_link(vfs_handle_struct *handle, connection_struct *conn, const char *oldpath, const char *newpath)
+{
+       return vfswrap_link(NULL, conn, oldpath, newpath);
+}
+
+static int skel_mknod(vfs_handle_struct *handle, connection_struct *conn, const char *path, mode_t mode, SMB_DEV_T dev)
+{
+       return vfswrap_mknod(NULL, conn, path, mode, dev);
+}
+
+static char *skel_realpath(vfs_handle_struct *handle, connection_struct *conn, const char *path, char *resolved_path)
+{
+       return vfswrap_realpath(NULL, conn, path, resolved_path);
+}
+
+static size_t skel_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp, int fd, uint32 security_info, struct security_descriptor_info **ppdesc)
+{
+       errno = ENOSYS;
+       return 0;
+}
+
+static size_t skel_get_nt_acl(vfs_handle_struct *handle, files_struct *fsp, const char *name, uint32 security_info, struct security_descriptor_info **ppdesc)
+{
+       errno = ENOSYS;
+       return 0;
+}
+
+static BOOL skel_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp, int fd, uint32 security_info_sent, struct security_descriptor_info *psd)
+{
+       errno = ENOSYS;
+       return False;
+}
+
+static BOOL skel_set_nt_acl(vfs_handle_struct *handle, files_struct *fsp, const char *name, uint32 security_info_sent, struct security_descriptor_info *psd)
+{
+       errno = ENOSYS;
+       return False;
+}
+
+static int skel_chmod_acl(vfs_handle_struct *handle, connection_struct *conn, const char *name, mode_t mode)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_fchmod_acl(vfs_handle_struct *handle, files_struct *fsp, int fd, mode_t mode)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_sys_acl_get_entry(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T theacl, int entry_id, SMB_ACL_ENTRY_T *entry_p)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_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)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_sys_acl_get_permset(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry_d, SMB_ACL_PERMSET_T *permset_p)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static void *skel_sys_acl_get_qualifier(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry_d)
+{
+       errno = ENOSYS;
+       return NULL;
+}
+
+static SMB_ACL_T skel_sys_acl_get_file(vfs_handle_struct *handle, connection_struct *conn, const char *path_p, SMB_ACL_TYPE_T type)
+{
+       errno = ENOSYS;
+       return NULL;
+}
+
+static SMB_ACL_T skel_sys_acl_get_fd(vfs_handle_struct *handle, files_struct *fsp, int fd)
+{
+       errno = ENOSYS;
+       return NULL;
+}
+
+static int skel_sys_acl_clear_perms(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_PERMSET_T permset)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_sys_acl_add_perm(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static char *skel_sys_acl_to_text(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T theacl, ssize_t *plen)
+{
+       errno = ENOSYS;
+       return NULL;
+}
+
+static SMB_ACL_T skel_sys_acl_init(vfs_handle_struct *handle, connection_struct *conn, int count)
+{
+       errno = ENOSYS;
+       return NULL;
+}
+
+static int skel_sys_acl_create_entry(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_sys_acl_set_tag_type(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tagtype)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_sys_acl_set_qualifier(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry, void *qual)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_sys_acl_set_permset(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry, SMB_ACL_PERMSET_T permset)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_sys_acl_valid(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T theacl )
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_sys_acl_set_file(vfs_handle_struct *handle, connection_struct *conn, const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_sys_acl_set_fd(vfs_handle_struct *handle, files_struct *fsp, int fd, SMB_ACL_T theacl)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_sys_acl_delete_def_file(vfs_handle_struct *handle, connection_struct *conn, const char *path)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_sys_acl_get_perm(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_sys_acl_free_text(vfs_handle_struct *handle, connection_struct *conn, char *text)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_sys_acl_free_acl(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T posix_acl)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+static int skel_sys_acl_free_qualifier(vfs_handle_struct *handle, connection_struct *conn, void *qualifier, SMB_ACL_TAG_T tagtype)
+{
+       errno = ENOSYS;
+       return -1;
+}
+
+
+/* VFS operations structure */
+
+static vfs_op_tuple skel_op_tuples[] = {
+
+       /* Disk operations */
+
+       {SMB_VFS_OP(skel_connect),                      SMB_VFS_OP_CONNECT,             SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_disconnect),                   SMB_VFS_OP_DISCONNECT,          SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_disk_free),                    SMB_VFS_OP_DISK_FREE,           SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_get_quota),                    SMB_VFS_OP_GET_QUOTA,           SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_set_quota),                    SMB_VFS_OP_SET_QUOTA,           SMB_VFS_LAYER_OPAQUE},
+       
+       /* Directory operations */
+
+       {SMB_VFS_OP(skel_opendir),                      SMB_VFS_OP_OPENDIR,             SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_readdir),                      SMB_VFS_OP_READDIR,             SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_mkdir),                        SMB_VFS_OP_MKDIR,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_rmdir),                        SMB_VFS_OP_RMDIR,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_closedir),                     SMB_VFS_OP_CLOSEDIR,            SMB_VFS_LAYER_OPAQUE},
+
+       /* File operations */
+
+       {SMB_VFS_OP(skel_open),                         SMB_VFS_OP_OPEN,                SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_close),                        SMB_VFS_OP_CLOSE,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_read),                         SMB_VFS_OP_READ,                SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_write),                        SMB_VFS_OP_WRITE,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_lseek),                        SMB_VFS_OP_LSEEK,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_rename),                       SMB_VFS_OP_RENAME,              SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_fsync),                        SMB_VFS_OP_FSYNC,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_stat),                         SMB_VFS_OP_STAT,                SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_fstat),                        SMB_VFS_OP_FSTAT,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_lstat),                        SMB_VFS_OP_LSTAT,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_unlink),                       SMB_VFS_OP_UNLINK,              SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_chmod),                        SMB_VFS_OP_CHMOD,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_fchmod),                       SMB_VFS_OP_FCHMOD,              SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_chown),                        SMB_VFS_OP_CHOWN,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_fchown),                       SMB_VFS_OP_FCHOWN,              SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_chdir),                        SMB_VFS_OP_CHDIR,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_getwd),                        SMB_VFS_OP_GETWD,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_utime),                        SMB_VFS_OP_UTIME,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_ftruncate),                    SMB_VFS_OP_FTRUNCATE,           SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_lock),                         SMB_VFS_OP_LOCK,                SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_symlink),                      SMB_VFS_OP_SYMLINK,             SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_readlink),                     SMB_VFS_OP_READLINK,            SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_link),                         SMB_VFS_OP_LINK,                SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_mknod),                        SMB_VFS_OP_MKNOD,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_realpath),                     SMB_VFS_OP_REALPATH,            SMB_VFS_LAYER_OPAQUE},
+
+       /* NT File ACL operations */
+
+       {SMB_VFS_OP(skel_fget_nt_acl),                  SMB_VFS_OP_FGET_NT_ACL,         SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_get_nt_acl),                   SMB_VFS_OP_GET_NT_ACL,          SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_fset_nt_acl),                  SMB_VFS_OP_FSET_NT_ACL,         SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_set_nt_acl),                   SMB_VFS_OP_SET_NT_ACL,          SMB_VFS_LAYER_OPAQUE},
+
+       /* POSIX ACL operations */
+
+       {SMB_VFS_OP(skel_chmod_acl),                    SMB_VFS_OP_CHMOD_ACL,           SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_fchmod_acl),                   SMB_VFS_OP_FCHMOD_ACL,          SMB_VFS_LAYER_OPAQUE},
+
+       {SMB_VFS_OP(skel_sys_acl_get_entry),            SMB_VFS_OP_SYS_ACL_GET_ENTRY,           SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_get_tag_type),         SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE,        SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_get_permset),          SMB_VFS_OP_SYS_ACL_GET_PERMSET,         SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_get_qualifier),        SMB_VFS_OP_SYS_ACL_GET_QUALIFIER,       SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_get_file),             SMB_VFS_OP_SYS_ACL_GET_FILE,            SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_get_fd),               SMB_VFS_OP_SYS_ACL_GET_FD,              SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_clear_perms),          SMB_VFS_OP_SYS_ACL_CLEAR_PERMS,         SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_add_perm),             SMB_VFS_OP_SYS_ACL_ADD_PERM,            SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_to_text),              SMB_VFS_OP_SYS_ACL_TO_TEXT,             SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_init),                 SMB_VFS_OP_SYS_ACL_INIT,                SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_create_entry),         SMB_VFS_OP_SYS_ACL_CREATE_ENTRY,        SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_set_tag_type),         SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE,        SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_set_qualifier),        SMB_VFS_OP_SYS_ACL_SET_QUALIFIER,       SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_set_permset),          SMB_VFS_OP_SYS_ACL_SET_PERMSET,         SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_valid),                SMB_VFS_OP_SYS_ACL_VALID,               SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_set_file),             SMB_VFS_OP_SYS_ACL_SET_FILE,            SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_set_fd),               SMB_VFS_OP_SYS_ACL_SET_FD,              SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_delete_def_file),      SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE,     SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_get_perm),             SMB_VFS_OP_SYS_ACL_GET_PERM,            SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_free_text),            SMB_VFS_OP_SYS_ACL_FREE_TEXT,           SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_free_acl),             SMB_VFS_OP_SYS_ACL_FREE_ACL,            SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(skel_sys_acl_free_qualifier),       SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER,      SMB_VFS_LAYER_OPAQUE},
+       
+       {NULL,                                          SMB_VFS_OP_NOOP,                        SMB_VFS_LAYER_NOOP}
+};
+
+NTSTATUS init_module(void)
+{
+       return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "skel_opaque", skel_op_tuples);
+}
diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c
new file mode 100644 (file)
index 0000000..3a96747
--- /dev/null
@@ -0,0 +1,458 @@
+/* 
+ * Skeleton VFS module.  Implements passthrough operation of all VFS
+ * calls to disk functions.
+ *
+ * Copyright (C) Tim Potter, 1999-2000
+ * Copyright (C) Alexander Bokovoy, 2002
+ * Copyright (C) Stefan (metze) Metzmacher, 2003
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *  
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *  
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "includes.h"
+
+/* PLEASE,PLEASE READ THE VFS MODULES CHAPTER OF THE 
+   SAMBA DEVELOPERS GUIDE!!!!!!
+ */
+
+/* If you take this file as template for your module
+ * please make sure that you remove all functions you didn't
+ * want to implement!!
+ *
+ * This passthrough operations are useless in reall vfs modules!
+ *
+ * --metze
+ */
+
+static int skel_connect(vfs_handle_struct *handle, connection_struct *conn, const char *service, const char *user)    
+{
+       return SMB_VFS_NEXT_CONNECT(handle, conn, service, user);
+}
+
+static void skel_disconnect(vfs_handle_struct *handle, connection_struct *conn)
+{
+       SMB_VFS_NEXT_DISCONNECT(handle, conn);
+}
+
+static SMB_BIG_UINT skel_disk_free(vfs_handle_struct *handle, connection_struct *conn, const char *path,
+       BOOL small_query, SMB_BIG_UINT *bsize,
+       SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize)
+{
+       return SMB_VFS_NEXT_DISK_FREE(handle, conn, path, small_query, bsize, 
+                                        dfree, dsize);
+}
+
+static int skel_get_quota(vfs_handle_struct *handle, connection_struct *conn, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dq)
+{
+       return SMB_VFS_NEXT_GET_QUOTA(handle, conn, qtype, id, dq);
+}
+
+static int skel_set_quota(vfs_handle_struct *handle, connection_struct *conn, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dq)
+{
+       return SMB_VFS_NEXT_SET_QUOTA(handle, conn, qtype, id, dq);
+}
+
+static DIR *skel_opendir(vfs_handle_struct *handle, connection_struct *conn, const char *fname)
+{
+       return SMB_VFS_NEXT_OPENDIR(handle, conn, fname);
+}
+
+static struct dirent *skel_readdir(vfs_handle_struct *handle, connection_struct *conn, DIR *dirp)
+{
+       return SMB_VFS_NEXT_READDIR(handle, conn, dirp);
+}
+
+static int skel_mkdir(vfs_handle_struct *handle, connection_struct *conn, const char *path, mode_t mode)
+{
+       return SMB_VFS_NEXT_MKDIR(handle, conn, path, mode);
+}
+
+static int skel_rmdir(vfs_handle_struct *handle, connection_struct *conn, const char *path)
+{
+       return SMB_VFS_NEXT_RMDIR(handle, conn, path);
+}
+
+static int skel_closedir(vfs_handle_struct *handle, connection_struct *conn, DIR *dir)
+{
+       return SMB_VFS_NEXT_CLOSEDIR(handle, conn, dir);
+}
+
+static int skel_open(vfs_handle_struct *handle, connection_struct *conn, const char *fname, int flags, mode_t mode)
+{
+       return SMB_VFS_NEXT_OPEN(handle, conn, fname, flags, mode);
+}
+
+static int skel_close(vfs_handle_struct *handle, files_struct *fsp, int fd)
+{
+       return SMB_VFS_NEXT_CLOSE(handle, fsp, fd);
+}
+
+static ssize_t skel_read(vfs_handle_struct *handle, files_struct *fsp, int fd, void *data, size_t n)
+{
+       return SMB_VFS_NEXT_READ(handle, fsp, fd, data, n);
+}
+
+static ssize_t skel_write(vfs_handle_struct *handle, files_struct *fsp, int fd, const void *data, size_t n)
+{
+       return SMB_VFS_NEXT_WRITE(handle, fsp, fd, data, n);
+}
+
+static SMB_OFF_T skel_lseek(vfs_handle_struct *handle, files_struct *fsp, int filedes, SMB_OFF_T offset, int whence)
+{
+       return SMB_VFS_NEXT_LSEEK(handle, fsp, filedes, offset, whence);
+}
+
+static int skel_rename(vfs_handle_struct *handle, connection_struct *conn, const char *old, const char *new)
+{
+       return SMB_VFS_NEXT_RENAME(handle, conn, old, new);
+}
+
+static int skel_fsync(vfs_handle_struct *handle, files_struct *fsp, int fd)
+{
+       return SMB_VFS_NEXT_FSYNC(handle, fsp, fd);
+}
+
+static int skel_stat(vfs_handle_struct *handle, connection_struct *conn, const char *fname, SMB_STRUCT_STAT *sbuf)
+{
+       return SMB_VFS_NEXT_STAT(handle, conn, fname, sbuf);
+}
+
+static int skel_fstat(vfs_handle_struct *handle, files_struct *fsp, int fd, SMB_STRUCT_STAT *sbuf)
+{
+       return SMB_VFS_NEXT_FSTAT(handle, fsp, fd, sbuf);
+}
+
+static int skel_lstat(vfs_handle_struct *handle, connection_struct *conn, const char *path, SMB_STRUCT_STAT *sbuf)
+{
+       return SMB_VFS_NEXT_LSTAT(handle, conn, path, sbuf);
+}
+
+static int skel_unlink(vfs_handle_struct *handle, connection_struct *conn, const char *path)
+{
+       return SMB_VFS_NEXT_UNLINK(handle, conn, path);
+}
+
+static int skel_chmod(vfs_handle_struct *handle, connection_struct *conn, const char *path, mode_t mode)
+{
+       return SMB_VFS_NEXT_CHMOD(handle, conn, path, mode);
+}
+
+static int skel_fchmod(vfs_handle_struct *handle, files_struct *fsp, int fd, mode_t mode)
+{
+       return SMB_VFS_NEXT_FCHMOD(handle, fsp, fd, mode);
+}
+
+static int skel_chown(vfs_handle_struct *handle, connection_struct *conn, const char *path, uid_t uid, gid_t gid)
+{
+       return SMB_VFS_NEXT_CHOWN(handle, conn, path, uid, gid);
+}
+
+static int skel_fchown(vfs_handle_struct *handle, files_struct *fsp, int fd, uid_t uid, gid_t gid)
+{
+       return SMB_VFS_NEXT_FCHOWN(handle, fsp, fd, uid, gid);
+}
+
+static int skel_chdir(vfs_handle_struct *handle, connection_struct *conn, const char *path)
+{
+       return SMB_VFS_NEXT_CHDIR(handle, conn, path);
+}
+
+static char *skel_getwd(vfs_handle_struct *handle, connection_struct *conn, char *buf)
+{
+       return SMB_VFS_NEXT_GETWD(handle, conn, buf);
+}
+
+static int skel_utime(vfs_handle_struct *handle, connection_struct *conn, const char *path, struct utimbuf *times)
+{
+       return SMB_VFS_NEXT_UTIME(handle, conn, path, times);
+}
+
+static int skel_ftruncate(vfs_handle_struct *handle, files_struct *fsp, int fd, SMB_OFF_T offset)
+{
+       return SMB_VFS_NEXT_FTRUNCATE(handle, fsp, fd, offset);
+}
+
+static BOOL skel_lock(vfs_handle_struct *handle, files_struct *fsp, int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
+{
+       return SMB_VFS_NEXT_LOCK(handle, fsp, fd, op, offset, count, type);
+}
+
+static BOOL skel_symlink(vfs_handle_struct *handle, connection_struct *conn, const char *oldpath, const char *newpath)
+{
+       return SMB_VFS_NEXT_SYMLINK(handle, conn, oldpath, newpath);
+}
+
+static BOOL skel_readlink(vfs_handle_struct *handle, connection_struct *conn, const char *path, char *buf, size_t bufsiz)
+{
+       return SMB_VFS_NEXT_READLINK(handle, conn, path, buf, bufsiz);
+}
+
+static int skel_link(vfs_handle_struct *handle, connection_struct *conn, const char *oldpath, const char *newpath)
+{
+       return SMB_VFS_NEXT_LINK(handle, conn, oldpath, newpath);
+}
+
+static int skel_mknod(vfs_handle_struct *handle, connection_struct *conn, const char *path, mode_t mode, SMB_DEV_T dev)
+{
+       return SMB_VFS_NEXT_MKNOD(handle, conn, path, mode, dev);
+}
+
+static char *skel_realpath(vfs_handle_struct *handle, connection_struct *conn, const char *path, char *resolved_path)
+{
+       return SMB_VFS_NEXT_REALPATH(handle, conn, path, resolved_path);
+}
+
+static size_t skel_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp, int fd, uint32 security_info, struct security_descriptor_info **ppdesc)
+{
+       return SMB_VFS_NEXT_FGET_NT_ACL(handle, fsp, fd, security_info, ppdesc);
+}
+
+static size_t skel_get_nt_acl(vfs_handle_struct *handle, files_struct *fsp, const char *name, uint32 security_info, struct security_descriptor_info **ppdesc)
+{
+       return SMB_VFS_NEXT_GET_NT_ACL(handle, fsp, name, security_info, ppdesc);
+}
+
+static BOOL skel_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp, int fd, uint32 security_info_sent, struct security_descriptor_info *psd)
+{
+       return SMB_VFS_NEXT_FSET_NT_ACL(handle, fsp, fd, security_info_sent, psd);
+}
+
+static BOOL skel_set_nt_acl(vfs_handle_struct *handle, files_struct *fsp, const char *name, uint32 security_info_sent, struct security_descriptor_info *psd)
+{
+       return SMB_VFS_NEXT_SET_NT_ACL(handle, fsp, name, security_info_sent, psd);
+}
+
+static int skel_chmod_acl(vfs_handle_struct *handle, connection_struct *conn, const char *name, mode_t mode)
+{
+       /* If the underlying VFS doesn't have ACL support... */
+       if (!handle->vfs_next.ops.chmod_acl) {
+               errno = ENOSYS;
+               return -1;
+       }
+       return SMB_VFS_NEXT_CHMOD_ACL(handle, conn, name, mode);
+}
+
+static int skel_fchmod_acl(vfs_handle_struct *handle, files_struct *fsp, int fd, mode_t mode)
+{
+       /* If the underlying VFS doesn't have ACL support... */
+       if (!handle->vfs_next.ops.fchmod_acl) {
+               errno = ENOSYS;
+               return -1;
+       }
+       return SMB_VFS_NEXT_FCHMOD_ACL(handle, fsp, fd, mode);
+}
+
+static int skel_sys_acl_get_entry(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T theacl, int entry_id, SMB_ACL_ENTRY_T *entry_p)
+{
+       return SMB_VFS_NEXT_SYS_ACL_GET_ENTRY(handle, conn, theacl, entry_id, entry_p);
+}
+
+static int skel_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)
+{
+       return SMB_VFS_NEXT_SYS_ACL_GET_TAG_TYPE(handle, conn, entry_d, tag_type_p);
+}
+
+static int skel_sys_acl_get_permset(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry_d, SMB_ACL_PERMSET_T *permset_p)
+{
+       return SMB_VFS_NEXT_SYS_ACL_GET_PERMSET(handle, conn, entry_d, permset_p);
+}
+
+static void *skel_sys_acl_get_qualifier(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry_d)
+{
+       return SMB_VFS_NEXT_SYS_ACL_GET_QUALIFIER(handle, conn, entry_d);
+}
+
+static SMB_ACL_T skel_sys_acl_get_file(vfs_handle_struct *handle, connection_struct *conn, const char *path_p, SMB_ACL_TYPE_T type)
+{
+       return SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, conn, path_p, type);
+}
+
+static SMB_ACL_T skel_sys_acl_get_fd(vfs_handle_struct *handle, files_struct *fsp, int fd)
+{
+       return SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, fd);
+}
+
+static int skel_sys_acl_clear_perms(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_PERMSET_T permset)
+{
+       return SMB_VFS_NEXT_SYS_ACL_CLEAR_PERMS(handle, conn, permset);
+}
+
+static int skel_sys_acl_add_perm(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm)
+{
+       return SMB_VFS_NEXT_SYS_ACL_ADD_PERM(handle, conn, permset, perm);
+}
+
+static char *skel_sys_acl_to_text(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T theacl, ssize_t *plen)
+{
+       return SMB_VFS_NEXT_SYS_ACL_TO_TEXT(handle, conn, theacl, plen);
+}
+
+static SMB_ACL_T skel_sys_acl_init(vfs_handle_struct *handle, connection_struct *conn, int count)
+{
+       return SMB_VFS_NEXT_SYS_ACL_INIT(handle, conn, count);
+}
+
+static int skel_sys_acl_create_entry(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry)
+{
+       return SMB_VFS_NEXT_SYS_ACL_CREATE_ENTRY(handle, conn, pacl, pentry);
+}
+
+static int skel_sys_acl_set_tag_type(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tagtype)
+{
+       return SMB_VFS_NEXT_SYS_ACL_SET_TAG_TYPE(handle, conn, entry, tagtype);
+}
+
+static int skel_sys_acl_set_qualifier(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry, void *qual)
+{
+       return SMB_VFS_NEXT_SYS_ACL_SET_QUALIFIER(handle, conn, entry, qual);
+}
+
+static int skel_sys_acl_set_permset(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_ENTRY_T entry, SMB_ACL_PERMSET_T permset)
+{
+       return SMB_VFS_NEXT_SYS_ACL_SET_PERMSET(handle, conn, entry, permset);
+}
+
+static int skel_sys_acl_valid(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T theacl )
+{
+       return SMB_VFS_NEXT_SYS_ACL_VALID(handle, conn, theacl);
+}
+
+static int skel_sys_acl_set_file(vfs_handle_struct *handle, connection_struct *conn, const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl)
+{
+       return SMB_VFS_NEXT_SYS_ACL_SET_FILE(handle, conn, name, acltype, theacl);
+}
+
+static int skel_sys_acl_set_fd(vfs_handle_struct *handle, files_struct *fsp, int fd, SMB_ACL_T theacl)
+{
+       return SMB_VFS_NEXT_SYS_ACL_SET_FD(handle, fsp, fd, theacl);
+}
+
+static int skel_sys_acl_delete_def_file(vfs_handle_struct *handle, connection_struct *conn, const char *path)
+{
+       return SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle, conn, path);
+}
+
+static int skel_sys_acl_get_perm(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_PERMSET_T permset, SMB_ACL_PERM_T perm)
+{
+       return SMB_VFS_NEXT_SYS_ACL_GET_PERM(handle, conn, permset, perm);
+}
+
+static int skel_sys_acl_free_text(vfs_handle_struct *handle, connection_struct *conn, char *text)
+{
+       return SMB_VFS_NEXT_SYS_ACL_FREE_TEXT(handle, conn, text);
+}
+
+static int skel_sys_acl_free_acl(vfs_handle_struct *handle, connection_struct *conn, SMB_ACL_T posix_acl)
+{
+       return SMB_VFS_NEXT_SYS_ACL_FREE_ACL(handle, conn, posix_acl);
+}
+
+static int skel_sys_acl_free_qualifier(vfs_handle_struct *handle, connection_struct *conn, void *qualifier, SMB_ACL_TAG_T tagtype)
+{
+       return SMB_VFS_NEXT_SYS_ACL_FREE_QUALIFIER(handle, conn, qualifier, tagtype);
+}
+
+
+/* VFS operations structure */
+
+static vfs_op_tuple skel_op_tuples[] = {
+
+       /* Disk operations */
+
+       {SMB_VFS_OP(skel_connect),                      SMB_VFS_OP_CONNECT,             SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_disconnect),                   SMB_VFS_OP_DISCONNECT,          SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_disk_free),                    SMB_VFS_OP_DISK_FREE,           SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_get_quota),                    SMB_VFS_OP_GET_QUOTA,           SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_set_quota),                    SMB_VFS_OP_SET_QUOTA,           SMB_VFS_LAYER_TRANSPARENT},
+       
+       /* Directory operations */
+
+       {SMB_VFS_OP(skel_opendir),                      SMB_VFS_OP_OPENDIR,             SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_readdir),                      SMB_VFS_OP_READDIR,             SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_mkdir),                        SMB_VFS_OP_MKDIR,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_rmdir),                        SMB_VFS_OP_RMDIR,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_closedir),                     SMB_VFS_OP_CLOSEDIR,            SMB_VFS_LAYER_TRANSPARENT},
+
+       /* File operations */
+
+       {SMB_VFS_OP(skel_open),                         SMB_VFS_OP_OPEN,                SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_close),                        SMB_VFS_OP_CLOSE,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_read),                         SMB_VFS_OP_READ,                SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_write),                        SMB_VFS_OP_WRITE,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_lseek),                        SMB_VFS_OP_LSEEK,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_rename),                       SMB_VFS_OP_RENAME,              SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_fsync),                        SMB_VFS_OP_FSYNC,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_stat),                         SMB_VFS_OP_STAT,                SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_fstat),                        SMB_VFS_OP_FSTAT,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_lstat),                        SMB_VFS_OP_LSTAT,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_unlink),                       SMB_VFS_OP_UNLINK,              SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_chmod),                        SMB_VFS_OP_CHMOD,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_fchmod),                       SMB_VFS_OP_FCHMOD,              SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_chown),                        SMB_VFS_OP_CHOWN,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_fchown),                       SMB_VFS_OP_FCHOWN,              SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_chdir),                        SMB_VFS_OP_CHDIR,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_getwd),                        SMB_VFS_OP_GETWD,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_utime),                        SMB_VFS_OP_UTIME,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_ftruncate),                    SMB_VFS_OP_FTRUNCATE,           SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_lock),                         SMB_VFS_OP_LOCK,                SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_symlink),                      SMB_VFS_OP_SYMLINK,             SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_readlink),                     SMB_VFS_OP_READLINK,            SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_link),                         SMB_VFS_OP_LINK,                SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_mknod),                        SMB_VFS_OP_MKNOD,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_realpath),                     SMB_VFS_OP_REALPATH,            SMB_VFS_LAYER_TRANSPARENT},
+
+       /* NT File ACL operations */
+
+       {SMB_VFS_OP(skel_fget_nt_acl),                  SMB_VFS_OP_FGET_NT_ACL,         SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_get_nt_acl),                   SMB_VFS_OP_GET_NT_ACL,          SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_fset_nt_acl),                  SMB_VFS_OP_FSET_NT_ACL,         SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_set_nt_acl),                   SMB_VFS_OP_SET_NT_ACL,          SMB_VFS_LAYER_TRANSPARENT},
+
+       /* POSIX ACL operations */
+
+       {SMB_VFS_OP(skel_chmod_acl),                    SMB_VFS_OP_CHMOD_ACL,           SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_fchmod_acl),                   SMB_VFS_OP_FCHMOD_ACL,          SMB_VFS_LAYER_TRANSPARENT},
+
+       {SMB_VFS_OP(skel_sys_acl_get_entry),            SMB_VFS_OP_SYS_ACL_GET_ENTRY,           SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_get_tag_type),         SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE,        SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_get_permset),          SMB_VFS_OP_SYS_ACL_GET_PERMSET,         SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_get_qualifier),        SMB_VFS_OP_SYS_ACL_GET_QUALIFIER,       SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_get_file),             SMB_VFS_OP_SYS_ACL_GET_FILE,            SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_get_fd),               SMB_VFS_OP_SYS_ACL_GET_FD,              SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_clear_perms),          SMB_VFS_OP_SYS_ACL_CLEAR_PERMS,         SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_add_perm),             SMB_VFS_OP_SYS_ACL_ADD_PERM,            SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_to_text),              SMB_VFS_OP_SYS_ACL_TO_TEXT,             SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_init),                 SMB_VFS_OP_SYS_ACL_INIT,                SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_create_entry),         SMB_VFS_OP_SYS_ACL_CREATE_ENTRY,        SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_set_tag_type),         SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE,        SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_set_qualifier),        SMB_VFS_OP_SYS_ACL_SET_QUALIFIER,       SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_set_permset),          SMB_VFS_OP_SYS_ACL_SET_PERMSET,         SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_valid),                SMB_VFS_OP_SYS_ACL_VALID,               SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_set_file),             SMB_VFS_OP_SYS_ACL_SET_FILE,            SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_set_fd),               SMB_VFS_OP_SYS_ACL_SET_FD,              SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_delete_def_file),      SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE,     SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_get_perm),             SMB_VFS_OP_SYS_ACL_GET_PERM,            SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_free_text),            SMB_VFS_OP_SYS_ACL_FREE_TEXT,           SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_free_acl),             SMB_VFS_OP_SYS_ACL_FREE_ACL,            SMB_VFS_LAYER_TRANSPARENT},
+       {SMB_VFS_OP(skel_sys_acl_free_qualifier),       SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER,      SMB_VFS_LAYER_TRANSPARENT},
+       
+       {NULL,                                          SMB_VFS_OP_NOOP,                        SMB_VFS_LAYER_NOOP}
+};
+
+NTSTATUS init_module(void)
+{
+       return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "skel_transparent", skel_op_tuples);
+}