s4-loadparm: added loadparm_init_global()
authorAndrew Tridgell <tridge@samba.org>
Mon, 29 Nov 2010 02:24:51 +0000 (13:24 +1100)
committerAndrew Tridgell <tridge@samba.org>
Mon, 29 Nov 2010 07:04:42 +0000 (18:04 +1100)
This ensures we use the same loadparm_context in all our command line
tools.

Pair-Programmed-With: Andrew Bartlett <abartlet@samba.org>

source4/param/loadparm.c
source4/param/param.h

index f6f894d5bc0acebb828ad49e7720eb3e74f1cd21..55cb45eaedef0433d8be428717c7afc25e8a8d2f 100644 (file)
@@ -531,6 +531,8 @@ struct loadparm_context {
                time_t modtime;
        } *file_lists;
        unsigned int flags[NUMPARAMETERS];
+       bool loaded;
+       bool refuse_free;
 };
 
 
@@ -2263,6 +2265,13 @@ static int lp_destructor(struct loadparm_context *lp_ctx)
 {
        struct parmlist_entry *data;
 
+       if (lp_ctx->refuse_free) {
+               /* someone is trying to free the
+                  global_loadparm_context.
+                  We can't allow that. */
+               return -1;
+       }
+
        if (lp_ctx->globals->param_opt != NULL) {
                struct parmlist_entry *next;
                for (data = lp_ctx->globals->param_opt; data; data=next) {
@@ -2278,6 +2287,8 @@ static int lp_destructor(struct loadparm_context *lp_ctx)
 
 /**
  * Initialise the global parameter structure.
+ *
+ * Note that most callers should use loadparm_init_global() instead
  */
 struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
 {
@@ -2481,6 +2492,21 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
        return lp_ctx;
 }
 
+/**
+ * Initialise the global parameter structure.
+ */
+struct loadparm_context *loadparm_init_global(bool load_default)
+{
+       if (global_loadparm_context == NULL) {
+               global_loadparm_context = loadparm_init(NULL);
+       }
+       if (load_default && !global_loadparm_context->loaded) {
+               lpcfg_load_default(global_loadparm_context);
+       }
+       global_loadparm_context->refuse_free = true;
+       return global_loadparm_context;
+}
+
 const char *lpcfg_configfile(struct loadparm_context *lp_ctx)
 {
        return lp_ctx->szConfigFile;
@@ -2588,6 +2614,7 @@ bool lpcfg_load(struct loadparm_context *lp_ctx, const char *filename)
                /* set the context used by the lp_*() function
                   varients */
                global_loadparm_context = lp_ctx;
+               lp_ctx->loaded = true;
        }
 
        return bRetval;
index ea121fa6da5d89230d8e7b9e90c78004ed399b58..21a97fbcd0226dbac9fdda5bd653e8ba452947a0 100644 (file)
@@ -175,6 +175,7 @@ void lpcfg_killunused(struct loadparm_context *lp_ctx,
  * Initialise the global parameter structure.
  */
 struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx);
+struct loadparm_context *loadparm_init_global(bool load_default);
 const char *lpcfg_configfile(struct loadparm_context *lp_ctx);
 bool lpcfg_load_default(struct loadparm_context *lp_ctx);
 const char *lp_default_path(void);