dovecot-1.2: Added mail_namespace_destroy().
dovecot at dovecot.org
dovecot at dovecot.org
Wed Nov 19 18:57:48 EET 2008
details: http://hg.dovecot.org/dovecot-1.2/rev/1c13cf0f8bb5
changeset: 8446:1c13cf0f8bb5
user: Timo Sirainen <tss at iki.fi>
date: Wed Nov 19 18:45:46 2008 +0200
description:
Added mail_namespace_destroy().
diffstat:
3 files changed, 57 insertions(+), 19 deletions(-)
src/lib-storage/index/shared/shared-storage.c | 14 +++---
src/lib-storage/mail-namespace.c | 57 ++++++++++++++++++++-----
src/lib-storage/mail-namespace.h | 5 +-
diffs (204 lines):
diff -r 33dc554bd33f -r 1c13cf0f8bb5 src/lib-storage/index/shared/shared-storage.c
--- 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 @@ static int shared_create(struct mail_sto
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_sto
}
_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
}
/* 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 -r 33dc554bd33f -r 1c13cf0f8bb5 src/lib-storage/mail-namespace.c
--- 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 @@ void mail_namespace_init_storage(struct
}
}
+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, unsi
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, unsi
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, unsi
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, unsi
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_use
}
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_use
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_use
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_u
{
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_u
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 -r 33dc554bd33f -r 1c13cf0f8bb5 src/lib-storage/mail-namespace.h
--- 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 @@ 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;
@@ -48,6 +48,9 @@ int mail_namespaces_init(struct mail_use
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);
More information about the dovecot-cvs
mailing list