param: Use set_variable instead of set_variable_helper in lp_do_parameter
authorGarming Sam <garming@catalyst.net.nz>
Thu, 27 Feb 2014 22:58:55 +0000 (11:58 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 7 Jul 2014 21:32:36 +0000 (23:32 +0200)
This extends the usage of the temporary s3 context in lp_do_parameter
to beyond the special functions.

At least for now, this will be necessary for sorting out the
differences between the do_parameter code.

Change-Id: Iac380d11a927e466ab1a56d34cebe343c3608707
Signed-off-by: Garming Sam <garming@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Nadezhda Ivanova <nivanova@samba.org>
lib/param/loadparm.c
source3/param/loadparm.c

index 12e402d08052fb2262f902c3f9c972cc87259bc6..5e89b7ecbc585b1b566c90b68c1aa4503a13a1de 100644 (file)
@@ -1406,7 +1406,7 @@ static bool lp_do_parameter_parametric(struct loadparm_context *lp_ctx,
        return true;
 }
 
-bool set_variable_helper(TALLOC_CTX *mem_ctx, int parmnum, void *parm_ptr,
+static bool set_variable_helper(TALLOC_CTX *mem_ctx, int parmnum, void *parm_ptr,
                         const char *pszParmName, const char *pszParmValue)
 {
        int i;
@@ -1533,7 +1533,7 @@ bool set_variable_helper(TALLOC_CTX *mem_ctx, int parmnum, void *parm_ptr,
 
 }
 
-static bool set_variable(TALLOC_CTX *mem_ctx, int parmnum, void *parm_ptr,
+bool set_variable(TALLOC_CTX *mem_ctx, int snum, int parmnum, void *parm_ptr,
                         const char *pszParmName, const char *pszParmValue,
                         struct loadparm_context *lp_ctx, bool on_globals)
 {
@@ -1542,7 +1542,7 @@ static bool set_variable(TALLOC_CTX *mem_ctx, int parmnum, void *parm_ptr,
 
        /* if it is a special case then go ahead */
        if (parm_table[parmnum].special) {
-               ok = parm_table[parmnum].special(lp_ctx, -1, pszParmValue,
+               ok = parm_table[parmnum].special(lp_ctx, snum, pszParmValue,
                                                  (char **)parm_ptr);
                if (!ok) {
                        return false;
@@ -1598,7 +1598,7 @@ bool lpcfg_do_global_parameter(struct loadparm_context *lp_ctx,
 
        parm_ptr = lpcfg_parm_ptr(lp_ctx, NULL, &parm_table[parmnum]);
 
-       return set_variable(lp_ctx->globals->ctx, parmnum, parm_ptr,
+       return set_variable(lp_ctx->globals->ctx, -1, parmnum, parm_ptr,
                            pszParmName, pszParmValue, lp_ctx, true);
 }
 
@@ -1647,7 +1647,7 @@ bool lpcfg_do_service_parameter(struct loadparm_context *lp_ctx,
                    parm_table[i].p_class == parm_table[parmnum].p_class)
                        bitmap_clear(service->copymap, i);
 
-       return set_variable(service, parmnum, parm_ptr, pszParmName,
+       return set_variable(service, -1, parmnum, parm_ptr, pszParmName,
                            pszParmValue, lp_ctx, false);
 }
 
index d9e4a910173c754135c7bd525c67ee653ea5318a..af4555c74d0b158bb688ad1f79f1bd72f5e52260 100644 (file)
@@ -2576,6 +2576,7 @@ bool lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
        TALLOC_CTX *mem_ctx;
        TALLOC_CTX *frame = talloc_stackframe();
        bool ok;
+       struct loadparm_context *lp_ctx;
 
        parmnum = lpcfg_map_parameter(pszParmName);
 
@@ -2644,50 +2645,24 @@ bool lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
                mem_ctx = ServicePtrs[snum];
        }
 
-       /* if it is a special case then go ahead */
-       if (parm_table[parmnum].special) {
-               struct loadparm_context *lp_ctx = loadparm_init_s3(frame,
-                                                                  loadparm_s3_helpers());
-               if (lp_ctx == NULL) {
-                       DEBUG(0, ("loadparm_init_s3 failed\n"));
-                       TALLOC_FREE(frame);
-                       return false;
-               }
-
-               lp_ctx->sDefault = &sDefault;
-               lp_ctx->services = ServicePtrs;
-               lp_ctx->bInGlobalSection = bInGlobalSection;
-               lp_ctx->flags = flags_list;
-               ok = parm_table[parmnum].special(lp_ctx, snum, pszParmValue,
-                                                 (char **)parm_ptr);
+       lp_ctx = loadparm_init_s3(frame,
+                                 loadparm_s3_helpers());
+       if (lp_ctx == NULL) {
+               DEBUG(0, ("loadparm_init_s3 failed\n"));
                TALLOC_FREE(frame);
-
-               if (!ok) {
-                       return false;
-               }
-               goto mark_non_default;
+               return false;
        }
 
-       TALLOC_FREE(frame);
-
-       ok = set_variable_helper(mem_ctx, parmnum, parm_ptr, pszParmName, pszParmValue);
+       lp_ctx->sDefault = &sDefault;
+       lp_ctx->services = ServicePtrs;
+       lp_ctx->bInGlobalSection = bInGlobalSection;
+       lp_ctx->flags = flags_list;
 
-       if (!ok) {
-               return false;
-       }
+       ok = set_variable(mem_ctx, snum, parmnum, parm_ptr, pszParmName, pszParmValue,
+                           lp_ctx, (snum < 0));
+       TALLOC_FREE(frame);
 
-mark_non_default:
-       if (snum < 0 && (flags_list[parmnum] & FLAG_DEFAULT)) {
-               flags_list[parmnum] &= ~FLAG_DEFAULT;
-               /* we have to also unset FLAG_DEFAULT on aliases */
-               for (i=parmnum-1;i>=0 && parm_table[i].offset == parm_table[parmnum].offset;i--) {
-                       flags_list[i] &= ~FLAG_DEFAULT;
-               }
-               for (i=parmnum+1;i<num_parameters() && parm_table[i].offset == parm_table[parmnum].offset;i++) {
-                       flags_list[i] &= ~FLAG_DEFAULT;
-               }
-       }
-       return true;
+       return ok;
 }
 
 /***************************************************************************