home *** CD-ROM | disk | FTP | other *** search
- /*--------------------------------------------------------------------------*/
- /* */
- /* */
- /* ------------ 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 SEAdog Mail Session Routines */
- /* */
- /* */
- /* 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"
-
- #define rb_plus "rb+"
-
- void SEA_sendreq ()
- {
- char fname[80];
- char reqf[80];
- char *reqtime = " 0";
- char *p, *name, *pw;
- char *updtime;
- FILE *fp;
- char *HoldName;
- ADDR tmp;
-
-
- HoldName = HoldAreaNameMunge(&called_addr);
-
- tmp = called_addr;
-
- /* For a point, massage the address to get the right .REQ filename */
-
- if (tmp.Point != 0)
- {
- tmp.Node = tmp.Point;
- tmp.Point = 0;
- tmp.Net = (pvtnet > 0) ? (unsigned int) pvtnet : 0;
- }
-
- (void) sprintf (fname,
- "%s%s.REQ",
- HoldName, Hex_Addr_Str (&tmp));
-
- /* If we have file requests, then do them */
- if (!dexists (fname))
- {
- status_line (MSG_TXT(M_NO_OUT_REQUESTS));
- }
- else
- {
- status_line (MSG_TXT(M_OUT_REQUESTS));
- /* Open the .REQ file */
- if ((fp = fopen (fname, "rt")) == NULL)
- {
- (void) Bark_Request (CURRENT.sc_Inbound, NULL, NULL, NULL);
- return;
- }
-
- /* As long as we do not have EOF, read the request */
- while ((fgets (reqf, 79, fp) != NULL) && (CARRIER))
- {
- /* Properly format the request */
-
- /* First get rid of the trailing junk */
-
- p = reqf + strlen (reqf) - 1;
- while ((p >= reqf) && (isspace (*p)))
- *p-- = '\0';
-
- /* Now get rid of the beginning junk */
-
- p = reqf;
- while ((*p) && (isspace (*p)))
- p++;
-
- /* This is where the name starts */
- name = p;
-
- /* If the first char is ; then ignore the line */
- if (*name == ';')
- continue;
-
- /* Now get to where the name ends */
- while ((*p) && (!isspace (*p)))
- p++;
-
- updtime = reqtime; /* Default to request */
- pw = p; /* This is or will be a null */
- req_scan:
- if (*p)
- {
- *p++ = '\0';
-
- while ((*p) && (*p != '!') && (*p != '-') && (*p != '+'))
- p++;
-
- /* Check for a password */
-
- if (*p == '!')
- {
- *p = ' ';
- pw = p++;
-
- /* Now get to where the password ends */
-
- while ((*p) && (!isspace (*p)))
- p++;
- goto req_scan;
- }
-
- /* Try for an update request */
-
- if (*p == '+')
- {
- *p = ' ';
- updtime = p++;
-
- /* Now get to where the update time ends */
-
- while ((*p) && (!isspace (*p)))
- p++;
-
- *p = '\0';
-
- /* Request time is last thing we care about on line, so
- we just drop out of the loop after finding it.
- */
- }
-
- /* Note: since SEAdog doesn't do "backdate" requests, all we
- have to do if we see a '-' is to do a full request. Hence
- we only process a '+' here.
- */
-
- }
-
- if (Bark_Request (CURRENT.sc_Inbound, name, pw, updtime))
- continue;
- }
- (void) fclose (fp);
- (void) unlink (fname);
- status_line (MSG_TXT(M_END_OUT_REQUESTS));
- }
-
- /* Finish the file requests off */
- (void) Bark_Request (CURRENT.sc_Inbound, NULL, NULL, NULL);
-
- }
-
- int SBInit (BARKARGSP, int);
- int SBEnd (BARKARGSP, int);
- int SBSendBark (BARKARGSP);
- int SBAskFile (BARKARGSP);
- int SBRcvFile (BARKARGSP);
- int SBNxtFile (BARKARGSP);
-
- STATES Bark_Sender[] = {
- { "SBInit", SBInit },
- { "SBEnd", SBEnd },
- { "SB0", SBSendBark },
- { "SB1", SBAskFile },
- { "SB2", SBRcvFile },
- { "SB3", SBNxtFile },
- };
-
- void Build_Bark_Packet (BARKARGSP args)
- {
- char *p, *q;
- unsigned int crc;
-
- p = args->barkpacket;
- *p++ = ACK;
- crc = 0;
- q = args->filename;
- while (*q)
- {
- *p++ = *q;
- crc = xcrc (crc, (byte) (*q));
- ++q;
- }
- q = args->barktime;
- while (*q)
- {
- *p++ = *q;
- crc = xcrc (crc, (byte) (*q));
- ++q;
- }
- q = args->barkpw;
- while (*q)
- {
- *p++ = *q;
- crc = xcrc (crc, (byte) (*q));
- ++q;
- }
-
- *p++ = ETX;
- *p++ = (char) (crc & 0xff);
- *p++ = (char) (crc >> 8);
-
- args->barklen = (int) (p - args->barkpacket);
- }
-
-
- int SBInit (BARKARGSP args, int start_state)
- {
- XON_DISABLE ();
- happy_compiler = args->tries; /* Makes the compiler happy! */
- return (start_state);
- }
-
- int SBEnd (BARKARGSP args, int cur_state)
- {
- happy_compiler = args->tries; /* Makes the compiler happy! */
- return (cur_state);
- }
-
- int SBSendBark (BARKARGSP args)
- {
- if ((args->filename != NULL) && (args->filename[0] != '\0'))
- {
- status_line ("%s '%s' %s%s", MSG_TXT(M_MAKING_FREQ), args->filename, (*(args->barkpw)) ? "with password" : "", args->barkpw);
- args->tries = 0;
- Build_Bark_Packet (args);
- return (SB1);
- }
- else
- {
- SENDBYTE (ETB);
-
- /* Delay one second */
- big_pause (1);
-
- return (SUCCESS);
- }
- }
-
- int SBAskFile (BARKARGSP args)
- {
- SENDCHARS (args->barkpacket, args->barklen, 1);
- return (SB2);
- }
-
- int SBRcvFile (BARKARGSP args)
- {
- int c;
- int ret;
-
- ret = SB2;
- while (CARRIER && (ret == SB2))
- {
- c = TIMED_READ (10);
-
- if (c == ACK)
- {
- (void) Batch_Receive (args->inbound);
- ret = SB3;
- break;
- }
-
- if (args->tries > 5)
- {
- /* Report transfer failed */
- SENDBYTE (ETB);
- ret = SENDBLOCK_ERR;
- break;
- }
-
- CLEAR_INBOUND ();
- ++(args->tries);
- ret = SB1;
- }
-
- if (!CARRIER)
- return (CARRIER_ERR);
- else
- return (ret);
- }
-
- int SBNxtFile (BARKARGSP args)
- {
- int c;
- long SB3Timer;
-
- SB3Timer = timerset (4500);
- happy_compiler = args->tries; /* Makes the compiler happy! */
-
- while (CARRIER && !timeup (SB3Timer))
- {
- if ((unsigned int)(c = TIMED_READ (5)) == 0xffff)
- {
- SENDBYTE (SUB);
- continue;
- }
-
- if (c == ENQ)
- return (SUCCESS);
- }
-
- if (CARRIER)
- return (CARRIER_ERR);
- else
- return (TIME_ERR);
- }
-
- int Bark_Request (char *where, char *filename, char *pw, char *updtime)
- {
- BARKARGS bark;
-
- bark.inbound = where;
- bark.filename = filename;
- bark.barkpw = pw;
- bark.barktime = updtime;
- return (state_machine (Bark_Sender, &bark, SB0));
- }
-
-
-