static FILE *listingfile;
static char *listingpath;
+static unsigned char *buddyicon = NULL;
+static int buddyiconlen = 0;
+static time_t buddyiconstamp = 0;
+static unsigned short buddyiconsum = 0;
+
static void faimtest_debugcb(struct aim_session_t *sess, int level, const char *format, va_list va)
{
- vfprintf(stderr, format, va);
+ vfprintf(stderr, format, va);
- return;
+ return;
}
int faimtest_reportinterval(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- va_list ap;
- unsigned short interval = 0;
+ va_list ap;
+ unsigned short interval = 0;
- va_start(ap, command);
- interval = va_arg(ap, int);
- va_end(ap);
+ va_start(ap, command);
+ interval = va_arg(ap, int);
+ va_end(ap);
- dvprintf("aim: minimum report interval: %d (seconds?)\n", interval);
+ dvprintf("aim: minimum report interval: %d (seconds?)\n", interval);
- return 1;
+ if (!connected)
+ connected++;
+
+#if 0
+ aim_bos_reqservice(sess, command->conn, 0x0005); /* adverts */
+ aim_bos_reqservice(sess, command->conn, 0x000f); /* user directory */
+
+ /* Don't know what this does... */
+ /* XXX sess->sn should be normalized by the 0001/000f handler */
+ aim_0002_000b(sess, command->conn, sess->sn);
+#endif
+
+ aim_reqicbmparams(sess, command->conn);
+
+ return 1;
}
int faimtest_flapversion(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- dvprintf("faimtest: using FLAP version %u\n", aimutil_get32(command->data));
+ dvprintf("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);
- dprintf("faimtest: login request sent\n");
- }
+ /*
+ * 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 flapversion, request_login will send it if needed */
+ aim_request_login(sess, command->conn, screenname);
+ dprintf("faimtest: login request sent\n");
+ }
#endif
- return 1;
+ return 1;
}
/*
*/
int faimtest_conncomplete(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- va_list ap;
- struct aim_conn_t *conn;
+ 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)
- dvprintf("faimtest: connection on %d completed\n", conn->fd);
+ va_start(ap, command);
+ conn = va_arg(ap, struct aim_conn_t *);
+ va_end(ap);
- return 1;
+ if (conn)
+ dvprintf("faimtest: connection on %d completed\n", conn->fd);
+
+ return 1;
}
#ifdef _WIN32
*/
int initwsa(void)
{
- WORD wVersionRequested;
- WSADATA wsaData;
+ WORD wVersionRequested;
+ WSADATA wsaData;
- wVersionRequested = MAKEWORD(2,2);
- return WSAStartup(wVersionRequested, &wsaData);
+ wVersionRequested = MAKEWORD(2,2);
+ return WSAStartup(wVersionRequested, &wsaData);
}
#endif /* _WIN32 */
int faimtest_init(void)
{
- struct aim_conn_t *stdinconn = NULL;
+ struct aim_conn_t *stdinconn = NULL;
- if (!(stdinconn = aim_newconn(&aimsess, 0, NULL))) {
- dprintf("unable to create connection for stdin!\n");
- return -1;
- }
+ if (!(stdinconn = aim_newconn(&aimsess, 0, NULL))) {
+ dprintf("unable to create connection for stdin!\n");
+ return -1;
+ }
- stdinconn->fd = STDIN_FILENO;
+ stdinconn->fd = STDIN_FILENO;
- return 0;
+ return 0;
}
int logout(void)
{
- if (ohcaptainmycaptain)
- aim_send_im(&aimsess, aim_getconn_type(&aimsess, AIM_CONN_TYPE_BOS), ohcaptainmycaptain, 0, "ta ta...", strlen("ta ta..."));
+ if (ohcaptainmycaptain)
+ aim_send_im(&aimsess, aim_getconn_type(&aimsess, AIM_CONN_TYPE_BOS), ohcaptainmycaptain, 0, "ta ta...");
- aim_session_kill(&aimsess);
+ aim_session_kill(&aimsess);
- if (faimtest_init() == -1)
- dprintf("faimtest_init failed\n");
+ if (faimtest_init() == -1)
+ dprintf("faimtest_init failed\n");
- return 0;
+ return 0;
}
int login(const char *sn, const char *passwd)
{
- struct aim_conn_t *authconn;
+ struct aim_conn_t *authconn;
- if (sn)
- screenname = strdup(sn);
- if (passwd)
- password = strdup(passwd);
+ if (sn)
+ screenname = strdup(sn);
+ if (passwd)
+ password = strdup(passwd);
- if (proxy)
- aim_setupproxy(&aimsess, proxy, proxyusername, proxypass);
+ if (proxy)
+ aim_setupproxy(&aimsess, proxy, proxyusername, proxypass);
- if (!screenname || !password) {
- dprintf("need SN and password\n");
- return -1;
- }
+ if (!screenname || !password) {
+ dprintf("need SN and password\n");
+ return -1;
+ }
- if (!(authconn = aim_newconn(&aimsess, AIM_CONN_TYPE_AUTH, server?server:FAIM_LOGIN_SERVER))) {
- dprintf("faimtest: internal connection error while in aim_login. bailing out.\n");
- return -1;
- } else if (authconn->fd == -1) {
- if (authconn->status & AIM_CONN_STATUS_RESOLVERR) {
- dprintf("faimtest: could not resolve authorizer name\n");
- } else if (authconn->status & AIM_CONN_STATUS_CONNERR) {
- dprintf("faimtest: could not connect to authorizer\n");
- }
- aim_conn_kill(&aimsess, &authconn);
- return -1;
- }
+ if (!(authconn = aim_newconn(&aimsess, AIM_CONN_TYPE_AUTH, server?server:FAIM_LOGIN_SERVER))) {
+ dprintf("faimtest: internal connection error while in aim_login. bailing out.\n");
+ return -1;
+ } else if (authconn->fd == -1) {
+ if (authconn->status & AIM_CONN_STATUS_RESOLVERR) {
+ dprintf("faimtest: could not resolve authorizer name\n");
+ } else if (authconn->status & AIM_CONN_STATUS_CONNERR) {
+ dprintf("faimtest: could not connect to authorizer\n");
+ }
+ aim_conn_kill(&aimsess, &authconn);
+ 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_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_conn_addhandler(&aimsess, authconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_DEBUGCONN_CONNECT, faimtest_debugconn_connect, 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);
- dprintf("faimtest: login request sent\n");
+ /* If the connection is in progress, this will just be queued */
+ aim_request_login(&aimsess, authconn, screenname);
+ dprintf("faimtest: login request sent\n");
- return 0;
+ return 0;
}
int main(int argc, char **argv)
{
- struct aim_conn_t *waitingconn = NULL;
- int i;
- int selstat = 0;
- static int faimtest_mode = 0;
- struct timeval tv;
- time_t lastnop = 0;
-
- screenname = getenv("SCREENNAME");
- password = getenv("PASSWORD");
- server = getenv("AUTHSERVER");
- proxy = getenv("SOCKSPROXY");
- proxyusername = getenv("SOCKSNAME");
- proxypass = getenv("SOCKSPASS");
-
- listingpath = getenv("LISTINGPATH");
-
- while ((i = getopt(argc, argv, "u:p:a:U:P:A:l:c:hoOb:")) != EOF) {
- switch (i) {
- case 'u': screenname = optarg; break;
- case 'p': password = optarg; break;
- case 'a': server = optarg; break;
- case 'U': proxyusername = optarg; break;
- case 'P': proxypass = 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 'b': aimbinarypath = optarg; break;
- case 'h':
- default:
- printf("faimtest\n");
- printf(" Options: \n");
- printf(" -u name Screen name ($SCREENNAME)\n");
- printf(" -p passwd Password ($PASSWORD)\n");
- printf(" -a host:port Authorizer ($AUTHSERVER)\n");
- printf(" -U name Proxy user name ($SOCKSPROXY)\n");
- printf(" -P passwd Proxy password ($SOCKSNAME)\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");
- printf(" -b path Path to AIM 3.5.1670 binaries\n");
- exit(0);
- }
- }
+ struct aim_conn_t *waitingconn = NULL;
+ int i;
+ int selstat = 0;
+ static int faimtest_mode = 0;
+ struct timeval tv;
+ time_t lastnop = 0;
+ const char *buddyiconpath = NULL;
+
+ screenname = getenv("SCREENNAME");
+ password = getenv("PASSWORD");
+ server = getenv("AUTHSERVER");
+ proxy = getenv("SOCKSPROXY");
+ proxyusername = getenv("SOCKSNAME");
+ proxypass = getenv("SOCKSPASS");
+
+ listingpath = getenv("LISTINGPATH");
+
+ while ((i = getopt(argc, argv, "u:p:a:U:P:A:l:c:hoOb:i:")) != EOF) {
+ switch (i) {
+ case 'u': screenname = optarg; break;
+ case 'p': password = optarg; break;
+ case 'a': server = optarg; break;
+ case 'U': proxyusername = optarg; break;
+ case 'P': proxypass = 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 'b': aimbinarypath = optarg; break;
+ case 'i': buddyiconpath = optarg; break;
+ case 'h':
+ default:
+ printf("faimtest\n");
+ printf(" Options: \n");
+ printf(" -u name Screen name ($SCREENNAME)\n");
+ printf(" -p passwd Password ($PASSWORD)\n");
+ printf(" -a host:port Authorizer ($AUTHSERVER)\n");
+ printf(" -U name Proxy user name ($SOCKSPROXY)\n");
+ printf(" -P passwd Proxy password ($SOCKSNAME)\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");
+ printf(" -b path Path to AIM 3.5.1670 binaries\n");
+ printf(" -i file Buddy Icon to send\n");
+ exit(0);
+ }
+ }
#ifdef _WIN32
- if (initwsa() != 0) {
- dprintf("faimtest: could not initialize windows sockets\n");
- return -1;
- }
+ if (initwsa() != 0) {
+ dprintf("faimtest: could not initialize windows sockets\n");
+ return -1;
+ }
#endif /* _WIN32 */
- /* Pass zero as flags if you want blocking connects */
- aim_session_init(&aimsess, AIM_SESS_FLAGS_NONBLOCKCONNECT, 1);
- aim_setdebuggingcb(&aimsess, faimtest_debugcb); /* still needed even if debuglevel = 0 ! */
+ /* Pass zero as flags if you want blocking connects */
+ aim_session_init(&aimsess, AIM_SESS_FLAGS_NONBLOCKCONNECT, 1);
+ aim_setdebuggingcb(&aimsess, faimtest_debugcb); /* still needed even if debuglevel = 0 ! */
- if(listingpath) {
- char *listingname;
- if(!(listingname = (char *)calloc(1, strlen(listingpath)+strlen("/listing.txt")))) {
- dperror("listingname calloc");
- exit(-1);
- }
- sprintf(listingname, "%s/listing.txt", listingpath);
- if( (listingfile = fopen(listingname, "r")) == NULL) {
- dvprintf("Couldn't open %s... disabling that shit.\n", listingname);
- }
+ if (listingpath) {
+ char *listingname;
+
+ if (!(listingname = (char *)calloc(1, strlen(listingpath)+strlen("/listing.txt")))) {
+ dperror("listingname calloc");
+ exit(-1);
+ }
- free(listingname);
- }
+ sprintf(listingname, "%s/listing.txt", listingpath);
+
+ if ((listingfile = fopen(listingname, "r")) == NULL)
+ dvprintf("Couldn't open %s... disabling that shit.\n", listingname);
- faimtest_init();
+ free(listingname);
+ }
- if (faimtest_mode < 2)
- cmd_init();
+ if (buddyiconpath) {
+ struct stat st;
+ FILE *f;
- if (faimtest_mode >= 1) {
- if (login(screenname, password) == -1) {
- if (faimtest_mode < 2)
- cmd_uninit();
- exit(-1);
- }
- }
+ if ((stat(buddyiconpath, &st) != -1) && (st.st_size <= MAXICONLEN) && (f = fopen(buddyiconpath, "r"))) {
- while (keepgoing) {
+ buddyiconlen = st.st_size;
+ buddyiconstamp = st.st_mtime;
+ buddyicon = malloc(buddyiconlen);
+ fread(buddyicon, 1, st.st_size, f);
- tv.tv_sec = 5;
- tv.tv_usec = 0;
+ buddyiconsum = aim_iconsum(buddyicon, buddyiconlen);
- waitingconn = aim_select(&aimsess, &tv, &selstat);
+ dvprintf("read %d bytes of %s for buddy icon (sum 0x%08x)\n", buddyiconlen, buddyiconpath, buddyiconsum);
- if (connected && ((time(NULL) - lastnop) > 30)) {
- lastnop = time(NULL);
- aim_flap_nop(&aimsess, aim_getconn_type(&aimsess, AIM_CONN_TYPE_BOS));
- }
+ fclose(f);
+
+ } else
+ dvprintf("could not open buddy icon %s\n", buddyiconpath);
- if (selstat == -1) { /* error */
- keepgoing = 0; /* fall through */
- } else if (selstat == 0) { /* no events pending */
- ;
- } else if (selstat == 1) { /* outgoing data pending */
- aim_tx_flushqueue(&aimsess);
- } else if (selstat == 2) { /* incoming data pending */
- if ((faimtest_mode < 2) && (waitingconn->fd == STDIN_FILENO)) {
- cmd_gotkey();
- } else {
- if (waitingconn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT) {
- if (aim_handlerendconnect(&aimsess, waitingconn) < 0) {
- dprintf("connection error (rend out)\n");
- aim_conn_kill(&aimsess, &waitingconn);
- }
- } else {
- if (aim_get_command(&aimsess, waitingconn) >= 0) {
- aim_rxdispatch(&aimsess);
- } else {
- dvprintf("connection error (type 0x%04x:0x%04x)\n", waitingconn->type, waitingconn->subtype);
- /* we should have callbacks for all these, else the library will do the conn_kill for us. */
- if(waitingconn->type == AIM_CONN_TYPE_RENDEZVOUS) {
- dprintf("connection error: rendezvous connection. you forgot register a disconnect callback, right?\n");
- aim_conn_kill(&aimsess, &waitingconn);
- } else
- 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_session_kill(&aimsess);
+ faimtest_init();
- if (faimtest_mode < 2) {
- printf("\n");
- cmd_uninit();
- }
+ 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) {
+
+ tv.tv_sec = 5;
+ tv.tv_usec = 0;
+
+ waitingconn = aim_select(&aimsess, &tv, &selstat);
+
+ if (connected && ((time(NULL) - lastnop) > 30)) {
+ lastnop = time(NULL);
+ aim_flap_nop(&aimsess, aim_getconn_type(&aimsess, AIM_CONN_TYPE_BOS));
+ }
+
+ if (selstat == -1) { /* error */
+ keepgoing = 0; /* fall through */
+ } else if (selstat == 0) { /* no events pending */
+ ;
+ } else if (selstat == 1) { /* outgoing data pending */
+ aim_tx_flushqueue(&aimsess);
+ } else if (selstat == 2) { /* incoming data pending */
+ if ((faimtest_mode < 2) && (waitingconn->fd == STDIN_FILENO)) {
+ cmd_gotkey();
+ } else {
+ if (waitingconn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT) {
+ if (aim_handlerendconnect(&aimsess, waitingconn) < 0) {
+ dprintf("connection error (rend out)\n");
+ aim_conn_kill(&aimsess, &waitingconn);
+ }
+ } else {
+ if (aim_get_command(&aimsess, waitingconn) >= 0) {
+ aim_rxdispatch(&aimsess);
+ } else {
+ dvprintf("connection error (type 0x%04x:0x%04x)\n", waitingconn->type, waitingconn->subtype);
+ /* we should have callbacks for all these, else the library will do the conn_kill for us. */
+ if (waitingconn->type == AIM_CONN_TYPE_RENDEZVOUS) {
+ dprintf("connection error: rendezvous connection. you forgot register a disconnect callback, right?\n");
+ aim_conn_kill(&aimsess, &waitingconn);
+ } else
+ 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_session_kill(&aimsess);
+
+ if (faimtest_mode < 2) {
+ printf("\n");
+ cmd_uninit();
+ }
+
+ free(buddyicon);
- /* Get out */
- exit(0);
+ /* Get out */
+ exit(0);
}
int faimtest_rateresp(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- switch(command->conn->type) {
- case AIM_CONN_TYPE_BOS: {
- /* this is the new buddy list */
- char buddies[128];
- /* this is the new profile */
- char profile[256];
-
- /* Caution: Buddy1 and Buddy2 are real people! (who I don't know) */
- snprintf(buddies, sizeof(buddies), "Buddy1&Buddy2&%s&", ohcaptainmycaptain?ohcaptainmycaptain:"blah");
- snprintf(profile, sizeof(profile), "Hello.<br>My captain is %s. They were dumb enough to leave this message in their client, or they are using faimtest. Shame on them.", ohcaptainmycaptain);
-
- aim_bos_ackrateresp(sess, command->conn); /* ack rate info response */
- aim_bos_reqpersonalinfo(sess, command->conn);
- aim_bos_reqlocaterights(sess, command->conn);
- aim_bos_setprofile(sess, command->conn, profile, NULL, AIM_CAPS_BUDDYICON | AIM_CAPS_CHAT | AIM_CAPS_VOICE | AIM_CAPS_GETFILE | AIM_CAPS_SENDFILE | AIM_CAPS_IMIMAGE /*| AIM_CAPS_GAMES | AIM_CAPS_SAVESTOCKS*/);
- aim_bos_reqbuddyrights(sess, command->conn);
-
- /* send the buddy list and profile (required, even if empty) */
- aim_bos_setbuddylist(sess, command->conn, buddies);
-
- /* dont really know what this does */
- aim_addicbmparam(sess, command->conn);
- aim_bos_reqicbmparaminfo(sess, command->conn);
-
- aim_bos_reqrights(sess, command->conn);
- /* set group permissions -- all user classes */
- aim_bos_setgroupperm(sess, command->conn, AIM_FLAG_ALLUSERS);
- aim_bos_setprivacyflags(sess, command->conn, AIM_PRIVFLAGS_ALLOWIDLE);
+ switch(command->conn->type) {
+ case AIM_CONN_TYPE_BOS: {
+ /* this is the new buddy list */
+ char buddies[128];
+ /* this is the new profile */
+ char profile[256];
+ char awaymsg[] = {"blah blah blah Ole! blah blah blah"};
- break;
- }
- case AIM_CONN_TYPE_AUTH:
- aim_bos_ackrateresp(sess, command->conn);
- aim_auth_clientready(sess, command->conn);
- dprintf("faimtest: connected to authorization/admin service\n");
- break;
+ /* Caution: Buddy1 and Buddy2 are real people! (who I don't know) */
+ snprintf(buddies, sizeof(buddies), "Buddy1&Buddy2&%s&", ohcaptainmycaptain?ohcaptainmycaptain:"blah");
+ snprintf(profile, sizeof(profile), "Hello.<br>My captain is %s. They were dumb enough to leave this message in their client, or they are using faimtest. Shame on them.", ohcaptainmycaptain);
- default:
- dvprintf("faimtest: got rate response for unhandled connection type %04x\n", command->conn->type);
- break;
- }
+ aim_bos_ackrateresp(sess, command->conn); /* ack rate info response */
+ aim_bos_reqpersonalinfo(sess, command->conn);
+ aim_bos_reqlocaterights(sess, command->conn);
+ aim_bos_setprofile(sess, command->conn, profile, awaymsg, AIM_CAPS_BUDDYICON | AIM_CAPS_CHAT | AIM_CAPS_GETFILE | AIM_CAPS_SENDFILE | AIM_CAPS_IMIMAGE /*| AIM_CAPS_GAMES | AIM_CAPS_SAVESTOCKS*/);
+ aim_bos_reqbuddyrights(sess, command->conn);
- return 1;
+ /* send the buddy list and profile (required, even if empty) */
+ aim_bos_setbuddylist(sess, command->conn, buddies);
+
+ aim_reqicbmparams(sess, command->conn);
+
+ aim_bos_reqrights(sess, command->conn);
+ /* set group permissions -- all user classes */
+ aim_bos_setgroupperm(sess, command->conn, AIM_FLAG_ALLUSERS);
+ aim_bos_setprivacyflags(sess, command->conn, AIM_PRIVFLAGS_ALLOWIDLE);
+
+ break;
+ }
+ case AIM_CONN_TYPE_AUTH:
+ aim_bos_ackrateresp(sess, command->conn);
+ aim_auth_clientready(sess, command->conn);
+ dprintf("faimtest: connected to authorization/admin service\n");
+ break;
+
+ default:
+ dvprintf("faimtest: got rate response for unhandled connection type %04x\n", command->conn->type);
+ break;
+ }
+
+ 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;
+ struct aim_icbmparameters *params;
+ 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);
+ va_start(ap, command);
+ params = va_arg(ap, struct aim_icbmparameters *);
+ 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);
+ 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", params->maxchan, params->flags, params->maxmsglen, ((float)params->maxsenderwarn)/10.0, ((float)params->maxrecverwarn)/10.0, params->minmsginterval);
- return 1;
+ /*
+ * Set these to your taste, or client medium. Setting minmsginterval
+ * higher is good for keeping yourself from getting flooded (esp
+ * if you're on a slow connection or something where that would be
+ * useful).
+ */
+ params->maxmsglen = 8000;
+ params->minmsginterval = 0; /* in milliseconds */
+
+ aim_seticbmparam(sess, command->conn, params);
+
+ return 1;
}
int faimtest_hostversions(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- int vercount, i;
- unsigned char *versions;
- va_list ap;
-
- va_start(ap, command);
- vercount = va_arg(ap, int); /* number of family/version pairs */
- versions = va_arg(ap, unsigned char *);
- va_end(ap);
-
- dprintf("faimtest: SNAC versions supported by this host: ");
- for (i = 0; i < vercount*4; i += 4)
- dvinlineprintf("0x%04x:0x%04x ",
- aimutil_get16(versions+i), /* SNAC family */
- aimutil_get16(versions+i+2) /* Version number */);
- dinlineprintf("\n");
+ int vercount, i;
+ unsigned char *versions;
+ va_list ap;
+
+ va_start(ap, command);
+ vercount = va_arg(ap, int); /* number of family/version pairs */
+ versions = va_arg(ap, unsigned char *);
+ va_end(ap);
+
+ dprintf("faimtest: SNAC versions supported by this host: ");
+ for (i = 0; i < vercount*4; i += 4) {
+ dvinlineprintf("0x%04x:0x%04x ",
+ aimutil_get16(versions+i), /* SNAC family */
+ aimutil_get16(versions+i+2) /* Version number */);
+ }
+ dinlineprintf("\n");
- return 1;
+ return 1;
}
int faimtest_accountconfirm(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- int status;
- va_list ap;
+ int status;
+ va_list ap;
- va_start(ap, command);
- status = va_arg(ap, int); /* status code of confirmation request */
- va_end(ap);
+ va_start(ap, command);
+ status = va_arg(ap, int); /* status code of confirmation request */
+ va_end(ap);
- dvprintf("account confirmation returned status 0x%04x (%s)\n", status, (status==0x0000)?"email sent":"unknown");
+ dvprintf("account confirmation returned status 0x%04x (%s)\n", status, (status==0x0000)?"email sent":"unknown");
- return 1;
+ return 1;
}
int faimtest_serverready(struct aim_session_t *sess, struct command_rx_struct *command, ...)
return 1;
}
+int faimtest_locrights(struct aim_session_t *sess, struct command_rx_struct *command, ...)
+{
+ unsigned short maxsiglen;
+ va_list ap;
+
+ va_start(ap, command);
+ maxsiglen = va_arg(ap, int);
+ va_end(ap);
+
+ dvprintf("faimtest: locate rights: max signature length = %d\n", maxsiglen);
+
+ return 1;
+}
+
int faimtest_parse_unknown(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
int i = 0;
aim_conn_addhandler(sess, bosconn, 0x000a, 0x0003, faimtest_parse_searchreply, 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_LOC, AIM_CB_LOC_RIGHTSINFO, faimtest_locrights, 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_GEN, AIM_CB_GEN_MOTD, faimtest_parse_motd, 0);
} else if (strstr(tmpstr, "goodday")) {
- aim_send_im(sess, command->conn, userinfo->sn, AIM_IMFLAGS_ACK, "Good day to you too.", strlen("Good day to you too."));
+ aim_send_im(sess, command->conn, userinfo->sn, AIM_IMFLAGS_ACK, "Good day to you too.");
+
+ } else if (strstr(tmpstr, "haveicon") && buddyicon) {
+ struct aim_sendimext_args args;
+ static const char iconmsg[] = {"I have an icon"};
+
+ args.destsn = userinfo->sn;
+ args.flags = AIM_IMFLAGS_HASICON;
+ args.msg = iconmsg;
+ args.msglen = strlen(iconmsg);
+ args.iconlen = buddyiconlen;
+ args.iconstamp = buddyiconstamp;
+ args.iconsum = buddyiconsum;
+
+ aim_send_im_ext(sess, command->conn, &args);
+
+ } else if (strstr(tmpstr, "sendicon") && buddyicon) {
+
+ aim_send_icon(sess, command->conn, userinfo->sn, buddyicon, buddyiconlen, buddyiconstamp, buddyiconsum);
} else if (strstr(tmpstr, "warnme")) {
if (!ohcaptainmycaptain) {
- aim_send_im(sess, command->conn, userinfo->sn, AIM_IMFLAGS_ACK, "I have no owner!", strlen("I have no owner!"));
+ aim_send_im(sess, command->conn, userinfo->sn, AIM_IMFLAGS_ACK, "I have no owner!");
} else {
struct aim_conn_t *newconn;
} else if (!strncmp(tmpstr, "reqsendmsg", 10)) {
- aim_send_im(sess, command->conn, ohcaptainmycaptain, 0, "sendmsg 7900", strlen("sendmsg 7900"));
+ aim_send_im(sess, command->conn, ohcaptainmycaptain, 0, "sendmsg 7900");
} else if (!strncmp(tmpstr, "reqauth", 7)) {
newbuf[z] = (z % 10)+0x30;
}
newbuf[i] = '\0';
- aim_send_im(sess, command->conn, userinfo->sn, 0, newbuf, strlen(newbuf));
+ aim_send_im(sess, command->conn, userinfo->sn, 0, newbuf);
free(newbuf);
}
int faimtest_parse_incoming_im(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
int channel;
+ struct aim_userinfo_s *userinfo;
va_list ap;
va_start(ap, command);
channel = va_arg(ap, int);
+ userinfo = va_arg(ap, struct aim_userinfo_s *);
/*
* Channel 1: Standard Message
*/
if (channel == 1) {
- struct aim_userinfo_s *userinfo;
- char *msg = NULL;
- u_int icbmflags = 0;
- char *tmpstr = NULL;
- unsigned short flag1, flag2;
- int finlen = 0;
- unsigned char *fingerprint = NULL;
+ char *tmpstr;
+ struct aim_incomingim_ch1_args *args;
int clienttype = AIM_CLIENTTYPE_UNKNOWN;
-
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- msg = va_arg(ap, char *);
- icbmflags = va_arg(ap, u_int);
- flag1 = va_arg(ap, int);
- flag2 = va_arg(ap, int);
- finlen = va_arg(ap, int);
- fingerprint = va_arg(ap, unsigned char *);
+ char realmsg[8192+1] = {""};
+
+ args = va_arg(ap, struct aim_incomingim_ch1_args *);
va_end(ap);
- clienttype = aim_fingerprintclient(fingerprint, finlen);
+ clienttype = aim_fingerprintclient(args->fingerprint, args->finlen);
dvprintf("faimtest: icbm: sn = \"%s\"\n", userinfo->sn);
dvprintf("faimtest: icbm: probable client type: %d\n", clienttype);
dvprintf("faimtest: icbm: capabilities = 0x%04x\n", userinfo->capabilities);
dprintf("faimtest: icbm: icbmflags = ");
- if (icbmflags & AIM_IMFLAGS_AWAY)
+ if (args->icbmflags & AIM_IMFLAGS_AWAY)
dinlineprintf("away ");
- if (icbmflags & AIM_IMFLAGS_ACK)
+ if (args->icbmflags & AIM_IMFLAGS_ACK)
dinlineprintf("ackrequest ");
+ if (args->icbmflags & AIM_IMFLAGS_BUDDYREQ)
+ dinlineprintf("buddyreq ");
+ if (args->icbmflags & AIM_IMFLAGS_HASICON)
+ dinlineprintf("hasicon ");
dinlineprintf("\n");
- dvprintf("faimtest: icbm: encoding flags = {%04x, %04x}\n", flag1, flag2);
-
- dvprintf("faimtest: icbm: message: %s\n", msg);
-
- if (msg) {
+ dvprintf("faimtest: icbm: encoding flags = {%04x, %04x}\n", args->flag1, args->flag2);
+
+ /*
+ * Quickly convert it to eight bit format, replacing non-ASCII UNICODE
+ * characters with their equivelent HTML entity.
+ */
+ if (args->icbmflags & AIM_IMFLAGS_UNICODE) {
+ int i;
+
+ for (i = 0; i < args->msglen; i += 2) {
+ unsigned short uni;
+
+ uni = ((args->msg[i] & 0xff) << 8) | (args->msg[i+1] & 0xff);
+
+ if ((uni < 128) || ((uni >= 160) && (uni <= 255))) { /* ISO 8859-1 */
+
+ snprintf(realmsg+strlen(realmsg), sizeof(realmsg)-strlen(realmsg),
+ "%c", uni);
+
+ } else { /* something else, do UNICODE entity */
+
+ snprintf(realmsg+strlen(realmsg), sizeof(realmsg)-strlen(realmsg),
+ "&#%04x;", uni);
+
+ }
+
+ }
+
+ } else {
+
+ /*
+ * For non-UNICODE encodings (ASCII and ISO 8859-1), there is no
+ * need to do anything special here. Most terminals/whatever will
+ * be able to display such characters unmodified.
+ *
+ * Beware that PC-ASCII 128 through 159 are _not_ actually defined in
+ * ASCII or ISO 8859-1, and you should send them as UNICODE. WinAIM
+ * will send these characters in a UNICODE message, so you need
+ * to do so as well.
+ *
+ * You may not think it necessary to handle UNICODE messages. You're
+ * probably wrong. For one thing, Microsoft "Smart Quotes" will
+ * be sent by WinAIM as UNICODE (not HTML UNICODE, but real UNICODE).
+ * If you don't parse UNICODE at all, your users will get a blank
+ * message instead of the message containing Smart Quotes.
+ *
+ */
+ strncpy(realmsg, args->msg, sizeof(realmsg));
+ }
+
+ dvprintf("faimtest: icbm: message: %s\n", realmsg);
+
+ if (args->icbmflags & AIM_IMFLAGS_HASICON)
+ aim_send_im(sess, command->conn, userinfo->sn, AIM_IMFLAGS_BUDDYREQ, "You have an icon");
+
+ if (realmsg) {
int i = 0;
- while (msg[i] == '<') {
- if (msg[i] == '<') {
- while (msg[i] != '>')
+ while (realmsg[i] == '<') {
+ if (realmsg[i] == '<') {
+ while (realmsg[i] != '>')
i++;
i++;
}
}
- tmpstr = msg+i;
+ tmpstr = realmsg+i;
faimtest_handlecmd(sess, command, userinfo, tmpstr);
* Channel 2: Rendevous Request
*/
else if (channel == 2) {
- struct aim_userinfo_s *userinfo;
- unsigned short reqclass;
+ struct aim_incomingim_ch2_args *args;
- reqclass = va_arg(ap, int);
- switch (reqclass) {
+ args = va_arg(ap, struct aim_incomingim_ch2_args *);
+ va_end(ap);
+
+ switch (args->reqclass) {
case AIM_CAPS_VOICE: {
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- va_end(ap);
dvprintf("faimtest: voice invitation: source sn = %s\n", userinfo->sn);
dvprintf("faimtest: voice invitation: \twarnlevel = 0x%04x\n", userinfo->warnlevel);
break;
}
case AIM_CAPS_GETFILE: {
- char *ip, *cookie;
struct aim_conn_t *newconn;
struct aim_fileheader_t *fh;
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- ip = va_arg(ap, char *);
- cookie = va_arg(ap, char *);
- va_end(ap);
-
- dvprintf("faimtest: get file request from %s (at %s) %x\n", userinfo->sn, ip, reqclass);
+ dvprintf("faimtest: get file request from %s (at %s) %x\n", userinfo->sn, args->info.getfile.ip, args->reqclass);
- fh = aim_getlisting(sess, listingfile);
+ fh = aim_getlisting(sess, listingfile);
- newconn = aim_accepttransfer(sess, command->conn, userinfo->sn, cookie, ip, fh->totfiles, fh->totsize, fh->size, fh->checksum, reqclass);
+ newconn = aim_accepttransfer(sess, command->conn, userinfo->sn, args->info.getfile.cookie, args->info.getfile.ip, fh->totfiles, fh->totsize, fh->size, fh->checksum, args->reqclass);
- if( (!newconn) || (newconn->fd == -1) ) {
+ if ( (!newconn) || (newconn->fd == -1) ) {
dprintf("faimtest: getfile: requestconn: apparent error in accepttransfer\n");
if(newconn)
aim_conn_kill(sess, &newconn);
break;
}
case AIM_CAPS_CHAT: {
- char *msg,*encoding,*lang;
- struct aim_chat_roominfo *roominfo;
-
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- roominfo = va_arg(ap, struct aim_chat_roominfo *);
- msg = va_arg(ap, char *);
- encoding = va_arg(ap, char *);
- lang = va_arg(ap, char *);
- va_end(ap);
dvprintf("faimtest: chat invitation: source sn = %s\n", userinfo->sn);
dvprintf("faimtest: chat invitation: \twarnlevel = 0x%04x\n", userinfo->warnlevel);
dvprintf("faimtest: chat invitation: \tonlinesince = %lu\n", userinfo->onlinesince);
dvprintf("faimtest: chat invitation: \tidletime = 0x%04x\n", userinfo->idletime);
- dvprintf("faimtest: chat invitation: message = %s\n", msg);
- dvprintf("faimtest: chat invitation: room name = %s\n", roominfo->name);
- dvprintf("faimtest: chat invitation: encoding = %s\n", encoding);
- dvprintf("faimtest: chat invitation: language = %s\n", lang);
- dvprintf("faimtest: chat invitation: exchange = 0x%04x\n", roominfo->exchange);
- dvprintf("faimtest: chat invitation: instance = 0x%04x\n", roominfo->instance);
- dvprintf("faimtest: chat invitiation: autojoining %s...\n", roominfo->name);
+ dvprintf("faimtest: chat invitation: message = %s\n", args->info.chat.msg);
+ dvprintf("faimtest: chat invitation: room name = %s\n", args->info.chat.roominfo.name);
+ dvprintf("faimtest: chat invitation: encoding = %s\n", args->info.chat.encoding);
+ dvprintf("faimtest: chat invitation: language = %s\n", args->info.chat.lang);
+ dvprintf("faimtest: chat invitation: exchange = 0x%04x\n", args->info.chat.roominfo.exchange);
+ dvprintf("faimtest: chat invitation: instance = 0x%04x\n", args->info.chat.roominfo.instance);
+ dvprintf("faimtest: chat invitiation: autojoining %s...\n", args->info.chat.roominfo.name);
+
/*
* Automatically join room...
*/
- aim_chat_join(sess, command->conn, 0x0004, roominfo->name);
+ aim_chat_join(sess, command->conn, args->info.chat.roominfo.exchange, args->info.chat.roominfo.name);
break;
}
case AIM_CAPS_IMIMAGE: {
- struct aim_directim_priv *priv;
struct aim_conn_t *newconn;
dprintf("faimtest: icbm: rendezvous imimage\n");
-
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- priv = va_arg(ap, struct aim_directim_priv *);
- va_end(ap);
- dvprintf("faimtest: OFT: DirectIM: request from %s (%s)\n", userinfo->sn, priv->ip);
+ dvprintf("faimtest: OFT: DirectIM: request from %s (%s)\n", userinfo->sn, args->info.directim->ip);
- newconn = aim_directim_connect(sess, command->conn, priv);
+ newconn = aim_directim_connect(sess, command->conn, args->info.directim);
if ( (!newconn) || (newconn->fd == -1) ) {
dprintf("faimtest: icbm: imimage: could not connect\n");
break;
}
+ case AIM_CAPS_BUDDYICON: {
+
+ dvprintf("faimtest: Buddy Icon from %s, length = %u\n", userinfo->sn, args->info.icon.length);
+ break;
+ }
default:
- dvprintf("faimtest: icbm: unknown reqclass (%d)\n", reqclass);
+ dvprintf("faimtest: icbm: unknown reqclass (%d)\n", args->reqclass);
} /* switch */
} else
dvprintf("faimtest does not support channels > 2 (chan = %02x)\n", channel);
+
dprintf("faimtest: icbm: done with ICBM handling\n");
return 1;
int faimtest_parse_motd(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- static char *codes[] = {
- "Unknown",
- "Mandatory upgrade",
- "Advisory upgrade",
- "System bulletin",
- "Top o' the world!"};
- static int codeslen = 5;
-
- char *msg;
- unsigned short id;
- va_list ap;
-
- va_start(ap, command);
- id = va_arg(ap, int);
- msg = va_arg(ap, char *);
- va_end(ap);
-
- dvprintf("faimtest: motd: %s (%d / %s)\n", msg, id,
- (id < codeslen)?codes[id]:"unknown");
-
- if (!connected)
- connected++;
+ static char *codes[] = {
+ "Unknown",
+ "Mandatory upgrade",
+ "Advisory upgrade",
+ "System bulletin",
+ "Top o' the world!"
+ };
+ static int codeslen = 5;
+ char *msg;
+ unsigned short id;
+ va_list ap;
-#if 0
- aim_bos_reqservice(sess, command->conn, 0x0005); /* adverts */
- aim_bos_reqservice(sess, command->conn, 0x000f); /* user directory */
+ va_start(ap, command);
+ id = va_arg(ap, int);
+ msg = va_arg(ap, char *);
+ va_end(ap);
- /* Don't know what this does... */
- /* XXX sess->sn should be normalized by the 0001/000f handler */
- aim_0002_000b(sess, command->conn, sess->sn);
-#endif
+ dvprintf("faimtest: motd: %s (%d / %s)\n", msg, id, (id < codeslen)?codes[id]:"unknown");
- return 1;
+ return 1;
}
int faimtest_parse_genericerr(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- va_list ap;
- unsigned short reason;
+ va_list ap;
+ unsigned short reason;
- va_start(ap, command);
- reason = va_arg(ap, int);
- va_end(ap);
+ va_start(ap, command);
+ reason = va_arg(ap, int);
+ va_end(ap);
- dvprintf("faimtest: snac threw error (reason 0x%04x: %s)\n", reason, (reason<msgerrreasonslen)?msgerrreasons[reason]:"unknown");
-
- return 1;
+ dvprintf("faimtest: snac threw error (reason 0x%04x: %s)\n", reason, (reason<msgerrreasonslen)?msgerrreasons[reason]:"unknown");
+
+ return 1;
}
int faimtest_parse_msgerr(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- va_list ap;
- char *destsn;
- unsigned short reason;
+ va_list ap;
+ char *destsn;
+ unsigned short reason;
- va_start(ap, command);
- reason = va_arg(ap, int);
- destsn = va_arg(ap, char *);
- va_end(ap);
+ va_start(ap, command);
+ 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");
-
- return 1;
+ dvprintf("faimtest: message to %s bounced (reason 0x%04x: %s)\n", destsn, reason, (reason<msgerrreasonslen)?msgerrreasons[reason]:"unknown");
+
+ return 1;
}
int faimtest_parse_locerr(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- va_list ap;
- char *destsn;
- unsigned short reason;
+ va_list ap;
+ char *destsn;
+ unsigned short reason;
- va_start(ap, command);
- reason = va_arg(ap, int);
- destsn = va_arg(ap, char *);
- va_end(ap);
+ va_start(ap, command);
+ 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");
-
- return 1;
+ dvprintf("faimtest: user information for %s unavailable (reason 0x%04x: %s)\n", destsn, reason, (reason<msgerrreasonslen)?msgerrreasons[reason]:"unknown");
+
+ return 1;
}
/*
*/
int faimtest_parse_misses(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- static char *missedreasons[] = {
- "Unknown",
- "Message too large"};
- static int missedreasonslen = 2;
+ static char *missedreasons[] = {
+ "Invalid (0)",
+ "Message too large",
+ "Rate exceeded",
+ "Evil Sender",
+ "Evil Receiver"
+ };
+ static int missedreasonslen = 5;
- va_list ap;
- unsigned short chan, nummissed, reason;
- struct aim_userinfo_s *userinfo;
-
- va_start(ap, command);
- chan = va_arg(ap, int);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- nummissed = va_arg(ap, int);
- reason = va_arg(ap, int);
- va_end(ap);
+ va_list ap;
+ unsigned short chan, nummissed, reason;
+ struct aim_userinfo_s *userinfo;
- dvprintf("faimtest: missed %d messages from %s (reason %d: %s)\n", nummissed, userinfo->sn, reason, (reason<missedreasonslen)?missedreasons[reason]:"unknown");
-
- return 1;
+ va_start(ap, command);
+ chan = va_arg(ap, int);
+ userinfo = va_arg(ap, struct aim_userinfo_s *);
+ nummissed = va_arg(ap, int);
+ reason = va_arg(ap, int);
+ va_end(ap);
+
+ dvprintf("faimtest: missed %d messages from %s on channel %d (reason %d: %s)\n", nummissed, userinfo->sn, chan, reason, (reason<missedreasonslen)?missedreasons[reason]:"unknown");
+
+ return 1;
}
int faimtest_parse_login(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- struct client_info_s info = AIM_CLIENTINFO_KNOWNGOOD;
- char *key;
- va_list ap;
-
- va_start(ap, command);
- key = va_arg(ap, char *);
- va_end(ap);
+ struct client_info_s info = AIM_CLIENTINFO_KNOWNGOOD;
+ char *key;
+ va_list ap;
- aim_send_login(sess, command->conn, screenname, password, &info, key);
-
- return 1;
+ va_start(ap, command);
+ key = va_arg(ap, char *);
+ va_end(ap);
+
+ aim_send_login(sess, command->conn, screenname, password, &info, key);
+
+ return 1;
}
int faimtest_chat_join(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- va_list ap;
- struct aim_userinfo_s *userinfo;
- int count = 0, i = 0;
-
- va_start(ap, command);
- count = va_arg(ap, int);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- va_end(ap);
+ va_list ap;
+ struct aim_userinfo_s *userinfo;
+ int count = 0, i = 0;
- dvprintf("faimtest: chat: %s: New occupants have joined:\n", (char *)command->conn->priv);
- while (i < count)
- dvprintf("faimtest: chat: %s: \t%s\n", (char *)command->conn->priv, userinfo[i++].sn);
+ va_start(ap, command);
+ count = va_arg(ap, int);
+ userinfo = va_arg(ap, struct aim_userinfo_s *);
+ va_end(ap);
- return 1;
+ dvprintf("faimtest: chat: %s: New occupants have joined:\n", (char *)command->conn->priv);
+ while (i < count)
+ dvprintf("faimtest: chat: %s: \t%s\n", (char *)command->conn->priv, userinfo[i++].sn);
+
+ return 1;
}
int faimtest_chat_leave(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- va_list ap;
- struct aim_userinfo_s *userinfo;
- int count = 0, i = 0;
-
- va_start(ap, command);
- count = va_arg(ap, int);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- va_end(ap);
+ va_list ap;
+ struct aim_userinfo_s *userinfo;
+ int count = 0, i = 0;
- dvprintf("faimtest: chat: %s: Some occupants have left:\n", (char *)command->conn->priv);
+ va_start(ap, command);
+ count = va_arg(ap, int);
+ userinfo = va_arg(ap, struct aim_userinfo_s *);
+ va_end(ap);
- for (i = 0; i < count; )
- dvprintf("faimtest: chat: %s: \t%s\n", (char *)command->conn->priv, userinfo[i++].sn);
+ dvprintf("faimtest: chat: %s: Some occupants have left:\n", (char *)command->conn->priv);
- return 1;
+ for (i = 0; i < count; )
+ dvprintf("faimtest: chat: %s: \t%s\n", (char *)command->conn->priv, userinfo[i++].sn);
+
+ return 1;
}
int faimtest_chat_infoupdate(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- va_list ap;
- struct aim_userinfo_s *userinfo;
- struct aim_chat_roominfo *roominfo;
- char *roomname;
- int usercount,i;
- char *roomdesc;
- unsigned short unknown_c9, unknown_d2, unknown_d5, maxmsglen;
- unsigned long creationtime;
-
- va_start(ap, command);
- roominfo = va_arg(ap, struct aim_chat_roominfo *);
- roomname = va_arg(ap, char *);
- usercount= va_arg(ap, int);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- roomdesc = va_arg(ap, char *);
- unknown_c9 = va_arg(ap, int);
- creationtime = va_arg(ap, unsigned long);
- maxmsglen = va_arg(ap, int);
- unknown_d2 = va_arg(ap, int);
- unknown_d5 = va_arg(ap, int);
- va_end(ap);
-
- dvprintf("faimtest: chat: %s: info update:\n", (char *)command->conn->priv);
- dvprintf("faimtest: chat: %s: \tRoominfo: {%04x, %s, %04x}\n",
- (char *)command->conn->priv,
- roominfo->exchange,
- roominfo->name,
- roominfo->instance);
- dvprintf("faimtest: chat: %s: \tRoomname: %s\n", (char *)command->conn->priv, roomname);
- dvprintf("faimtest: chat: %s: \tRoomdesc: %s\n", (char *)command->conn->priv, roomdesc);
- dvprintf("faimtest: chat: %s: \tOccupants: (%d)\n", (char *)command->conn->priv, usercount);
-
- for (i = 0; i < usercount; )
- dvprintf("faimtest: chat: %s: \t\t%s\n", (char *)command->conn->priv, userinfo[i++].sn);
-
- dvprintf("faimtest: chat: %s: \tUnknown_c9: 0x%04x\n", (char *)command->conn->priv, unknown_c9);
- dvprintf("faimtest: chat: %s: \tCreation time: %lu (time_t)\n", (char *)command->conn->priv, creationtime);
- dvprintf("faimtest: chat: %s: \tMax message length: %d bytes\n", (char *)command->conn->priv, maxmsglen);
- dvprintf("faimtest: chat: %s: \tUnknown_d2: 0x%04x\n", (char *)command->conn->priv, unknown_d2);
- dvprintf("faimtest: chat: %s: \tUnknown_d5: 0x%02x\n", (char *)command->conn->priv, unknown_d5);
-
- return 1;
+ va_list ap;
+ struct aim_userinfo_s *userinfo;
+ struct aim_chat_roominfo *roominfo;
+ char *roomname;
+ int usercount,i;
+ char *roomdesc;
+ unsigned short unknown_c9, unknown_d2, unknown_d5, maxmsglen;
+ unsigned long creationtime;
+
+ va_start(ap, command);
+ roominfo = va_arg(ap, struct aim_chat_roominfo *);
+ roomname = va_arg(ap, char *);
+ usercount= va_arg(ap, int);
+ userinfo = va_arg(ap, struct aim_userinfo_s *);
+ roomdesc = va_arg(ap, char *);
+ unknown_c9 = va_arg(ap, int);
+ creationtime = va_arg(ap, unsigned long);
+ maxmsglen = va_arg(ap, int);
+ unknown_d2 = va_arg(ap, int);
+ unknown_d5 = va_arg(ap, int);
+ va_end(ap);
+
+ dvprintf("faimtest: chat: %s: info update:\n", (char *)command->conn->priv);
+ dvprintf("faimtest: chat: %s: \tRoominfo: {%04x, %s, %04x}\n", (char *)command->conn->priv, roominfo->exchange, roominfo->name, roominfo->instance);
+ dvprintf("faimtest: chat: %s: \tRoomname: %s\n", (char *)command->conn->priv, roomname);
+ dvprintf("faimtest: chat: %s: \tRoomdesc: %s\n", (char *)command->conn->priv, roomdesc);
+ dvprintf("faimtest: chat: %s: \tOccupants: (%d)\n", (char *)command->conn->priv, usercount);
+
+ for (i = 0; i < usercount; )
+ dvprintf("faimtest: chat: %s: \t\t%s\n", (char *)command->conn->priv, userinfo[i++].sn);
+
+ dvprintf("faimtest: chat: %s: \tUnknown_c9: 0x%04x\n", (char *)command->conn->priv, unknown_c9);
+ dvprintf("faimtest: chat: %s: \tCreation time: %lu (time_t)\n", (char *)command->conn->priv, creationtime);
+ dvprintf("faimtest: chat: %s: \tMax message length: %d bytes\n", (char *)command->conn->priv, maxmsglen);
+ dvprintf("faimtest: chat: %s: \tUnknown_d2: 0x%04x\n", (char *)command->conn->priv, unknown_d2);
+ dvprintf("faimtest: chat: %s: \tUnknown_d5: 0x%02x\n", (char *)command->conn->priv, unknown_d5);
+
+ return 1;
}
int faimtest_chat_incomingmsg(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- va_list ap;
- struct aim_userinfo_s *userinfo;
- char *msg;
- char tmpbuf[1152];
-
- va_start(ap, command);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- msg = va_arg(ap, char *);
- va_end(ap);
-
- dvprintf("faimtest: chat: %s: incoming msg from %s: %s\n", (char *)command->conn->priv, userinfo->sn, msg);
-
- /*
- * Do an echo for testing purposes. But not for ourselves ("oops!")
- */
- if (strcmp(userinfo->sn, sess->sn) != 0)
- {
- sprintf(tmpbuf, "(%s said \"%s\")", userinfo->sn, msg);
- aim_chat_send_im(sess, command->conn, 0, tmpbuf, strlen(tmpbuf));
- }
+ va_list ap;
+ struct aim_userinfo_s *userinfo;
+ char *msg;
+ char tmpbuf[1152];
+
+ va_start(ap, command);
+ userinfo = va_arg(ap, struct aim_userinfo_s *);
+ msg = va_arg(ap, char *);
+ va_end(ap);
+
+ dvprintf("faimtest: chat: %s: incoming msg from %s: %s\n", (char *)command->conn->priv, userinfo->sn, msg);
+
+ /*
+ * Do an echo for testing purposes. But not for ourselves ("oops!")
+ */
+ if (strcmp(userinfo->sn, sess->sn) != 0) {
+ sprintf(tmpbuf, "(%s said \"%s\")", userinfo->sn, msg);
+ aim_chat_send_im(sess, command->conn, 0, tmpbuf, strlen(tmpbuf));
+ }
- return 1;
+ return 1;
}
int faimtest_chatnav_info(struct aim_session_t *sess, struct command_rx_struct *command, ...)
int faimtest_parse_connerr(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- va_list ap;
- unsigned short code;
- char *msg = NULL;
+ va_list ap;
+ unsigned short code;
+ char *msg = NULL;
- va_start(ap, command);
- code = va_arg(ap, int);
- msg = va_arg(ap, char *);
- va_end(ap);
+ va_start(ap, command);
+ code = va_arg(ap, int);
+ msg = va_arg(ap, char *);
+ va_end(ap);
- dvprintf("faimtest: connerr: Code 0x%04x: %s\n", code, msg);
- aim_conn_kill(sess, &command->conn); /* this will break the main loop */
+ dvprintf("faimtest: connerr: Code 0x%04x: %s\n", code, msg);
+ aim_conn_kill(sess, &command->conn); /* this will break the main loop */
- connected = 0;
+ connected = 0;
- return 1;
+ return 1;
}
int faimtest_debugconn_connect(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- dprintf("faimtest: connecting to an aimdebugd!\n");
+ dprintf("faimtest: connecting to an aimdebugd!\n");
- /* convert the authorizer connection to a BOS connection */
- command->conn->type = AIM_CONN_TYPE_BOS;
+ /* convert the authorizer connection to a BOS connection */
+ command->conn->type = AIM_CONN_TYPE_BOS;
- aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_MSG, AIM_CB_MSG_INCOMING, faimtest_parse_incoming_im, 0);
+ aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_MSG, AIM_CB_MSG_INCOMING, faimtest_parse_incoming_im, 0);
- /* tell the aimddebugd we're ready */
- aim_debugconn_sendconnect(sess, command->conn);
+ /* tell the aimddebugd we're ready */
+ aim_debugconn_sendconnect(sess, command->conn);
- /* go right into main loop (don't open a BOS connection, etc) */
- return 1;
+ /* go right into main loop (don't open a BOS connection, etc) */
+ return 1;
}
/*
*/
int faimtest_parse_msgack(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- va_list ap;
- unsigned short type;
- char *sn = NULL;
+ va_list ap;
+ unsigned short type;
+ char *sn = NULL;
- va_start(ap, command);
- type = va_arg(ap, int);
- sn = va_arg(ap, char *);
- va_end(ap);
+ va_start(ap, command);
+ type = va_arg(ap, int);
+ sn = va_arg(ap, char *);
+ va_end(ap);
- dvprintf("faimtest: msgack: 0x%04x / %s\n", type, sn);
+ dvprintf("faimtest: msgack: 0x%04x / %s\n", type, sn);
- return 1;
+ return 1;
}
int faimtest_getfile_filereq(struct aim_session_t *ses, struct command_rx_struct *command, ...)
{
- va_list ap;
- struct aim_conn_t *oftconn;
- struct aim_fileheader_t *fh;
- char *cookie;
+ va_list ap;
+ struct aim_conn_t *oftconn;
+ struct aim_fileheader_t *fh;
+ char *cookie;
- va_start(ap, command);
- oftconn = va_arg(ap, struct aim_conn_t *);
- fh = va_arg(ap, struct aim_fileheader_t *);
- cookie = va_arg(ap, char *);
- va_end(ap);
+ va_start(ap, command);
+ oftconn = va_arg(ap, struct aim_conn_t *);
+ fh = va_arg(ap, struct aim_fileheader_t *);
+ cookie = va_arg(ap, char *);
+ va_end(ap);
- dvprintf("faimtest: request for file %s.\n", fh->name);
+ dvprintf("faimtest: request for file %s.\n", fh->name);
- return 1;
+ return 1;
}
dvprintf("faimtest: getfile: disconnected from %s\n", sn);
return 1;
}
+
int faimtest_getfile_initiate(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
va_list ap;
int faimtest_parse_evilnotify(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- va_list ap;
- int newevil;
- struct aim_userinfo_s *userinfo;
+ va_list ap;
+ int newevil;
+ struct aim_userinfo_s *userinfo;
- va_start(ap, command);
- newevil = va_arg(ap, int);
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- va_end(ap);
+ va_start(ap, command);
+ newevil = va_arg(ap, int);
+ userinfo = va_arg(ap, struct aim_userinfo_s *);
+ va_end(ap);
- /*
- * Evil Notifications that are lacking userinfo->sn are anon-warns
- * if they are an evil increases, but are not warnings at all if its
- * a decrease (its the natural backoff happening).
- *
- * newevil is passed as an int representing the new evil value times
- * ten.
- */
- dvprintf("faimtest: evil level change: new value = %2.1f%% (caused by %s)\n", ((float)newevil)/10, (userinfo && strlen(userinfo->sn))?userinfo->sn:"anonymous");
+ /*
+ * Evil Notifications that are lacking userinfo->sn are anon-warns
+ * if they are an evil increases, but are not warnings at all if its
+ * a decrease (its the natural backoff happening).
+ *
+ * newevil is passed as an int representing the new evil value times
+ * ten.
+ */
+ dvprintf("faimtest: evil level change: new value = %2.1f%% (caused by %s)\n", ((float)newevil)/10, (userinfo && strlen(userinfo->sn))?userinfo->sn:"anonymous");
- return 1;
+ return 1;
}
int faimtest_parse_searchreply(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- va_list ap;
- char *address, *SNs;
- int i, num;
-
- va_start(ap, command);
- address = va_arg(ap, char *);
- num = va_arg(ap, int);
- SNs = va_arg(ap, char *);
- va_end(ap);
+ va_list ap;
+ char *address, *SNs;
+ int i, num;
- dvprintf("faimtest: E-Mail Search Results for %s: ", address);
+ va_start(ap, command);
+ address = va_arg(ap, char *);
+ num = va_arg(ap, int);
+ SNs = va_arg(ap, char *);
+ va_end(ap);
- for(i = 0; i < num; i++)
- dvinlineprintf("%s, ", &SNs[i*(MAXSNLEN+1)]);
- dinlineprintf("\n");
+ dvprintf("faimtest: E-Mail Search Results for %s: ", address);
- return 1;
+ for(i = 0; i < num; i++)
+ dvinlineprintf("%s, ", &SNs[i*(MAXSNLEN+1)]);
+ dinlineprintf("\n");
+
+ return 1;
}
int faimtest_parse_searcherror(struct aim_session_t *sess, struct command_rx_struct *command, ...)
{
- va_list ap;
- char *address;
-
- va_start(ap, command);
- address = va_arg(ap, char *);
- va_end(ap);
+ va_list ap;
+ char *address;
- dvprintf("faimtest: E-Mail Search Results for %s: No Results or Invalid Email\n", address);
+ va_start(ap, command);
+ address = va_arg(ap, char *);
+ va_end(ap);
- return 1;
+ dvprintf("faimtest: E-Mail Search Results for %s: No Results or Invalid Email\n", address);
+
+ return 1;
}