*
*/
-#include "aim.h"
+#include <faim/aim.h>
-void aim_connrst(void)
+void aim_connrst(struct aim_session_t *sess)
{
int i;
for (i = 0; i < AIM_CONN_MAX; i++)
{
- aim_conns[i].fd = -1;
- aim_conns[i].type = -1;
- aim_conns[i].status = 0;
- aim_conns[i].seqnum = 0;
- aim_conns[i].lastactivity = 0;
- aim_conns[i].forcedlatency = 0;
- aim_clearhandlers(&aim_conns[i]);
- aim_conns[i].handlerlist = NULL;
+ sess->conns[i].fd = -1;
+ sess->conns[i].type = -1;
+ sess->conns[i].status = 0;
+ sess->conns[i].seqnum = 0;
+ sess->conns[i].lastactivity = 0;
+ sess->conns[i].forcedlatency = 0;
+ aim_clearhandlers(&(sess->conns[i]));
+ sess->conns[i].handlerlist = NULL;
}
}
-struct aim_conn_t *aim_conn_getnext(void)
+struct aim_conn_t *aim_conn_getnext(struct aim_session_t *sess)
{
int i;
for (i=0;i<AIM_CONN_MAX;i++)
- if (aim_conns[i].fd == -1)
- return &(aim_conns[i]);
+ if (sess->conns[i].fd == -1)
+ return &(sess->conns[i]);
return NULL;
}
deadconn->handlerlist = NULL;
}
-struct aim_conn_t *aim_getconn_type(int type)
+struct aim_conn_t *aim_getconn_type(struct aim_session_t *sess,
+ int type)
{
int i;
for (i=0; i<AIM_CONN_MAX; i++)
- if (aim_conns[i].type == type)
- return &(aim_conns[i]);
+ if (sess->conns[i].type == type)
+ return &(sess->conns[i]);
return NULL;
}
* FIXME: Return errors in a more sane way.
*
*/
-struct aim_conn_t *aim_newconn(int type, char *dest)
+struct aim_conn_t *aim_newconn(struct aim_session_t *sess,
+ int type, char *dest)
{
struct aim_conn_t *connstruct;
int ret;
struct sockaddr_in sa;
struct hostent *hp;
u_short port = FAIM_LOGIN_PORT;
+ char *host = NULL;
int i=0;
- if (!dest || ((connstruct=aim_conn_getnext())==NULL))
+ if (!dest || ((connstruct=aim_conn_getnext(sess))==NULL))
return NULL;
connstruct->type = type;
*
*/
- for(i=0;(i<strlen(dest));i++)
- if (dest[i] == ':') {
- port = atoi(&(dest[i+1]));
- dest[i]=0;
- break;
+ for(i=0;i<strlen(dest);i++)
+ {
+ if (dest[i] == ':') {
+ port = atoi(&(dest[i+1]));
+ break;
+ }
}
+ host = (char *)malloc(i+1);
+ strncpy(host, dest, i);
+
+ hp = gethostbyname2(host, AF_INET);
+ free(host);
- hp = gethostbyname2(dest, AF_INET);
if (hp == NULL)
{
connstruct->status = (h_errno | AIM_CONN_STATUS_RESOLVERR);
connstruct->status = (errno | AIM_CONN_STATUS_CONNERR);
return connstruct;
}
-
+
return connstruct;
}
-int aim_conngetmaxfd(void)
+int aim_conngetmaxfd(struct aim_session_t *sess)
{
int i,j;
j=0;
for (i=0;i<AIM_CONN_MAX;i++)
- if(aim_conns[i].fd > j)
- j = aim_conns[i].fd;
+ if(sess->conns[i].fd > j)
+ j = sess->conns[i].fd;
return j;
}
-int aim_countconn(void)
+int aim_countconn(struct aim_session_t *sess)
{
int i,cnt;
cnt = 0;
for (i=0;i<AIM_CONN_MAX;i++)
- if (aim_conns[i].fd > -1)
+ if (sess->conns[i].fd > -1)
cnt++;
return cnt;
}
* See select(2).
*
*/
-struct aim_conn_t *aim_select(struct timeval *timeout)
+struct aim_conn_t *aim_select(struct aim_session_t *sess,
+ struct timeval *timeout)
{
fd_set fds;
fd_set errfds;
int i;
- if (aim_countconn() <= 0)
+ if (aim_countconn(sess) <= 0)
return 0;
/*
* If we have data waiting to be sent, return immediatly
*/
- if (aim_queue_outgoing)
+ if (sess->queue_outgoing)
return (struct aim_conn_t *)1;
FD_ZERO(&fds);
FD_ZERO(&errfds);
for(i=0;i<AIM_CONN_MAX;i++)
- if (aim_conns[i].fd>-1)
+ if (sess->conns[i].fd>-1)
{
- FD_SET(aim_conns[i].fd, &fds);
- FD_SET(aim_conns[i].fd, &errfds);
+ FD_SET(sess->conns[i].fd, &fds);
+ FD_SET(sess->conns[i].fd, &errfds);
}
- i = select(aim_conngetmaxfd()+1, &fds, NULL, &errfds, timeout);
+ i = select(aim_conngetmaxfd(sess)+1, &fds, NULL, &errfds, timeout);
if (i>=1)
{
int j;
for (j=0;j<AIM_CONN_MAX;j++)
{
- if (aim_conns[j].fd > -1)
+ if (sess->conns[j].fd > -1)
{
- if ((FD_ISSET(aim_conns[j].fd, &errfds)))
+ if ((FD_ISSET(sess->conns[j].fd, &errfds)))
{
/* got an exception; close whats left of it up */
- aim_conn_close(&(aim_conns[j]));
+ aim_conn_close(&(sess->conns[j]));
return (struct aim_conn_t *)-1;
}
- else if ((FD_ISSET(aim_conns[j].fd, &fds)))
- return &(aim_conns[j]); /* return the first waiting struct */
+ else if ((FD_ISSET(sess->conns[j].fd, &fds)))
+ return &(sess->conns[j]); /* return the first waiting struct */
}
}
/* should never get here */
return 0;
}
+
+void aim_session_init(struct aim_session_t *sess)
+{
+ int i;
+
+ if (!sess)
+ return;
+
+ sess->logininfo.screen_name[0] = '\0';
+ sess->logininfo.BOSIP = NULL;
+ sess->logininfo.cookie[0] = '\0';
+ sess->logininfo.email = NULL;
+ sess->logininfo.regstatus = 0x00;
+
+ for (i = 0; i < AIM_CONN_MAX; i++)
+ {
+ sess->conns[i].fd = -1;
+ sess->conns[i].type = -1;
+ sess->conns[i].status = 0;
+ sess->conns[i].seqnum = 0;
+ sess->conns[i].lastactivity = 0;
+ sess->conns[i].forcedlatency = 0;
+ sess->conns[i].handlerlist = NULL;
+ }
+
+ sess->queue_outgoing = NULL;
+ sess->queue_incoming = NULL;
+ sess->outstanding_snacs = NULL;
+ sess->snac_nextid = 0x00000001;
+
+ return;
+}