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