Mercurial > dovecot > original-hg > dovecot-1.2
changeset 8446:1c13cf0f8bb5 HEAD
Added mail_namespace_destroy().
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 19 Nov 2008 18:45:46 +0200 |
parents | 33dc554bd33f |
children | c56835b33b14 |
files | src/lib-storage/index/shared/shared-storage.c src/lib-storage/mail-namespace.c src/lib-storage/mail-namespace.h |
diffstat | 3 files changed, 56 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/shared/shared-storage.c Wed Nov 19 18:19:13 2008 +0200 +++ b/src/lib-storage/index/shared/shared-storage.c Wed Nov 19 18:45:46 2008 +0200 @@ -45,6 +45,7 @@ struct shared_storage *storage = (struct shared_storage *)_storage; struct mailbox_list_settings list_set; const char *driver, *p; + char *wildcardp; bool have_username; /* data must begin with the actual mailbox driver */ @@ -63,14 +64,13 @@ } _storage->mailbox_is_file = storage->storage_class->mailbox_is_file; - p = strchr(_storage->ns->prefix, '%'); - if (p == NULL) { + wildcardp = strchr(_storage->ns->prefix, '%'); + if (wildcardp == NULL) { *error_r = "Shared namespace prefix doesn't contain %"; return -1; } - storage->ns_prefix_pattern = p_strdup(_storage->pool, p); - _storage->ns->prefix = p_strdup_until(_storage->ns->user->pool, - _storage->ns->prefix, p); + storage->ns_prefix_pattern = p_strdup(_storage->pool, wildcardp); + *wildcardp = '\0'; have_username = FALSE; for (p = storage->ns_prefix_pattern; *p != '\0'; p++) { @@ -265,10 +265,10 @@ } /* create the new namespace */ - ns = p_new(user->pool, struct mail_namespace, 1); + ns = i_new(struct mail_namespace, 1); ns->type = NAMESPACE_SHARED; ns->user = user; - ns->prefix = p_strdup(user->pool, str_c(prefix)); + ns->prefix = i_strdup(str_c(prefix)); ns->flags = NAMESPACE_FLAG_LIST | NAMESPACE_FLAG_HIDDEN | NAMESPACE_FLAG_AUTOCREATED; ns->sep = _storage->ns->sep;
--- a/src/lib-storage/mail-namespace.c Wed Nov 19 18:19:13 2008 +0200 +++ b/src/lib-storage/mail-namespace.c Wed Nov 19 18:45:46 2008 +0200 @@ -27,6 +27,12 @@ } } +static void mail_namespace_free(struct mail_namespace *ns) +{ + i_free(ns->prefix); + i_free(ns); +} + static struct mail_namespace * namespace_add_env(const char *data, unsigned int num, struct mail_user *user, enum mail_storage_flags flags, @@ -35,7 +41,7 @@ struct mail_namespace *ns; const char *sep, *type, *prefix, *driver, *error; - ns = p_new(user->pool, struct mail_namespace, 1); + ns = i_new(struct mail_namespace, 1); sep = getenv(t_strdup_printf("NAMESPACE_%u_SEP", num)); type = getenv(t_strdup_printf("NAMESPACE_%u_TYPE", num)); @@ -57,6 +63,7 @@ ns->type = NAMESPACE_PUBLIC; else { i_error("Unknown namespace type: %s", type); + mail_namespace_free(ns); return NULL; } @@ -76,7 +83,7 @@ if (sep != NULL) ns->sep = *sep; - ns->prefix = p_strdup(user->pool, prefix); + ns->prefix = i_strdup(prefix); ns->user = user; if (ns->type == NAMESPACE_SHARED && strchr(ns->prefix, '%') != NULL) { @@ -89,6 +96,7 @@ if (mail_storage_create(ns, driver, data, flags, lock_method, &error) < 0) { i_error("Namespace '%s': %s", ns->prefix, error); + mail_namespace_free(ns); return NULL; } return ns; @@ -199,8 +207,14 @@ } if (namespaces != NULL) { - if (!namespaces_check(namespaces)) + if (!namespaces_check(namespaces)) { + while (namespaces != NULL) { + ns = namespaces; + namespaces = ns->next; + mail_namespace_free(ns); + } return -1; + } mail_user_add_namespace(user, namespaces); if (hook_mail_namespaces_created != NULL) { @@ -220,11 +234,11 @@ mail = t_strconcat("maildir:", mail, NULL); } - ns = p_new(user->pool, struct mail_namespace, 1); + ns = i_new(struct mail_namespace, 1); ns->type = NAMESPACE_PRIVATE; ns->flags = NAMESPACE_FLAG_INBOX | NAMESPACE_FLAG_LIST | NAMESPACE_FLAG_SUBSCRIPTIONS; - ns->prefix = ""; + ns->prefix = i_strdup(""); ns->user = user; if (mail_storage_create(ns, NULL, mail, flags, lock_method, @@ -235,6 +249,7 @@ i_error("mail_location not set and " "autodetection failed: %s", error); } + mail_namespace_free(ns); return -1; } user->namespaces = ns; @@ -252,9 +267,9 @@ { struct mail_namespace *ns; - ns = p_new(user->pool, struct mail_namespace, 1); + ns = i_new(struct mail_namespace, 1); ns->user = user; - ns->prefix = ""; + ns->prefix = i_strdup(""); ns->flags = NAMESPACE_FLAG_INBOX | NAMESPACE_FLAG_LIST | NAMESPACE_FLAG_SUBSCRIPTIONS; user->namespaces = ns; @@ -263,16 +278,36 @@ void mail_namespaces_deinit(struct mail_namespace **_namespaces) { - struct mail_namespace *namespaces = *_namespaces; + struct mail_namespace *ns, *namespaces = *_namespaces; *_namespaces = NULL; while (namespaces != NULL) { - if (namespaces->storage != NULL) - mail_storage_destroy(&namespaces->storage); + ns = namespaces; namespaces = namespaces->next; + + if (ns->storage != NULL) + mail_storage_destroy(&ns->storage); + mail_namespace_free(ns); } } +void mail_namespace_destroy(struct mail_namespace *ns) +{ + struct mail_namespace **nsp; + + /* remove from user's namespaces list */ + for (nsp = &ns->user->namespaces; *nsp != NULL; nsp = &(*nsp)->next) { + if (*nsp == ns) { + *nsp = ns->next; + break; + } + } + + if (ns->storage != NULL) + mail_storage_destroy(&ns->storage); + mail_namespace_free(ns); +} + const char *mail_namespace_fix_sep(struct mail_namespace *ns, const char *name) { char *ret, *p;
--- a/src/lib-storage/mail-namespace.h Wed Nov 19 18:19:13 2008 +0200 +++ b/src/lib-storage/mail-namespace.h Wed Nov 19 18:45:46 2008 +0200 @@ -33,7 +33,7 @@ char sep, real_sep, sep_str[3]; enum namespace_flags flags; - const char *prefix; + char *prefix; size_t prefix_len; struct mail_user *user; @@ -49,6 +49,9 @@ struct mail_namespace *mail_namespaces_init_empty(struct mail_user *user); void mail_namespaces_deinit(struct mail_namespace **namespaces); +/* Destroy a single namespace and remove it from user's namespaces list. */ +void mail_namespace_destroy(struct mail_namespace *ns); + /* Update hierarchy separators in given name to real_sep characters. */ const char *mail_namespace_fix_sep(struct mail_namespace *ns, const char *name); /* Write virtual mailbox name to dest and return it. Separators are changed to