]> andersk Git - libfaim.git/commitdiff
- Thu Dec 14 03:39:34 UTC 2000
authormid <mid>
Thu, 14 Dec 2000 03:44:59 +0000 (03:44 +0000)
committermid <mid>
Thu, 14 Dec 2000 03:44:59 +0000 (03:44 +0000)
  - Change the 0x01 to a 0x00 in auth request to make buddy lists work again
  - Rearrange bytes in setversions() to match winaim
  - Add several cachesnac() calls
  - Add hostonline and hostversions parsers (superfluous)

CHANGES
aim_login.c
aim_misc.c
aim_rxhandlers.c
faim/aim.h
utils/faimtest/faimtest.c

diff --git a/CHANGES b/CHANGES
index 61a370455d5420843a7fdaf455cf96d554b3b7d8..3f5aa87a9fa13b63b997752302442885fa05bc07 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,12 @@
 
 No release numbers
 ------------------
+ - Thu Dec 14 03:39:34 UTC 2000
+  - Change the 0x01 to a 0x00 in auth request to make buddy lists work again
+  - Rearrange bytes in setversions() to match winaim
+  - Add several cachesnac() calls
+  - Add hostonline and hostversions parsers (superfluous)
+
  - Wed Dec 13 02:26:39 UTC 2000
   - Create aim_cachesnac()
   - Some long overdue cleanups
index 2b5e92b41fc2132affafaf97c2a34ee1b7d5613c..5a4c7790e4434a75b74e7b6c9a2d5350ea7075e7 100644 (file)
@@ -199,7 +199,7 @@ faim_export int aim_send_login (struct aim_session_t *sess,
   
     curbyte += aim_puttlv_32(newpacket->data+curbyte, 0x0014, clientinfo->unknown);
     curbyte += aim_puttlv_16(newpacket->data+curbyte, 0x0009, 0x0015);
-    curbyte += aim_puttlv_8(newpacket->data+curbyte, 0x004a, 0x01);
+    curbyte += aim_puttlv_8(newpacket->data+curbyte, 0x004a, 0x00);
   } else {
     /* Use very specific version numbers, to further indicate the hack. */
     curbyte += aim_puttlv_16(newpacket->data+curbyte, 0x0016, 0x010a);
index 368215a6200039a65de8e2e029e1c98329be2098..590d981a1e694a1ec184550506662d05e302ab47 100644 (file)
@@ -457,10 +457,14 @@ faim_export unsigned long aim_setversions(struct aim_session_t *sess,
   newpacket->lock = 1;
 
   i = aim_putsnac(newpacket->data, 0x0001, 0x0017, 0x0000, sess->snac_nextid);
+  aim_cachesnac(sess, 0x0001, 0x0017, 0x0000, NULL, 0);
 
   i += aimutil_put16(newpacket->data+i, 0x0001);
   i += aimutil_put16(newpacket->data+i, 0x0003);
 
+  i += aimutil_put16(newpacket->data+i, 0x0013);
+  i += aimutil_put16(newpacket->data+i, 0x0001);
+
   i += aimutil_put16(newpacket->data+i, 0x0002);
   i += aimutil_put16(newpacket->data+i, 0x0001);
 
@@ -483,29 +487,16 @@ faim_export unsigned long aim_setversions(struct aim_session_t *sess,
   i += aimutil_put16(newpacket->data+i, 0x0001);
 
   i += aimutil_put16(newpacket->data+i, 0x000b);
-  i += aimutil_put16(newpacket->data+i, 0x0002);
-
-  i += aimutil_put16(newpacket->data+i, 0x000c);
   i += aimutil_put16(newpacket->data+i, 0x0001);
 
-  i += aimutil_put16(newpacket->data+i, 0x0013);
-  i += aimutil_put16(newpacket->data+i, 0x0001);
-
-  i += aimutil_put16(newpacket->data+i, 0x0015);
+  i += aimutil_put16(newpacket->data+i, 0x000c);
   i += aimutil_put16(newpacket->data+i, 0x0001);
 
-#if 0
-  for (j = 0; j < 0x10; j++) {
-    i += aimutil_put16(newpacket->data+i, j); /* family */
-    i += aimutil_put16(newpacket->data+i, 0x0003); /* version */
-  }
-#endif
-
   newpacket->commandlen = i;
   newpacket->lock = 0;
   aim_tx_enqueue(sess, newpacket);
 
-  return (sess->snac_nextid++);
+  return sess->snac_nextid;
 }
 
 
@@ -655,9 +646,11 @@ faim_internal unsigned long aim_genericreq_n(struct aim_session_t *sess,
   newpacket->lock = 1;
 
   aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
+
+  aim_cachesnac(sess, family, subtype, 0x0000, NULL, 0);
+
   aim_tx_enqueue(sess, newpacket);
-  return (sess->snac_nextid++);
+  return sess->snac_nextid;
 }
 
 /*
@@ -682,13 +675,14 @@ faim_internal unsigned long aim_genericreq_l(struct aim_session_t *sess,
   newpacket->lock = 1;
 
   aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
+  aim_cachesnac(sess, family, subtype, 0x0000, NULL, 0);
 
   /* copy in data */
   newlong = htonl(*longdata);
   memcpy(&(newpacket->data[10]), &newlong, sizeof(u_long));
 
   aim_tx_enqueue(sess, newpacket);
-  return (sess->snac_nextid++);
+  return sess->snac_nextid;
 }
 
 faim_internal unsigned long aim_genericreq_s(struct aim_session_t *sess,
@@ -709,13 +703,14 @@ faim_internal unsigned long aim_genericreq_s(struct aim_session_t *sess,
   newpacket->lock = 1;
 
   aim_putsnac(newpacket->data, family, subtype, 0x0000, sess->snac_nextid);
+  aim_cachesnac(sess, family, subtype, 0x0000, NULL, 0);
 
   /* copy in data */
   newshort = htons(*shortdata);
   memcpy(&(newpacket->data[10]), &newshort, sizeof(u_short));
 
   aim_tx_enqueue(sess, newpacket);
-  return (sess->snac_nextid++);
+  return sess->snac_nextid;
 }
 
 /*
@@ -757,6 +752,8 @@ faim_export unsigned long aim_addicbmparam(struct aim_session_t *sess,
   newpacket->lock = 1;
 
   i = aim_putsnac(newpacket->data, 0x0004, 0x0002, 0x0000, sess->snac_nextid);
+  aim_cachesnac(sess, 0x0004, 0x0002, 0x0000, NULL, 0);
+
   i += aimutil_put16(newpacket->data+i, 0x0000); 
   i += aimutil_put16(newpacket->data+i, 0x0000);
   i += aimutil_put16(newpacket->data+i, 0x0003);
@@ -768,7 +765,7 @@ faim_export unsigned long aim_addicbmparam(struct aim_session_t *sess,
   
   aim_tx_enqueue(sess, newpacket);
 
-  return (sess->snac_nextid);
+  return sess->snac_nextid;
 }
 
 /* 
index 10c9ee35d0b9bc16b5492407373d0cc7300c7158..75167b8c421c366e8fa23c78c03111024397afd1 100644 (file)
@@ -370,21 +370,24 @@ faim_export int aim_rxdispatch(struct aim_session_t *sess)
            else
              workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0017, 0xffff, workingPtr);
            break;
-         case 0x0007:
-           if (subtype == 0x0005)
-             workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_ADM, AIM_CB_ADM_INFOCHANGE_REPLY, workingPtr);
-           break;
-         case AIM_CB_FAM_SPECIAL:
-           if (subtype == AIM_CB_SPECIAL_DEBUGCONN_CONNECT) {
-             workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, family, subtype, workingPtr);
-             break;
-           } /* others fall through */
-         default:
-#if 0
-           /* Old login protocol */
-           /* any user callbacks will be called from here */
-           workingPtr->handled = aim_authparse(sess, workingPtr);
-#endif
+         case 0x0001:
+           if (subtype == 0x0003)
+             workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
+           else
+             workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0017, 0xffff, workingPtr);
+           break;
+         case 0x0007:
+           if (subtype == 0x0005)
+             workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_ADM, AIM_CB_ADM_INFOCHANGE_REPLY, workingPtr);
+           break;
+         case AIM_CB_FAM_SPECIAL:
+           if (subtype == AIM_CB_SPECIAL_DEBUGCONN_CONNECT) {
+             workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, family, subtype, workingPtr);
+             break;
+           } else
+             workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0017, 0xffff, workingPtr);
+           break;
+         default:
            break;
          }
        }
@@ -415,7 +418,7 @@ faim_export int aim_rxdispatch(struct aim_session_t *sess)
            workingPtr->handled = aim_parse_generalerrs(sess, workingPtr);
            break;
          case 0x0003:
-           workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0003, workingPtr);
+           workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
            break;
          case 0x0005:
            workingPtr->handled = aim_handleredirect_middle(sess, workingPtr);
@@ -435,6 +438,9 @@ faim_export int aim_rxdispatch(struct aim_session_t *sess)
          case 0x0013:
            workingPtr->handled = aim_parsemotd_middle(sess, workingPtr);
            break;
+         case 0x0018:
+           workingPtr->handled = aim_parse_hostversions(sess, workingPtr);
+           break;
          default:
            workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_GEN, AIM_CB_GEN_DEFAULT, workingPtr);
            break;
@@ -544,6 +550,8 @@ faim_export int aim_rxdispatch(struct aim_session_t *sess)
 
        if ((family == 0x0000) && (subtype == 0x00001)) {
          workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_FLAPVER, workingPtr);
+       } else if ((family == 0x0001) && (subtype == 0x0003)) {
+         workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
        } else if ((family == 0x000d) && (subtype == 0x0009)) {
          workingPtr->handled = aim_chatnav_parse_info(sess, workingPtr);
        } else {
@@ -563,7 +571,7 @@ faim_export int aim_rxdispatch(struct aim_session_t *sess)
          if (subtype == 0x0001)
            workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0001, workingPtr);
          else if (subtype == 0x0003)
-           workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0003, workingPtr);
+           workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
          else if (subtype == 0x0007)
            workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0007, workingPtr);
          else
@@ -731,8 +739,46 @@ faim_internal int aim_parsemotd_middle(struct aim_session_t *sess,
   return ret;  
 }
 
+faim_internal int aim_parse_hostonline(struct aim_session_t *sess,
+                                      struct command_rx_struct *command, ...)
+{
+  rxcallback_t userfunc = NULL;
+  int ret = 1;
+  unsigned short *families = NULL;
+  int famcount = 0, i;
+
+  famcount = (command->commandlen-10)/2;
+  if (!(families = malloc(command->commandlen-10)))
+    return ret;
+
+  for (i = 0; i < famcount; i++)
+    families[i] = aimutil_get16(command->data+((i*2)+10));
+
+  if ((userfunc = aim_callhandler(command->conn, 0x0001, 0x0003)))
+    ret = userfunc(sess, command, famcount, families);
+
+  free(families);
+
+  return ret;  
+}
+
+faim_internal int aim_parse_hostversions(struct aim_session_t *sess,
+                                        struct command_rx_struct *command, ...)
+{
+  rxcallback_t userfunc = NULL;
+  int ret = 1;
+  int vercount;
+
+  vercount = (command->commandlen-10)/4;
+  
+  if ((userfunc = aim_callhandler(command->conn, 0x0001, 0x0018)))
+    ret = userfunc(sess, command, vercount, command->data+10);
+
+  return ret;  
+}
+
 faim_internal int aim_handleredirect_middle(struct aim_session_t *sess,
-                             struct command_rx_struct *command, ...)
+                                           struct command_rx_struct *command, ...)
 {
   int serviceid = 0;
   unsigned char *cookie = NULL;
index 1bd0014b9eba9bd3eec9f073245a0556d71cbb13..3c83b910f9db0b6928e7b4f6f2414a4e6a94074c 100644 (file)
@@ -476,6 +476,9 @@ faim_internal unsigned int aim_get_next_txseqnum(struct aim_conn_t *);
 faim_export int aim_tx_flushqueue(struct aim_session_t *);
 faim_internal int aim_tx_printqueue(struct aim_session_t *);
 faim_export void aim_tx_purgequeue(struct aim_session_t *);
+faim_internal int aim_parse_hostonline(struct aim_session_t *sess, struct command_rx_struct *command, ...);
+faim_internal int aim_parse_hostversions(struct aim_session_t *sess, struct command_rx_struct *command, ...);
+
 
 struct aim_rxcblist_t {
   u_short family;
index d101c9f88d15335a19905fd1671d6726d8d36294..9fffe4726fe1a89c3ccafc9fabc892bba8aab14f 100644 (file)
@@ -56,6 +56,7 @@ int faimtest_handleredirect(struct aim_session_t *, struct command_rx_struct *co
 int faimtest_authsvrready(struct aim_session_t *, struct command_rx_struct *command, ...);
 int faimtest_pwdchngdone(struct aim_session_t *, struct command_rx_struct *command, ...);
 int faimtest_serverready(struct aim_session_t *, struct command_rx_struct *command, ...);
+int faimtest_hostversions(struct aim_session_t *sess, struct command_rx_struct *command, ...);
 int faimtest_parse_misses(struct aim_session_t *, struct command_rx_struct *command, ...);
 int faimtest_parse_msgack(struct aim_session_t *, struct command_rx_struct *command, ...);
 int faimtest_parse_motd(struct aim_session_t *, struct command_rx_struct *command, ...);
@@ -117,6 +118,7 @@ static char *msgerrreasons[] = {
 static int msgerrreasonslen = 25;
 
 static char *screenname,*password,*server=NULL;
+static int connected = 0;
 
 int faimtest_reportinterval(struct aim_session_t *sess, struct command_rx_struct *command, ...)
 {
@@ -336,7 +338,7 @@ int faimtest_rateresp(struct aim_session_t *sess, struct command_rx_struct *comm
   switch(command->conn->type) {
   case AIM_CONN_TYPE_BOS: {
     /* this is the new buddy list */
-    char buddies[] = "Buddy1&Buddy2&ThisHereIsAName2&";
+    char buddies[] = "Buddy1&Buddy2&ThisHereIsAName2&midendian&ewarmenhoven&";
     /* this is the new profile */
     char profile[] = "Hello";  
 
@@ -369,43 +371,79 @@ int faimtest_rateresp(struct aim_session_t *sess, struct command_rx_struct *comm
   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);
+
+  printf("faimtest: SNAC versions supported by this host: ");
+  for (i = 0; i < vercount*4; i += 4)
+    printf("0x%04x:0x%04x ", 
+          aimutil_get16(versions+i),  /* SNAC family */
+          aimutil_get16(versions+i+2) /* Version number */);
+  printf("\n");
+
+  return 1;
+}
+
 int faimtest_serverready(struct aim_session_t *sess, struct command_rx_struct *command, ...)
 {
-  switch (command->conn->type)
-    {
-    case AIM_CONN_TYPE_BOS:
+  int famcount, i;
+  unsigned short *families;
+  va_list ap;
 
-      aim_setversions(sess, command->conn);
-      aim_bos_reqrate(sess, command->conn); /* request rate info */
+  va_start(ap, command);
+  famcount = va_arg(ap, int);
+  families = va_arg(ap, unsigned short *);
+  va_end(ap);
 
-      fprintf(stderr, "faimtest: done with BOS ServerReady\n");
-      break;
+  printf("faimtest: SNAC families supported by this host (type %d): ", command->conn->type);
+  for (i = 0; i < famcount; i++)
+    printf("0x%04x ", families[i]);
+  printf("\n");
 
-    case AIM_CONN_TYPE_CHATNAV:
-      fprintf(stderr, "faimtest: chatnav: got server ready\n");
-      aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, faimtest_chatnav_info, 0);
-      aim_bos_reqrate(sess, command->conn);
-      aim_bos_ackrateresp(sess, command->conn);
-      aim_chatnav_clientready(sess, command->conn);
-      aim_chatnav_reqrights(sess, command->conn);
+  switch (command->conn->type) {
+  case AIM_CONN_TYPE_BOS:
 
-      break;
-    case AIM_CONN_TYPE_CHAT:
-      aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERJOIN, faimtest_chat_join, 0);
-      aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERLEAVE, faimtest_chat_leave, 0);
-      aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_ROOMINFOUPDATE, faimtest_chat_infoupdate, 0);
-      aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, faimtest_chat_incomingmsg, 0);
-      aim_bos_reqrate(sess, command->conn);
-      aim_bos_ackrateresp(sess, command->conn);
-      aim_chat_clientready(sess, command->conn);
-      break;
+    aim_setversions(sess, command->conn);
+    aim_bos_reqrate(sess, command->conn); /* request rate info */
 
-    case AIM_CONN_TYPE_RENDEZVOUS: /* empty */
-      break;
+    fprintf(stderr, "faimtest: done with BOS ServerReady\n");
+    break;
+
+  case AIM_CONN_TYPE_CHATNAV:
+    fprintf(stderr, "faimtest: chatnav: got server ready\n");
+    aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, faimtest_chatnav_info, 0);
+    aim_bos_reqrate(sess, command->conn);
+    aim_bos_ackrateresp(sess, command->conn);
+    aim_chatnav_clientready(sess, command->conn);
+    aim_chatnav_reqrights(sess, command->conn);
+
+    break;
+
+  case AIM_CONN_TYPE_CHAT:
+    aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERJOIN, faimtest_chat_join, 0);
+    aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERLEAVE, faimtest_chat_leave, 0);
+    aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_ROOMINFOUPDATE, faimtest_chat_infoupdate, 0);
+    aim_conn_addhandler(sess, command->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, faimtest_chat_incomingmsg, 0);
+    aim_bos_reqrate(sess, command->conn);
+    aim_bos_ackrateresp(sess, command->conn);
+    aim_chat_clientready(sess, command->conn);
+    break;
+
+  case AIM_CONN_TYPE_RENDEZVOUS: /* empty */
+    break;
+
+  default:
+    fprintf(stderr, "faimtest: unknown connection type on Server Ready\n");
+  }
 
-    default:
-      fprintf(stderr, "faimtest: unknown connection type on Server Ready\n");
-    }
   return 1;
 }
 
@@ -480,6 +518,7 @@ int faimtest_handleredirect(struct aim_session_t *sess, struct command_rx_struct
        if ( (tstconn==NULL) || (tstconn->status & AIM_CONN_STATUS_RESOLVERR) )
          fprintf(stderr, "faimtest: unable to reconnect with authorizer\n");
        else {
+         aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_FLAPVER, faimtest_flapversion, 0);
          aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNCOMPLETE, faimtest_conncomplete, 0);
          /* Send the cookie to the Auth */
          aim_auth_sendcookie(sess, tstconn, cookie);
@@ -614,6 +653,7 @@ int faimtest_parse_authresp(struct aim_session_t *sess, struct command_rx_struct
   aim_conn_addhandler(sess, bosconn, 0x0009, 0x0003, faimtest_bosrights, 0);
   aim_conn_addhandler(sess, bosconn, 0x0001, 0x0007, faimtest_rateresp, 0); /* rate info */
   aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ACK, AIM_CB_ACK_ACK, NULL, 0);
+  aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, 0x0018, faimtest_hostversions, 0);
   aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_SERVERREADY, faimtest_serverready, 0);
   aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATEINFO, NULL, 0);
   aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_REDIRECT, faimtest_handleredirect, 0);
@@ -813,6 +853,10 @@ int faimtest_parse_incoming_im(struct aim_session_t *sess, struct command_rx_str
       } else if (!strncmp(tmpstr, "open directim", 13)) {
        struct aim_conn_t *newconn;
        newconn = aim_directim_initiate(sess, command->conn, NULL, userinfo->sn);
+      } else if (!strncmp(tmpstr, "openauth", 8)) {
+       aim_bos_reqservice(sess, command->conn, AIM_CONN_TYPE_AUTH);
+      } else if (!strncmp(tmpstr, "auth", 4)) {
+       aim_genericreq_n(sess, aim_getconn_type(sess, AIM_CONN_TYPE_AUTH), 0x0007, 0x0002);
       } else if (!strncmp(tmpstr, "reqsendmsg", 10)) {
        aim_send_im(sess, command->conn, "vaxherder", 0, "sendmsg 7900");
       } else if (!strncmp(tmpstr, "sendmsg", 7)) {
@@ -1108,7 +1152,8 @@ int faimtest_parse_oncoming(struct aim_session_t *sess, struct command_rx_struct
   userinfo = va_arg(ap, struct aim_userinfo_s *);
   va_end(ap);
 
-  printf("\n%s is now online (flags: %04x = %s%s%s%s%s%s%s%s) (caps = 0x%04x)\n",
+  printf("%ld  %s is now online (flags: %04x = %s%s%s%s%s%s%s%s) (caps = 0x%04x)\n",
+        time(NULL),
         userinfo->sn, userinfo->flags,
         (userinfo->flags&AIM_FLAG_UNCONFIRMED)?" UNCONFIRMED":"",
         (userinfo->flags&AIM_FLAG_ADMINISTRATOR)?" ADMINISTRATOR":"",
@@ -1158,6 +1203,9 @@ int faimtest_parse_motd(struct aim_session_t *sess, struct command_rx_struct *co
   printf("faimtest: motd: %s (%d / %s)\n", msg, id, 
         (id < codeslen)?codes[id]:"unknown");
 
+  if (!connected)
+    connected++;
+
   return 1;
 }
 
This page took 0.080662 seconds and 5 git commands to generate.