]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added mail_namespace_destroy().
authorTimo Sirainen <tss@iki.fi>
Wed, 19 Nov 2008 16:45:46 +0000 (18:45 +0200)
committerTimo Sirainen <tss@iki.fi>
Wed, 19 Nov 2008 16:45:46 +0000 (18:45 +0200)
--HG--
branch : HEAD

src/lib-storage/index/shared/shared-storage.c
src/lib-storage/mail-namespace.c
src/lib-storage/mail-namespace.h

index 702a8ae2dfbe36b83bd330bad087828e752f1bb4..3e9498af649afc1e062ff5bdde79f62352a16da2 100644 (file)
@@ -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;
index 07c202b4fcd00144da5126f6982a58964f42ac24..ee77626eda14be990f1cdb20f269896095c337b3 100644 (file)
@@ -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)
index 7e509a534d0ae23d4ecc14db78cf0683dbafa176..26ffeef228e1e135a15ac3f2a36310ac8a313914 100644 (file)
@@ -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