]> andersk Git - libfaim.git/blobdiff - src/conn.c
- Sat Sep 8 17:07:09 PDT 2001
[libfaim.git] / src / conn.c
index 0c6168671da0c54ac7854fb8d2f2738b12250892..e489b1c035191a22c96f78eac59976f50bae2456 100644 (file)
 #include <netinet/in.h>
 #endif
 
+static void connkill_real(aim_session_t *sess, aim_conn_t **deadconn)
+{
+
+       aim_rxqueue_cleanbyconn(sess, *deadconn);
+       aim_tx_cleanqueue(sess, *deadconn);
+
+       if ((*deadconn)->fd != -1) 
+               aim_conn_close(*deadconn);
+
+       /*
+        * XXX ->priv should never be touched by the library. I know
+        * it used to be, but I'm getting rid of all that.  Use
+        * ->internal instead.
+        */
+       if ((*deadconn)->priv)
+               free((*deadconn)->priv);
+
+       /*
+        * This will free ->internal if it necessary...
+        */
+       if ((*deadconn)->type == AIM_CONN_TYPE_RENDEZVOUS)
+               aim_conn_kill_rend(sess, *deadconn);
+
+       free(*deadconn);
+       deadconn = NULL;
+
+       return;
+}
+
 /**
  * aim_connrst - Clears out connection list, killing remaining connections.
  * @sess: Session to be cleared
@@ -33,7 +62,7 @@ static void aim_connrst(aim_session_t *sess)
                while (cur) {
                        tmp = cur->next;
                        aim_conn_close(cur);
-                       free(cur);
+                       connkill_real(sess, &cur);
                        cur = tmp;
                }
        }
@@ -79,24 +108,16 @@ static void aim_conn_init(aim_conn_t *deadconn)
  */
 static aim_conn_t *aim_conn_getnext(aim_session_t *sess)
 {
-       aim_conn_t *newconn, *cur;
+       aim_conn_t *newconn;
 
        if (!(newconn = malloc(sizeof(aim_conn_t))))    
                return NULL;
        memset(newconn, 0, sizeof(aim_conn_t));
 
        aim_conn_init(newconn);
-       newconn->next = NULL;
 
-       faim_mutex_lock(&sess->connlistlock);
-       if (!sess->connlist)
-               sess->connlist = newconn;
-       else {
-               for (cur = sess->connlist; cur->next; cur = cur->next)
-                       ;
-               cur->next = newconn;
-       }
-       faim_mutex_unlock(&sess->connlistlock);
+       newconn->next = sess->connlist;
+       sess->connlist = newconn;
 
        return newconn;
 }
@@ -112,40 +133,23 @@ static aim_conn_t *aim_conn_getnext(aim_session_t *sess)
  */
 faim_export void aim_conn_kill(aim_session_t *sess, aim_conn_t **deadconn)
 {
-       aim_conn_t *cur;
+       aim_conn_t *cur, **prev;
 
        if (!deadconn || !*deadconn)    
                return;
 
-       aim_tx_cleanqueue(sess, *deadconn);
-
-       faim_mutex_lock(&sess->connlistlock);
-       if (sess->connlist == NULL)
-               ;
-       else if (sess->connlist->next == NULL) {
-               if (sess->connlist == *deadconn)
-               sess->connlist = NULL;
-       } else {
-               cur = sess->connlist;
-               while (cur->next) {
-                       if (cur->next == *deadconn) {
-                               cur->next = cur->next->next;
-                               break;
-                       }
-                       cur = cur->next;
+       for (prev = &sess->connlist; (cur = *prev); ) {
+               if (cur == *deadconn) {
+                       *prev = cur->next;
+                       break;
                }
+               prev = &cur->next;
        }
-       faim_mutex_unlock(&sess->connlistlock);
 
-       /* XXX: do we need this for txqueue too? */
-       aim_rxqueue_cleanbyconn(sess, *deadconn);
+       if (!cur)
+               return; /* oops */
 
-       if ((*deadconn)->fd != -1) 
-               aim_conn_close(*deadconn);
-       if ((*deadconn)->priv)
-               free((*deadconn)->priv);
-       free(*deadconn);
-       deadconn = NULL;
+       connkill_real(sess, &cur);
 
        return;
 }
@@ -158,7 +162,7 @@ faim_export void aim_conn_kill(aim_session_t *sess, aim_conn_t **deadconn)
  *
  * This leaves everything untouched except for clearing the 
  * handler list and setting the fd to -1 (used to recognize
- * dead connections).
+ * dead connections).  It will also remove cookies if necessary.
  *
  */
 faim_export void aim_conn_close(aim_conn_t *deadconn)
@@ -171,6 +175,9 @@ faim_export void aim_conn_close(aim_conn_t *deadconn)
        deadconn->fd = -1;
        if (deadconn->handlerlist)
                aim_clearhandlers(deadconn);
+       if (deadconn->type == AIM_CONN_TYPE_RENDEZVOUS)
+               aim_conn_close_rend((aim_session_t *)deadconn->sessv, deadconn);
+
 
        return;
 }
@@ -425,6 +432,7 @@ faim_internal aim_conn_t *aim_cloneconn(aim_session_t *sess, aim_conn_t *src)
        conn->subtype = src->subtype;
        conn->seqnum = src->seqnum;
        conn->priv = src->priv;
+       conn->internal = src->internal;
        conn->lastactivity = src->lastactivity;
        conn->forcedlatency = src->forcedlatency;
        conn->sessv = src->sessv;
This page took 0.036771 seconds and 4 git commands to generate.