]> andersk Git - libfaim.git/blobdiff - utils/faimtest/faimtest.c
.
[libfaim.git] / utils / faimtest / faimtest.c
index 76fc179e5ae777f14718c9d3e32621791f479b30..91bb63d5826caef4e6318565564d71fe522a5b59 100644 (file)
@@ -39,6 +39,7 @@
  */
 
 #include "faimtest.h"
+#include <sys/stat.h>
 
 static char *dprintf_ctime(void)
 {
@@ -75,7 +76,7 @@ static char *dprintf_ctime(void)
 int faimtest_parse_oncoming(struct aim_session_t *, struct command_rx_struct *, ...);
 int faimtest_parse_offgoing(struct aim_session_t *, struct command_rx_struct *, ...);
 int faimtest_parse_login_phase3d_f(struct aim_session_t *, struct command_rx_struct *, ...);
-int faimtest_parse_authresp(struct aim_session_t *, struct command_rx_struct *, ...);
+static int faimtest_parse_authresp(struct aim_session_t *, struct command_rx_struct *, ...);
 int faimtest_parse_incoming_im(struct aim_session_t *, struct command_rx_struct *command, ...);
 int faimtest_parse_userinfo(struct aim_session_t *, struct command_rx_struct *command, ...);
 int faimtest_handleredirect(struct aim_session_t *, struct command_rx_struct *command, ...);
@@ -148,6 +149,7 @@ static char *msgerrreasons[] = {
   "Not while on AOL"};
 static int msgerrreasonslen = 25;
 
+static char *aimbinarypath = NULL;
 static char *screenname,*password,*server=NULL;
 static char *proxy = NULL, *proxyusername = NULL, *proxypass = NULL;
 static char *ohcaptainmycaptain = NULL;
@@ -159,46 +161,65 @@ int keepgoing = 1;
 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;
 }
 
 /*
@@ -211,17 +232,17 @@ int faimtest_flapversion(struct aim_session_t *sess, struct command_rx_struct *c
  */
 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
@@ -233,335 +254,364 @@ int faimtest_conncomplete(struct aim_session_t *sess, struct command_rx_struct *
  */
 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...");
+       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:hoO")) != 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 '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");
-      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);
-      dprintf("sending NOP\n");
-      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); 
 
-  /* Get out */
-  exit(0);
+       if (faimtest_mode < 2) {
+               printf("\n");
+               cmd_uninit();
+       }
+
+       free(buddyicon);
+
+       /* 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;
+       params->maxmsglen = 8000;
+       params->minmsginterval = 0;
+
+       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, ...)
@@ -660,6 +710,20 @@ int faimtest_bosrights(struct aim_session_t *sess, struct command_rx_struct *com
   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;
@@ -796,7 +860,194 @@ int faimtest_handleredirect(struct aim_session_t *sess, struct command_rx_struct
   return 1;
 }
 
-int faimtest_parse_authresp(struct aim_session_t *sess, struct command_rx_struct *command, ...)
+/*
+ * This is a little more complicated than it looks.  The module
+ * name (proto, boscore, etc) may or may not be given.  If it is
+ * not given, then use aim.exe.  If it is given, put ".ocm" on the
+ * end of it.
+ *
+ * Now, if the offset or length requested would cause a read past
+ * the end of the file, then the request is considered invalid.  Invalid
+ * requests are processed specially.  The value hashed is the
+ * the request, put into little-endian (eight bytes: offset followed
+ * by length).  
+ *
+ * Additionally, if the request is valid, the length is mod 4096.  It is
+ * important that the length is checked for validity first before doing
+ * the mod.
+ *
+ * Note to Bosco's Brigade: if you'd like to break this, put the 
+ * module name on an invalid request.
+ *
+ */
+static int getaimdata(unsigned char **bufret, int *buflenret, unsigned long offset, unsigned long len, const char *modname)
+{
+  FILE *f;
+  static const char defaultmod[] = "aim.exe";
+  char *filename = NULL;
+  struct stat st;
+  unsigned char *buf;
+  int invalid = 0;
+
+  if (!bufret || !buflenret)
+    return -1;
+
+  if (modname) {
+
+    if (!(filename = malloc(strlen(aimbinarypath)+1+strlen(modname)+4+1))) {
+      dperror("memrequest: malloc");
+      return -1;
+    }
+
+    sprintf(filename, "%s/%s.ocm", aimbinarypath, modname);
+
+  } else {
+
+    if (!(filename = malloc(strlen(aimbinarypath)+1+strlen(defaultmod)+1))) {
+      dperror("memrequest: malloc");
+      return -1;
+    }
+
+    sprintf(filename, "%s/%s", aimbinarypath, defaultmod);
+
+  }
+
+  if (stat(filename, &st) == -1) {
+    if (!modname) {
+      dperror("memrequest: stat");
+      free(filename);
+      return -1;
+    }
+    invalid = 1;
+  }
+
+  if (!invalid) {
+    if ((offset > st.st_size) || (len > st.st_size))
+      invalid = 1;
+    else if ((st.st_size - offset) < len)
+      len = st.st_size - offset;
+    else if ((st.st_size - len) < len)
+      len = st.st_size - len;
+  }
+
+  if (!invalid && len)
+    len %= 4096;
+
+  if (invalid) {
+    int i;
+
+    free(filename); /* not needed */
+
+    dvprintf("memrequest: recieved invalid request for 0x%08lx bytes at 0x%08lx (file %s)\n", len, offset, modname);
+
+    i = 8;
+    if (modname)
+      i += strlen(modname);
+
+    if (!(buf = malloc(i)))
+      return -1;
+
+    i = 0;
+
+    if (modname) {
+      memcpy(buf, modname, strlen(modname));
+      i += strlen(modname);
+    }
+
+    /* Damn endianness. This must be little (LSB first) endian. */
+    buf[i++] = offset & 0xff;
+    buf[i++] = (offset >> 8) & 0xff;
+    buf[i++] = (offset >> 16) & 0xff;
+    buf[i++] = (offset >> 24) & 0xff;
+    buf[i++] = len & 0xff;
+    buf[i++] = (len >> 8) & 0xff;
+    buf[i++] = (len >> 16) & 0xff;
+    buf[i++] = (len >> 24) & 0xff;
+
+    *bufret = buf;
+    *buflenret = i;
+
+  } else {
+
+    if (!(buf = malloc(len))) {
+      free(filename);
+      return -1;
+    }
+
+    dvprintf("memrequest: loading %ld bytes from 0x%08lx in \"%s\"...\n", len, offset, filename);
+
+    if (!(f = fopen(filename, "r"))) {
+      dperror("memrequest: fopen");
+      free(filename);
+      free(buf);
+      return -1;
+    }
+
+    free(filename);
+
+    if (fseek(f, offset, SEEK_SET) == -1) {
+      dperror("memrequest: fseek");
+      fclose(f);
+      free(buf);
+      return -1;
+    }
+
+    if (fread(buf, len, 1, f) != 1) {
+      dperror("memrequest: fread");
+      fclose(f);
+      free(buf);
+      return -1;
+    }
+
+    fclose(f);
+
+    *bufret = buf;
+    *buflenret = len;
+
+  }
+
+  return 0; /* success! */
+}
+
+/*
+ * This will get an offset and a length.  The client should read this
+ * data out of whatever AIM.EXE binary the user has provided (hopefully
+ * it matches the client information thats sent at login) and pass a
+ * buffer back to libfaim so it can hash the data and send it to AOL for
+ * inspection by the client police.
+ */
+static int faimtest_memrequest(struct aim_session_t *sess, struct command_rx_struct *command, ...)
+{
+  va_list ap;
+  unsigned long offset, len;
+  char *modname;
+  unsigned char *buf;
+  int buflen;
+  
+  va_start(ap, command);
+  offset = va_arg(ap, unsigned long);
+  len = va_arg(ap, unsigned long);
+  modname = va_arg(ap, char *);
+  va_end(ap);
+
+  if (aimbinarypath && (getaimdata(&buf, &buflen, offset, len, modname) == 0)) {
+
+    aim_sendmemblock(sess, command->conn, offset, buflen, buf, AIM_SENDMEMBLOCK_FLAG_ISREQUEST);
+
+    free(buf);
+
+  } else {
+
+    dvprintf("memrequest: unable to use AIM binary (\"%s/%s\"), sending defaults...\n", aimbinarypath, modname);
+
+    aim_sendmemblock(sess, command->conn, offset, len, NULL, AIM_SENDMEMBLOCK_FLAG_ISREQUEST);
+
+  }
+
+  return 1;
+}
+
+static int faimtest_parse_authresp(struct aim_session_t *sess, struct command_rx_struct *command, ...)
 {
   va_list ap;
   struct aim_conn_t *bosconn = NULL;
@@ -883,6 +1134,7 @@ int faimtest_parse_authresp(struct aim_session_t *sess, struct command_rx_struct
   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);
@@ -893,6 +1145,7 @@ int faimtest_parse_authresp(struct aim_session_t *sess, struct command_rx_struct
   aim_conn_addhandler(sess, bosconn, 0x0009, 0x0001, faimtest_parse_genericerr, 0);
 
   aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR, faimtest_parse_connerr, 0);
+  aim_conn_addhandler(sess, bosconn, 0x0001, 0x001f, faimtest_memrequest, 0);
   aim_conn_addhandler(sess, bosconn, 0xffff, 0xffff, faimtest_parse_unknown, 0);
 
   aim_auth_sendcookie(sess, bosconn, cookie);
@@ -969,6 +1222,24 @@ static int faimtest_handlecmd(struct aim_session_t *sess, struct command_rx_stru
 
       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")) {
 
     dprintf("faimtest: icbm: sending non-anon warning\n");
@@ -1102,34 +1373,26 @@ static int faimtest_handlecmd(struct aim_session_t *sess, struct command_rx_stru
 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);
@@ -1144,27 +1407,82 @@ int faimtest_parse_incoming_im(struct aim_session_t *sess, struct command_rx_str
     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);
 
@@ -1174,14 +1492,13 @@ int faimtest_parse_incoming_im(struct aim_session_t *sess, struct command_rx_str
    * 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);
@@ -1196,22 +1513,16 @@ int faimtest_parse_incoming_im(struct aim_session_t *sess, struct command_rx_str
       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);
@@ -1236,15 +1547,6 @@ int faimtest_parse_incoming_im(struct aim_session_t *sess, struct command_rx_str
       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);
@@ -1256,32 +1558,28 @@ int faimtest_parse_incoming_im(struct aim_session_t *sess, struct command_rx_str
       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");
@@ -1302,11 +1600,17 @@ int faimtest_parse_incoming_im(struct aim_session_t *sess, struct command_rx_str
 
       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;
@@ -1508,89 +1812,72 @@ int faimtest_parse_offgoing(struct aim_session_t *sess, struct command_rx_struct
 
 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++;
-
-#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
-
-  /* As of 26 Mar 2001 you need to send this to keep from getting kicked off */
-  aim_0001_0020(sess, command->conn);
-
-
-  return 1;
+       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");
+
+       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;
 }
 
 /* 
@@ -1598,149 +1885,148 @@ int faimtest_parse_locerr(struct aim_session_t *sess, struct command_rx_struct *
  */
 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;
-
-  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);
-
-  dvprintf("faimtest: missed %d messages from %s (reason %d: %s)\n", nummissed, userinfo->sn, reason, (reason<missedreasonslen)?missedreasons[reason]:"unknown");
-  
-  return 1;
+       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);
+
+       dvprintf("faimtest: missed %d messages from %s (reason %d: %s)\n", nummissed, userinfo->sn, 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, 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, ...)
@@ -1807,37 +2093,37 @@ int faimtest_chatnav_info(struct aim_session_t *sess, struct command_rx_struct *
 
 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;
 }
 
 /*
@@ -1845,36 +2131,36 @@ int faimtest_debugconn_connect(struct aim_session_t *sess, struct command_rx_str
  */
 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;
 }
 
 
@@ -1986,6 +2272,7 @@ int faimtest_getfile_disconnect(struct aim_session_t *sess, struct command_rx_st
   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;
@@ -2233,59 +2520,59 @@ int faimtest_parse_ratechange(struct aim_session_t *sess, struct command_rx_stru
 
 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_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");
-
-  return 1;
+       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);
+
+       /*
+        * 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;
 }
 
 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;
 }
This page took 0.119313 seconds and 4 git commands to generate.