Mercurial > pidgin.yaz
diff libfaim/aim_rxqueue.c @ 840:595ac7759563
[gaim-migrate @ 850]
lots of (mostly useless for us) libfaim changes. should help portability, but it was always portable between unices.... stupid win32ers.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Mon, 04 Sep 2000 23:37:32 +0000 |
parents | 88f8f98de02d |
children | e1da6a6ec42b |
line wrap: on
line diff
--- a/libfaim/aim_rxqueue.c Mon Sep 04 01:15:38 2000 +0000 +++ b/libfaim/aim_rxqueue.c Mon Sep 04 23:37:32 2000 +0000 @@ -7,12 +7,46 @@ */ #include <faim/aim.h> +#include <sys/socket.h> + +/* + * 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) +{ +#ifdef MSG_WAITALL + return recv(fd, buf, count, MSG_WAITALL); +#else + int left, ret, cur = 0; + + left = count; + + while (left) { + ret = read(fd, ((unsigned char *)buf)+cur, left); + if (ret == -1) + return -1; + if (ret == 0) + return cur; + + cur += ret; + left -= ret; + } + + return cur; +#endif +} /* * 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; @@ -41,7 +75,7 @@ * 4 short -- Number of data bytes that follow. */ faim_mutex_lock(&conn->active); - if (recv(conn->fd, generic, 6, MSG_WAITALL) < 6){ + if (aim_recv(conn->fd, generic, 6) < 6){ aim_conn_close(conn); faim_mutex_unlock(&conn->active); return -1; @@ -89,7 +123,7 @@ } /* read the data portion of the packet */ - if (recv(conn->fd, newrx->data, newrx->commandlen, MSG_WAITALL) < newrx->commandlen){ + if (aim_recv(conn->fd, newrx->data, newrx->commandlen) < newrx->commandlen){ free(newrx->data); free(newrx); aim_conn_close(conn); @@ -136,7 +170,7 @@ * 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; @@ -194,7 +228,7 @@ * 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;