X-Git-Url: http://andersk.mit.edu/gitweb/libfaim.git/blobdiff_plain/a3619f23f4aeff53f82fbde8578382db13c65cf9..24fbfcf349642bd1d140ce171c0fdd997ebedac2:/aim_rxqueue.c diff --git a/aim_rxqueue.c b/aim_rxqueue.c index f362e39..6cc1806 100644 --- a/aim_rxqueue.c +++ b/aim_rxqueue.c @@ -6,15 +6,25 @@ * aim_rxhandlers.c. */ +#define FAIM_INTERNAL #include +#ifndef _WIN32 +#include +#endif + /* * Since not all implementations support MSG_WAITALL, define * an alternate guarenteed read function... + * + * We keep recv() for systems that can do it because it means + * a single system call for the entire packet, where read may + * take more for a badly fragmented packet. + * */ -static int aim_recv(int fd, void *buf, size_t count) +faim_internal int aim_recv(int fd, void *buf, size_t count) { -#ifdef FAIM_HAS_MSG_WAITALL +#ifdef MSG_WAITALL return recv(fd, buf, count, MSG_WAITALL); #else int left, ret, cur = 0; @@ -22,7 +32,7 @@ static int aim_recv(int fd, void *buf, size_t count) left = count; while (left) { - ret = read(fd, buf+cur, left); + ret = recv(fd, ((unsigned char *)buf)+cur, left, 0); if (ret == -1) return -1; if (ret == 0) @@ -40,7 +50,7 @@ static int aim_recv(int fd, void *buf, size_t count) * Grab a single command sequence off the socket, and enqueue * it in the incoming event queue in a seperate struct. */ -int aim_get_command(struct aim_session_t *sess, struct aim_conn_t *conn) +faim_export int aim_get_command(struct aim_session_t *sess, struct aim_conn_t *conn) { unsigned char generic[6]; struct command_rx_struct *newrx = NULL; @@ -48,17 +58,25 @@ int aim_get_command(struct aim_session_t *sess, struct aim_conn_t *conn) if (!sess || !conn) return 0; + if (conn->fd == -1) + return -1; /* its a aim_conn_close()'d connection */ + if (conn->fd < 3) /* can happen when people abuse the interface */ return 0; + if (conn->status & AIM_CONN_STATUS_INPROGRESS) + return aim_conn_completeconnect(sess, conn); + /* * Rendezvous (client-client) connections do not speak * FLAP, so this function will break on them. */ if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) return aim_get_command_rendezvous(sess, conn); - if (conn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT) + if (conn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT) { + printf("out on fd %d\n", conn->fd); return 0; + } /* * Read FLAP header. Six bytes: @@ -164,7 +182,7 @@ int aim_get_command(struct aim_session_t *sess, struct aim_conn_t *conn) * does not keep a pointer, it's lost forever. * */ -void aim_purge_rxqueue(struct aim_session_t *sess) +faim_export void aim_purge_rxqueue(struct aim_session_t *sess) { struct command_rx_struct *cur = NULL; struct command_rx_struct *tmp; @@ -222,7 +240,7 @@ void aim_purge_rxqueue(struct aim_session_t *sess) * XXX: this is something that was handled better in the old connection * handling method, but eh. */ -void aim_rxqueue_cleanbyconn(struct aim_session_t *sess, struct aim_conn_t *conn) +faim_internal void aim_rxqueue_cleanbyconn(struct aim_session_t *sess, struct aim_conn_t *conn) { struct command_rx_struct *currx;