X-Git-Url: http://andersk.mit.edu/gitweb/libfaim.git/blobdiff_plain/e7fb57f5cbb98abd53854210b1572e0afc3ec099..1ea867e3531824627556aaf5bf7d23fdf33325fb:/utils/faimtest/faimtest.c diff --git a/utils/faimtest/faimtest.c b/utils/faimtest/faimtest.c index 02ca0e0..d101c9f 100644 --- a/utils/faimtest/faimtest.c +++ b/utils/faimtest/faimtest.c @@ -116,6 +116,8 @@ static char *msgerrreasons[] = { "Not while on AOL"}; static int msgerrreasonslen = 25; +static char *screenname,*password,*server=NULL; + int faimtest_reportinterval(struct aim_session_t *sess, struct command_rx_struct *command, ...) { if (command->data) { @@ -125,6 +127,49 @@ int faimtest_reportinterval(struct aim_session_t *sess, struct command_rx_struct return 1; } +int faimtest_flapversion(struct aim_session_t *sess, struct command_rx_struct *command, ...) +{ + + printf("faimtest: using FLAP version %u\n", aimutil_get32(command->data)); + +#if 0 + /* + * This is an alternate location for starting the login process. + */ + /* XXX should do more checking to make sure its really the right AUTH conn */ + if (command->conn->type == AIM_CONN_TYPE_AUTH) { + /* do NOT send a connack/flapversion, request_login will send it if needed */ + aim_request_login(sess, command->conn, screenname); + printf("faimtest: login request sent\n"); + } +#endif + + return 1; +} + +/* + * This is a frivilous callback. You don't need it. I only used it for + * debugging non-blocking connects. + * + * If packets are sent to a conn before its fully connected, they + * will be queued and then transmitted when the connection completes. + * + */ +int faimtest_conncomplete(struct aim_session_t *sess, struct command_rx_struct *command, ...) +{ + va_list ap; + struct aim_conn_t *conn; + + va_start(ap, command); + conn = va_arg(ap, struct aim_conn_t *); + va_end(ap); + + if (conn) + printf("faimtest: connection on %d completed\n", conn->fd); + + return 1; +} + #ifdef _WIN32 /* * This is really all thats needed to link against libfaim on win32. @@ -142,8 +187,6 @@ int initwsa(void) } #endif /* _WIN32 */ -static char *screenname,*password,*server=NULL; - int main(void) { struct aim_session_t aimsess; @@ -183,7 +226,8 @@ int main(void) } #endif /* _WIN32 */ - aim_session_init(&aimsess); + /* Pass zero as flags if you want blocking connects */ + aim_session_init(&aimsess, AIM_SESS_FLAGS_NONBLOCKCONNECT); #ifdef FILESUPPORT if(listingpath) { @@ -221,14 +265,15 @@ int main(void) return -1; } + aim_conn_addhandler(&aimsess, authconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_FLAPVER, faimtest_flapversion, 0); + aim_conn_addhandler(&aimsess, authconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNCOMPLETE, faimtest_conncomplete, 0); aim_conn_addhandler(&aimsess, authconn, 0x0017, 0x0007, faimtest_parse_login, 0); - aim_conn_addhandler(&aimsess, authconn, 0x0017, 0x0003, faimtest_parse_authresp, 0); - - aim_sendconnack(&aimsess, authconn); - aim_request_login(&aimsess, authconn, screenname); + aim_conn_addhandler(&aimsess, authconn, 0x0017, 0x0003, faimtest_parse_authresp, 0); aim_conn_addhandler(&aimsess, authconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_DEBUGCONN_CONNECT, faimtest_debugconn_connect, 0); + /* If the connection is in progress, this will just be queued */ + aim_request_login(&aimsess, authconn, screenname); printf("faimtest: login request sent\n"); while (keepgoing) { @@ -432,11 +477,13 @@ int faimtest_handleredirect(struct aim_session_t *sess, struct command_rx_struct struct aim_conn_t *tstconn; /* Open a connection to the Auth */ tstconn = aim_newconn(sess, AIM_CONN_TYPE_AUTH, ip); - if ( (tstconn==NULL) || (tstconn->status >= AIM_CONN_STATUS_RESOLVERR) ) + if ( (tstconn==NULL) || (tstconn->status & AIM_CONN_STATUS_RESOLVERR) ) fprintf(stderr, "faimtest: unable to reconnect with authorizer\n"); - else + else { + aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNCOMPLETE, faimtest_conncomplete, 0); /* Send the cookie to the Auth */ aim_auth_sendcookie(sess, tstconn, cookie); + } } break; @@ -444,7 +491,7 @@ int faimtest_handleredirect(struct aim_session_t *sess, struct command_rx_struct { struct aim_conn_t *tstconn = NULL; tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHATNAV, ip); - if ( (tstconn==NULL) || (tstconn->status >= AIM_CONN_STATUS_RESOLVERR)) { + if ( (tstconn==NULL) || (tstconn->status & AIM_CONN_STATUS_RESOLVERR)) { fprintf(stderr, "faimtest: unable to connect to chatnav server\n"); if (tstconn) aim_conn_kill(sess, &tstconn); return 1; @@ -454,6 +501,7 @@ int faimtest_handleredirect(struct aim_session_t *sess, struct command_rx_struct aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_GEN, AIM_CB_SPECIAL_DEFAULT, aim_parse_unknown, 0); #endif aim_conn_addhandler(sess, tstconn, 0x0001, 0x0003, faimtest_serverready, 0); + aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNCOMPLETE, faimtest_conncomplete, 0); aim_auth_sendcookie(sess, tstconn, cookie); fprintf(stderr, "\achatnav: connected\n"); } @@ -461,18 +509,20 @@ int faimtest_handleredirect(struct aim_session_t *sess, struct command_rx_struct case 0x000e: /* Chat */ { char *roomname = NULL; + int exchange; struct aim_conn_t *tstconn = NULL; roomname = va_arg(ap, char *); + exchange = va_arg(ap, int); tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHAT, ip); - if ( (tstconn==NULL) || (tstconn->status >= AIM_CONN_STATUS_RESOLVERR)) + if ( (tstconn==NULL) || (tstconn->status & AIM_CONN_STATUS_RESOLVERR)) { fprintf(stderr, "faimtest: unable to connect to chat server\n"); if (tstconn) aim_conn_kill(sess, &tstconn); return 1; } - printf("faimtest: chat: connected\n"); + printf("faimtest: chat: connected to %s on exchange %d\n", roomname, exchange); /* * We must do this to attach the stored name to the connection! @@ -480,6 +530,7 @@ int faimtest_handleredirect(struct aim_session_t *sess, struct command_rx_struct aim_chat_attachname(tstconn, roomname); aim_conn_addhandler(sess, tstconn, 0x0001, 0x0003, faimtest_serverready, 0); + aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNCOMPLETE, faimtest_conncomplete, 0); aim_auth_sendcookie(sess, tstconn, cookie); } break; @@ -495,62 +546,98 @@ int faimtest_handleredirect(struct aim_session_t *sess, struct command_rx_struct int faimtest_parse_authresp(struct aim_session_t *sess, struct command_rx_struct *command, ...) { + va_list ap; struct aim_conn_t *bosconn = NULL; - + char *sn = NULL, *bosip = NULL, *errurl = NULL, *email = NULL; + unsigned char *cookie = NULL; + int errorcode = 0, regstatus = 0; + int latestbuild = 0, latestbetabuild = 0; + char *latestrelease = NULL, *latestbeta = NULL; + char *latestreleaseurl = NULL, *latestbetaurl = NULL; + char *latestreleaseinfo = NULL, *latestbetainfo = NULL; + + va_start(ap, command); + sn = va_arg(ap, char *); + errorcode = va_arg(ap, int); + errurl = va_arg(ap, char *); + regstatus = va_arg(ap, int); + email = va_arg(ap, char *); + bosip = va_arg(ap, char *); + cookie = va_arg(ap, unsigned char *); + + latestrelease = va_arg(ap, char *); + latestbuild = va_arg(ap, int); + latestreleaseurl = va_arg(ap, char *); + latestreleaseinfo = va_arg(ap, char *); - printf("Screen name: %s\n", sess->logininfo.screen_name); + latestbeta = va_arg(ap, char *); + latestbetabuild = va_arg(ap, int); + latestbetaurl = va_arg(ap, char *); + latestbetainfo = va_arg(ap, char *); + + va_end(ap); + + printf("Screen name: %s\n", sn); /* * Check for error. */ - if (sess->logininfo.errorcode) - { - printf("Login Error Code 0x%04x\n", sess->logininfo.errorcode); - printf("Error URL: %s\n", sess->logininfo.errorurl); - aim_conn_kill(sess, &command->conn); - exit(0); /* XXX: should return in order to let the above things get free()'d. */ - } + if (errorcode || !bosip || !cookie) { + printf("Login Error Code 0x%04x\n", errorcode); + printf("Error URL: %s\n", errurl); + aim_conn_kill(sess, &command->conn); + return 1; + } + + printf("Reg status: %2d\n", regstatus); + printf("Email: %s\n", email); + printf("BOS IP: %s\n", bosip); - printf("Reg status: %2d\n", sess->logininfo.regstatus); - printf("Email: %s\n", sess->logininfo.email); - printf("BOS IP: %s\n", sess->logininfo.BOSIP); + if (latestbeta) + printf("Latest beta version: %s, build %d, at %s (more info at %s)\n", latestbeta, latestbetabuild, latestbetaurl, latestbetainfo); + + if (latestrelease) + printf("Latest released version: %s, build %d, at %s (more info at %s)\n", latestrelease, latestbuild, latestreleaseurl, latestreleaseinfo); printf("Closing auth connection...\n"); aim_conn_kill(sess, &command->conn); - bosconn = aim_newconn(sess, AIM_CONN_TYPE_BOS, sess->logininfo.BOSIP); - if (bosconn == NULL) { + if (!(bosconn = aim_newconn(sess, AIM_CONN_TYPE_BOS, bosip))) { fprintf(stderr, "faimtest: could not connect to BOS: internal error\n"); - } else if (bosconn->status != 0) { + return 1; + } else if (bosconn->status & AIM_CONN_STATUS_CONNERR) { fprintf(stderr, "faimtest: could not connect to BOS\n"); aim_conn_kill(sess, &bosconn); - } else { - aim_conn_addhandler(sess, bosconn, 0x0009, 0x0003, faimtest_bosrights, 0); - aim_conn_addhandler(sess, bosconn, 0x0001, 0x0007, faimtest_rateresp, 0); /* rate info */ - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ACK, AIM_CB_ACK_ACK, NULL, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_SERVERREADY, faimtest_serverready, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATEINFO, NULL, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_REDIRECT, faimtest_handleredirect, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_STS, AIM_CB_STS_SETREPORTINTERVAL, faimtest_reportinterval, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_RIGHTSINFO, faimtest_parse_buddyrights, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_ONCOMING, faimtest_parse_oncoming, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_OFFGOING, faimtest_parse_offgoing, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_INCOMING, faimtest_parse_incoming_im, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_ERROR, faimtest_parse_locerr, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MISSEDCALL, faimtest_parse_misses, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATECHANGE, faimtest_parse_ratechange, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_EVIL, faimtest_parse_evilnotify, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ERROR, faimtest_parse_msgerr, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_USERINFO, faimtest_parse_userinfo, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ACK, faimtest_parse_msgack, 0); - - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_CTN, AIM_CB_CTN_DEFAULT, aim_parse_unknown, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_DEFAULT, aim_parse_unknown, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_MOTD, faimtest_parse_motd, 0); + return 1; + } + + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNCOMPLETE, faimtest_conncomplete, 0); + aim_conn_addhandler(sess, bosconn, 0x0009, 0x0003, faimtest_bosrights, 0); + aim_conn_addhandler(sess, bosconn, 0x0001, 0x0007, faimtest_rateresp, 0); /* rate info */ + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ACK, AIM_CB_ACK_ACK, NULL, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_SERVERREADY, faimtest_serverready, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATEINFO, NULL, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_REDIRECT, faimtest_handleredirect, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_STS, AIM_CB_STS_SETREPORTINTERVAL, faimtest_reportinterval, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_RIGHTSINFO, faimtest_parse_buddyrights, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_ONCOMING, faimtest_parse_oncoming, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_OFFGOING, faimtest_parse_offgoing, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_INCOMING, faimtest_parse_incoming_im, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_ERROR, faimtest_parse_locerr, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MISSEDCALL, faimtest_parse_misses, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATECHANGE, faimtest_parse_ratechange, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_EVIL, faimtest_parse_evilnotify, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ERROR, faimtest_parse_msgerr, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_USERINFO, faimtest_parse_userinfo, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ACK, faimtest_parse_msgack, 0); + + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_CTN, AIM_CB_CTN_DEFAULT, aim_parse_unknown, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_DEFAULT, aim_parse_unknown, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_MOTD, faimtest_parse_motd, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, faimtest_parse_connerr, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, faimtest_parse_connerr, 0); - aim_auth_sendcookie(sess, bosconn, sess->logininfo.cookie); - } + aim_auth_sendcookie(sess, bosconn, cookie); + return 1; } @@ -1247,7 +1334,7 @@ int faimtest_chat_incomingmsg(struct aim_session_t *sess, struct command_rx_stru /* * Do an echo for testing purposes. But not for ourselves ("oops!") */ - if (strcmp(userinfo->sn, sess->logininfo.screen_name) != 0) + if (strcmp(userinfo->sn, sess->sn) != 0) { sprintf(tmpbuf, "(%s said \"%s\")", userinfo->sn, msg); aim_chat_send_im(sess, command->conn, tmpbuf); @@ -1292,12 +1379,13 @@ int faimtest_chatnav_info(struct aim_session_t *sess, struct command_rx_struct * break; case 0x0008: { char *fqcn, *name, *ck; - unsigned short instance, flags, maxmsglen, maxoccupancy, unknown; + unsigned short instance, flags, maxmsglen, maxoccupancy, unknown, exchange; unsigned char createperms; unsigned long createtime; fqcn = va_arg(ap, char *); instance = va_arg(ap, int); + exchange = va_arg(ap, int); flags = va_arg(ap, int); createtime = va_arg(ap, unsigned long); maxmsglen = va_arg(ap, int); @@ -1308,7 +1396,7 @@ int faimtest_chatnav_info(struct aim_session_t *sess, struct command_rx_struct * ck = va_arg(ap, char *); va_end(ap); - printf("faimtest: recieved room create reply for %s\n", fqcn); + printf("faimtest: recieved room create reply for %s/0x%04x\n", fqcn, exchange); } break; default: