www.pudn.com > xmodem.zip > XMDM1.C
/*----------------------------------------------------------------
XMODEM.C
Main Drivers
(c) Copyright 1985 By Donald G Krantz
All Rights Reserved
----------------------------------------------------------------*/
#define MAIN
#include "stdio.h"
#include "b:xmodem.h"
char *c_tx, *c_rx, *c_txstat, *c_rxstat, *c_abort;
int _tx(), _rx(), _txstat(), _rxstat(), _abort(), _lcon();
/*----------------------------------------------------------------
main() XMODEM main driver
----------------------------------------------------------------*/
VOID main( argc, argv )
int argc;
char *argv[];
{
int i;
init();
printf( "XMODEM 5.0 - Osborne 1/BYE-Z - D. Krantz" );
parsopt( &argc, argv );
if( !option_speced || (t_r_mode == 0) || (argc < 2) )
do_usage();
printf( "\n%s mode, batch %s", crc ? "CRC" : "Checksum",
batch_request ? "ON" : "OFF" );
if( t_r_mode == 'S' )
for( i=1 ; i < argc ; i++ )
show_size( argv[ i ] );
else
if( batch_request )
make_rxspec( argc, argv );
printf( "\n\n* * * * Send ^X to cancel * * * *" );
printf( "\nReady to start transfer" );
if( t_r_mode == 'R' )
rx_exec( argc, argv );
else
tx_exec( argc, argv );
}
/*---------------------------------------------------------------
error() does error abort cleanup
References globals: fd;
---------------------------------------------------------------*/
VOID error( str )
char *str;
{
tx( CAN ); /* alert remote */
sprintf( msg, "\n\nError - %s\n", str );
lcl_str( msg );
printf( msg );
exit( 1 );
}
/*----------------------------------------------------------------
abort() checks for carrier.
----------------------------------------------------------------*/
VOID abort()
{
if( !ret_a( c_abort, 0,0,0,0 ) )
exit( 1 );
}
/*----------------------------------------------------------------
rx() gets a char from the remote system.
----------------------------------------------------------------*/
char rx() { return( ret_a( c_rx,0,0,0,0 ) ); }
/*----------------------------------------------------------------
rxstat() returns TRUE if a char is awaiting input.
----------------------------------------------------------------*/
rxstat() { abort(); return( ret_a( c_rxstat,0,0,0,0 ) ); }
/*----------------------------------------------------------------
tx() sends a char to remote and updates the CRC buffer.
----------------------------------------------------------------*/
VOID tx( ch )
{
int i;
for( i=0 ; i < 1000; i++ )
{
if( txstat() )
{
ret_a( c_tx, ch, 0,0,0 );
updcrc( ch );
return;
}
}
error( "Transmitter timed out" );
}
/*----------------------------------------------------------------
txstat() returns TRUE if tx register is empty.
----------------------------------------------------------------*/
txstat() { abort(); return( ret_a( c_txstat, 0,0,0,0 ) ); }
/*----------------------------------------------------------------
init() moves Osborne code out into the heap where it can
operate safely.
----------------------------------------------------------------*/
init()
{
c_tx = alloc( 11 );
c_rx = alloc( 11 );
c_txstat = alloc( 11 );
c_rxstat = alloc( 11 );
c_abort = alloc( 15 );
movmem( (char *)_tx, c_tx, 11 );
movmem( (char *)_rx, c_rx, 11 );
movmem( (char *)_txstat, c_txstat, 13 );
movmem( (char *)_rxstat, c_rxstat, 13 );
movmem( (char *)_abort, c_abort, 15 );
}
/*----------------------------------------------------------------
movmem() transfers blocks of memory.
----------------------------------------------------------------*/
movmem( source, dest, count )
char *source, *dest;
int count;
{
register int i;
for( i=0 ; i