#include <faim/aim.h>
+#ifndef _WIN32
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#endif
+
/*
* 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;
/*
* 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;
deadconn->forcedlatency = 0;
deadconn->handlerlist = NULL;
deadconn->priv = NULL;
- faim_mutex_init(&deadconn->active, NULL);
- faim_mutex_init(&deadconn->seqnum_lock, NULL);
+ faim_mutex_init(&deadconn->active);
+ faim_mutex_init(&deadconn->seqnum_lock);
return;
}
-void aim_conn_kill(struct aim_session_t *sess, struct aim_conn_t **deadconn)
+faim_export void aim_conn_kill(struct aim_session_t *sess, struct aim_conn_t **deadconn)
{
struct aim_conn_t *cur;
/* XXX: do we need this for txqueue too? */
aim_rxqueue_cleanbyconn(sess, *deadconn);
- aim_conn_init(*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;
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;
* 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;
*
*/
- for(i=0;i<strlen(dest);i++) {
+ for(i=0;i<(int)strlen(dest);i++) {
if (dest[i] == ':') {
port = atoi(&(dest[i+1]));
break;
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;
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;
* 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;
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;
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;
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;
sess->queue_outgoing = NULL;
sess->queue_incoming = NULL;
sess->pendingjoin = NULL;
- sess->outstanding_snacs = NULL;
+ aim_initsnachash(sess);
sess->snac_nextid = 0x00000001;
/*