X-Git-Url: http://andersk.mit.edu/gitweb/libfaim.git/blobdiff_plain/d2587300fe3ca6bf664c93b5f6258d275fe75155..00ef5271216e3bea9b233ce26a3c0f21fbca931f:/utils/faimtest/faimtest.c diff --git a/utils/faimtest/faimtest.c b/utils/faimtest/faimtest.c index e10d494..96d993d 100644 --- a/utils/faimtest/faimtest.c +++ b/utils/faimtest/faimtest.c @@ -169,10 +169,15 @@ static void faimtest_debugcb(struct aim_session_t *sess, int level, const char * int faimtest_reportinterval(struct aim_session_t *sess, struct command_rx_struct *command, ...) { - if (command->data) { - dvprintf("aim: minimum report interval: %d (seconds?)\n", aimutil_get16(command->data+10)); - } else - dprintf("aim: NULL minimum report interval!\n"); + va_list ap; + unsigned short interval = 0; + + va_start(ap, command); + interval = va_arg(ap, int); + va_end(ap); + + dvprintf("aim: minimum report interval: %d (seconds?)\n", interval); + return 1; } @@ -256,7 +261,7 @@ int logout(void) if (ohcaptainmycaptain) aim_send_im(&aimsess, aim_getconn_type(&aimsess, AIM_CONN_TYPE_BOS), ohcaptainmycaptain, 0, "ta ta..."); - aim_logoff(&aimsess); + aim_session_kill(&aimsess); if (faimtest_init() == -1) dprintf("faimtest_init failed\n"); @@ -313,6 +318,7 @@ int main(int argc, char **argv) struct aim_conn_t *waitingconn = NULL; int i; int selstat = 0; + static int faimtest_mode = 0; screenname = getenv("SCREENNAME"); password = getenv("PASSWORD"); @@ -323,7 +329,7 @@ int main(int argc, char **argv) listingpath = getenv("LISTINGPATH"); - while ((i = getopt(argc, argv, "u:p:a:U:P:A:l:c:h")) != EOF) { + while ((i = getopt(argc, argv, "u:p:a:U:P:A:l:c:hoO")) != EOF) { switch (i) { case 'u': screenname = optarg; break; case 'p': password = optarg; break; @@ -333,6 +339,8 @@ int main(int argc, char **argv) case 'A': proxy = optarg; break; case 'l': listingpath = optarg; break; case 'c': ohcaptainmycaptain = optarg; break; + case 'o': faimtest_mode = 1; break; /* half old interface */ + case 'O': faimtest_mode = 2; break; /* full old interface */ case 'h': default: printf("faimtest\n"); @@ -345,6 +353,8 @@ int main(int argc, char **argv) printf(" -A host:port Proxy host ($SOCKSPASS)\n"); printf(" -l path Path to listing file ($LISTINGPATH)\n"); printf(" -c name Screen name of owner\n"); + printf(" -o Login at startup, then prompt\n"); + printf(" -O Login, never give prompt\n"); exit(0); } } @@ -357,7 +367,7 @@ int main(int argc, char **argv) #endif /* _WIN32 */ /* Pass zero as flags if you want blocking connects */ - aim_session_init(&aimsess, AIM_SESS_FLAGS_NONBLOCKCONNECT, 0); + aim_session_init(&aimsess, AIM_SESS_FLAGS_NONBLOCKCONNECT, 1); aim_setdebuggingcb(&aimsess, faimtest_debugcb); /* still needed even if debuglevel = 0 ! */ if(listingpath) { @@ -368,8 +378,7 @@ int main(int argc, char **argv) } sprintf(listingname, "%s/listing.txt", listingpath); if( (listingfile = fopen(listingname, "r")) == NULL) { - dvprintf("Couldn't open %s... bombing.\n", listingname); - exit(-1); + dvprintf("Couldn't open %s... disabling that shit.\n", listingname); } free(listingname); @@ -377,19 +386,28 @@ int main(int argc, char **argv) faimtest_init(); - cmd_init(); + if (faimtest_mode < 2) + cmd_init(); + + if (faimtest_mode >= 1) { + if (login(screenname, password) == -1) { + if (faimtest_mode < 2) + cmd_uninit(); + exit(-1); + } + } while (keepgoing) { waitingconn = aim_select(&aimsess, NULL, &selstat); if (selstat == -1) { /* error */ - keepgoing = 0; /* fall through and hit the aim_logoff() */ + keepgoing = 0; /* fall through */ } else if (selstat == 0) { /* no events pending */ keepgoing = 0; } else if (selstat == 1) { /* outgoing data pending */ aim_tx_flushqueue(&aimsess); } else if (selstat == 2) { /* incoming data pending */ - if (waitingconn->fd == STDIN_FILENO) { + if ((faimtest_mode < 2) && (waitingconn->fd == STDIN_FILENO)) { cmd_gotkey(); } else { if (waitingconn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT) { @@ -410,6 +428,8 @@ int main(int argc, char **argv) aim_conn_kill(&aimsess, &waitingconn); if (!aim_getconn_type(&aimsess, AIM_CONN_TYPE_BOS)) { dprintf("major connection error\n"); + if (faimtest_mode == 2) + break; } } } @@ -418,10 +438,12 @@ int main(int argc, char **argv) } /* close up all connections, dead or no */ - aim_logoff(&aimsess); + aim_session_kill(&aimsess); - printf("\n"); - cmd_uninit(); + if (faimtest_mode < 2) { + printf("\n"); + cmd_uninit(); + } /* Get out */ exit(0); @@ -475,6 +497,26 @@ int faimtest_rateresp(struct aim_session_t *sess, struct command_rx_struct *comm return 1; } +static int faimtest_icbmparaminfo(struct aim_session_t *sess, struct command_rx_struct *command, ...) +{ + unsigned long defflags, minmsginterval; + unsigned short maxicbmlen, maxsenderwarn, maxrecverwarn, maxchannel; + va_list ap; + + va_start(ap, command); + maxchannel = va_arg(ap, unsigned short); + defflags = va_arg(ap, unsigned long); + maxicbmlen = va_arg(ap, unsigned short); + maxsenderwarn = va_arg(ap, unsigned short); + maxrecverwarn = va_arg(ap, unsigned short); + minmsginterval = va_arg(ap, unsigned long); + va_end(ap); + + dvprintf("ICBM Parameters: maxchannel = %d, default flags = 0x%08lx, max msg len = %d, max sender evil = %f, max reciever evil = %f, min msg interval = %ld\n", maxchannel, defflags, maxicbmlen, ((float)maxsenderwarn)/10.0, ((float)maxrecverwarn)/10.0, minmsginterval); + + return 1; +} + int faimtest_hostversions(struct aim_session_t *sess, struct command_rx_struct *command, ...) { int vercount, i; @@ -704,10 +746,7 @@ int faimtest_handleredirect(struct aim_session_t *sess, struct command_rx_struct if (tstconn) aim_conn_kill(sess, &tstconn); return 1; } -#if 0 - aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_CTN, AIM_CB_SPECIAL_DEFAULT, faimtest_parse_unknown, 0); - aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_GEN, AIM_CB_SPECIAL_DEFAULT, faimtest_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); @@ -793,7 +832,7 @@ int faimtest_parse_authresp(struct aim_session_t *sess, struct command_rx_struct if (errorcode || !bosip || !cookie) { dvprintf("Login Error Code 0x%04x\n", errorcode); dvprintf("Error URL: %s\n", errurl); - aim_conn_kill(sess, &command->conn); + aim_conn_kill(sess, &command->conn); return 1; } @@ -841,10 +880,9 @@ int faimtest_parse_authresp(struct aim_session_t *sess, struct command_rx_struct 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, faimtest_parse_unknown, 0); - aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_DEFAULT, faimtest_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, 0x0004, 0x0005, faimtest_icbmparaminfo, 0); aim_conn_addhandler(sess, bosconn, 0x0001, 0x0001, faimtest_parse_genericerr, 0); aim_conn_addhandler(sess, bosconn, 0x0003, 0x0001, faimtest_parse_genericerr, 0); aim_conn_addhandler(sess, bosconn, 0x0009, 0x0001, faimtest_parse_genericerr, 0); @@ -986,6 +1024,8 @@ static int faimtest_handlecmd(struct aim_session_t *sess, struct command_rx_stru aim_getinfo(sess, command->conn, "75784102", AIM_GETINFO_GENERALINFO); aim_getinfo(sess, command->conn, "15853637", AIM_GETINFO_AWAYMESSAGE); + aim_getinfo(sess, command->conn, "midendian", AIM_GETINFO_GENERALINFO); + aim_getinfo(sess, command->conn, "midendian", AIM_GETINFO_AWAYMESSAGE); } else if (!strncmp(tmpstr, "open directim", 13)) { struct aim_conn_t *newconn; @@ -1500,8 +1540,8 @@ int faimtest_parse_msgerr(struct aim_session_t *sess, struct command_rx_struct * unsigned short reason; va_start(ap, command); - destsn = va_arg(ap, char *); reason = va_arg(ap, int); + destsn = va_arg(ap, char *); va_end(ap); dvprintf("faimtest: message to %s bounced (reason 0x%04x: %s)\n", destsn, reason, (reason