lib/util: consolidate module loading into common code
[samba.git] / source4 / ntvfs / ntvfs_base.c
index 20197a4ba9f612f319ce7623d598cb6b0cf961c9..8058181f89df42236731cf787224864bb3e52f9e 100644 (file)
 */
 
 #include "includes.h"
-#include "lib/util/dlinklist.h"
-#include "build.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
@@ -44,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;
@@ -85,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;
 
@@ -108,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 +153,9 @@ _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,
-                              struct event_context *ev, struct messaging_context *msg,
+                              uint64_t ntvfs_client_caps,
+                              struct tevent_context *ev, struct imessaging_context *msg,
+                              struct loadparm_context *lp_ctx,
                               struct server_id server_id, struct ntvfs_context **_ctx)
 {
        const char **handlers = share_string_list_option(mem_ctx, scfg, SHARE_NTVFS_HANDLER);
@@ -167,11 +169,13 @@ NTSTATUS ntvfs_init_connection(TALLOC_CTX *mem_ctx, struct share_config *scfg, e
        ctx = talloc_zero(mem_ctx, struct ntvfs_context);
        NT_STATUS_HAVE_NO_MEMORY(ctx);
        ctx->protocol           = protocol;
+       ctx->client_caps        = ntvfs_client_caps;
        ctx->type               = type;
        ctx->config             = talloc_steal(ctx, scfg);
        ctx->event_ctx          = ev;
        ctx->msg_ctx            = msg;
        ctx->server_id          = server_id;
+       ctx->lp_ctx             = lp_ctx;
 
        for (i=0; handlers[i]; i++) {
                struct ntvfs_module_context *ntvfs;
@@ -197,15 +201,49 @@ NTSTATUS ntvfs_init_connection(TALLOC_CTX *mem_ctx, struct share_config *scfg, e
        return NT_STATUS_OK;
 }
 
-NTSTATUS ntvfs_init(void)
+/*
+  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)
 {
-       init_module_fn static_init[] = STATIC_ntvfs_MODULES;
-       init_module_fn *shared_init = load_samba_modules(NULL, global_loadparm, "ntvfs");
+       static bool initialized = false;
+#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, "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;
 }