diff options
-rw-r--r-- | include/mailutils/cfg.h | 2 | ||||
-rw-r--r-- | libmailutils/cfg/driver.c | 64 | ||||
-rw-r--r-- | libmailutils/cli/capa.c | 7 | ||||
-rw-r--r-- | libmailutils/opt/progname.c | 17 |
4 files changed, 67 insertions, 23 deletions
diff --git a/include/mailutils/cfg.h b/include/mailutils/cfg.h index 19bdd5e7a..2266acc61 100644 --- a/include/mailutils/cfg.h +++ b/include/mailutils/cfg.h @@ -192,6 +192,8 @@ struct mu_cfg_section void *target; /* Actual pointer to the data. It is recomputed each time the section is reduced. */ + char *ident_storage; /* Storage for ident, if malloc'ed */ + char *label_storage; /* Same for the label */ }; enum mu_cfg_cont_type diff --git a/libmailutils/cfg/driver.c b/libmailutils/cfg/driver.c index 56c1daa06..9a8fd2265 100644 --- a/libmailutils/cfg/driver.c +++ b/libmailutils/cfg/driver.c @@ -94,6 +94,12 @@ mu_get_canned_container (const char *name) static struct mu_cfg_cont *root_container; +static void +destroy_root_container (void *ptr) +{ + mu_config_destroy_container (&root_container); +} + int mu_config_create_container (struct mu_cfg_cont **pcont, enum mu_cfg_cont_type type) @@ -211,25 +217,32 @@ destroy_list (mu_list_t *plist) void mu_config_destroy_container (struct mu_cfg_cont **pcont) { - struct mu_cfg_cont *cont = *pcont; - unsigned refcount = mu_refcount_dec (cont->refcount); - /* printf ("destr %p-%s: %d\n", cont, cont->v.section.ident, refcount); */ - // FIXME: Shouldn't it be done inside the conditional below? - switch (cont->type) + if (pcont) { - case mu_cfg_cont_section: - destroy_list (&cont->v.section.children); - break; - - case mu_cfg_cont_param: - break; - } + struct mu_cfg_cont *cont = *pcont; + if (cont) + { + unsigned refcount = mu_refcount_dec (cont->refcount); - if (refcount == 0) - { - mu_refcount_destroy (&cont->refcount); - free (cont); - *pcont = 0; + if (refcount == 0) + { + switch (cont->type) + { + case mu_cfg_cont_section: + free (cont->v.section.ident_storage); + free (cont->v.section.label_storage); + destroy_list (&cont->v.section.children); + break; + + case mu_cfg_cont_param: + break; + } + + mu_refcount_destroy (&cont->refcount); + free (cont); + *pcont = 0; + } + } } } @@ -418,8 +431,8 @@ mu_config_container_register_section (struct mu_cfg_cont **proot, mu_list_append (parent->children, container); s = &container->v.section; - s->ident = strdup (ident); - s->label = label ? strdup (label) : NULL; + s->ident = s->ident_storage = strdup (ident); + s->label = s->label_storage = label ? strdup (label) : NULL; s->parser = parser; s->children = NULL; mu_cfg_section_add_params (s, param); @@ -445,10 +458,15 @@ mu_config_root_register_section (const char *parent_path, mu_cfg_section_fp parser, struct mu_cfg_param *param) { - return mu_config_container_register_section (&root_container, - parent_path, - ident, label, - parser, param, NULL); + int rc = mu_config_container_register_section (&root_container, + parent_path, + ident, label, + parser, param, NULL); + if (rc == 0) + { + mu_onexit (destroy_root_container, NULL); + } + return rc; } int diff --git a/libmailutils/cli/capa.c b/libmailutils/cli/capa.c index 312aed0df..f23752f1c 100644 --- a/libmailutils/cli/capa.c +++ b/libmailutils/cli/capa.c @@ -27,6 +27,12 @@ static mu_list_t capa_list; static void +capa_list_destroy (void *ptr) +{ + mu_list_destroy (&capa_list); +} + +static void capa_free (void *ptr) { struct mu_cli_capa *cp = ptr; @@ -47,6 +53,7 @@ mu_cli_capa_register (struct mu_cli_capa *capa) { mu_list_create (&capa_list); mu_list_set_destroy_item (capa_list, capa_free); + mu_onexit (capa_list_destroy, NULL); } mu_list_append (capa_list, cp); } diff --git a/libmailutils/opt/progname.c b/libmailutils/opt/progname.c index 9d4d2469f..e2dbc570e 100644 --- a/libmailutils/opt/progname.c +++ b/libmailutils/opt/progname.c @@ -21,9 +21,21 @@ #include <string.h> #include <mailutils/alloc.h> #include <mailutils/opt.h> +#include <mailutils/util.h> char *mu_program_name; char *mu_full_program_name; +static int progname_cleaner_installed; + +static void +progname_cleaner (void *ptr) +{ + free (mu_program_name); + mu_program_name = NULL; + free (mu_full_program_name); + mu_full_program_name = NULL; + progname_cleaner_installed = 0; +} void mu_set_program_name (const char *arg) @@ -43,4 +55,9 @@ mu_set_program_name (const char *arg) p += 3; free (mu_program_name); mu_program_name = mu_strdup (p); + if (!progname_cleaner_installed) + { + mu_onexit (progname_cleaner, NULL); + progname_cleaner_installed = 1; + } } |