]> granicus.if.org Git - neomutt/commitdiff
TAILQify struct Connection 814/head
authorPietro Cerutti <gahr@gahr.ch>
Tue, 3 Oct 2017 08:18:26 +0000 (08:18 +0000)
committerRichard Russon <rich@flatcap.org>
Tue, 3 Oct 2017 19:13:16 +0000 (20:13 +0100)
imap/imap.c
imap/util.c
mutt_socket.c
mutt_socket.h

index ae1116c758a62860967494a97aecf8ba9b90b2c9..302a4681ea2050b15d02a3763b11b378db82f70c 100644 (file)
@@ -200,24 +200,18 @@ int imap_delete_mailbox(struct Context *ctx, struct ImapMbox *mx)
  */
 void imap_logout_all(void)
 {
-  struct Connection *conn = NULL;
-  struct Connection *tmp = NULL;
-
-  conn = mutt_socket_head();
-
-  while (conn)
+  struct ConnectionList *head = mutt_socket_head();
+  struct Connection *np, *tmp;
+  TAILQ_FOREACH_SAFE(np, head, entries, tmp)
   {
-    tmp = conn->next;
-
-    if (conn->account.type == MUTT_ACCT_TYPE_IMAP && conn->fd >= 0)
+    if (np->account.type == MUTT_ACCT_TYPE_IMAP && np->fd >= 0)
     {
-      mutt_message(_("Closing connection to %s..."), conn->account.host);
-      imap_logout((struct ImapData **) (void *) &conn->data);
+      TAILQ_REMOVE(head, np, entries);
+      mutt_message(_("Closing connection to %s..."), np->account.host);
+      imap_logout((struct ImapData **) (void *) &np->data);
       mutt_clear_error();
-      mutt_socket_free(conn);
+      mutt_socket_free(np);
     }
-
-    conn = tmp;
   }
 }
 
@@ -2303,7 +2297,7 @@ static int imap_complete_hosts(char *dest, size_t len)
     }
   }
 
-  for (conn = mutt_socket_head(); conn; conn = conn->next)
+  TAILQ_FOREACH(conn, mutt_socket_head(), entries)
   {
     struct Url url;
     char urlstr[LONG_STRING];
index 6d6acce3cbdce8c057b4fb6029d0887dec8edfb7..baa29d2c40e7912e37f441ab994b22b0ec96e5d2 100644 (file)
@@ -902,7 +902,7 @@ void imap_keepalive(void)
   struct ImapData *idata = NULL;
   time_t now = time(NULL);
 
-  for (conn = mutt_socket_head(); conn; conn = conn->next)
+  TAILQ_FOREACH(conn, mutt_socket_head(), entries)
   {
     if (conn->account.type == MUTT_ACCT_TYPE_IMAP)
     {
index d4bb0167468e2c32dc08beb7f39c821b44554f91..0288e201c77ee09196547540ccc6bb043f62e6c1 100644 (file)
@@ -46,7 +46,7 @@
 #endif
 
 /* support for multiple socket connections */
-static struct Connection *Connections = NULL;
+static struct ConnectionList Connections = TAILQ_HEAD_INITIALIZER(Connections);
 
 static int socket_preconnect(void)
 {
@@ -218,9 +218,9 @@ int mutt_socket_readln_d(char *buf, size_t buflen, struct Connection *conn, int
   return i + 1;
 }
 
-struct Connection *mutt_socket_head(void)
+struct ConnectionList *mutt_socket_head(void)
 {
-  return Connections;
+  return &Connections;
 }
 
 /**
@@ -228,29 +228,15 @@ struct Connection *mutt_socket_head(void)
  */
 void mutt_socket_free(struct Connection *conn)
 {
-  struct Connection *iter = NULL;
-  struct Connection *tmp = NULL;
-
-  iter = Connections;
-
-  /* head is special case, doesn't need prev updated */
-  if (iter == conn)
-  {
-    Connections = iter->next;
-    FREE(&iter);
-    return;
-  }
-
-  while (iter->next)
+  struct Connection *np = NULL;
+  TAILQ_FOREACH(np, &Connections, entries)
   {
-    if (iter->next == conn)
+    if (np == conn)
     {
-      tmp = iter->next;
-      iter->next = tmp->next;
-      FREE(&tmp);
+      TAILQ_REMOVE(&Connections, np, entries);
+      FREE(&np);
       return;
     }
-    iter = iter->next;
   }
 }
 
@@ -288,19 +274,18 @@ struct Connection *mutt_conn_find(const struct Connection *start, const struct A
   url_tostring(&url, hook, sizeof(hook), 0);
   mutt_account_hook(hook);
 
-  conn = start ? start->next : Connections;
+  conn = start ? TAILQ_NEXT(start, entries) : TAILQ_FIRST(&Connections);
   while (conn)
   {
     if (mutt_account_match(account, &(conn->account)))
       return conn;
-    conn = conn->next;
+    conn = TAILQ_NEXT(conn, entries);
   }
 
   conn = socket_new_conn();
   memcpy(&conn->account, account, sizeof(struct Account));
 
-  conn->next = Connections;
-  Connections = conn;
+  TAILQ_INSERT_HEAD(&Connections, conn, entries);
 
   if (Tunnel && *Tunnel)
     mutt_tunnel_socket_setup(conn);
index 0e580e32b6ed4f58efc48a4621e634ba34e9abc5..c770a9bfb964f4ef6b988378a172d1f27dd405f6 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <stddef.h>
 #include "account.h"
+#include "list.h"
 #include "lib/lib.h"
 
 /* logging levels */
 #define MUTT_SOCK_LOG_HDR  3
 #define MUTT_SOCK_LOG_FULL 4
 
+/**
+ * struct ConnectionList - A list of connections
+ */
+TAILQ_HEAD(ConnectionList, Connection);
+
 /**
  * struct Connection - An open network connection (socket)
  */
@@ -48,7 +54,7 @@ struct Connection
   int fd;
   int available;
 
-  struct Connection *next;
+  TAILQ_ENTRY(Connection) entries;
 
   void *sockdata;
   int (*conn_read)(struct Connection *conn, char *buf, size_t len);
@@ -69,7 +75,7 @@ int mutt_socket_readln_d(char *buf, size_t buflen, struct Connection *conn, int
 int mutt_socket_write_d(struct Connection *conn, const char *buf, int len, int dbg);
 
 /* stupid hack for imap_logout_all */
-struct Connection *mutt_socket_head(void);
+struct ConnectionList *mutt_socket_head(void);
 void mutt_socket_free(struct Connection *conn);
 struct Connection *mutt_conn_find(const struct Connection *start, const struct Account *account);