lib: modules: Change XXX_init interface from XXX_init(void) to XXX_init(TALLOC_CTX *)
[bbaumbach/samba-autobuild/.git] / source4 / ntvfs / ntvfs_base.c
index 4cd6192c776d6704a50a1bd87538e7270d0e6aa2..5c438bbd5a2192f51d91927f635823d6ef09f484 100644 (file)
 */
 
 #include "includes.h"
-#include "lib/util/dlinklist.h"
+#include "../lib/util/dlinklist.h"
 #include "ntvfs/ntvfs.h"
 #include "param/param.h"
+#include "lib/util/samba_modules.h"
 
 /* the list of currently registered NTVFS backends, note that there
  * can be more than one backend with the same name, as long as they
@@ -43,7 +44,7 @@ static int num_backends;
 
   The 'type' is used to specify whether this is for a disk, printer or IPC$ share
 */
-_PUBLIC_ NTSTATUS ntvfs_register(const struct ntvfs_ops *ops,
+NTSTATUS ntvfs_register(const struct ntvfs_ops *ops,
                                 const struct ntvfs_critical_sizes *const sizes)
 {
        struct ntvfs_ops *new_ops;
@@ -84,7 +85,7 @@ _PUBLIC_ NTSTATUS ntvfs_register(const struct ntvfs_ops *ops,
 /*
   return the operations structure for a named backend of the specified type
 */
-_PUBLIC_ const struct ntvfs_ops *ntvfs_backend_byname(const char *name, enum ntvfs_type type)
+const struct ntvfs_ops *ntvfs_backend_byname(const char *name, enum ntvfs_type type)
 {
        int i;
 
@@ -107,12 +108,12 @@ _PUBLIC_ const struct ntvfs_ops *ntvfs_backend_byname(const char *name, enum ntv
 
 static const NTVFS_CURRENT_CRITICAL_SIZES(critical_sizes);
 
-_PUBLIC_ const struct ntvfs_critical_sizes *ntvfs_interface_version(void)
+const struct ntvfs_critical_sizes *ntvfs_interface_version(void)
 {
        return &critical_sizes;
 }
 
-_PUBLIC_ bool ntvfs_interface_differs(const struct ntvfs_critical_sizes *const iface)
+bool ntvfs_interface_differs(const struct ntvfs_critical_sizes *const iface)
 {
        /* The comparison would be easier with memcmp, but compiler-interset
         * alignment padding is not guaranteed to be zeroed.
@@ -153,7 +154,7 @@ _PUBLIC_ bool ntvfs_interface_differs(const struct ntvfs_critical_sizes *const i
 NTSTATUS ntvfs_init_connection(TALLOC_CTX *mem_ctx, struct share_config *scfg, enum ntvfs_type type,
                               enum protocol_types protocol,
                               uint64_t ntvfs_client_caps,
-                              struct event_context *ev, struct messaging_context *msg,
+                              struct tevent_context *ev, struct imessaging_context *msg,
                               struct loadparm_context *lp_ctx,
                               struct server_id server_id, struct ntvfs_context **_ctx)
 {
@@ -189,7 +190,7 @@ NTSTATUS ntvfs_init_connection(TALLOC_CTX *mem_ctx, struct share_config *scfg, e
                        return NT_STATUS_INTERNAL_ERROR;
                }
                ntvfs->depth = i;
-               DLIST_ADD_END(ctx->modules, ntvfs, struct ntvfs_module_context *);
+               DLIST_ADD_END(ctx->modules, ntvfs);
        }
 
        if (!ctx->modules) {
@@ -200,31 +201,49 @@ NTSTATUS ntvfs_init_connection(TALLOC_CTX *mem_ctx, struct share_config *scfg, e
        return NT_STATUS_OK;
 }
 
+/*
+  adds the IPC$ share, needed for RPC calls
+ */
+static NTSTATUS ntvfs_add_ipc_share(struct loadparm_context *lp_ctx)
+{
+       struct loadparm_service *ipc;
+
+       if (lpcfg_service(lp_ctx, "IPC$")) {
+               /* it has already been defined in smb.conf or elsewhere */
+               return NT_STATUS_OK;
+       }
+
+       ipc = lpcfg_add_service(lp_ctx, NULL, "IPC$");
+       NT_STATUS_HAVE_NO_MEMORY(ipc);
+
+       lpcfg_do_service_parameter(lp_ctx, ipc, "comment", "IPC Service");
+       lpcfg_do_service_parameter(lp_ctx, ipc, "path", "/dev/null");
+       lpcfg_do_service_parameter(lp_ctx, ipc, "ntvfs handler", "default");
+       lpcfg_do_service_parameter(lp_ctx, ipc, "browseable", "No");
+       lpcfg_do_service_parameter(lp_ctx, ipc, "fstype", "IPC");
+
+       return NT_STATUS_OK;
+}
+
 NTSTATUS ntvfs_init(struct loadparm_context *lp_ctx)
 {
        static bool initialized = false;
-       extern NTSTATUS ntvfs_posix_init(void);
-       extern NTSTATUS ntvfs_cifs_init(void);
-       extern NTSTATUS ntvfs_nbench_init(void);
-       extern NTSTATUS ntvfs_unixuid_init(void);
-       extern NTSTATUS ntvfs_ipc_init(void);
-       extern NTSTATUS pvfs_acl_nfs4_init(void);
-       extern NTSTATUS pvfs_acl_xattr_init(void);
-       extern NTSTATUS ntvfs_print_init(void);
-       extern NTSTATUS ntvfs_simple_init(void);
-       extern NTSTATUS ntvfs_cifs_posix_init(void);
+#define _MODULE_PROTO(init) extern NTSTATUS init(TALLOC_CTX *);
+       STATIC_ntvfs_MODULES_PROTO;
        init_module_fn static_init[] = { STATIC_ntvfs_MODULES };
        init_module_fn *shared_init;
 
        if (initialized) return NT_STATUS_OK;
        initialized = true;
        
-       shared_init = load_samba_modules(NULL, lp_ctx, "ntvfs");
+       shared_init = load_samba_modules(NULL, "ntvfs");
 
-       run_init_functions(static_init);
-       run_init_functions(shared_init);
+       run_init_functions(NULL, static_init);
+       run_init_functions(NULL, shared_init);
 
        talloc_free(shared_init);
+
+       ntvfs_add_ipc_share(lp_ctx);
        
        return NT_STATUS_OK;
 }