]> granicus.if.org Git - neomutt/commitdiff
imap: remove ImapMbox from imap_ac_add()
authorMehdi Abaakouk <sileht@sileht.net>
Tue, 13 Nov 2018 22:47:07 +0000 (23:47 +0100)
committerRichard Russon <rich@flatcap.org>
Thu, 15 Nov 2018 00:26:28 +0000 (00:26 +0000)
imap/imap.c
imap/imap.h
imap/util.c

index d824e13af77ea136a28082c1b1760d046aa04c85..818b7a889d240471747048ea8fd36848b03a917c 100644 (file)
@@ -2061,41 +2061,44 @@ int imap_ac_add(struct Account *a, struct Mailbox *m)
 
   // NOTE(sileht): The goal is to use ImapMbox and imap_parse_path() only here
   // So we can remove it at this end.
-  struct ImapMbox mx;
-
-  if (imap_parse_path(m->path, &mx) < 0)
-    return -1;
 
-  // if (a->type == MUTT_UNKNOWN)
-  if (!a->adata)
+  if (!a->adata || !m->mdata)
   {
-    struct ImapAccountData *adata = imap_adata_new();
-    a->magic = MUTT_IMAP;
-    a->adata = adata;
-    a->free_adata = imap_adata_free;
-    adata->conn_account = mx.account;
-    adata->conn = mutt_conn_new(&adata->conn_account);
-    if (!adata->conn)
-    {
-      FREE(&mx.mbox);
+    struct ConnAccount *conn_account = mutt_mem_calloc(1, sizeof(struct ConnAccount));
+    char mailbox[LONG_STRING];
+
+    if (imap_parse_path2(m->path, conn_account, mailbox, sizeof(mailbox)) < 0)
       return -1;
-    }
-  }
 
-  m->account = a;
+    if (!a->adata)
+    {
+      struct ImapAccountData *adata = imap_adata_new();
+      adata->conn_account = *conn_account;
+      adata->conn = mutt_conn_new(conn_account);
+      if (!adata->conn)
+      {
+        FREE(&conn_account);
+        return -1;
+      }
+      a->magic = MUTT_IMAP;
+      a->adata = adata;
+      a->free_adata = imap_adata_free;
+    }
+    else
+      FREE(&conn_account);
 
-  if (!m->mdata)
-  {
-    struct ImapMailboxData *mdata = imap_mdata_new(a->adata, mx.mbox);
-    if (!mdata)
+    if (!m->mdata)
     {
-      FREE(&mx.mbox);
-      return -1;
+      struct ImapMailboxData *mdata = imap_mdata_new(a->adata, mailbox);
+      if (!mdata)
+        return -1;
+      m->mdata = mdata;
+      m->free_mdata = imap_mdata_free;
     }
-    m->mdata = mdata;
-    m->free_mdata = imap_mdata_free;
   }
 
+  m->account = a;
+
   struct MailboxNode *np = mutt_mem_calloc(1, sizeof(*np));
   np->m = m;
   STAILQ_INSERT_TAIL(&a->mailboxes, np, entries);
index 1bb71f325bb6865c30854d61c769974531a1d175..96d37b657b38b476c93b5589e66b864a896b6a8d 100644 (file)
@@ -113,6 +113,7 @@ void imap_logout_all(void);
 
 /* util.c */
 int imap_parse_path(const char *path, struct ImapMbox *mx);
+int imap_parse_path2(const char *path, struct ConnAccount *account, char *mailbox, size_t mailboxlen);
 void imap_pretty_mailbox(char *path, const char *folder);
 
 int imap_wait_keepalive(pid_t pid);
index c69265982d3b746eb4ba2e9f81b34a4a045900e4..b8c333b7122e0fdc3000a2f9703c321a42647bd2 100644 (file)
@@ -547,16 +547,18 @@ char *imap_hcache_get_uid_seqset(struct ImapAccountData *adata)
 #endif
 
 /**
- * imap_parse_path - Parse an IMAP mailbox name into name,host,port
- * @param path Mailbox path to parse
- * @param mx   An IMAP mailbox
+ * imap_parse_path2 - Parse an IMAP mailbox name into ConnAccount, name
+ * @param path       Mailbox path to parse
+ * @param account    Account credentials
+ * @param mailbox    Buffer for mailbox name
+ * @param mailboxlen Length of buffer
  * @retval  0 Success
  * @retval -1 Failure
  *
  * Given an IMAP mailbox name, return host, port and a path IMAP servers will
  * recognize.  mx.mbox is malloc'd, caller must free it
  */
-int imap_parse_path(const char *path, struct ImapMbox *mx)
+int imap_parse_path2(const char *path, struct ConnAccount *account, char *mailbox, size_t mailboxlen)
 {
   static unsigned short ImapPort = 0;
   static unsigned short ImapsPort = 0;
@@ -584,25 +586,24 @@ int imap_parse_path(const char *path, struct ImapMbox *mx)
   }
 
   /* Defaults */
-  memset(&mx->account, 0, sizeof(mx->account));
-  mx->account.port = ImapPort;
-  mx->account.type = MUTT_ACCT_TYPE_IMAP;
+  account->port = ImapPort;
+  account->type = MUTT_ACCT_TYPE_IMAP;
 
   c = mutt_str_strdup(path);
   url_parse(&url, c);
   if (url.scheme == U_IMAP || url.scheme == U_IMAPS)
   {
-    if (mutt_account_fromurl(&mx->account, &url) < 0 || !*mx->account.host)
+    if (mutt_account_fromurl(account, &url) < 0 || !*account->host)
     {
       url_free(&url);
       FREE(&c);
       return -1;
     }
 
-    mx->mbox = mutt_str_strdup(url.path);
+    mutt_str_strfcpy(mailbox, url.path, mailboxlen);
 
     if (url.scheme == U_IMAPS)
-      mx->account.flags |= MUTT_ACCT_SSL;
+      account->flags |= MUTT_ACCT_SSL;
 
     url_free(&url);
     FREE(&c);
@@ -622,49 +623,53 @@ int imap_parse_path(const char *path, struct ImapMbox *mx)
     else
     {
       /* walk past closing '}' */
-      mx->mbox = mutt_str_strdup(c + 1);
+      mutt_str_strfcpy(mailbox, c + 1, mailboxlen);
     }
 
     c = strrchr(tmp, '@');
     if (c)
     {
       *c = '\0';
-      mutt_str_strfcpy(mx->account.user, tmp, sizeof(mx->account.user));
+      mutt_str_strfcpy(account->user, tmp, sizeof(account->user));
       mutt_str_strfcpy(tmp, c + 1, sizeof(tmp));
-      mx->account.flags |= MUTT_ACCT_USER;
+      account->flags |= MUTT_ACCT_USER;
     }
 
-    const int n = sscanf(tmp, "%127[^:/]%127s", mx->account.host, tmp);
+    const int n = sscanf(tmp, "%127[^:/]%127s", account->host, tmp);
     if (n < 1)
     {
       mutt_debug(1, "NULL host in %s\n", path);
-      FREE(&mx->mbox);
       return -1;
     }
 
     if (n > 1)
     {
-      if (sscanf(tmp, ":%hu%127s", &(mx->account.port), tmp) >= 1)
-        mx->account.flags |= MUTT_ACCT_PORT;
+      if (sscanf(tmp, ":%hu%127s", &(account->port), tmp) >= 1)
+        account->flags |= MUTT_ACCT_PORT;
       if (sscanf(tmp, "/%s", tmp) == 1)
       {
         if (mutt_str_startswith(tmp, "ssl", CASE_MATCH))
-          mx->account.flags |= MUTT_ACCT_SSL;
+          account->flags |= MUTT_ACCT_SSL;
         else
         {
           mutt_debug(1, "Unknown connection type in %s\n", path);
-          FREE(&mx->mbox);
           return -1;
         }
       }
     }
   }
 
-  if ((mx->account.flags & MUTT_ACCT_SSL) && !(mx->account.flags & MUTT_ACCT_PORT))
-    mx->account.port = ImapsPort;
+  if ((account->flags & MUTT_ACCT_SSL) && !(account->flags & MUTT_ACCT_PORT))
+    account->port = ImapsPort;
 
   return 0;
 }
+int imap_parse_path(const char *path, struct ImapMbox *mx)
+{
+  memset(&mx->account, 0, sizeof(mx->account));
+  mx->mbox = mutt_mem_calloc(1, sizeof(char) * LONG_STRING);
+  return imap_parse_path2(path, &mx->account, mx->mbox, sizeof(char) * LONG_STRING);
+}
 
 /**
  * imap_mxcmp - Compare mailbox names, giving priority to INBOX