From: Timo Sirainen Date: Wed, 19 Nov 2008 16:45:46 +0000 (+0200) Subject: Added mail_namespace_destroy(). X-Git-Tag: 1.2.alpha4~43 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c8cf8a605e0ddea7cb36fe04551aeca5090e684b;p=thirdparty%2Fdovecot%2Fcore.git Added mail_namespace_destroy(). --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/shared/shared-storage.c b/src/lib-storage/index/shared/shared-storage.c index 702a8ae2df..3e9498af64 100644 --- a/src/lib-storage/index/shared/shared-storage.c +++ b/src/lib-storage/index/shared/shared-storage.c @@ -45,6 +45,7 @@ static int shared_create(struct mail_storage *_storage, const char *data, 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 @@ static int shared_create(struct mail_storage *_storage, const char *data, } _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 @@ int shared_storage_get_namespace(struct mail_storage *_storage, } /* 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; diff --git a/src/lib-storage/mail-namespace.c b/src/lib-storage/mail-namespace.c index 07c202b4fc..ee77626eda 100644 --- a/src/lib-storage/mail-namespace.c +++ b/src/lib-storage/mail-namespace.c @@ -27,6 +27,12 @@ void mail_namespace_init_storage(struct mail_namespace *ns) } } +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 @@ namespace_add_env(const char *data, unsigned int num, 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 @@ namespace_add_env(const char *data, unsigned int num, ns->type = NAMESPACE_PUBLIC; else { i_error("Unknown namespace type: %s", type); + mail_namespace_free(ns); return NULL; } @@ -76,7 +83,7 @@ namespace_add_env(const char *data, unsigned int num, 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 @@ namespace_add_env(const char *data, unsigned int num, 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 @@ int mail_namespaces_init(struct mail_user *user) } 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 @@ int mail_namespaces_init(struct mail_user *user) 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 @@ int mail_namespaces_init(struct mail_user *user) i_error("mail_location not set and " "autodetection failed: %s", error); } + mail_namespace_free(ns); return -1; } user->namespaces = ns; @@ -252,9 +267,9 @@ mail_namespaces_init_empty(struct mail_user *user) { 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,14 +278,34 @@ mail_namespaces_init_empty(struct mail_user *user) 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) diff --git a/src/lib-storage/mail-namespace.h b/src/lib-storage/mail-namespace.h index 7e509a534d..26ffeef228 100644 --- a/src/lib-storage/mail-namespace.h +++ b/src/lib-storage/mail-namespace.h @@ -33,7 +33,7 @@ struct mail_namespace { 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 @@ int mail_namespaces_init(struct mail_user *user); 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