lib/util: consolidate module loading into common code
[samba.git] / source4 / ntvfs / ntvfs_base.c
index 6de13e4a0a0446cec572b85b551fe70534bb86aa..8058181f89df42236731cf787224864bb3e52f9e 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
@@ -153,7 +154,7 @@ bool ntvfs_interface_differs(const struct ntvfs_critical_sizes *const iface)
 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)
 {
@@ -200,32 +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_smb2_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(void);
+       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);
 
        talloc_free(shared_init);
+
+       ntvfs_add_ipc_share(lp_ctx);
        
        return NT_STATUS_OK;
 }