param: copy parametric option helper to lib/param
authorGarming Sam <garming@catalyst.net.nz>
Tue, 25 Feb 2014 03:58:21 +0000 (16:58 +1300)
committerJeremy Allison <jra@samba.org>
Wed, 7 May 2014 17:49:17 +0000 (19:49 +0200)
Signed-off-by: Garming Sam <garming@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
lib/param/loadparm.c
source3/param/loadparm.c

index e8b0874d4fb5010cbe37aaa3c6b18b47e0b14c19..7728e6dd0c7a0e4f64391c90ff93362edfb5be1b 100644 (file)
@@ -237,6 +237,55 @@ static bool do_section(const char *pszSectionName, void *);
 /* This is a helper function for parametrical options support. */
 /* It returns a pointer to parametrical option value if it exists or NULL otherwise */
 /* Actual parametrical functions are quite simple */
+struct parmlist_entry *get_parametric_helper(struct loadparm_service *service,
+                                            const char *type, const char *option,
+                                            struct parmlist_entry *global_opts)
+{
+       char* param_key;
+       struct parmlist_entry *data = NULL;
+       TALLOC_CTX *mem_ctx = talloc_stackframe();
+
+       param_key = talloc_asprintf(mem_ctx, "%s:%s", type, option);
+       if (param_key == NULL) {
+               DEBUG(0,("asprintf failed!\n"));
+               TALLOC_FREE(mem_ctx);
+               return NULL;
+       }
+
+       /*
+        * Try to fetch the option from the data.
+        */
+       if (service != NULL) {
+               data = service->param_opt;
+               while (data != NULL) {
+                       if (strwicmp(data->key, param_key) == 0) {
+                               TALLOC_FREE(mem_ctx);
+                               return data;
+                       }
+                       data = data->next;
+               }
+       }
+
+       /*
+        * Fall back to fetching from the globals.
+        */
+       data = global_opts;
+       while (data != NULL) {
+               if (strwicmp(data->key, param_key) == 0) {
+                       TALLOC_FREE(mem_ctx);
+                       return data;
+               }
+               data = data->next;
+       }
+
+
+       TALLOC_FREE(mem_ctx);
+
+       return NULL;
+
+
+}
+
 const char *lpcfg_get_parametric(struct loadparm_context *lp_ctx,
                              struct loadparm_service *service,
                              const char *type, const char *option)
index 459528f23700cc7c7fc7525837d7b554dfc016ff..2a3a8cba069d6c9143f3622b9700e2659b36a255 100644 (file)
@@ -1228,10 +1228,10 @@ static struct parmlist_entry *get_parametrics(int snum, const char *type,
        if (snum >= iNumServices) return NULL;
 
        if (snum < 0) {
-               return get_parametrics_by_service(NULL, type, option, Globals.param_opt);
+               return get_parametric_helper(NULL, type, option, Globals.param_opt);
        } else {
-               return get_parametrics_by_service(ServicePtrs[snum],
-                                                 type, option, Globals.param_opt);
+               return get_parametric_helper(ServicePtrs[snum],
+                                            type, option, Globals.param_opt);
        }
 }
 
@@ -1295,7 +1295,9 @@ const char *lp_parm_const_string_service(struct loadparm_service *service,
                                         const char *type, const char *option,
                                         const char *def)
 {
-       struct parmlist_entry *data = get_parametrics_by_service(service, type, option, Globals.param_opt);
+       struct parmlist_entry *data;
+
+       data = get_parametric_helper(service, type, option, Globals.param_opt);
 
        if (data == NULL||data->value==NULL)
                return def;