samldb: Allow automatic generation of mAPIIDs
[sfrench/samba-autobuild/.git] / source4 / ntvfs / ntvfs_interface.c
index 6ab5aad790b8ec68f1f56b9dadc94d26edb28ddb..005da0b8e2f14728ee8f11a7f4f66880349d7312 100644 (file)
@@ -6,7 +6,7 @@
 
    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
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    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.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
-#include "smb_server/smb_server.h"
-
+#include "ntvfs/ntvfs.h"
+#include "lib/tsocket/tsocket.h"
 
 /* connect/disconnect */
-NTSTATUS ntvfs_connect(struct smbsrv_request *req, const char *sharename)
+NTSTATUS ntvfs_connect(struct ntvfs_request *req, union smb_tcon *tcon)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->connect) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->connect_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->connect(ntvfs, req, sharename);
+       return ntvfs->ops->connect_fn(ntvfs, req, tcon);
 }
 
-NTSTATUS ntvfs_disconnect(struct smbsrv_tcon *tcon)
+NTSTATUS ntvfs_disconnect(struct ntvfs_context *ntvfs_ctx)
 {
-       struct ntvfs_module_context *ntvfs = tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->disconnect) {
+       struct ntvfs_module_context *ntvfs;
+       if (ntvfs_ctx == NULL) {
+               return NT_STATUS_INVALID_CONNECTION;
+       }
+       ntvfs = ntvfs_ctx->modules;
+       if (!ntvfs->ops->disconnect_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->disconnect(ntvfs, tcon);
+       return ntvfs->ops->disconnect_fn(ntvfs);
 }
 
-/* path operations */
-NTSTATUS ntvfs_unlink(struct smbsrv_request *req, struct smb_unlink *unl)
+/* async setup - called by a backend that wants to setup any state for
+   a async request */
+NTSTATUS ntvfs_async_setup(struct ntvfs_request *req, void *private_data)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->unlink) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->async_setup_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->unlink(ntvfs, req, unl);
+       return ntvfs->ops->async_setup_fn(ntvfs, req, private_data);
 }
 
-NTSTATUS ntvfs_chkpath(struct smbsrv_request *req, struct smb_chkpath *cp)
+/* filesystem operations */
+NTSTATUS ntvfs_fsinfo(struct ntvfs_request *req, union smb_fsinfo *fs)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->chkpath) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->fsinfo_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->chkpath(ntvfs, req, cp);
+       return ntvfs->ops->fsinfo_fn(ntvfs, req, fs);
 }
 
-NTSTATUS ntvfs_qpathinfo(struct smbsrv_request *req, union smb_fileinfo *st)
+/* path operations */
+NTSTATUS ntvfs_unlink(struct ntvfs_request *req, union smb_unlink *unl)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->qpathinfo) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->unlink_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->qpathinfo(ntvfs, req, st);
+       return ntvfs->ops->unlink_fn(ntvfs, req, unl);
 }
 
-NTSTATUS ntvfs_setpathinfo(struct smbsrv_request *req, union smb_setfileinfo *st)
+NTSTATUS ntvfs_chkpath(struct ntvfs_request *req, union smb_chkpath *cp)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->setpathinfo) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->chkpath_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->setpathinfo(ntvfs, req, st);
+       return ntvfs->ops->chkpath_fn(ntvfs, req, cp);
 }
 
-NTSTATUS ntvfs_openfile(struct smbsrv_request *req, union smb_open *oi)
+NTSTATUS ntvfs_qpathinfo(struct ntvfs_request *req, union smb_fileinfo *st)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->openfile) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->qpathinfo_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->openfile(ntvfs, req, oi);
+       return ntvfs->ops->qpathinfo_fn(ntvfs, req, st);
 }
 
-NTSTATUS ntvfs_mkdir(struct smbsrv_request *req, union smb_mkdir *md)
+NTSTATUS ntvfs_setpathinfo(struct ntvfs_request *req, union smb_setfileinfo *st)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->mkdir) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->setpathinfo_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->mkdir(ntvfs, req, md);
+       return ntvfs->ops->setpathinfo_fn(ntvfs, req, st);
 }
 
-NTSTATUS ntvfs_rmdir(struct smbsrv_request *req, struct smb_rmdir *rd)
+NTSTATUS ntvfs_open(struct ntvfs_request *req, union smb_open *oi)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->rmdir) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->open_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->rmdir(ntvfs, req, rd);
+       return ntvfs->ops->open_fn(ntvfs, req, oi);
 }
 
-NTSTATUS ntvfs_rename(struct smbsrv_request *req, union smb_rename *ren)
+NTSTATUS ntvfs_mkdir(struct ntvfs_request *req, union smb_mkdir *md)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->rename) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->mkdir_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->rename(ntvfs, req, ren);
+       return ntvfs->ops->mkdir_fn(ntvfs, req, md);
 }
 
-NTSTATUS ntvfs_copy(struct smbsrv_request *req, struct smb_copy *cp)
+NTSTATUS ntvfs_rmdir(struct ntvfs_request *req, struct smb_rmdir *rd)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->copy) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->rmdir_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->copy(ntvfs, req, cp);
+       return ntvfs->ops->rmdir_fn(ntvfs, req, rd);
 }
 
-/* directory search */
-NTSTATUS ntvfs_search_first(struct smbsrv_request *req, union smb_search_first *io, void *private,
-                                BOOL ntvfs_callback(void *private, union smb_search_data *file))
+NTSTATUS ntvfs_rename(struct ntvfs_request *req, union smb_rename *ren)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->search_first) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->rename_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->search_first(ntvfs, req, io, private, ntvfs_callback);
+       return ntvfs->ops->rename_fn(ntvfs, req, ren);
 }
 
-NTSTATUS ntvfs_search_next(struct smbsrv_request *req, union smb_search_next *io, void *private,
-                                BOOL ntvfs_callback(void *private, union smb_search_data *file))
+NTSTATUS ntvfs_copy(struct ntvfs_request *req, struct smb_copy *cp)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->search_next) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->copy_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->search_next(ntvfs, req, io, private, ntvfs_callback);
+       return ntvfs->ops->copy_fn(ntvfs, req, cp);
 }
 
-NTSTATUS ntvfs_search_close(struct smbsrv_request *req, union smb_search_close *io)
+/* directory search */
+NTSTATUS ntvfs_search_first(struct ntvfs_request *req, union smb_search_first *io, void *private_data,
+                                    bool ntvfs_callback(void *private_data, const union smb_search_data *file))
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->search_close) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->search_first_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->search_close(ntvfs, req, io);
+       return ntvfs->ops->search_first_fn(ntvfs, req, io, private_data, ntvfs_callback);
 }
 
-/* operations on open files */
-NTSTATUS ntvfs_ioctl(struct smbsrv_request *req, union smb_ioctl *io)
+NTSTATUS ntvfs_search_next(struct ntvfs_request *req, union smb_search_next *io, void *private_data,
+                                   bool ntvfs_callback(void *private_data, const union smb_search_data *file))
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->ioctl) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->search_next_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->ioctl(ntvfs, req, io);
+       return ntvfs->ops->search_next_fn(ntvfs, req, io, private_data, ntvfs_callback);
 }
 
-NTSTATUS ntvfs_read(struct smbsrv_request *req, union smb_read *io)
+NTSTATUS ntvfs_search_close(struct ntvfs_request *req, union smb_search_close *io)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->read) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->search_close_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->read(ntvfs, req, io);
+       return ntvfs->ops->search_close_fn(ntvfs, req, io);
 }
 
-NTSTATUS ntvfs_write(struct smbsrv_request *req, union smb_write *io)
+/* operations on open files */
+NTSTATUS ntvfs_ioctl(struct ntvfs_request *req, union smb_ioctl *io)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->write) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->ioctl_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->write(ntvfs, req, io);
+       return ntvfs->ops->ioctl_fn(ntvfs, req, io);
 }
 
-NTSTATUS ntvfs_seek(struct smbsrv_request *req, struct smb_seek *io)
+NTSTATUS ntvfs_read(struct ntvfs_request *req, union smb_read *io)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->seek) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->read_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->seek(ntvfs, req, io);
+       return ntvfs->ops->read_fn(ntvfs, req, io);
 }
 
-NTSTATUS ntvfs_flush(struct smbsrv_request *req, struct smb_flush *flush)
+NTSTATUS ntvfs_write(struct ntvfs_request *req, union smb_write *io)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->flush) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->write_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->flush(ntvfs, req, flush);
+       return ntvfs->ops->write_fn(ntvfs, req, io);
 }
 
-NTSTATUS ntvfs_close(struct smbsrv_request *req, union smb_close *io)
+NTSTATUS ntvfs_seek(struct ntvfs_request *req, union smb_seek *io)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->close) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->seek_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->close(ntvfs, req, io);
+       return ntvfs->ops->seek_fn(ntvfs, req, io);
 }
 
-NTSTATUS ntvfs_exit(struct smbsrv_request *req)
+NTSTATUS ntvfs_flush(struct ntvfs_request *req,
+                             union smb_flush *flush)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->exit) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->flush_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->exit(ntvfs, req);
+       return ntvfs->ops->flush_fn(ntvfs, req, flush);
 }
 
-NTSTATUS ntvfs_lock(struct smbsrv_request *req, union smb_lock *lck)
+NTSTATUS ntvfs_lock(struct ntvfs_request *req, union smb_lock *lck)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->lock) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->lock_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->lock(ntvfs, req, lck);
+       return ntvfs->ops->lock_fn(ntvfs, req, lck);
 }
 
-NTSTATUS ntvfs_setfileinfo(struct smbsrv_request *req, union smb_setfileinfo *info)
+NTSTATUS ntvfs_qfileinfo(struct ntvfs_request *req, union smb_fileinfo *info)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->setfileinfo) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->qfileinfo_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->setfileinfo(ntvfs, req, info);
+       return ntvfs->ops->qfileinfo_fn(ntvfs, req, info);
 }
 
-NTSTATUS ntvfs_qfileinfo(struct smbsrv_request *req, union smb_fileinfo *info)
+NTSTATUS ntvfs_setfileinfo(struct ntvfs_request *req, union smb_setfileinfo *info)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->qfileinfo) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->setfileinfo_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->qfileinfo(ntvfs, req, info);
+       return ntvfs->ops->setfileinfo_fn(ntvfs, req, info);
 }
 
-/* filesystem operations */
-NTSTATUS ntvfs_fsinfo(struct smbsrv_request *req, union smb_fsinfo *fs)
+NTSTATUS ntvfs_close(struct ntvfs_request *req, union smb_close *io)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->fsinfo) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->close_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->fsinfo(ntvfs, req, fs);
+       return ntvfs->ops->close_fn(ntvfs, req, io);
 }
 
-/* printing specific operations */
-NTSTATUS ntvfs_lpq(struct smbsrv_request *req, union smb_lpq *lpq)
+/* trans interface - used by IPC backend for pipes and RAP calls */
+NTSTATUS ntvfs_trans(struct ntvfs_request *req, struct smb_trans2 *trans)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->lpq) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->trans_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->lpq(ntvfs, req, lpq);
+       return ntvfs->ops->trans_fn(ntvfs, req, trans);
 }
 
 /* trans2 interface - only used by CIFS backend to prover complete passthru for testing */
-NTSTATUS ntvfs_trans2(struct smbsrv_request *req, struct smb_trans2 *trans2)
+NTSTATUS ntvfs_trans2(struct ntvfs_request *req, struct smb_trans2 *trans2)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->trans2) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->trans2_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->trans2(ntvfs, req, trans2);
+       return ntvfs->ops->trans2_fn(ntvfs, req, trans2);
 }
 
-/* trans interface - used by IPC backend for pipes and RAP calls */
-NTSTATUS ntvfs_trans(struct smbsrv_request *req, struct smb_trans2 *trans)
+/* printing specific operations */
+NTSTATUS ntvfs_lpq(struct ntvfs_request *req, union smb_lpq *lpq)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->trans) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->lpq_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->trans(ntvfs, req, trans);
+       return ntvfs->ops->lpq_fn(ntvfs, req, lpq);
 }
 
 /* logoff - called when a vuid is closed */
-NTSTATUS ntvfs_logoff(struct smbsrv_request *req)
+NTSTATUS ntvfs_logoff(struct ntvfs_request *req)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->logoff) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->logoff_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->logoff(ntvfs, req);
+       return ntvfs->ops->logoff_fn(ntvfs, req);
 }
 
-/* async setup - called by a backend that wants to setup any state for
-   a async request */
-NTSTATUS ntvfs_async_setup(struct smbsrv_request *req, void *private)
+NTSTATUS ntvfs_exit(struct ntvfs_request *req)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->async_setup) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->exit_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->async_setup(ntvfs, req, private);
+       return ntvfs->ops->exit_fn(ntvfs, req);
 }
 
+/*
+  change notify request
+*/
+NTSTATUS ntvfs_notify(struct ntvfs_request *req, union smb_notify *info)
+{
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->notify_fn) {
+               return NT_STATUS_NOT_IMPLEMENTED;
+       }
+       return ntvfs->ops->notify_fn(ntvfs, req, info);
+}
 
 /*
   cancel an outstanding async request
 */
-NTSTATUS ntvfs_cancel(struct smbsrv_request *req)
+NTSTATUS ntvfs_cancel(struct ntvfs_request *req)
 {
-       struct ntvfs_module_context *ntvfs = req->tcon->ntvfs_ctx->modules;
-       if (!ntvfs->ops->cancel) {
+       struct ntvfs_module_context *ntvfs = req->ctx->modules;
+       if (!ntvfs->ops->cancel_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->ops->cancel(ntvfs, req);
+       return ntvfs->ops->cancel_fn(ntvfs, req);
 }
 
-
 /* initial setup */
 NTSTATUS ntvfs_next_connect(struct ntvfs_module_context *ntvfs, 
-                           struct smbsrv_request *req, const char *sharename)
+                                    struct ntvfs_request *req,
+                                    union smb_tcon *tcon)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->connect) {
+       if (!ntvfs->next || !ntvfs->next->ops->connect_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->connect(ntvfs->next, req, sharename);
+       return ntvfs->next->ops->connect_fn(ntvfs->next, req, tcon);
 }
 
-NTSTATUS ntvfs_next_disconnect(struct ntvfs_module_context *ntvfs, 
-                              struct smbsrv_tcon *tcon)
+NTSTATUS ntvfs_next_disconnect(struct ntvfs_module_context *ntvfs)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->disconnect) {
+       if (!ntvfs->next || !ntvfs->next->ops->disconnect_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->disconnect(ntvfs->next, tcon);
+       return ntvfs->next->ops->disconnect_fn(ntvfs->next);
+}
+
+/* async_setup - called when setting up for a async request */
+NTSTATUS ntvfs_next_async_setup(struct ntvfs_module_context *ntvfs, 
+                                        struct ntvfs_request *req, 
+                                        void *private_data)
+{
+       if (!ntvfs->next || !ntvfs->next->ops->async_setup_fn) {
+               return NT_STATUS_NOT_IMPLEMENTED;
+       }
+       return ntvfs->next->ops->async_setup_fn(ntvfs->next, req, private_data);
+}
+
+/* filesystem operations */
+NTSTATUS ntvfs_next_fsinfo(struct ntvfs_module_context *ntvfs, 
+                                   struct ntvfs_request *req,
+                                   union smb_fsinfo *fs)
+{
+       if (!ntvfs->next || !ntvfs->next->ops->fsinfo_fn) {
+               return NT_STATUS_NOT_IMPLEMENTED;
+       }
+       return ntvfs->next->ops->fsinfo_fn(ntvfs->next, req, fs);
 }
 
 /* path operations */
 NTSTATUS ntvfs_next_unlink(struct ntvfs_module_context *ntvfs, 
-                          struct smbsrv_request *req, struct smb_unlink *unl)
+                                   struct ntvfs_request *req,
+                                   union smb_unlink *unl)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->unlink) {
+       if (!ntvfs->next || !ntvfs->next->ops->unlink_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->unlink(ntvfs->next, req, unl);
+       return ntvfs->next->ops->unlink_fn(ntvfs->next, req, unl);
 }
 
 NTSTATUS ntvfs_next_chkpath(struct ntvfs_module_context *ntvfs, 
-                           struct smbsrv_request *req, struct smb_chkpath *cp)
+                                    struct ntvfs_request *req,
+                                    union smb_chkpath *cp)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->chkpath) {
+       if (!ntvfs->next || !ntvfs->next->ops->chkpath_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->chkpath(ntvfs->next, req, cp);
+       return ntvfs->next->ops->chkpath_fn(ntvfs->next, req, cp);
 }
 
 NTSTATUS ntvfs_next_qpathinfo(struct ntvfs_module_context *ntvfs, 
-                             struct smbsrv_request *req, union smb_fileinfo *st)
+                                      struct ntvfs_request *req,
+                                      union smb_fileinfo *st)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->qpathinfo) {
+       if (!ntvfs->next || !ntvfs->next->ops->qpathinfo_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->qpathinfo(ntvfs->next, req, st);
+       return ntvfs->next->ops->qpathinfo_fn(ntvfs->next, req, st);
 }
 
 NTSTATUS ntvfs_next_setpathinfo(struct ntvfs_module_context *ntvfs, 
-                               struct smbsrv_request *req, union smb_setfileinfo *st)
+                                        struct ntvfs_request *req,
+                                        union smb_setfileinfo *st)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->setpathinfo) {
+       if (!ntvfs->next || !ntvfs->next->ops->setpathinfo_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->setpathinfo(ntvfs->next, req, st);
+       return ntvfs->next->ops->setpathinfo_fn(ntvfs->next, req, st);
 }
 
-NTSTATUS ntvfs_next_openfile(struct ntvfs_module_context *ntvfs, 
-                        struct smbsrv_request *req, union smb_open *oi)
+NTSTATUS ntvfs_next_mkdir(struct ntvfs_module_context *ntvfs, 
+                                  struct ntvfs_request *req,
+                                  union smb_mkdir *md)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->openfile) {
+       if (!ntvfs->next || !ntvfs->next->ops->mkdir_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->openfile(ntvfs->next, req, oi);
+       return ntvfs->next->ops->mkdir_fn(ntvfs->next, req, md);
 }
 
-NTSTATUS ntvfs_next_mkdir(struct ntvfs_module_context *ntvfs, 
-                         struct smbsrv_request *req, union smb_mkdir *md)
+NTSTATUS ntvfs_next_rmdir(struct ntvfs_module_context *ntvfs, 
+                                  struct ntvfs_request *req,
+                                  struct smb_rmdir *rd)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->mkdir) {
+       if (!ntvfs->next || !ntvfs->next->ops->rmdir_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->mkdir(ntvfs->next, req, md);
+       return ntvfs->next->ops->rmdir_fn(ntvfs->next, req, rd);
 }
 
-NTSTATUS ntvfs_next_rmdir(struct ntvfs_module_context *ntvfs, 
-                         struct smbsrv_request *req, struct smb_rmdir *rd)
+NTSTATUS ntvfs_next_rename(struct ntvfs_module_context *ntvfs, 
+                                   struct ntvfs_request *req,
+                                   union smb_rename *ren)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->rmdir) {
+       if (!ntvfs->next || !ntvfs->next->ops->rename_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->rmdir(ntvfs->next, req, rd);
+       return ntvfs->next->ops->rename_fn(ntvfs->next, req, ren);
 }
 
-NTSTATUS ntvfs_next_rename(struct ntvfs_module_context *ntvfs, 
-                          struct smbsrv_request *req, union smb_rename *ren)
+NTSTATUS ntvfs_next_copy(struct ntvfs_module_context *ntvfs, 
+                                 struct ntvfs_request *req,
+                                 struct smb_copy *cp)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->rename) {
+       if (!ntvfs->next || !ntvfs->next->ops->copy_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->rename(ntvfs->next, req, ren);
+       return ntvfs->next->ops->copy_fn(ntvfs->next, req, cp);
 }
 
-NTSTATUS ntvfs_next_copy(struct ntvfs_module_context *ntvfs, 
-                        struct smbsrv_request *req, struct smb_copy *cp)
+NTSTATUS ntvfs_next_open(struct ntvfs_module_context *ntvfs, 
+                                 struct ntvfs_request *req,
+                                 union smb_open *oi)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->copy) {
+       if (!ntvfs->next || !ntvfs->next->ops->open_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->copy(ntvfs->next, req, cp);
+       return ntvfs->next->ops->open_fn(ntvfs->next, req, oi);
 }
 
+
 /* directory search */
 NTSTATUS ntvfs_next_search_first(struct ntvfs_module_context *ntvfs, 
-                                struct smbsrv_request *req, union smb_search_first *io, void *private,
-                                BOOL (*callback)(void *private, union smb_search_data *file))
+                                         struct ntvfs_request *req,
+                                         union smb_search_first *io, void *private_data,
+                                         bool (*callback)(void *private_data, const union smb_search_data *file))
 {
-       if (!ntvfs->next || !ntvfs->next->ops->search_first) {
+       if (!ntvfs->next || !ntvfs->next->ops->search_first_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->search_first(ntvfs->next, req, io, private, callback);
+       return ntvfs->next->ops->search_first_fn(ntvfs->next, req, io, private_data, callback);
 }
 
 NTSTATUS ntvfs_next_search_next(struct ntvfs_module_context *ntvfs, 
-                               struct smbsrv_request *req, union smb_search_next *io, void *private,
-                               BOOL (*callback)(void *private, union smb_search_data *file))
+                                        struct ntvfs_request *req,
+                                        union smb_search_next *io, void *private_data,
+                                        bool (*callback)(void *private_data, const union smb_search_data *file))
 {
-       if (!ntvfs->next || !ntvfs->next->ops->search_next) {
+       if (!ntvfs->next || !ntvfs->next->ops->search_next_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->search_next(ntvfs->next, req, io, private, callback);
+       return ntvfs->next->ops->search_next_fn(ntvfs->next, req, io, private_data, callback);
 }
 
 NTSTATUS ntvfs_next_search_close(struct ntvfs_module_context *ntvfs, 
-                                struct smbsrv_request *req, union smb_search_close *io)
+                                         struct ntvfs_request *req,
+                                         union smb_search_close *io)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->search_close) {
+       if (!ntvfs->next || !ntvfs->next->ops->search_close_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->search_close(ntvfs->next, req, io);
+       return ntvfs->next->ops->search_close_fn(ntvfs->next, req, io);
 }
 
 /* operations on open files */
 NTSTATUS ntvfs_next_ioctl(struct ntvfs_module_context *ntvfs, 
-                         struct smbsrv_request *req, union smb_ioctl *io)
+                                  struct ntvfs_request *req,
+                                  union smb_ioctl *io)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->ioctl) {
+       if (!ntvfs->next || !ntvfs->next->ops->ioctl_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->ioctl(ntvfs->next, req, io);
+       return ntvfs->next->ops->ioctl_fn(ntvfs->next, req, io);
 }
 
 NTSTATUS ntvfs_next_read(struct ntvfs_module_context *ntvfs, 
-                        struct smbsrv_request *req, union smb_read *io)
+                                 struct ntvfs_request *req,
+                                 union smb_read *io)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->read) {
+       if (!ntvfs->next || !ntvfs->next->ops->read_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->read(ntvfs->next, req, io);
+       return ntvfs->next->ops->read_fn(ntvfs->next, req, io);
 }
 
 NTSTATUS ntvfs_next_write(struct ntvfs_module_context *ntvfs, 
-                         struct smbsrv_request *req, union smb_write *io)
+                                  struct ntvfs_request *req,
+                                  union smb_write *io)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->write) {
+       if (!ntvfs->next || !ntvfs->next->ops->write_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->write(ntvfs->next, req, io);
+       return ntvfs->next->ops->write_fn(ntvfs->next, req, io);
 }
 
 NTSTATUS ntvfs_next_seek(struct ntvfs_module_context *ntvfs, 
-                        struct smbsrv_request *req, struct smb_seek *io)
+                                 struct ntvfs_request *req,
+                                 union smb_seek *io)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->seek) {
+       if (!ntvfs->next || !ntvfs->next->ops->seek_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->seek(ntvfs->next, req, io);
+       return ntvfs->next->ops->seek_fn(ntvfs->next, req, io);
 }
 
 NTSTATUS ntvfs_next_flush(struct ntvfs_module_context *ntvfs, 
-                         struct smbsrv_request *req, struct smb_flush *flush)
+                                  struct ntvfs_request *req,
+                                  union smb_flush *flush)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->flush) {
+       if (!ntvfs->next || !ntvfs->next->ops->flush_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->flush(ntvfs->next, req, flush);
+       return ntvfs->next->ops->flush_fn(ntvfs->next, req, flush);
 }
 
-NTSTATUS ntvfs_next_close(struct ntvfs_module_context *ntvfs, 
-                         struct smbsrv_request *req, union smb_close *io)
+NTSTATUS ntvfs_next_lock(struct ntvfs_module_context *ntvfs, 
+                                 struct ntvfs_request *req,
+                                 union smb_lock *lck)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->close) {
+       if (!ntvfs->next || !ntvfs->next->ops->lock_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->close(ntvfs->next, req, io);
+       return ntvfs->next->ops->lock_fn(ntvfs->next, req, lck);
 }
 
-NTSTATUS ntvfs_next_exit(struct ntvfs_module_context *ntvfs, 
-                        struct smbsrv_request *req)
+NTSTATUS ntvfs_next_qfileinfo(struct ntvfs_module_context *ntvfs, 
+                                      struct ntvfs_request *req,
+                                      union smb_fileinfo *info)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->exit) {
+       if (!ntvfs->next || !ntvfs->next->ops->qfileinfo_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->exit(ntvfs->next, req);
+       return ntvfs->next->ops->qfileinfo_fn(ntvfs->next, req, info);
 }
 
-NTSTATUS ntvfs_next_lock(struct ntvfs_module_context *ntvfs, 
-                        struct smbsrv_request *req, union smb_lock *lck)
+NTSTATUS ntvfs_next_setfileinfo(struct ntvfs_module_context *ntvfs, 
+                                        struct ntvfs_request *req,
+                                        union smb_setfileinfo *info)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->lock) {
+       if (!ntvfs->next || !ntvfs->next->ops->setfileinfo_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->lock(ntvfs->next, req, lck);
+       return ntvfs->next->ops->setfileinfo_fn(ntvfs->next, req, info);
 }
 
-NTSTATUS ntvfs_next_setfileinfo(struct ntvfs_module_context *ntvfs, 
-                               struct smbsrv_request *req, union smb_setfileinfo *info)
+NTSTATUS ntvfs_next_close(struct ntvfs_module_context *ntvfs, 
+                                  struct ntvfs_request *req,
+                                  union smb_close *io)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->setfileinfo) {
+       if (!ntvfs->next || !ntvfs->next->ops->close_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->setfileinfo(ntvfs->next, req, info);
+       return ntvfs->next->ops->close_fn(ntvfs->next, req, io);
 }
 
-NTSTATUS ntvfs_next_qfileinfo(struct ntvfs_module_context *ntvfs, 
-                             struct smbsrv_request *req, union smb_fileinfo *info)
+/* trans interface - used by IPC backend for pipes and RAP calls */
+NTSTATUS ntvfs_next_trans(struct ntvfs_module_context *ntvfs, 
+                                  struct ntvfs_request *req,
+                                  struct smb_trans2 *trans)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->qfileinfo) {
+       if (!ntvfs->next || !ntvfs->next->ops->trans_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->qfileinfo(ntvfs->next, req, info);
+       return ntvfs->next->ops->trans_fn(ntvfs->next, req, trans);
 }
 
-/* filesystem operations */
-NTSTATUS ntvfs_next_fsinfo(struct ntvfs_module_context *ntvfs, 
-                          struct smbsrv_request *req, union smb_fsinfo *fs)
+/* trans2 interface - only used by CIFS backend to prover complete passthru for testing */
+NTSTATUS ntvfs_next_trans2(struct ntvfs_module_context *ntvfs, 
+                                   struct ntvfs_request *req,
+                                   struct smb_trans2 *trans2)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->fsinfo) {
+       if (!ntvfs->next || !ntvfs->next->ops->trans2_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->fsinfo(ntvfs->next, req, fs);
+       return ntvfs->next->ops->trans2_fn(ntvfs->next, req, trans2);
 }
 
-/* printing specific operations */
-NTSTATUS ntvfs_next_lpq(struct ntvfs_module_context *ntvfs, 
-                       struct smbsrv_request *req, union smb_lpq *lpq)
+/*
+  change notify request
+*/
+NTSTATUS ntvfs_next_notify(struct ntvfs_module_context *ntvfs,
+                                   struct ntvfs_request *req,
+                                   union smb_notify *info)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->lpq) {
+       if (!ntvfs->next || !ntvfs->next->ops->notify_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->lpq(ntvfs->next, req, lpq);
+       return ntvfs->next->ops->notify_fn(ntvfs->next, req, info);
 }
 
-/* trans2 interface - only used by CIFS backend to prover complete passthru for testing */
-NTSTATUS ntvfs_next_trans2(struct ntvfs_module_context *ntvfs, 
-                          struct smbsrv_request *req, struct smb_trans2 *trans2)
+/* cancel - called to cancel an outstanding async request */
+NTSTATUS ntvfs_next_cancel(struct ntvfs_module_context *ntvfs, 
+                                   struct ntvfs_request *req)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->trans2) {
+       if (!ntvfs->next || !ntvfs->next->ops->cancel_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->trans2(ntvfs->next, req, trans2);
+       return ntvfs->next->ops->cancel_fn(ntvfs->next, req);
 }
 
-/* trans interface - used by IPC backend for pipes and RAP calls */
-NTSTATUS ntvfs_next_trans(struct ntvfs_module_context *ntvfs, 
-                         struct smbsrv_request *req, struct smb_trans2 *trans)
+/* printing specific operations */
+NTSTATUS ntvfs_next_lpq(struct ntvfs_module_context *ntvfs, 
+                                struct ntvfs_request *req,
+                                union smb_lpq *lpq)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->trans) {
+       if (!ntvfs->next || !ntvfs->next->ops->lpq_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->trans(ntvfs->next, req, trans);
+       return ntvfs->next->ops->lpq_fn(ntvfs->next, req, lpq);
 }
 
+
 /* logoff - called when a vuid is closed */
 NTSTATUS ntvfs_next_logoff(struct ntvfs_module_context *ntvfs, 
-                          struct smbsrv_request *req)
+                                   struct ntvfs_request *req)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->logoff) {
+       if (!ntvfs->next || !ntvfs->next->ops->logoff_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->logoff(ntvfs->next, req);
+       return ntvfs->next->ops->logoff_fn(ntvfs->next, req);
 }
 
-/* async_setup - called when setting up for a async request */
-NTSTATUS ntvfs_next_async_setup(struct ntvfs_module_context *ntvfs, 
-                               struct smbsrv_request *req, 
-                               void *private)
+NTSTATUS ntvfs_next_exit(struct ntvfs_module_context *ntvfs, 
+                                 struct ntvfs_request *req)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->async_setup) {
+       if (!ntvfs->next || !ntvfs->next->ops->exit_fn) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       return ntvfs->next->ops->async_setup(ntvfs->next, req, private);
+       return ntvfs->next->ops->exit_fn(ntvfs->next, req);
 }
 
-/* cancel - called to cancel an outstanding async request */
-NTSTATUS ntvfs_next_cancel(struct ntvfs_module_context *ntvfs, 
-                          struct smbsrv_request *req)
+/* client connection callback */
+NTSTATUS ntvfs_set_addresses(struct ntvfs_context *ntvfs,
+                            const struct tsocket_address *local_address,
+                            const struct tsocket_address *remote_address)
 {
-       if (!ntvfs->next || !ntvfs->next->ops->cancel) {
-               return NT_STATUS_NOT_IMPLEMENTED;
+       ntvfs->client.local_address = tsocket_address_copy(local_address, ntvfs);
+       NT_STATUS_HAVE_NO_MEMORY(ntvfs->client.local_address);
+
+       ntvfs->client.remote_address = tsocket_address_copy(remote_address, ntvfs);
+       NT_STATUS_HAVE_NO_MEMORY(ntvfs->client.remote_address);
+
+       return NT_STATUS_OK;
+}
+
+const struct tsocket_address *ntvfs_get_local_address(struct ntvfs_module_context *ntvfs)
+{
+       return ntvfs->ctx->client.local_address;
+}
+
+const struct tsocket_address *ntvfs_get_remote_address(struct ntvfs_module_context *ntvfs)
+{
+       return ntvfs->ctx->client.remote_address;
+}
+
+/* oplock helpers */
+NTSTATUS ntvfs_set_oplock_handler(struct ntvfs_context *ntvfs,
+                                          NTSTATUS (*handler)(void *private_data, struct ntvfs_handle *handle, uint8_t level),
+                                          void *private_data)
+{
+       ntvfs->oplock.handler           = handler;
+       ntvfs->oplock.private_data      = private_data;
+       return NT_STATUS_OK;
+}
+
+NTSTATUS ntvfs_send_oplock_break(struct ntvfs_module_context *ntvfs,
+                                         struct ntvfs_handle *handle, uint8_t level)
+{
+       if (!ntvfs->ctx->oplock.handler) {
+               return NT_STATUS_OK;
        }
-       return ntvfs->next->ops->cancel(ntvfs->next, req);
+
+       return ntvfs->ctx->oplock.handler(ntvfs->ctx->oplock.private_data, handle, level);
 }
+