]> andersk Git - libfaim.git/blobdiff - aim_conn.c
- Thu Feb 8 20:12:39 UTC 2001
[libfaim.git] / aim_conn.c
index b630145f304283e4df4bec1a6d2d5a429faedc75..944708efbe37e11392129083027bcfd0a06f2eda 100644 (file)
@@ -6,6 +6,7 @@
  *
  */
 
+#define FAIM_INTERNAL
 #include <faim/aim.h> 
 
 #ifndef _WIN32
@@ -38,6 +39,32 @@ faim_internal void aim_connrst(struct aim_session_t *sess)
   return;
 }
 
+/**
+ * aim_conn_init - Reset a connection to default values.
+ * @deadconn: Connection to be reset
+ *
+ * Initializes and/or resets a connection structure.
+ *
+ */
+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;
+}
+
 /**
  * aim_conn_getnext - Gets a new connection structure.
  * @sess: Session
@@ -53,7 +80,7 @@ faim_internal struct aim_conn_t *aim_conn_getnext(struct aim_session_t *sess)
     return NULL;
 
   memset(newconn, 0, sizeof(struct aim_conn_t));
-  aim_conn_close(newconn);
+  aim_conn_init(newconn);
   newconn->next = NULL;
 
   faim_mutex_lock(&sess->connlistlock);
@@ -69,32 +96,6 @@ faim_internal struct aim_conn_t *aim_conn_getnext(struct aim_session_t *sess)
   return newconn;
 }
 
-/**
- * aim_conn_init - Reset a connection to default values.
- * @deadconn: Connection to be reset
- *
- * Initializes and/or resets a connection structure.
- *
- */
-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;
-}
-
 /**
  * aim_conn_kill - Close and free a connection.
  * @sess: Session for the connection
@@ -131,7 +132,8 @@ faim_export void aim_conn_kill(struct aim_session_t *sess, struct aim_conn_t **d
   /* XXX: do we need this for txqueue too? */
   aim_rxqueue_cleanbyconn(sess, *deadconn);
 
-  aim_conn_close(*deadconn);
+  if ((*deadconn)->fd != -1) 
+    aim_conn_close(*deadconn);
   if ((*deadconn)->priv)
     free((*deadconn)->priv);
   free(*deadconn);
@@ -146,34 +148,22 @@ faim_export void aim_conn_kill(struct aim_session_t *sess, struct aim_conn_t **d
  *
  * Close (but not free) a connection.
  *
+ * This leaves everything untouched except for clearing the 
+ * handler list and setting the fd to -1 (used to recognize
+ * dead connections).
+ *
  */
 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;
   if (deadconn->handlerlist)
     aim_clearhandlers(deadconn);
 
-  typesav = deadconn->type;
-  subtypesav = deadconn->subtype;
-
-  if (deadconn->priv && (deadconn->type != AIM_CONN_TYPE_RENDEZVOUS)) {
-    free(deadconn->priv);
-    deadconn->priv = NULL;
-  }
-  privsav = deadconn->priv;
-
-  aim_conn_init(deadconn);
-
-  deadconn->type = typesav;
-  deadconn->subtype = subtypesav;
-  deadconn->priv = privsav;
-
   return;
 }
 
@@ -187,8 +177,8 @@ faim_export void aim_conn_close(struct aim_conn_t *deadconn)
  * type found.
  *
  */
-faim_internal struct aim_conn_t *aim_getconn_type(struct aim_session_t *sess,
-                                                 int type)
+faim_export struct aim_conn_t *aim_getconn_type(struct aim_session_t *sess,
+                                               int type)
 {
   struct aim_conn_t *cur;
 
@@ -369,6 +359,37 @@ static int aim_proxyconnect(struct aim_session_t *sess,
   return fd;
 }
 
+faim_internal struct aim_conn_t *aim_cloneconn(struct aim_session_t *sess,
+                                              struct aim_conn_t *src)
+{
+  struct aim_conn_t *conn;
+    struct aim_rxcblist_t *cur;
+
+  if (!(conn = aim_conn_getnext(sess)))
+    return NULL;
+  
+
+  faim_mutex_lock(&conn->active);
+
+  conn->fd = src->fd;
+  conn->type = src->type;
+  conn->subtype = src->subtype;
+  conn->seqnum = src->seqnum;
+  conn->priv = src->priv;
+  conn->lastactivity = src->lastactivity;
+  conn->forcedlatency = src->forcedlatency;
+
+  /* clone handler list */
+  for (cur = src->handlerlist; cur; cur = cur->next) {
+    aim_conn_addhandler(sess, conn, cur->family, cur->type, 
+                       cur->handler, cur->flags);
+  }
+
+  faim_mutex_unlock(&conn->active);
+
+  return conn;
+}
+
 /**
  * aim_newconn - Open a new connection
  * @sess: Session to create connection in
@@ -464,26 +485,6 @@ faim_export int aim_conngetmaxfd(struct aim_session_t *sess)
   return j;
 }
 
-/**
- * aim_countconn - Return the number of open connections in the session
- * @sess: Session to look at
- *
- * Returns the number of number connections in @sess.
- *
- */
-static int aim_countconn(struct aim_session_t *sess)
-{
-  int cnt = 0;
-  struct aim_conn_t *cur;
-
-  faim_mutex_lock(&sess->connlistlock);
-  for (cur = sess->connlist; cur; cur = cur->next)
-    cnt++;
-  faim_mutex_unlock(&sess->connlistlock);
-
-  return cnt;
-}
-
 /**
  * aim_conn_in_sess - Predicate to test the precense of a connection in a sess
  * @sess: Session to look in
@@ -547,7 +548,12 @@ faim_export struct aim_conn_t *aim_select(struct aim_session_t *sess,
 
   faim_mutex_lock(&sess->connlistlock);
   for (cur = sess->connlist; cur; cur = cur->next) {
-    if (cur->status & AIM_CONN_STATUS_INPROGRESS) {
+    if (cur->fd == -1) {
+      /* don't let invalid/dead connections sit around */
+      *status = 2;
+      faim_mutex_unlock(&sess->connlistlock);
+      return cur;
+    } else if (cur->status & AIM_CONN_STATUS_INPROGRESS) {
       FD_SET(cur->fd, &wfds);
       haveconnecting++;
     }
@@ -715,7 +721,9 @@ faim_export void aim_session_init(struct aim_session_t *sess, unsigned long flag
   sess->queue_outgoing = NULL;
   sess->queue_incoming = NULL;
   sess->pendingjoin = NULL;
+  sess->pendingjoinexchange = 0;
   aim_initsnachash(sess);
+  sess->msgcookies = NULL;
   sess->snac_nextid = 0x00000001;
 
   sess->flags = 0;
This page took 0.402694 seconds and 4 git commands to generate.