RECVBARK.C

10.1 KB 3213d0a61c694ab2…
/*--------------------------------------------------------------------------*/
/*                                                                          */
/*                                                                          */
/*      ------------         Bit-Bucket Software, Co.                       */
/*      \ 10001101 /         Writers and Distributors of                    */
/*       \ 011110 /          Freely Available<tm> Software.                 */
/*        \ 1011 /                                                          */
/*         ------                                                           */
/*                                                                          */
/*  (C) Copyright 1987-91, Bit Bucket Software Co., a Delaware Corporation. */
/*                                                                          */
/*                                                                          */
/*                  This module was written by Bob Hartman                  */
/*                                                                          */
/*                                                                          */
/*               BinkleyTerm "BARK" File request state machine              */
/*                                                                          */
/*                                                                          */
/*    For complete  details  of the licensing restrictions, please refer    */
/*    to the License  agreement,  which  is published in its entirety in    */
/*    the MAKEFILE and BT.C, and also contained in the file LICENSE.250.    */
/*                                                                          */
/*    USE  OF THIS FILE IS SUBJECT TO THE  RESTRICTIONS CONTAINED IN THE    */
/*    BINKLEYTERM  LICENSING  AGREEMENT.  IF YOU DO NOT FIND THE TEXT OF    */
/*    THIS  AGREEMENT IN ANY OF THE  AFOREMENTIONED FILES,  OR IF YOU DO    */
/*    NOT HAVE THESE FILES,  YOU  SHOULD  IMMEDIATELY CONTACT BIT BUCKET    */
/*    SOFTWARE CO.  AT ONE OF THE  ADDRESSES  LISTED BELOW.  IN NO EVENT    */
/*    SHOULD YOU  PROCEED TO USE THIS FILE  WITHOUT HAVING  ACCEPTED THE    */
/*    TERMS  OF  THE  BINKLEYTERM  LICENSING  AGREEMENT,  OR  SUCH OTHER    */
/*    AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO.      */
/*                                                                          */
/*                                                                          */
/* You can contact Bit Bucket Software Co. at any one of the following      */
/* addresses:                                                               */
/*                                                                          */
/* Bit Bucket Software Co.        FidoNet  1:104/501, 1:343/491             */
/* P.O. Box 460398                AlterNet 7:491/0                          */
/* Aurora, CO 80046               BBS-Net  86:2030/1                        */
/*                                Internet f491.n343.z1.fidonet.org         */
/*                                                                          */
/* Please feel free to contact us at any time to share your comments about  */
/* our software and/or licensing policies.                                  */
/*                                                                          */
/*--------------------------------------------------------------------------*/

/* Include this file before any other includes or defines! */

#include "includes.h"

int  get_req_str (char *);
void gen_req_name (char *);
int  cdog_callback (char *);
int  cdog_time (long);

int RBInit (BARKARGSP, int);
int RBEnd (BARKARGSP, int);
int RBHonorReq (BARKARGSP);
int RBWaitBark (BARKARGSP);
int RBAckBark (BARKARGSP);
int RBWaitStrt (BARKARGSP);
int RBSendFile (BARKARGSP);

STATES Bark_Receiver[] = {
   { "RBInit", RBInit },
   { "RBEnd", RBEnd },
   { "RB0", RBHonorReq },
   { "RB1", RBWaitBark },
   { "RB2", RBAckBark },
   { "RB3", RBWaitStrt },
   { "RB4", RBSendFile }
};

int Receive_Bark_Packet (BARKARGSP args)
{
   if (get_req_str (args->barkpacket))
      {
      gen_req_name (args->barkpacket);
      args->barkok = 1;
      return (0);
      }

   return (1);
}

int RBInit (BARKARGSP args, int start_state)
{
   XON_DISABLE ();
   args->barkok = 0;
   return (start_state);
}

int RBEnd (BARKARGSP args, int cur_state)
{
   if (!no_requests)
      {
      status_line (":%s %s %s", MSG_TXT(M_END_OF), MSG_TXT(M_INBOUND), MSG_TXT(M_FILE_REQUESTS));
      }
   happy_compiler = args->nfiles; /* This makes compilers happy! */
   return (cur_state);
}

int RBHonorReq (BARKARGSP args)
{
   args->nfiles = 0;

   if (!no_requests)
      {
      status_line (":%s %s", MSG_TXT(M_INBOUND), MSG_TXT(M_FILE_REQUESTS));
      SENDBYTE (ENQ);
      args->T1 = timerset (200);
      return (RB1);
      }
   else
      {
      SENDBYTE (CAN);
      status_line (MSG_TXT(M_REFUSING_IN_FREQ));
      return (SUCCESS);
      }
}

int RBWaitBark (BARKARGSP args)
{
   int c, ret;
   long RB1Timer;

   ret = -1;
   RB1Timer = timerset (2000);
   while (ret < 0)
      {
      while ((c = PEEKBYTE ()) < 0)
         {
         if (!CARRIER)
            return (CARRIER_ERR);
         time_release ();

         if (timeup (args->T1))
            {
            break;
            }
         }

      if (timeup (RB1Timer))
         {
/* Report error */
         return (SENDBLOCK_ERR);
         }

      if (((unsigned int)c == 0xffff) && timeup (args->T1))
         {
         CLEAR_INBOUND ();
         SENDBYTE (ENQ);
         args->T1 = timerset (200);
         continue;
         }

      c = TIMED_READ (0);

      switch (c)
         {
         case ACK:
            if (Receive_Bark_Packet (args) == 0)
               ret = RB2;
            else
               ret = RB0;
            break;

         case ETB:
            ret = SUCCESS;
            break;

         case ENQ:
            SENDBYTE (ETB);
            break;
         }
      }
   return (ret);
}

int RBAckBark (BARKARGSP args)
{
   if (args->barkok)
      {
      SENDBYTE (ACK);
      return (RB3);
      }
   else
      {
      SENDBYTE (NAK);
      return (RB1);
      }
}

int RBWaitStrt (BARKARGSP args)
{
   int c = 0;
   long RB3Timer;
   long RB3Timer1;

   RB3Timer = timerset (1500);
   while (CARRIER && (!timeup (RB3Timer)))
      {
      RB3Timer1 = timerset (300);
      while (!timeup (RB3Timer1))
         {
         if ((c = PEEKBYTE ()) >= 0)
            break;

         time_release ();
         }

      if ((unsigned int)c == 0xffff)
         SENDBYTE (ACK);
      else if ((c == 'C') || (c == NAK))
         return (RB4);
      }

   happy_compiler = args->nfiles; /* This makes compilers happy! */

/* Return error */
   return (SENDBLOCK_ERR);
}

int RBSendFile (BARKARGSP args)
{
   int nfiles1;

   nfiles1 = args->nfiles;
   if (((args->nfiles = n_frproc (args->barkpacket, args->nfiles, cdog_callback, cdog_time)) < 0)
      || nfiles1 == args->nfiles)
      {
      (void) Batch_Send (NULL);
      }
   else
      {
      (void) Batch_Send (NULL);
      status_line (MSG_TXT(M_MATCHING_FILES), args->nfiles - nfiles1);
      }

   return (RB0);
}

int SEA_recvreq ()
{
   BARKARGS bark;

   Netmail_Session = 2;
   CLEAR_INBOUND ();
   return (state_machine (Bark_Receiver, &bark, RB0));
}

int get_req_str (char *req)
{
   unsigned int crc, crc1, crc2, crc3;
   int i, j;

   crc = i = 0;
   while (CARRIER)
      {
      j = TIMED_READ (2);
      if (j < 0)
         return (0);

      if ((j == ACK) && (i == 0))
         {
         /* Just skip the extra ACK */
         continue;
         }

      if (i >= 100)
         {
         /* Too long of a string */
         status_line (MSG_TXT(M_BAD_BARK));
         CLEAR_INBOUND ();
         return (0);
         }

      if (j == ETX)
         {
         crc1 = (unsigned) TIMED_READ (2);
         crc2 = (unsigned) TIMED_READ (2);
         crc3 = (crc2 << 8) + crc1;
         if (crc3 != crc)
            {
            status_line (MSG_TXT(M_BAD_CRC));
            return (0);
            }
         req[i] = '\0';
         return (1);
         }
      else if (j == SUB)
         {
         return (0);
         }
      else
         {
         req[i++] = (char) (j & 0xff);
         crc = xcrc (crc, (j & 0xff));
         }
      }
   return (0);
}

/*
 * gen_req_name -- take the name [time] [password] fields from
 *                 the BARK file request format and reformat to
 *                 name [!password] [+time] WaZOO format for use
 *                 by the WaZOO file request routines.
 *
 * Input:          *req = pointer to character array with Bark string
 * Output:         *req array contents reformatted
 *
 */


void gen_req_name (char *req)
{
   char *q, *q1;
   char buf[48];
   char *fsecs = NULL;

   q = req;
   q1 = buf;

   /* Get the filename */

   while ((*q) && (!isspace (*q)))
      {
      *q1++ = *q++;
      }
   *q1 = '\0';

   /* If we have more characters, go on */

   if (*q)
      {
      /* Skip the space */
      fsecs = q++;
      *fsecs = '+';

      /* Skip the digits */

      while ((*q) && (!isspace (*q)))
         q++;

      /* If we have more, get the password */

      if (*q)
         {
         *q++ = '\0';                   /* Skip space, terminate the time */

         *q1++ = ' ';
         *q1++ = '!';
         while (*q)
            {
            *q1++ = *q++;
            }
         *q1 = '\0';
         }

      /* If we got an update time          */
      if (fsecs != NULL)
         {
         *q1++ = ' ';
         while (*fsecs)
            {
            *q1++ = *fsecs++;
            }
         *q1 = '\0';
         }
      }

   (void) strcpy (req, buf);
   return;
}

int cdog_callback (char *reqs)
{
   return (!Batch_Send (reqs));
}

int cdog_time (long filesize)
{
   int i;
   i = (int) (filesize * 10 / cur_baud.rate_value * 100 / 94);
   return (i);
}