]> andersk Git - libfaim.git/blobdiff - aim_conn.c
- Mon Sep 4 21:38:09 GMT 2000
[libfaim.git] / aim_conn.c
index 061409f74b78a672d39eda164e2f76b21683c18f..f76eeba666d7ff06dded8c9b4d8c1bad6f4a1efa 100644 (file)
@@ -8,12 +8,16 @@
 
 #include <faim/aim.h> 
 
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
 /*
  * Clears out connection list, killing remaining connections.
  */
-void aim_connrst(struct aim_session_t *sess)
+faim_internal void aim_connrst(struct aim_session_t *sess)
 {
-  faim_mutex_init(&sess->connlistlock, NULL);
+  faim_mutex_init(&sess->connlistlock);
   if (sess->connlist) {
     struct aim_conn_t *cur = sess->connlist, *tmp;
 
@@ -31,7 +35,7 @@ void aim_connrst(struct aim_session_t *sess)
 /*
  * Gets a new connection structure.
  */
-struct aim_conn_t *aim_conn_getnext(struct aim_session_t *sess)
+faim_internal struct aim_conn_t *aim_conn_getnext(struct aim_session_t *sess)
 {
   struct aim_conn_t *newconn, *cur;
 
@@ -55,7 +59,26 @@ struct aim_conn_t *aim_conn_getnext(struct aim_session_t *sess)
   return newconn;
 }
 
-void aim_conn_kill(struct aim_session_t *sess, struct aim_conn_t **deadconn)
+static void aim_conn_init(struct aim_conn_t *deadconn)
+{
+  if (!deadconn)
+    return;
+
+  deadconn->fd = -1;
+  deadconn->subtype = -1;
+  deadconn->type = -1;
+  deadconn->seqnum = 0;
+  deadconn->lastactivity = 0;
+  deadconn->forcedlatency = 0;
+  deadconn->handlerlist = NULL;
+  deadconn->priv = NULL;
+  faim_mutex_init(&deadconn->active);
+  faim_mutex_init(&deadconn->seqnum_lock);
+  
+  return;
+}
+
+faim_export void aim_conn_kill(struct aim_session_t *sess, struct aim_conn_t **deadconn)
 {
   struct aim_conn_t *cur;
 
@@ -80,34 +103,50 @@ void aim_conn_kill(struct aim_session_t *sess, struct aim_conn_t **deadconn)
   }
   faim_mutex_unlock(&sess->connlistlock);
 
+  /* XXX: do we need this for txqueue too? */
+  aim_rxqueue_cleanbyconn(sess, *deadconn);
+
   aim_conn_close(*deadconn);
+  if ((*deadconn)->priv)
+    free((*deadconn)->priv);
   free(*deadconn);
   deadconn = NULL;
 
   return;
 }
 
-void aim_conn_close(struct aim_conn_t *deadconn)
+faim_export void aim_conn_close(struct aim_conn_t *deadconn)
 {
+  int typesav = -1, subtypesav = -1;
+  void *privsav = NULL;
+
+  faim_mutex_destroy(&deadconn->active);
+  faim_mutex_destroy(&deadconn->seqnum_lock);
   if (deadconn->fd >= 3)
     close(deadconn->fd);
-  deadconn->fd = -1;
-  deadconn->type = -1;
-  deadconn->seqnum = 0;
-  deadconn->lastactivity = 0;
-  deadconn->forcedlatency = 0;
   if (deadconn->handlerlist)
     aim_clearhandlers(deadconn);
-  deadconn->handlerlist = NULL;
-  if (deadconn->priv)
+
+  typesav = deadconn->type;
+  subtypesav = deadconn->subtype;
+
+  if (deadconn->priv && (deadconn->type != AIM_CONN_TYPE_RENDEZVOUS)) {
     free(deadconn->priv);
-  deadconn->priv = NULL;
-  faim_mutex_init(&deadconn->active, NULL);
-  faim_mutex_init(&deadconn->seqnum_lock, NULL);
+    deadconn->priv = NULL;
+  }
+  privsav = deadconn->priv;
+
+  aim_conn_init(deadconn);
+
+  deadconn->type = typesav;
+  deadconn->subtype = subtypesav;
+  deadconn->priv = privsav;
+
+  return;
 }
 
-struct aim_conn_t *aim_getconn_type(struct aim_session_t *sess,
-                                   int type)
+faim_internal struct aim_conn_t *aim_getconn_type(struct aim_session_t *sess,
+                                                 int type)
 {
   struct aim_conn_t *cur;
 
@@ -129,8 +168,8 @@ struct aim_conn_t *aim_getconn_type(struct aim_session_t *sess,
  * FIXME: Return errors in a more sane way.
  *
  */
-struct aim_conn_t *aim_newconn(struct aim_session_t *sess,
-                              int type, char *dest)
+faim_export struct aim_conn_t *aim_newconn(struct aim_session_t *sess,
+                                          int type, char *dest)
 {
   struct aim_conn_t *connstruct;
   int ret;
@@ -201,7 +240,7 @@ struct aim_conn_t *aim_newconn(struct aim_session_t *sess,
   return connstruct;
 }
 
-int aim_conngetmaxfd(struct aim_session_t *sess)
+faim_export int aim_conngetmaxfd(struct aim_session_t *sess)
 {
   int j = 0;
   struct aim_conn_t *cur;
@@ -216,7 +255,7 @@ int aim_conngetmaxfd(struct aim_session_t *sess)
   return j;
 }
 
-int aim_countconn(struct aim_session_t *sess)
+static int aim_countconn(struct aim_session_t *sess)
 {
   int cnt = 0;
   struct aim_conn_t *cur;
@@ -244,8 +283,8 @@ int aim_countconn(struct aim_session_t *sess)
  * XXX: we could probably stand to do a little courser locking here.
  *
  */ 
-struct aim_conn_t *aim_select(struct aim_session_t *sess,
-                             struct timeval *timeout, int *status)
+faim_export struct aim_conn_t *aim_select(struct aim_session_t *sess,
+                                         struct timeval *timeout, int *status)
 {
   struct aim_conn_t *cur;
   fd_set fds;
@@ -255,7 +294,8 @@ struct aim_conn_t *aim_select(struct aim_session_t *sess,
   faim_mutex_lock(&sess->connlistlock);
   if (sess->connlist == NULL) {
     faim_mutex_unlock(&sess->connlistlock);
-    return 0;
+    *status = -1;
+    return NULL;
   }
   faim_mutex_unlock(&sess->connlistlock);
 
@@ -287,21 +327,24 @@ struct aim_conn_t *aim_select(struct aim_session_t *sess,
        return cur;
       }
     }
-  }
+    *status = 0; /* shouldn't happen */
+  } else if ((i == -1) && (errno == EINTR)) /* treat interrupts as a timeout */
+    *status = 0;
+  else
+    *status = i; /* can be 0 or -1 */
 
   faim_mutex_unlock(&sess->connlistlock);
-  *status = i; /* may be 0 or -1 */
   return NULL;  /* no waiting or error, return */
 }
 
-int aim_conn_isready(struct aim_conn_t *conn)
+faim_export int aim_conn_isready(struct aim_conn_t *conn)
 {
   if (conn)
     return (conn->status & 0x0001);
   return -1;
 }
 
-int aim_conn_setstatus(struct aim_conn_t *conn, int status)
+faim_export int aim_conn_setstatus(struct aim_conn_t *conn, int status)
 {
   int val;
 
@@ -314,7 +357,7 @@ int aim_conn_setstatus(struct aim_conn_t *conn, int status)
   return val;
 }
 
-int aim_conn_setlatency(struct aim_conn_t *conn, int newval)
+faim_export int aim_conn_setlatency(struct aim_conn_t *conn, int newval)
 {
   if (!conn)
     return -1;
@@ -327,7 +370,7 @@ int aim_conn_setlatency(struct aim_conn_t *conn, int newval)
   return 0;
 }
 
-void aim_session_init(struct aim_session_t *sess)
+faim_export void aim_session_init(struct aim_session_t *sess)
 {
   if (!sess)
     return;
@@ -337,7 +380,7 @@ void aim_session_init(struct aim_session_t *sess)
   sess->queue_outgoing = NULL;
   sess->queue_incoming = NULL;
   sess->pendingjoin = NULL;
-  sess->outstanding_snacs = NULL;
+  aim_initsnachash(sess);
   sess->snac_nextid = 0x00000001;
 
   /*
This page took 0.061252 seconds and 4 git commands to generate.