X-Git-Url: http://andersk.mit.edu/gitweb/libfaim.git/blobdiff_plain/b69540e3cf15a403137cb89bbc36ef7450945f83..3369f8d468f7e296d93bb50698dc3f6b55af8848:/aim_rxqueue.c diff --git a/aim_rxqueue.c b/aim_rxqueue.c index 003c1a2..41e34c7 100644 --- a/aim_rxqueue.c +++ b/aim_rxqueue.c @@ -29,6 +29,8 @@ int aim_get_command(struct aim_session_t *sess, struct aim_conn_t *conn) */ if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) return aim_get_command_rendezvous(sess, conn); + if (conn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT) + return 0; /* * Read FLAP header. Six bytes: @@ -51,6 +53,7 @@ int aim_get_command(struct aim_session_t *sess, struct aim_conn_t *conn) */ if (generic[0] != 0x2a) { faimdprintf(1, "Bad incoming data!"); + aim_conn_close(conn); faim_mutex_unlock(&conn->active); return -1; } @@ -122,82 +125,6 @@ int aim_get_command(struct aim_session_t *sess, struct aim_conn_t *conn) return 0; } -int aim_get_command_rendezvous(struct aim_session_t *sess, struct aim_conn_t *conn) -{ - unsigned char hdrbuf1[6]; - unsigned char *hdr = NULL; - int hdrlen, hdrtype; - int payloadlength = 0; - int flags = 0; - char *snptr = NULL; - - if (read(conn->fd, hdrbuf1, 6) < 6) { - perror("read"); - printf("faim: rend: read error\n"); - aim_conn_kill(sess, &conn); - return -1; - } - - hdrlen = aimutil_get16(hdrbuf1+4); - - hdrlen -= 6; - hdr = malloc(hdrlen); - - faim_mutex_lock(&conn->active); - if (read(conn->fd, hdr, hdrlen) < hdrlen) { - perror("read"); - printf("faim: rend: read2 error\n"); - free(hdr); - faim_mutex_unlock(&conn->active); - aim_conn_kill(sess, &conn); - return -1; - } - - hdrtype = aimutil_get16(hdr); - - switch (hdrtype) { - case 0x0001: { - payloadlength = aimutil_get32(hdr+22); - flags = aimutil_get16(hdr+32); - snptr = hdr+38; - - printf("OFT frame: %04x / %04x / %04x / %s\n", hdrtype, payloadlength, flags, snptr); - - if (flags == 0x000e) { - printf("directim: %s has started typing\n", snptr); - } else if ((flags == 0x0000) && payloadlength) { - unsigned char *buf; - buf = malloc(payloadlength+1); - - /* XXX theres got to be a better way */ - faim_mutex_lock(&conn->active); - if (recv(conn->fd, buf, payloadlength, MSG_WAITALL) < payloadlength) { - perror("read"); - printf("faim: rend: read3 error\n"); - free(buf); - faim_mutex_unlock(&conn->active); - aim_conn_kill(sess, &conn); - return -1; - } - faim_mutex_unlock(&conn->active); - buf[payloadlength] = '\0'; - printf("directim: %s/%04x/%04x/%s\n", snptr, payloadlength, flags, buf); - aim_send_im_direct(sess, conn, buf); - free(buf); - } - break; - } - default: - printf("OFT frame: type %04x\n", hdrtype); - /* data connection may be unreliable here */ - break; - } /* switch */ - - free(hdr); - - return 0; -} - /* * Purge recieve queue of all handled commands (->handled==1). Also * allows for selective freeing using ->nofree so that the client can @@ -259,3 +186,21 @@ void aim_purge_rxqueue(struct aim_session_t *sess) return; } + +/* + * Since aim_get_command will aim_conn_kill dead connections, we need + * to clean up the rxqueue of unprocessed connections on that socket. + * + * 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) +{ + struct command_rx_struct *currx; + + for (currx = sess->queue_incoming; currx; currx = currx->next) { + if ((!currx->handled) && (currx->conn == conn)) + currx->handled = 1; + } + return; +}