]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
libsmbconf: text - change the cache to be talloced
authorMichael Adam <obnox@samba.org>
Wed, 26 Mar 2008 22:58:01 +0000 (23:58 +0100)
committerMichael Adam <obnox@samba.org>
Wed, 26 Mar 2008 23:32:09 +0000 (00:32 +0100)
instead of having it directly as a member in the private data struct.
This makes it easier to flush and initialize the cache.

Michael

source/lib/smbconf/smbconf_txt_simple.c

index f149a1623c2f779b1423429088c6fcd2f6b7626b..0f1388ce30a00ff429742d6d13933f0c81f11d3a 100644 (file)
 #include "includes.h"
 #include "smbconf_private.h"
 
+struct txt_cache {
+       uint32_t current_share;
+       uint32_t num_shares;
+       char **share_names;
+       uint32_t *num_params;
+       char ***param_names;
+       char ***param_values;
+};
+
 struct txt_private_data {
-       struct {
-               uint32_t current_share;
-               uint32_t num_shares;
-               char **share_names;
-               uint32_t *num_params;
-               char ***param_names;
-               char ***param_values;
-       } cache;
+       struct txt_cache *cache;
        uint64_t csn;
 };
 
@@ -170,23 +172,37 @@ static bool smbconf_txt_do_parameter(const char *param_name,
 
 static void smbconf_txt_flush_cache(struct smbconf_ctx *ctx)
 {
-       TALLOC_FREE(pd(ctx)->cache.share_names);
-       pd(ctx)->cache.current_share = 0;
-       pd(ctx)->cache.num_shares = 0;
-       TALLOC_FREE(pd(ctx)->cache.param_names);
-       TALLOC_FREE(pd(ctx)->cache.param_values);
-       TALLOC_FREE(pd(ctx)->cache.num_params);
+       TALLOC_FREE(pd(ctx)->cache);
+}
+
+static WERROR smbconf_txt_init_cache(struct smbconf_ctx *ctx)
+{
+       if (pd(ctx)->cache != NULL) {
+               smbconf_txt_flush_cache(ctx);
+       }
+
+       pd(ctx)->cache = TALLOC_ZERO_P(pd(ctx), struct txt_cache);
+
+       if (pd(ctx)->cache == NULL) {
+               return WERR_NOMEM;
+       }
+
+       return WERR_OK;
 }
 
 static WERROR smbconf_txt_load_file(struct smbconf_ctx *ctx)
 {
+       WERROR werr;
        uint64_t new_csn = (uint64_t)file_modtime(ctx->path);
 
        if (new_csn == pd(ctx)->csn) {
                return WERR_OK;
        }
 
-       smbconf_txt_flush_cache(ctx);
+       werr = smbconf_txt_init_cache(ctx);
+       if (!W_ERROR_IS_OK(werr)) {
+               return werr;
+       }
 
        if (!pm_process(ctx->path, smbconf_txt_do_section,
                        smbconf_txt_do_parameter, pd(ctx)))
@@ -303,14 +319,14 @@ static WERROR smbconf_txt_get_share_names(struct smbconf_ctx *ctx,
                added_count++;
        }
 
-       for (count = 0; count < pd(ctx)->cache.num_shares; count++) {
-               if (strequal(pd(ctx)->cache.share_names[count], GLOBAL_NAME)) {
+       for (count = 0; count < pd(ctx)->cache->num_shares; count++) {
+               if (strequal(pd(ctx)->cache->share_names[count], GLOBAL_NAME)) {
                        continue;
                }
 
                werr = smbconf_add_string_to_array(tmp_ctx, &tmp_share_names,
                                        added_count,
-                                       pd(ctx)->cache.share_names[count]);
+                                       pd(ctx)->cache->share_names[count]);
                if (!W_ERROR_IS_OK(werr)) {
                        goto done;
                }
@@ -343,8 +359,8 @@ static bool smbconf_txt_share_exists(struct smbconf_ctx *ctx,
        }
 
        return smbconf_txt_find_in_array(servicename,
-                                        pd(ctx)->cache.share_names,
-                                        pd(ctx)->cache.num_shares, NULL);
+                                        pd(ctx)->cache->share_names,
+                                        pd(ctx)->cache->num_shares, NULL);
 }
 
 /**
@@ -378,8 +394,8 @@ static WERROR smbconf_txt_get_share(struct smbconf_ctx *ctx,
        }
 
        found = smbconf_txt_find_in_array(servicename,
-                                         pd(ctx)->cache.share_names,
-                                         pd(ctx)->cache.num_shares,
+                                         pd(ctx)->cache->share_names,
+                                         pd(ctx)->cache->num_shares,
                                          &sidx);
        if (!found) {
                return WERR_NO_SUCH_SERVICE;
@@ -391,18 +407,18 @@ static WERROR smbconf_txt_get_share(struct smbconf_ctx *ctx,
                goto done;
        }
 
-       for (count = 0; count < pd(ctx)->cache.num_params[sidx]; count++) {
+       for (count = 0; count < pd(ctx)->cache->num_params[sidx]; count++) {
                werr = smbconf_add_string_to_array(tmp_ctx,
                                &tmp_param_names,
                                count,
-                               pd(ctx)->cache.param_names[sidx][count]);
+                               pd(ctx)->cache->param_names[sidx][count]);
                if (!W_ERROR_IS_OK(werr)) {
                        goto done;
                }
                werr = smbconf_add_string_to_array(tmp_ctx,
                                &tmp_param_values,
                                count,
-                               pd(ctx)->cache.param_values[sidx][count]);
+                               pd(ctx)->cache->param_values[sidx][count]);
                if (!W_ERROR_IS_OK(werr)) {
                        goto done;
                }
@@ -461,23 +477,23 @@ static WERROR smbconf_txt_get_parameter(struct smbconf_ctx *ctx,
        }
 
        found = smbconf_txt_find_in_array(service,
-                                         pd(ctx)->cache.share_names,
-                                         pd(ctx)->cache.num_shares,
+                                         pd(ctx)->cache->share_names,
+                                         pd(ctx)->cache->num_shares,
                                          &share_index);
        if (!found) {
                return WERR_NO_SUCH_SERVICE;
        }
 
        found = smbconf_txt_find_in_array(param,
-                                       pd(ctx)->cache.param_names[share_index],
-                                       pd(ctx)->cache.num_params[share_index],
-                                       &param_index);
+                               pd(ctx)->cache->param_names[share_index],
+                               pd(ctx)->cache->num_params[share_index],
+                               &param_index);
        if (!found) {
                return WERR_INVALID_PARAM;
        }
 
        *valstr = talloc_strdup(mem_ctx,
-                       pd(ctx)->cache.param_values[share_index][param_index]);
+                       pd(ctx)->cache->param_values[share_index][param_index]);
 
        if (*valstr == NULL) {
                return WERR_NOMEM;