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