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;
}
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");
struct aim_conn_t *waitingconn = NULL;
int i;
int selstat = 0;
+ static int faimtest_mode = 0;
screenname = getenv("SCREENNAME");
password = getenv("PASSWORD");
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;
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");
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);
}
}
#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) {
}
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);
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) {
aim_conn_kill(&aimsess, &waitingconn);
if (!aim_getconn_type(&aimsess, AIM_CONN_TYPE_BOS)) {
dprintf("major connection error\n");
+ if (faimtest_mode == 2)
+ break;
}
}
}
}
/* 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);
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;
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);
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;
}
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);
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;
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<msgerrreasonslen)?msgerrreasons[reason]:"unknown");
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: user information for %s unavailable (reason 0x%04x: %s)\n", destsn, reason, (reason<msgerrreasonslen)?msgerrreasons[reason]:"unknown");
int faimtest_parse_login(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- struct client_info_s info = {"faimtest (with SNAC login)", 4, 1, 2010, "us", "en", 0x0004, 0x0000, 0x0000004b}; /* 4.1.2010 */
+ struct client_info_s info = AIM_CLIENTINFO_KNOWNGOOD;
char *key;
va_list ap;