mirror of
https://github.com/samba-team/samba.git
synced 2025-03-03 12:58:35 +03:00
Move VFS example skel.c to two different examples: one for opaque operations and one for transparent. Also add configure support for compiling third-party modules. Patch from Stefan Metzmacher <metze@metzemix.de>
This commit is contained in:
parent
768e42bf40
commit
fcdf215753
@ -1,4 +1,9 @@
|
||||
.libs
|
||||
*.so
|
||||
*.o
|
||||
*.bak
|
||||
autom4te.cache
|
||||
autom4te-2.53.cache
|
||||
Makefile
|
||||
configure
|
||||
config.*
|
||||
|
@ -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
|
43
examples/VFS/Makefile.in
Normal file
43
examples/VFS/Makefile.in
Normal file
@ -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
|
||||
|
@ -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.
|
||||
|
||||
|
60
examples/VFS/autogen.sh
Executable file
60
examples/VFS/autogen.sh
Executable file
@ -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
|
||||
|
275
examples/VFS/configure.in
Normal file
275
examples/VFS/configure.in
Normal file
@ -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)
|
238
examples/VFS/install-sh
Normal file
238
examples/VFS/install-sh
Normal file
@ -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
|
@ -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);
|
||||
}
|
477
examples/VFS/skel_opaque.c
Normal file
477
examples/VFS/skel_opaque.c
Normal file
@ -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);
|
||||
}
|
458
examples/VFS/skel_transparent.c
Normal file
458
examples/VFS/skel_transparent.c
Normal file
@ -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);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user