home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 September
/
Simtel20_Sept92.cdr
/
msdos
/
fido
/
ftsc_all.z43
/
FTS-0006.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-07-10
|
15KB
|
539 lines
/*--------------------------------------------------------------------------*/
/* */
/* ------------ Bit-Bucket Software <no-Inc> */
/* \ 10001101 / Writers and Distributors of */
/* \ 011110 / No-Cost<no-tm> Software. */
/* \ 1011 / */
/* ------ */
/* */
/* Copyright (C) 1987, 1988, 1989 by Robert Hartman and Vincent Perriello */
/* */
/* */
/* This module was written by Vince Perriello */
/* */
/* */
/* */
/* This file contains a sample YooHoo sender and receiver module. You may */
/* use it in any program, provided you give credit to Bit-Bucket Software */
/* in any informational screens or literature pertaining to your program */
/* that contains other such information (such as your own copyrights). */
/* */
/* */
/*--------------------------------------------------------------------------*/
#include <stdio.h>
#include <signal.h>
#include <ctype.h>
#include <conio.h>
#include <string.h>
#define WAZOO_SECTION
#define MATRIX_SECTION
#define isBITBRAIN 0x1b
#include "com.h"
#include "xfer.h"
#include "zmodem.h"
#include "keybd.h"
#include "sbuf.h"
#include "sched.h"
#include "externs.h"
#include "prototyp.h"
static int Send_Hello_Packet (int);
static int Recv_Hello_Packet (void);
/*--------------------------------------------------------------------------*/
/* YOOHOO SENDER (used when I am the CALLING system) */
/*--------------------------------------------------------------------------*/
int YooHoo_Sender (void)
{
char *sptr;
if (un_attended && fullscreen)
{
sb_move (filewin, 2, 2);
sb_puts (filewin, "YooHoo");
sb_show ();
}
else
{
set_xy ("YooHoo ");
}
if (!Send_Hello_Packet (1))
sptr = "No Send";
else
{
if (TIMED_READ (30) == YOOHOO)
return Recv_Hello_Packet ();
status_line ("!No YOOHOO/2U2");
sptr = IDUNNO_msg;
}
message (sptr);
return (0);
}
/*--------------------------------------------------------------------------*/
/* YOOHOO RECEIVER (Used when I am the CALLED system) */
/*--------------------------------------------------------------------------*/
int YooHoo_Receiver (void)
{
int i;
int c;
if (un_attended && fullscreen)
{
sb_move (filewin, 2, 2);
sb_puts (filewin, "YooHoo");
sb_show ();
}
else
{
set_xy ("YooHoo ");
}
if (!(i = Recv_Hello_Packet()))
return (0);
for (i = 0; (CARRIER) && (i < 10); i++)
{
if ((c = TIMED_READ (10)) == ENQ)
return Send_Hello_Packet (0) ? 1 : (b_init (), 0);
if (c > 0)
{
message (NULL);
cprintf ("[%x] ", c);
CLEAR_INBOUND ();
}
SENDBYTE (YOOHOO);
}
hup = 1;
message (FUBAR_msg);
b_init ();
return (0);
} /* YooHoo Receiver */
/*--------------------------------------------------------------------------*/
/* SEND HELLO PACKET */
/*--------------------------------------------------------------------------*/
static int Send_Hello_Packet (Sender)
int Sender;
{
int i;
struct _Hello Hello;
byte *sptr;
long response_timer;
word crc;
word num_errs = 0;
/*--------------------------------------------------------------------*/
/* Setup HELLO structure */
/*--------------------------------------------------------------------*/
memset ((char *) &Hello, 0, sizeof (struct _Hello));
Hello.signal = 'o';
Hello.hello_version = 1;
Hello.product = isBITBRAIN;
Hello.product_maj = BINK_MAJVERSION;
Hello.product_min = BINK_MINVERSION;
strncpy (Hello.my_name, system_name, 58);
Hello.my_name[58] = '\0';
strncpy (Hello.sysop, sysop, 19);
Hello.sysop[19] = '\0';
Hello.my_zone = alias[assumed].Zone;
if ((pvtnet >= 0) && (Sender) &&
((called_zone == alias[assumed].Zone) || (called_zone == 0)) &&
(called_net == boss_net) && (called_node == boss_node))
{
Hello.my_net = boss_net;
Hello.my_node = boss_node;
Hello.my_point = alias[assumed].Node;
}
else
{
Hello.my_net = alias[assumed].Net;
Hello.my_node = alias[assumed].Node;
}
Hello.capabilities = (no_zapzed) ? 0 : ZED_ZAPPER;
Hello.capabilities |= Y_DIETIFNA;
#ifdef JANUS
if (janus_baud >= cur_baud)
Hello.capabilities |= DOES_IANUS;
#endif
if (n_getpassword (remote_zone, remote_net, remote_node))
{
strncpy (Hello.my_password, remote_password, 8);
}
if ((matrix_mask & TAKE_REQ) &&
((!Sender) || (on_our_nickel)))
Hello.capabilities |= WZ_FREQ;
/*--------------------------------------------------------------------*/
/* Disable handshaking and ^C/^K handling */
/*--------------------------------------------------------------------*/
XON_DISABLE ();
/*--------------------------------------------------------------------*/
/* Send the packet. */
/* Load outbound buffer quickly, and get modem busy sending. */
/*--------------------------------------------------------------------*/
xmit_packet:
SENDBYTE (0x1f);
sptr = (char *) (&Hello);
SENDCHARS (sptr, 128, 1);
/*--------------------------------------------------------------------*/
/* Calculate CRC while modem is sending its buffer */
/*--------------------------------------------------------------------*/
for (crc = i = 0; i < 128; i++)
{
crc = xcrc (crc, (byte) sptr[i]);
}
CLEAR_INBOUND ();
SENDBYTE ((unsigned char) (crc >> 8));
SENDBYTE ((unsigned char) (crc & 0xff));
response_timer = timerset (4000);
while (!timeup(response_timer) && CARRIER)
{
if (!CHAR_AVAIL ())
{
if (got_ESC ())
{
DTR_OFF ();
sptr = KBD_msg;
goto no_response;
}
time_release ();
continue;
}
switch (i = TIMED_READ (0))
{
case ACK:
return (1);
case '?':
message ("drats");
case ENQ:
if (++num_errs == 10)
{
sptr = FUBAR_msg;
goto no_response;
}
goto xmit_packet;
default:
if (i > 0) /* Could just be line noise */
{
/* cprintf ("[%x] ", i);*/
}
break;
}
}
if (!CARRIER)
sptr = CARRIER_msg;
else
sptr = TIME_msg;
no_response:
message (sptr);
return (0);
} /* Send Hello */
/*--------------------------------------------------------------------------*/
/* RECEIVE HELLO PACKET */
/*--------------------------------------------------------------------------*/
static int Recv_Hello_Packet (void)
{
int i;
int c;
struct _Hello Hello;
byte *sptr;
byte num_errs = 0;
word crc;
word lsb;
word msb;
long master_timeout, hello_timeout;
char junkbuff[128];
hup = 0;
sptr = NULL;
/*--------------------------------------------------------------------*/
/* Clean up any mess that may be around */
/*--------------------------------------------------------------------*/
CLEAR_OUTBOUND ();
CLEAR_INBOUND ();
XON_DISABLE ();
/*--------------------------------------------------------------------*/
/* Get the Hello structure */
/*--------------------------------------------------------------------*/
/* big_pause (1); */ /* Wait for quiet. */
if (un_attended && fullscreen)
{
sb_move (filewin, 2, 2);
sb_puts (filewin, "YooHoo/2U2");
sb_show ();
}
else
{
set_xy ("YooHoo/2U2 ");
}
SENDBYTE (ENQ); /* Let the other system know
* we heard YooHoo. */
master_timeout = timerset (12000); /* No more than 2 mins! */
watch_for_header:
while (1)
{
if (sptr)
{
message (sptr);
sptr = NULL;
}
if ((c = TIMED_READ (20)) == 0x1f)
break;
if (got_ESC ())
{
sptr = KBD_msg;
goto receive_failed;
}
if (!CARRIER)
{
sptr = CARRIER_msg;
goto receive_failed;
}
if (timeup(master_timeout))
goto timeout;
if (c >= 0) /* noise? */
{
hello_timeout = timerset (1000); /* Look for up to 10 secs */
while (((c = PEEKBYTE ()) >= 0) && (c != 0x1f) && (CARRIER))
{
if (timeup(hello_timeout))
break;
MODEM_IN (); /* Eat non-YooHoo chars */
}
if (c != 0x1f) /* If we didn't get YooHoo */
{
CLEAR_INBOUND (); /* Throw out what we have */
SENDBYTE (ENQ); /* Start over with ENQ */
}
}
} /* while */
/*receive_packet:*/
sptr = (char *) (&Hello);
hello_timeout = timerset (3000);
for (i = 0, crc = 0; i < 128; i++)
{
while (PEEKBYTE () < 0)
{
if (timeup (master_timeout) || timeup (hello_timeout))
goto timeout;
if (got_ESC ())
{
sptr = KBD_msg;
goto receive_failed;
}
if (!CARRIER)
{
sptr = CARRIER_msg;
goto receive_failed;
}
time_release ();
}
c = TIMED_READ (0);
sptr[i] = (char) c;
crc = xcrc (crc, (byte) c);
}
if (!CARRIER)
{
sptr = CARRIER_msg;
goto receive_failed;
}
if (((msb = TIMED_READ (10)) < 0) || ((lsb = TIMED_READ (10)) < 0))
{
sptr = SHRT_msg;
goto hello_error;
}
if (((msb << 8) | lsb) == crc)
goto process_hello;
sptr = CRC_msg;
hello_error:
if (timeup(master_timeout))
goto timeout;
if ((num_errs++) > 10)
{
sptr = FUBAR_msg;
goto receive_failed;
}
CLEAR_INBOUND ();
SENDBYTE ('?');
goto watch_for_header;
process_hello:
Hello.my_name[42] = '\0';
Hello.sysop[19] = '\0';
remote_zone = Hello.my_zone;
remote_net = Hello.my_net;
remote_node = Hello.my_node;
remote_point = Hello.my_point;
remote_capabilities = (Hello.capabilities) | Y_DIETIFNA;
if (nodefind (remote_zone, remote_net, remote_node, 0) && !remote_zone)
remote_zone = found_zone;
sprintf (junkbuff, "*%s (%u:%u/%u.%u)",
Hello.my_name,
remote_zone,
remote_net,
remote_node,
remote_point);
status_line (junkbuff);
if ((pvtnet >= 0) &&
((remote_zone == alias[assumed].Zone) || (remote_zone == 0)) &&
(remote_net == boss_net) && (remote_node == boss_node) &&
(remote_point > 0))
{
remote_net = pvtnet;
remote_node = Hello.my_point;
remote_point = 0;
}
switch (Hello.product)
{
case isBITBRAIN:
case isFIDO:
case isSPARK:
case isSEA:
case isHENK:
case isTABBIE:
case isWOLF:
case isQMM:
case isFD:
case isTERUS:
case isCYGNUS:
case isGSPOINT:
case isBGMAIL:
case isCROSSBOW:
case isDBRIDGE:
case isDAISY:
case isTHEBOX:
status_line ("*Remote uses %s Version %d.%02d",
prodcode[Hello.product], Hello.product_maj, Hello.product_min);
break;
case isOPUS:
status_line ("*Remote Uses Opus Version %d.%02d", Hello.product_maj,
(Hello.product_min == 48) ? 0 : Hello.product_min);
break;
default:
status_line ("*Remote Uses Program '%02x' Version %d.%02d",
Hello.product, Hello.product_maj, Hello.product_min);
break;
}
if (Hello.sysop[0])
status_line (":Sysop: %s", Hello.sysop);
if (remote_point > 0)
{
remote_point = 0;
remote_node = -1;
}
if (n_getpassword (remote_zone, remote_net, remote_node))
{
if (n_password (Hello.my_password, remote_password))
{
DTR_OFF (); /* He'll never get it right */
timer (2); /* Wait two secs */
sptr = NULL; /* Already logged something */
goto receive_failed;
}
}
CLEAR_INBOUND ();
SENDBYTE (ACK);
SENDBYTE (YOOHOO);
return (1);
timeout:
sptr = TIME_msg;
receive_failed:
hup = 1;
message (sptr);
b_init ();
return (0);
} /* Recv Hello */
/* END OF FILE: yoohoo.c */