[net.sources] Kermit for the Fortune 32:16

ron@eed092.UUCP (prototype account) (09/04/85)

	Somebody out there posted a request for Kermit on
the Fortune 32:16.  Such as it may be this version works
well for us even though it is sloppy.  Please note that
this copy is designed to work with the Fortune hooked up to 
a Sytek box and configured so that DTR causes hangups/session
aborts.  This problem is bypassed by having a working
command line within the program.

	Good luck and have fun!


*** REPLACE THIS LINE WITH YOUR MESSAGE ***
# Shell archive by: Ronald R. Tribble
# revision level 1.0
#
# unload this file using the Bourne shell not csh
# Begin Archive:
# 
# this file is connect.c
echo -n "Extracting file connect.c   "
sed "s/^X//" << TRIBBLE_EOF > connect.c
X#include "kermit.h"
X/*
X *      c o n n e c t
X *
X *      establish a virtual terminal connection
X *      with the remote host, over a tty line.
X *
X */
Xint done;
Xint divert;
Xint unit;
Xint crlf;
Xint screen;
Xint count;
Xint len;
X
Xchar cc         [1024];
Xchar file0      [128];
Xchar file1      [128];
X
XFILE *popen ();
XFILE *cunit;
X
Xjmp_buf oops;
X
Xconnect()
X{
X
X        extern int con_oops ();
X        extern int quit_kermit ();
X
X        char c;
X
X        if (host)        /* if in host mode, nothing to connect to */
X        {
X                fprintf(stderr,
X                        "Kermit: host mode nothing to connect to\n");
X                ioctl(0,TIOCSETP,&cookedmode);
X                return;
X        }
X
X        signal ( SIGINT , con_oops );
X
X        printf("Remote.\r\n");
X
X        setjmp (oops);
X
X        ioctl (0,TIOCSETP,&rawmode);
X
X        c = done = divert = 0;
X        screen = 1;
X
X        while (c != escchr)
X        {
X                ioctl ( 0     , FIONREAD , &count );
X                if ( count )
X                {
X                read  ( 0     , &c       , 1      );
X                if ( c == '\1' ) eval (c);
X                else write ( remfd , &c       , 1      );
X                if ( done ) break;
X                }
X                if ( done ) break;
X                read_rem ();
X        }
X
X        ioctl(0,TIOCSETP,&cookedmode);
X
X        printf("\nLocal.\n");
X        fclose ( cunit );
X        signal ( SIGINT , quit_kermit );
X        return;
X}
X
Xeval (c0)
Xchar c0;
X{
X
X        int err;
X        char c;
X
X        read ( 0 , &c , 1 );
X        ioctl(0    ,TIOCSETP,&cookedmode);
X        switch ( c )
X        {
X                case '@':       help_con ();
X                                break;
X
X                case 'a':       done = 1;
X                                break;
X
X                case 'b':       ioctl ( 0 , TIOCSBRK , 0 );
X                                break;
X
X                case 'c':       
X                                printf ( "Local shell\n" );
X                                system ( "/bin/sh" );
X                                printf ( "Remote.\n" );
X                                break;
X
X                case 'd':       printf ( "Local shell name ? " );
X                                gets ( file0 );
X                                if ( !strlen(file0) ) break;
X                                cunit = popen (file0,"r");
X                                if ( cunit == NULL ) break;
X                                while (fgets(cc,sizeof(cc),cunit) 
X                                        != NULL ) {
X                                len = strlen ( cc );
X                                write ( remfd , cc , len );
X                                read_rem (); }
X                                pclose ( cunit );
X                                break;
X
X                case 'e':       printf ( "Command  name ? " );
X                                gets ( file0 );
X                                if ( !strlen(file0) ) break;
X                                remcomx ();
X                                break;
X
X                case 'f':       if ( divert ) {
X                                close ( divert );
X                                divert = 0;
X                                printf ( "Divert closed\n" );
X                                } else {
X                                printf ( "Divert filename ? " );
X                                gets ( file0 );
X                                if ( !strlen(file0) ) break;
X                                divert = creat ( file0 , 0644 );}
X                                break;
X
X                case 'g':       screen = !screen;
X                                if ( screen ) printf ( "Screen on\n" );
X                                else printf ( "Screen off\n" );
X                                break;
X
X                case 'h':       if ( divert ) {
X                                close ( divert );
X                                divert = 0;
X                                printf ( "Divert closed\n" );
X                                } else {
X                                printf ( "Append divert filename ? " );
X                                gets ( file0 );
X                                if ( !strlen(file0) ) break;
X                                divert = open  ( file0 , 1 );
X                                if ( !divert )
X                                  divert = creat ( file0 , 0644 );
X                                lseek ( divert , 0 , 2 );
X                                break; }
X
X                case 'i':       printf ( "Take file [from] [to] :" );
X                                gets ( cc );
X                                if ( !strlen(cc) ) break;
X                                err=sscanf ( cc,"%s %s",file0,file1 );
X                                if ( err == 0 ) break;
X                                if ( err == 1 ) strcpy ( file1,file0 );
X                                take_file ();
X                                break;
X
X                case 'j':       printf ( "Send file [from] [to] :" );
X                                gets ( cc );
X                                if ( !strlen(cc) ) break;
X                                err=sscanf ( cc,"%s %s",file0,file1 );
X                                if ( err == 0 ) break;
X                                if ( err == 1 ) strcpy ( file1,file0 );
X                                send_file ();
X                                break;
X
X                case 'k':       printf ( "Transmit file :" );
X                                gets ( cc );
X                                if ( !strlen(cc) ) break;
X                                err=sscanf ( cc,"%s %s",file0,file1 );
X                                if ( err == 0 ) break;
X                                strcpy ( file1,file0 );
X                                tran_file ();
X                                break;
X
X                case 'l':       crlf++;
X                                crlf = crlf % 5;
X                                printf ( "Line termination set to " );
X                                if ( crlf == 0 ) printf ( "CR\n" );
X                                if ( crlf == 1 ) printf ( "NL\n" );
X                                if ( crlf == 2 ) printf ( "RAW\n" );
X                                if ( crlf == 3 ) printf ( "CRLF\n" );
X                                if ( crlf == 4 ) printf ( "LFCR\n" );
X                                break;
X
X                default:        if ( screen ) {
X                                write ( remfd , &c0 , 1 );
X                                write ( remfd , &c  , 1 );
X                                }
X                                break;
X        }
X        ioctl (0    ,TIOCSETP,&rawmode);
X}
Xremcomx ()
X{
X
X        strcpy ( file1 , file0 );
X        cunit = fopen ( file0 , "r" );
X        if ( cunit == NULL ) return;
X
X        strcpy ( cc , "stty -echo;cat >" );
X        strcat ( cc , file1 );
X        strcat ( cc , ";stty echo;sh " );
X        strcat ( cc , file1 );
X        strcat ( cc , ";rm " );
X        strcat ( cc , file1 );
X        strcat ( cc , "\r" );
X        len = strlen ( cc );
X        write ( remfd , cc , len );
X        transfer (1);
X        fclose ( cunit );
X}
Xsend_file ()
X{
X
X        cunit = fopen ( file0 , "r" );
X        if ( cunit == NULL ) return;
X
X        strcpy ( cc , "stty -echo;cat > " );
X        strcat ( cc , file1 );
X        strcat ( cc , ";stty echo\r" );
X        len = strlen ( cc );
X        write ( remfd , cc , len );
X        transfer (1);
X        fclose ( cunit );
X}
Xtake_file ()
X{
Xchar c;
X        c = 0;
X        unit = creat ( file1 , 0644 );
X        if ( unit == -1 ) return;
X
X        strcpy ( cc , "echo -n \2;cat " );
X        strcat ( cc , file0 );
X        strcat ( cc , ";echo -n \3\3\3\3\3\r" );
X        len = strlen ( cc );
X        write ( remfd , cc , len );
X        while ( c != 2 ) read ( remfd , &c , 1 );
X        done = 0;
X        while ( 1 )
X        {
X        ioctl ( remfd , FIONREAD , &count );
X        if ( count > sizeof (cc) ) count = sizeof (cc);
X        read  ( remfd , cc       , count  );
X        for ( len = 0 ; len < count ; len ++ )
X        {
X                c = cc[len] & 0177;;
X                if ( c == '\r' ) continue;
X                if ( c == 3    ) {done++;break;}
X                write ( unit , &c , 1 );    
X        }
X        if ( done ) break;
X        }
X        done = 0;
X        close ( unit );
X        read_rem ();
X}
Xtran_file ()
X{
X
X        cunit = fopen ( file0 , "r" );
X        if ( cunit == NULL ) return;
X        transfer (0);
X        fclose ( cunit );
X}
Xtransfer (logic)
Xint logic;
X{
X
Xint num;
Xchar c;
X
X        num = 0;
X        sleep ( 2 );
X        read_rem ();
X        while ( (c=fgetc(cunit)) != EOF )
X        {
X                if ( c=='\r' || c=='\n' ) switch ( crlf )
X                        {
X                        case 0: c = '\r';
X                                break;
X                        case 1: c = '\n';
X                                break;
X                        case 2: break;
X                        case 3: c = '\r';
X                                write ( remfd,&c,1 );
X                                c = '\n';
X                                break;
X                        case 4: c = '\n';
X                                write ( remfd,&c,1 );
X                                c = '\r';
X                                break;
X                        }
X                write ( remfd , &c , 1 );       
X                num++;
X                if ( num % 512 == 0 ) read_rem ();
X        }
X        c = '\04';
X        if ( logic ) write ( remfd , &c , 1 );
X        read_rem ();
X        sleep ( 1 );
X}
Xread_rem ()
X{
Xchar c;
X
X        ioctl ( remfd , FIONREAD , &count );
X        if ( count > sizeof (cc) ) count = sizeof (cc);
X        read  ( remfd , cc       , count  );
X
X        if ( screen )
X        write ( 1     , cc       , count  );
X
X        if ( divert )
X        {
X        poff ( cc , count );
X        write ( divert, cc       , count  );
X        }
X}
Xpoff ( text , len )
X
Xchar *text;
Xint len;
X
X{
Xwhile ( len-- )
X        {
X        *text &= 0177;
X        text++;
X        }
X}
Xhelp_con ()
X{
X        printf ( "Function Keys:\n\n" );
X        printf ( "\tHelp\t\tHelp\tDisplay toggle\tf7\n" );
X        printf ( "\tQuit emulator\tf1\tAppend divert\tf8\n" );
X        printf ( "\tBreak\t\tf2\tReceive file\tf9\n" );
X        printf ( "\tLocal shell\tf3\tSend file\tf10\n" );
X        printf ( "\tLcl shl rmt dsp\tf4\tTransmit file\tf11\n" );
X        printf ( "\tRemote cmd xdt\tf5\tToggle crlf\tf12\n" );
X        printf ( "\tDivert\t\tf6\n\n" );
X}
Xcon_oops ()
X{
X        close  ( divert );
X        close  ( unit   );
X        fclose ( cunit  );
X        longjmp ( oops , 1 );
X}
TRIBBLE_EOF
ival=`wc -c connect.c`
set $ival
ival=$1
set   10659 connect.c
iam=$1
if test $ival = $iam
then echo '    sucessfull'
else echo '    failed'
fi
# this file is interact.c
echo -n "Extracting file interact.c   "
sed "s/^X//" << TRIBBLE_EOF > interact.c
X/*      interact.c      modules added to kermit for
X                        interactive use.
X*/
X
X#include <ctype.h>
X#include "kermit.h"
X
Xchar ans        [128];
Xchar text       [128];
Xchar names      [128];
Xchar *files     [128];
X
Xinteract ()
X
X{
X
X        while ( 1 )
X        {
X
X                ioctl(0,TIOCSETP,&cookedmode);  
X                str0 ( ans , 128 );
X
X                printf (  "Kermit 32:16 ->" );
X                fgets ( ans , 128 , stdin );
X                switch ( ans[0] )
X                {
X
X                case 'B' :
X                case 'b' :
X                        debug = !debug;
X                        if ( debug )
X                        {
X                                printf ( "Debug mode on\n" );
X                        }
X                        else
X                            {
X                                printf ( "Debug mode off\n" );
X                        }
X                        break;
X
X                case 'C' :
X                case 'c' :      /* connect command */
X                        switch ( ans [1] )
X                        {
X
X                        case 'D' :
X                        case 'd' :
X                                move_dir ();
X                                break;
X
X                        default :
X                                if ( !remfd ) open_port ();
X                                connect ();
X                                break;
X                        }
X                        break;
X
X                case 'D':
X                case 'd':
X                        quit_port ();
X                        close ( remfd );
X                        remfd = 0;
X                        break;
X
X
X                case 'H':
X                case 'h' :
X                case '?' :
X
X                        help ();
X                        break;
X
X
X                case 'Q':
X                case 'q' :      /* quit and get out */
X
X                        return;
X                        break;
X
X                case 'S':
X                case 's' :      /* send command */
X                        switch ( ans [1] )
X                        {
X
X                        case 'H':
X                        case 'h':
X                                showme ();
X                                break;
X                        case 'E':
X                        case 'e':
X                                switch ( ans [2] )
X                                {
X                                case 'T':
X                                case 't' :
X                                        set_up ();
X                                        break;
X                                case 'N':
X                                case 'n' :
X                                        send_files ();
X                                        break;
X                                }
X                                break;
X                        default:
X                                send_files ();
X                                break;
X                        }
X                        break;
X                case 'R':
X                case 'r' :      /* receive command */
X
X                        if (recsw() == FALSE)
X                                printf("Receive failed.\n");
X                        else
X                            printf("OK\n");
X                        break;
X                case 'V':
X                case 'v' :
X                        if ( (eol=='\n') || (eol==0) )
X                        {
X                                eol = '\r';
X                                printf ( "Vax mode on\n" );
X                        }
X                        else
X                            {
X                                eol = '\n';
X                                printf ( "Vax mode off\n" );
X                        }
X                        break;
X
X                case '!':
X
X                        system ( shell );
X                        break;
X
X                default:
X                        system ( ans );
X                        break;
X                }
X        }
X}
Xhelp ()
X{
X        printf ( "\tb\ttoggle Debug mode\n" );
X        printf ( "\tc\tconnect to remote system\n" );
X        printf ( "\tcd\tunix level change directory\n" );
X        printf ( "\td\tdisconnect current port\n" );
X        printf ( "\th\thelp\n" );
X        printf ( "\tq\tquit or exit from Kermit\n" );
X        printf ( "\tr\trecieve files\n" );
X        printf ( "\tsend\tsend files\n" );
X        printf ( "\tset [h]\tset Kermit parameters\n" );
X        printf ( "\tshow\tshow Kermit parameters\n" );
X        printf ( "\tv\ttoggle Vax mode\n" );
X        printf ( "\t?\thelp\n" );
X        printf ( "\t!\tenter unix shell\n" );
X}
Xset_help ()
X{
X        printf ( "Set modes available\n\n" );
X        printf ( "port\t\tunix device to use\n" );
X        printf ( "shell\t\tunix shell to use\n" );
X        printf ( "eol\t\tend of line character\n" );
X        printf ( "baud\t\tbaud rate to use\n" );
X        printf ( "debug\t\tturn debug mode on or off\n" );
X        printf ( "esc\t\tset escape character [octal]\n" );
X        printf ( "padchar\t\tset padding character [octal]\n" );
X        printf ( "padcount\tset number of pads to use [decimal]\n" );
X        printf ( "quote\t\tset quote character [octal]\n\n" );
X}
Xsend_files ()
X{
X        FILE *point;
X        FILE *popen ();
X        char *malloc ();
X
X        int count;
X
X        count = 0;
X
X        str0 ( names , 128 );
X        sscanf ( ans , "%s %128c" , text , names );
X
X        if ( strlen ( names ) == 0 )
X        {
X                printf ( "Which files please ? " );
X                fgets ( names , 128 , stdin );
X                if ( strlen ( names ) == 0 ) return;
X        }
X
X        strcpy ( text , "/bin/ls -1 " );
X        strcat ( text , names );
X
X        point = popen ( text , "r" );
X        while ( (fgets (names,128,point)) != NULL )
X        {
X                names[strlen(names)-1]=0;
X                files [count] = malloc ( strlen (names) );
X                strcpy ( files[count] , names);
X                count ++;
X                files[count] == 0;
X                if ( count > 127 ) break;
X        }
X        pclose ( point );
X        count --;
X
X        filelist = files;
X        if (sendsw() == FALSE)
X                printf("Send failed.\n");
X        else
X            printf("OK\n");
X        for ( ;count>=0;count--) 
X        {
X                free ( files[count] );
X                files [count] = 0;
X        }
X
X}
Xshowme ()
X{
X        printf ( "Kermit current settings\n" );
X        printf ( "port\t= %s\n" , remtty );
X        printf ( "shell\t= %s\n" , shell );
X        printf ( "eol\t= %o" , eol );
X        if ( eol == '\n' ) printf ( " Normal mode is on\n" );
X        if ( eol == '\r' ) printf ( " Vax mode is on\n" );
X        if ( (eol!='\n') && (eol!='\r') ) printf ( " Unknown eol mode\n" );
X        printf ( "%d baud\n" , speed );
X        if ( debug ) printf ( "Debugging is on\n" );
X        printf ( "%o is the escape char\n" , escchr );
X        printf ( "%o is the padchar\n" , padchar );
X        printf ( "%d is the padcount\n" , pad );
X        printf ( "%o is the quote char\n" , quote );
X
X}
Xset_up ()
X{
X
X        int len;
X
X        str0 ( names , 128 );
X        sscanf ( ans , "%s %128c" , text , names );
X        str0 ( ans   , 128 );
X        str0 ( text  , 128 );
X        sscanf ( names , "%s %128c" , ans , text );
X
X        len = strlen ( text );
X        len --;
X        if ( text[len] == '\n' ) text [len] = 0;
X
X        switch ( ans [0] )
X        {
X        case '?' :
X        case 'h' :
X                set_help ();
X                return;
X
X
X        case 's' :
X                strcpy ( shell , text );
X                break;
X
X        case 'e' :
X                switch ( ans [1] )
X                {
X                case 'o' :
X                        sscanf ( text , "%o" , &len );
X                        eol = len;
X                        break;
X                case 's' :
X                        sscanf ( text , "%o" , &len );
X                        escchr = len;
X                        break;
X                }
X                break;
X
X        case 'd' :
X                switch ( text[1] )
X                {
X                case 'n':
X                        debug = 1;
X                        break;
X                case 'f':
X                        debug = 0;
X                        break;
X                default :
X                        printf ( "Unknown debug mode\n" );
X                        break;
X                }
X                break;
X
X        case 'b' :
X                speed = atol ( text );
X                break;
X
X        case 'q' :
X                sscanf ( text , "%o" , &len );
X                quote = len;
X                break;
X
X        case 'p' :
X                switch ( ans [4] )
X                {
X                case 'h' :
X                        sscanf ( text , "%o" , &len );
X                        padchar = len;
X                        break;
X                case 'o' :
X                        pad = atol ( text );
X                        break;
X                }
X                switch ( ans [1] )
X                {
X                case 'o' :
X                        strcpy ( remtty , text );
X                        break;
X                }
X                break;
X
X        default :
X                printf ( "Unknown set command\n" );
X                break;
X        }
X        showme ();
X}
Xlpack ( itext )
Xchar itext[];
X{
X        int iam;
X        int jam;
X        int kam;
X        int len;
X
X        len = strlen ( text );
X
X        for ( iam = 0 ; iam < len ; iam++ )
X        {
X                if ( isspace ( itext[iam] ) == 0 )
X                {
X                        jam = iam;
X                        break;
X                }
X        }
X        for ( iam = jam, kam = 0; iam < len; iam++ , kam++ )
X                itext [kam] = itext[iam];
X        kam = strlen ( itext );
X        kam = kam - jam;
X        for ( iam = kam ; iam < len ; iam++ )
X                itext[iam] = 0;
X}
Xmove_dir ()
X{
X
X        sscanf ( ans , "%s %s" , text , names );
X        chdir ( names );
X}
Xstr0 ( string , len )
X
Xchar string [];
X
Xint len;
X
X{
X
X        len --;
X        for ( ; len >= 0 ; len-- ) string [len]  = 0;
X
X}
TRIBBLE_EOF
ival=`wc -c interact.c`
set $ival
ival=$1
set   10163 interact.c
iam=$1
if test $ival = $iam
then echo '    sucessfull'
else echo '    failed'
fi
# this file is kermit.h
echo -n "Extracting file kermit.h   "
sed "s/^X//" << TRIBBLE_EOF > kermit.h
X/*
X *      K e r m i t  File Transfer Utility
X *
X *      Unix Kermit, Columbia University, 1983
X *
X *      usage: kermit [csr][dlbe line baud escapechar] [f1 f2 ...]
X *
X *      where c=connect, s=send [files], r=receive, d=debug,
X *      l=tty line, b=baud rate, e=escape char (decimal ascii code).
X *      For "host" mode Kermit, format is either "kermit r" to
X *      receive files, or "kermit s f1 f2 ..." to send f1 .. fn.
X *
X *      Modfied by: Ronald R. Tribble for interactive use. 3-21-85
X */
X
X#include <stdio.h>
X#include <sgtty.h>
X#include <signal.h>
X#include <setjmp.h>
X#include <ctype.h>
X#include <time.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X
X#define DBUGSW 0
X#define MAXPACK         94      /* Maximum packet size */
X#define SOH             1       /* Start of header */
X#define SP              32      /* ASCII space */
X#define DEL             127     /* Delete (rubout) */
X#define CTRLD           4
X#define BRKCHR          033     /* default break-connection character */
X#define MAXTRY          10      /* Times to retry a packet */
X#define MYQUOTE         '#'     /* Quote character I will use */
X#define MYPAD           0       /* Number of pad characters needed */
X#define MYPCHAR         0       /* Padding character I need */
X#define MYEOL           '\r'    /* End-Of-Line character I need */
X#define MYTIME          5       /* Seconds for time out */
X#define MAXTIM          20      /* Maximum timeout interval */
X#define MINTIM          2       /* Minumum timeout interval */
X#define TRUE            -1
X#define FALSE           0
X
X/*
X *      Global Variables
X */
X
Xint     size,           /* Size of present data */
Xn,                      /* Message number */
Xrpsiz,                  /* Maximum receive packet size */
Xspsiz,                  /* Maximum send packet size */
Xpad,                    /* How much padding to send */
Xtimint,                 /* Timeout for foreign host on sends */
Xnumtry,                 /* Times this packet retried */
Xoldtry,                 /* Times previous packet retried */
Xfd,                     /* file pointer of file to read/write */
Xremfd,                  /* file pointer of the host's tty */
Xremspd,                 /* speed of this tty */
Xhost,                   /* -1 means we're a host-mode kermit */
Xdebug,                  /* -1 means debugging */
Xspeed,                  /* baud rate to run at */
Xtstart,                 /* start time of i/o */
Xtstop,
Xsleep_len;              /* delay in seconds for kermit send */
X
Xunsigned long filch;    /* counter for rate of transfer */
X
Xchar    state,          /* Present state of the automaton */
Xpadchar,                /* Padding character to send */
Xeol,                    /* End-Of-Line character to send */
Xescchr,                 /* Connect command escape character */
Xquote,                  /* Quote character in incoming data */
X**filelist,             /* list of files to be sent */
X*filnam,                /* current file name */
Xremtty[128],
Xrecpkt[MAXPACK],        /* Receive packet buffer */
Xpacket[MAXPACK],        /* Packet buffer */
Xshell[32];              /* unix shell to run */
X
Xstruct sgttyb
Xrawmode,                /* host tty "raw" mode */
Xcookedmode,             /* host tty "normal" mode */
Xoldmode,                /* remote tty original state */
Xremttymode;             /* remote tty line "raw" mode */
X
Xjmp_buf env;            /* environment ptr for timeout longjump */
TRIBBLE_EOF
ival=`wc -c kermit.h`
set $ival
ival=$1
set    3416 kermit.h
iam=$1
if test $ival = $iam
then echo '    sucessfull'
else echo '    failed'
fi
# this file is main.c
echo -n "Extracting file main.c   "
sed "s/^X//" << TRIBBLE_EOF > main.c
X#include "kermit.h"
X/*
X *      K e r m i t
X *
X *      Main routine - parse command and option, set up the
X *      tty lines and dispatch to the appropriate routine.
X */
X
Xint ttyflg;
X
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X{
X        char *cp;
X        int cflg;
X        int rflg;
X        int sflg;
X        int iflg;
X
X        if (argc == 1) usage();
X
X        cp = *++argv; 
X        argv++; 
X        argc -= 2;
X        speed=cflg=sflg=rflg=iflg=ttyflg=0; /* turn off all flags */
X
X        strcpy ( shell , "/bin/sh");
X        strcpy ( remtty , "/dev/cul0" ); /* default device */
X        escchr = BRKCHR;                /* default esc char */
X        sleep_len = 5;                  /* default sleep on send */
X        eol = MYEOL;
X        quote = MYQUOTE;
X
X        while ((*cp) != NULL)
X                switch (*cp++)
X                {
X                case '-': 
X                        break;
X                case 'c': 
X                        cflg++; 
X                        break;                  /* connect command */
X                case 's': 
X                        sflg++; 
X                        break;                  /* send command */
X                case 'r': 
X                        rflg++; 
X                        break;                  /* receive command */
X                case 'h':                       /* help detail */
X                        khelp ();
X                        exit ();
X                        break;
X                case 'i': 
X                        iflg++; 
X                        break;          /* interactive mode */
X                case 'e': 
X                        if (argc--)     /* specify escape char */
X                                escchr = atoi(*argv++);
X                        /*  as ascii decimal number */
X                        else usage();
X                        if (debug) 
X                                fprintf(stderr,
X                                "escape char is ascii %d\n",escchr);
X                        break;
X                case 'l': 
X                        if (argc--) /* specify tty line to use */
X                        {
X                                strcpy ( remtty , *argv );
X                                *argv++;
X                        }
X                        else usage ();
X                        if (debug) fprintf(stderr,"line %s\n",remtty);
X                        ttyflg++;
X                        break;
X                case 'b': 
X                        if (argc--) /* specify baud rate */
X                                speed = atoi(*argv++);
X                        else usage();
X                        if (debug) fprintf(stderr,"speed %d\n",speed);
X                        break;
X                case 'd': 
X                        debug = TRUE; 
X                        break;            /* debug mode */
X                case 'v':
X                        eol = '\15';
X                        break;
X                }
X        if (debug)
X        {
X                if (cflg) fprintf(stderr,"cflg ");
X                if (sflg) fprintf(stderr,"sflg ");
X                if (rflg) fprintf(stderr,"rflg ");
X                fprintf(stderr,"line %s, speed %d\n",remtty,speed);
X        }
X        /* only one command allowed, for now */
X        if ( iflg ) sflg=rflg=0;
X        if ((cflg+sflg+rflg+iflg) != 1) usage();
X
X
X        /* save tty mode so we can restore it later */
X        ioctl(0,TIOCGETP,&cookedmode);  
X        ioctl(0,TIOCGETP,&rawmode);     
X
X        open_port ();
X
X        if (iflg) ttyflg++;
X        if (cflg) connect();                  /* connect command */
X        if (iflg) interact ();
X        if (sflg)                             /* send command */
X        {
X                if (argc--) filnam = *argv;
X                else usage();
X                printf ( "Sleeping for %d seconds\n" , sleep_len );
X                sleep ( sleep_len );
X                filelist = argv;
X                if (host) ioctl(0,TIOCSETP,&rawmode);
X                if (sendsw() == FALSE)
X                        printf("Send failed.\n");
X                else
X                    printf("OK\n");
X                if (host) ioctl(0,TIOCSETP,&cookedmode);
X        }
X        if (rflg)                             /* receive command */
X        {
X                if (host) ioctl(0,TIOCSETP,&rawmode);
X                if (recsw() == FALSE)
X                        printf("Receive failed.\n");
X                else
X                    printf("OK\n");
X                if (host) ioctl(0,TIOCSETP,&cookedmode);
X        }
X        quit_port ();
X}
Xusage()
X{
X        fprintf(stderr,
X        "usage:\tkermit [csri][dh][lbe] [line] [baud] [char] [files]\n");
X        fprintf(stderr,
X        "\tkermit h <for help detail>\n" );
X        quit_port ();
X        exit();
X}
Xkhelp ()
X{
X        printf ( "usage:\tkermit [csri][dhv][lbe] [line] [baud] [char] [files]\n\n" );
X
X        printf ( "\tc\tconnect command to go to another machine\n" );
X        printf ( "\ts\tsend command to act as server kermit\n" );
X        printf ( "\tr\trecieve command to act as server kermit\n" );
X        printf ( "\ti\tinteractive mode: defeats c,s,and r\n" );
X        printf ( "\t\tKermit in a terminal emulator mode\n" );
X        printf ( "\t\twith the ability to do many things\n" );
X        printf ( "\t\tenter kermit in this mode and ask for help\n" );
X        printf ( "\td\tturns on debugging output\n" );
X        printf ( "\th\tprints this message <defeats everything else>\n" );
X        printf ( "\tv\tsets end of line to <CR> for Vax\n" );
X        printf ( "\tl\tuse with <line> for the connect device\n" );
X        printf ( "\tb\tuse with <baud> for the baud rate\n" );
X        printf ( "\te\tuse with <char> decimal value of the escape\n" );
X        printf ( "\t\tcharacter now set at 33 for escape\n" );
X        printf ( "\tfiles\ta list of files to act on\n\n" );
X}
Xset_faults ()
X{
X        extern quit_kermit ();
X
X        signal ( SIGHUP , quit_kermit );
X        signal ( SIGINT , quit_kermit );
X        signal ( SIGQUIT, quit_kermit );
X        signal ( SIGFPE , SIG_IGN     );
X        signal ( SIGALRM, quit_kermit );
X        signal ( SIGTERM, quit_kermit );
X}
Xstatic char lockname [48];
Xget_port ( remtty )
X
Xchar *remtty;
X
X{
X
X        struct stat buff;
X
X        char *cc;
X        char *rindex ();
X
X        FILE *temp;
X
X        strcpy ( lockname , "/usr/spool/uucp/LCK.." );
X
X        cc = rindex ( remtty , '/' );
X        if ( cc )
X        {
X                cc++;
X                strcat ( lockname , cc );
X        }
X        else
X            {
X                strcat ( lockname , remtty );
X        }
X
X
X        while ( 1 )
X        {
X                if ( stat ( lockname , buff ) )
X                {
X                        temp = fopen ( lockname , "w" );
X                        fclose ( temp );
X                        break;
X                }
X                printf ( "Port %s is busy... sleeping 5 seconds\n" , remtty );
X                sleep ( 5 );
X        }
X}
Xquit_port ()
X{
X        if ( !remfd ) return;
X        unlink ( lockname );
X        unlink ( lockname );
X        return;
X}
Xquit_kermit ()
X{
X        quit_port ();
X        exit (0);
X}
Xopen_port ()
X{
Xif ( ttyflg )
X        {
X        get_port ( remtty );
X        set_faults ();
X        remfd = open(remtty,2); /* we're a remote kermit, so */
X        if (remfd < 0)          /*  set up the tty line */
X        {
X                fprintf(stderr,
X                "Kermit: cannot open %s\n",remtty);
X                exit(-1);
X        }
X        host = FALSE;
X}
X        else
X        {
X                remfd = 0;     /* we're a host kermit */
X                host = TRUE;
X        }
X        /* rawmode is used during connect, send, receive */
X        rawmode.sg_flags |= (RAW|TANDEM);
X        rawmode.sg_flags &= ~(ECHO|CRMOD);
X
X        /* if remote kermit, get remote tty mode */
X        ioctl(remfd,TIOCGETP,&oldmode);      
X        ioctl(remfd,TIOCGETP,&remttymode);      
X        remttymode.sg_flags |= (RAW|TANDEM);
X        remttymode.sg_flags &= ~(ECHO|CRMOD);
X        if (speed)                    /* user specified a speed? */
X        {
X                switch(speed)         /* get internal system code */
X                {
X                case 110: 
X                        speed = B110; 
X                        break;
X                case 150: 
X                        speed = B150; 
X                        break;
X                case 300: 
X                        speed = B300; 
X                        break;
X                case 1200: 
X                        speed = B1200; 
X                        break;
X                case 2400: 
X                        speed = B2400; 
X                        break;
X                case 4800: 
X                        speed = B4800; 
X                        break;
X                case 9600: 
X                        speed = B9600; 
X                        break;
X                default: 
X                        fprintf(stderr,"bad line speed\n");
X                }
X                remttymode.sg_ispeed = speed;
X                remttymode.sg_ospeed = speed;
X        }
X        ioctl(remfd,TIOCSETP,&remttymode);
X}
TRIBBLE_EOF
ival=`wc -c main.c`
set $ival
ival=$1
set    9091 main.c
iam=$1
if test $ival = $iam
then echo '    sucessfull'
else echo '    failed'
fi
# this file is makefile
echo -n "Extracting file makefile   "
sed "s/^X//" << TRIBBLE_EOF > makefile
X.c.o: ; cc -c $*.c
X
Xmodcommand = kermit
X
Xmodkermit =     main.o connect.o interact.o receive.o send.o \
X                utils.o
X
Xkermit: $(modkermit)
X        cc -o kermit $(modkermit)
X
X$(modkermit):   kermit.h
X
Xclean:
X        -rm -f  *.o kermit
X
Xforce:
X        -rm -f  $(modcommand)
X
Xinstall: kermit
X        -cp kermit /bin
X
Xxref:
X        -rm -f kermit.xref
X        -xref main.c    >> kermit.xref
X        -xref connect.c >> kermit.xref
X        -xref interact.c>> kermit.xref
X        -xref receive.c >> kermit.xref
X        -xref send.c    >> kermit.xref
X        -xref utils.c   >> kermit.xref
X
X
Xlint:
X        -lint main.c connect.c interact.c receive.c send.c utils.c >kermit.lint
TRIBBLE_EOF
ival=`wc -c makefile`
set $ival
ival=$1
set     680 makefile
iam=$1
if test $ival = $iam
then echo '    sucessfull'
else echo '    failed'
fi
# this file is receive.c
echo -n "Extracting file receive.c   "
sed "s/^X//" << TRIBBLE_EOF > receive.c
X#include "kermit.h"
X
X/*
X *      receive - routines for receiving data
X */
X/*
X *      r e c s w
X */
Xrecsw()
X{
X        state = 'R';          /* receive is the start state */
X        n = 0;                /* initialize message number */
X        numtry = 0;           /* say no tries yet */
X        while(TRUE) switch(state) /* do this for as long as necessary */
X        {
X        case 'D':   
X                state = rdata(); 
X                break; /* data receive state */
X        case 'F':   
X                state = rfile(); 
X                break; /* file receive state */
X        case 'R':   
X                state = rinit(); 
X                break; /* send initiate state */
X        case 'C':   
X                return(TRUE);           /* complete state */
X        case 'A':   
X                return(FALSE);          /* unknown state, abort */
X        }
X}
X
X/*
X *       r i n i t
X */
X
Xrinit()
X{
X        int len, num;
X        if (numtry++ > MAXTRY) return('A');/* abort if to many tries */
X        switch(rpack(&len,&num,packet))       /* get a packet */
X        {
X        case 'S':                            /* send-init */
X                {
X                        rpar(packet);        /* get the init data */
X                        spar(packet); /* fill up packet w/ init info */
X                        spack('Y',n,6,packet);/* ACK w/ my parameters */
X                        oldtry = numtry;      /* save old try count */
X                        numtry = 0;        /* and start a new counter */
X                        n = (n+1)%64;      /* bump packet number */
X                        return('F');       /* enter file-send state */
X                }
X        case FALSE:  
X                return (state);         /* we didn't receive a packet */
X        default:     
X                return('A');            /* unknown type, abort */
X        }
X}
X/*
X *      r f i l e
X */
Xrfile()
X{
X        int num, len;
X        if (numtry++ > MAXTRY) return('A');/* abort if too many tries */
X        switch(rpack(&len,&num,packet))        /* get packet */
X        {
X        case 'S':                            /* send-init */
X                {
X                        if (oldtry++ > MAXTRY)
X                                return('A');/* if 2 many tries, abort */
X                        if (num == n-1)     /* check packet number */
X                        {
X                                spar(packet);/* get the init params */
X                                spack('Y',num,6,packet);/* it's right, ACK it */
X                                numtry = 0;      /* reset try counter */
X                                return(state);
X                        }
X                        else return('A');      /* sorry, wrong number */
X                }
X        case 'Z':                            /* end-of-file */
X                {
X                        if (oldtry++ > MAXTRY) return('A');
X                        if (num == n-1)   /* acknowledge good packet */
X                        {
X                                spack('Y',num,0,0);
X                                numtry = 0;
X                                return(state);
X                        }
X                        else return('A'); /* or abort on bad one */
X                }
X        case 'F':                            /* file-header */
X                {
X                        if (num != n) return('A');
X                        if (!getfil(packet))
X                        {
X                                fprintf(stderr,"Could not create %s\n");
X                                return('A');
X                        }
X                        else
X                            if (!host){
X                                filch = 0;
X                                time ( &tstart );
X                                fprintf(stderr,"\t\tReceiving %s\r",packet);
X                                }
X                        spack('Y',n,0,0);   /* acknowledge */
X                        oldtry = numtry;
X                        numtry = 0;
X                        n = (n+1)%64;
X                        return('D');        /* switch to data state */
X                }
X        case 'B':                            /* break transmission */
X                {
X                        if (num != n) return ('A');
X                        spack('Y',n,0,0);   /* say OK */
X                        return('C');      /* and go to complete state */
X                }
X        case FALSE: 
X                return(state);
X        default: 
X                return ('A');
X        }
X}
X/*
X *      r d a t a
X */
Xrdata()
X{
X        int num, len;
X        if (numtry++ > MAXTRY) return('A');/* abort if too many tries */
X        switch(rpack(&len,&num,packet))        /* get packet */
X        {
X        case 'D':                            /* data */
X                {
X                        if (num != n)       /* right packet? */
X                        {                         /* no */
X                                if (oldtry++ > MAXTRY) return('A'); 
X                                /* if too many tries */
X                                if (num == n-1)/* check packet number */
X                                {
X                                        spar(packet);
X                                        /* get the init params */
X                                        spack('Y',num,6,packet);
X                                        /* ACK it */
X                                        numtry = 0;
X                                        /* reset try counter */
X                                        return(state);
X                                }
X                                else return('A');
X                                /* sorry wrong number */
X                        }
X                        /* data with right packet number */
X                        bufemp(packet,fd,len);/* write out the packet */
X                        spack('Y',n,0,0);/* right packet, acknowledge */
X                        oldtry = numtry;
X                        numtry = 0;
X                        n = (n+1)%64;
X                        return('D');     /* remain in data state */
X                }
X        case 'F':                        /* file-send */
X                {
X                        if (oldtry++ > MAXTRY) return('A');
X                        if (num == n-1)  /* acknowledge good packet */
X                        {
X                                spack('Y',num,0,0);
X                                numtry = 0;
X                                return(state);
X                        }
X                        else return('A');/* or abort on bad one */
X                }
X        case 'Z':                        /* end-of-file */
X                {
X                        if (num != n) return('A');
X                        spack('Y',n,0,0);/* say OK */
X                        time (&tstop);
X                        tstart = tstop - tstart;
X                        tstart = filch / tstart;
X                        filch = 0;
X                        if ( !host ) 
X                             fprintf ( stderr,"%d bps\n",tstart );
X                        close(fd);       /* close up the file */
X                        n = (n+1)%64;
X                        return('F');     /* and go to file state */
X                }
X        case FALSE:  
X                return(state);
X        default:     
X                return('A');
X        }
X}
TRIBBLE_EOF
ival=`wc -c receive.c`
set $ival
ival=$1
set    7392 receive.c
iam=$1
if test $ival = $iam
then echo '    sucessfull'
else echo '    failed'
fi
# this file is send.c
echo -n "Extracting file send.c   "
sed "s/^X//" << TRIBBLE_EOF > send.c
X#include "kermit.h"
X/*
X *      s e n d s w
X *
X *      Sendsw is the state table switcher for sending
X *      files.  It loops until either it finishes, or
X *      an error is encountered.  The routines called by
X *      sendsw are responsible for changing the state.
X */
Xsendsw()
X{
X        gnxtfl ();
X        state = 'S';       /* Send initiate is the start state */
X        n = 0;             /* Initialize message number */
X        numtry = 0;        /* Say no tries yet */
X        while(TRUE)        /* Do this as long as necessary */
X        {
X                switch(state)
X                {
X                case 'D':  
X                        state = sdata(); 
X                        break; /* Data-Send state */
X
X                case 'F':  
X                        state = sfile(); 
X                        break; /* File-Send */
X
X                case 'Z':  
X                        state = seof(); 
X                        time (&tstop);
X                        tstart = tstop - tstart;
X                        tstart = filch / tstart;
X                        filch = 0;
X                        if ( !host ) 
X                             fprintf ( stderr,"%d bps\n",tstart );
X                        break;  /* End-of-File */
X                case 'S':  
X                        state = sinit(); 
X                        break; /* Send-Init */
X                case 'B':  
X                        state = sbreak(); 
X                        break; /* Break-Send */
X                case 'C':  
X                        return (TRUE);          /* Complete */
X                case 'A':  
X                        return (FALSE);         /* Abort */
X                default:   
X                        return (FALSE);         /* Unknown, abort */
X                }
X        }
X}
X/*
X *      s i n i t
X */
Xsinit()
X{
X        int num, len;
X        if (debug) fprintf(stderr,"sinit\n");
X        if (numtry++ > MAXTRY) return('A');   /* If too many tries, abort */
X        spar(packet);                         /* Fill up with init info */
X        if (debug) fprintf(stderr,"n = %d\n",n);
X        spack('S',n,6,packet);                /* Send an 'S' packet */
X        switch(rpack(&len,&num,recpkt))       /* What was the reply? */
X        {
X        case 'N':                           /* NAK */
X                if (n != num--) return(state);    
X                /* If NAK for next one, like ACK */
X        case 'Y':                           /* ACK */
X                {
X                        if (n != num)       /* If wrong ACK, fail */
X                                return(state);
X                        rpar(recpkt);       /* Get the init info */
X                        if (eol == 0) /* check and set defaults */
X                                eol = MYEOL;
X                        if (quote == 0) quote = '#';
X                        numtry = 0;/* reset try counter */
X                        n = (n+1)%64;/* and bump packet count */
X                        if (debug) fprintf(stderr,"Opening %s\n",filnam);
X                        fd = open(filnam,0);/* Open the file to read */
X                        if (fd < 0) return('A');
X                        /* if bad file descriptor, abort */
X                        filch = 0;
X                        time (&tstart);
X                        if (!host) fprintf(stderr,"\t\tSending %s\r",filnam);
X                        return('F');        /* switch state to F */
X                }
X        case FALSE: 
X                return(state);          /* Receive failure, fail */
X        default: 
X                return('A');               /* Just abort */
X        }
X}
X/*
X *      s f i l e
X */
Xsfile()
X{
X        int num, len;
X        if (debug) fprintf(stderr,"sfile\n");
X        if (numtry++ > MAXTRY) return('A');/* If too many tries, abort */
X        for (len=0; filnam[len] != '\0'; len++); /* count the length */
X        len++;
X        spack('F',n,len,filnam);              /* send an 'F' packet */
X        switch(rpack(&len,&num,recpkt))
X        {                                    /* What was the reply? */
X        case 'N':                           /* NAK */
X                if (n != num--) return(state);
X                /* If NAK for next pack its like ACK */
X        case 'Y':                           /* ACK */
X                {
X                        if (n != num) return(state);      
X                        /* If wrong ACK, fail */
X                        numtry = 0;           /* reset try counter */
X                        n = (n+1)%64;       /* and bump packet count */
X                        size = bufill(packet);
X                        /* get packet of data from file */
X                        return('D');      /* switch state to D */
X                }
X        case FALSE: 
X                return(state);          /* receive failure, fail */
X        default: 
X                return('A');               /* just abort */
X        }
X}
X/*
X *      s d a t a
X */
Xsdata()
X{
X        int num, len;
X        if (numtry++ > MAXTRY)            /* If too many tries, abort */
X                return('A');
X        spack('D',n,size,packet);         /* send a 'D' packet */
X        switch(rpack(&len,&num,recpkt))
X        {                                 /* What was the reply */
X        case 'N':                         /* NAK */
X                if (n != num--) return(state);
X                /* If NAK for next pack, like ACK */
X        case 'Y':                           /* ACK */
X                {
X                        if (n != num) return(state);
X                        /* If wrong ACK, fail */
X                        numtry = 0;  /* reset try counter */
X                        n = (n+1)%64;/* and bump packet count */
X                        if ((size = bufill(packet)) == EOF) 
X                                /* get the data from file */
X                                return('Z');/* if EOF set state to it */
X                        return('D');        /* switch state to 'D' */
X                }
X        case FALSE: 
X                return(state);          /* receive failure, fail */
X        default: 
X                return('A');               /* just abort */
X        }
X}
X/*
X *      s e o f
X */
Xseof()
X{
X        int num, len;
X        if (debug) fprintf(stderr,"seof\n");
X        if (numtry++ > MAXTRY) return('A');   /* If too many tries, abort */
X        spack('Z',n,0,packet);                /* Send a 'Z' packet */
X        if (debug) fprintf(stderr,"seof1 ");
X        switch(rpack(&len,&num,recpkt))
X        {                                    /* What was the reply? */
X        case 'N':                           /* NAK */
X                if (n != num--) return(state);    /* If NAK for next pkt, like ACK */
X        case 'Y':                           /* ACK */
X                {
X                        if (debug) fprintf(stderr,"seof2 ");
X                        if (n != num)                     /* if wrong ACK, fail */
X                                return(state);
X                        numtry = 0;                       /* reset try counter */
X                        /* n = (n+1)%64;                  /* and bump packet count */
X                        if (debug) fprintf(stderr,"closing %s, ",filnam);
X                        close(fd);                        /* close the input file */
X                        if (debug) fprintf(stderr,"ok, getting next file\n");
X                        if (gnxtfl() == FALSE)            /* No more files go? */
X                        {
X                                n = (n+1)%64;
X                                return('B');                    /* if not, break */
X                        }
X                        if (debug) fprintf(stderr,"new file is %s\n",filnam);
X                        return('S');                      /* switch state to F */
X                }
X        case FALSE: 
X                return(state);          /* Receive failure, fail */
X        default: 
X                return('A');               /* just abort */
X        }
X}
X/*
X *      s b r e a k
X */
Xsbreak()
X{
X        int num, len;
X        if (debug) fprintf(stderr,"sbreak\n");
X        if (numtry++ > MAXTRY)                /* If too many tries abort */
X                return('A');
X        spack('B',n,0,packet);                /* Send a B packet */
X        switch (rpack(&len,&num,recpkt))
X        {                                    /* What was the reply? */
X        case 'N':                           /* NAK */
X                if (n != num--) return(state);    /* If NAK for next pack, */
X                /*  it's like ACK */
X        case 'Y':                           /* ACK */
X                {
X                        if (n != num) return(state);      /* If wrong ACK, fail */
X                        numtry = 0;                       /* reset try counter */
X                        n = (n+1)%64;                     /* and bump packet count */
X                        return('C');                      /* switch state to C */
X                }
X        case FALSE: 
X                return(state);          /* receive failure, fail */
X        default: 
X                return ('A');              /* just abort */
X        }
X}
TRIBBLE_EOF
ival=`wc -c send.c`
set $ival
ival=$1
set    9142 send.c
iam=$1
if test $ival = $iam
then echo '    sucessfull'
else echo '    failed'
fi
# this file is utils.c
echo -n "Extracting file utils.c   "
sed "s/^X//" << TRIBBLE_EOF > utils.c
X#include "kermit.h"
X/*
X *      Various KERMIT utilities.
X */
Xclkint()                    /* timer interrupt handler */
X{
X        longjmp(env,TRUE);  /* tell rpack to give up */
X}
Xquit()                      /* panic interrupt handler */
X{
X        ioctl(0,TIOCSETP,&cookedmode);
X        printf("\n");
X        exit();
X}
X/* tochar converts a control character 
Xto a printable one by adding a space */
Xchar tochar(ch)
Xchar ch;
X{
X        return(ch + ' ');             /* make sure not a control char */
X}
X/* unchar undoes tochar */
Xchar unchar(ch)
Xchar ch;
X{
X        return(ch - ' ');             /* restore char */
X}
X/*
X * ctl turns a control character into a printable character by toggling the
X * control bit (ie. ^A becomes A and A becomes ^A).
X */
Xchar ctl(ch)
Xchar ch;
X{
X        return(ch ^ 64);               /* toggle the control bit */
X}
X/*
X *      s p a c k
X */
Xspack(type,num,len,data)
Xchar type, *data;
Xint num, len;
X{
X        int i;
X        char chksum, buffer[100];
X        register char *bufp;
X
X        /* initialize some parameters */
X
X        bufp = buffer;
X        /* issue necessary padding */
X        for (i=1; i<=pad; i++) write(remfd,&padchar,1);
X        *bufp++ = SOH;           /* packet marker, ASCII 1 (SOH) */
X        chksum = tochar(len+3);  /* initialize the checksum */
X        *bufp++ = tochar(len+3); /* send the character count */
X        chksum = chksum + tochar(num);        /* init checksum */
X        *bufp++ = tochar(num);                /* packet number */
X        chksum = chksum + type;
X        *bufp++ = type;                       /* packet type */
X        /* loop for all data characters */
X        for (i=0; i<len; i++)
X        {
X                *bufp++ = data[i];
X                chksum = chksum+data[i];
X        }
X        chksum = (chksum + (chksum & 192) / 64) & 63;
X        *bufp++ = tochar(chksum);             /* checksum */
X        *bufp = eol;                  /* extra packet line terminator */
X        write(remfd, buffer,bufp-buffer+1);   /* send it out */
X        if (debug) putc('.',stderr);
X        if ( !host ) fprintf ( stderr , "%d\r" , filch );
X}
X/*
X *      r p a c k
X */
Xrpack(len,num,data)
Xint *len, *num;
Xchar *data;
X{
X        int i, fld;
X        char chksum, t, type;
X
X        chksum = 0;                   /* initialize checksum */
X        t = 0;                        /* initialize input char value */
X        type=i=fld=0;
X        /* set up clock interrupt */
X        if (setjmp(env))  
X                /* if clock interrupt happens, print message and fail */
X        {
X                if (debug) if (!host)
X                        fprintf(stderr,"Read timed out\n");
X                return FALSE;  /* return false if we time out */
X        }
X        signal(SIGALRM,clkint);
X        if ((timint > MAXTIM) || (timint < MINTIM)) timint = MYTIME;
X        alarm(timint);
X        while (t != SOH)
X        {
X                read(remfd,&t,1);  /* wait for packet header */
X                t = t & 0177;
X        }
X        for (fld=1; fld<=5; fld++)    /* got one, loop for each field */
X        {
X                if (fld != 5 || i != 0)
X                        /* don't get char on no data packets */
X                {
X                        read(remfd,&t,1);
X                        t = t & 0177;
X                        if (t == SOH)
X                                fld = 0;          /* resynch if SOH */
X                }
X                if (fld <= 3) chksum = chksum + t;/* accumulate checksum */
X                switch (fld)
X                {
X                case 0:    
X                        chksum = 0; 
X                        break;      /* restart loop */
X                case 1:    
X                        *len = unchar(t)-3; 
X                        break; /* character count */
X                case 2:    
X                        *num = unchar(t); 
X                        break; /* packet number */
X                case 3:    
X                        type = t; 
X                        break;        /* packet type */
X                case 4:    
X                        for (i=0; i<*len; i++)
X                        {
X                                if (i != 0)
X                                {
X                                        read(remfd,&t,1);
X                                        t = t & 0177;
X                                        if (t == SOH)  /* get a char */
X                                        {
X                                                fld = -1;
X                                                break;
X                                        }
X                                }
X                                chksum = chksum + t;/* add it to checksum */
X                                data[i] = t;        /* normal character */
X                        }
X                        data[*len] = 0;
X
X                case 5:    
X                        chksum = (chksum + (chksum & 192) / 64) & 63;
X                        break;
X                }
X        }
X
X        alarm(0);                  /* disable the timer interrupt */
X        /* check the checksum */
X        if (chksum != unchar(t))
X        {
X                printf("Kermit: bad checksum %c, should be %c\n",
X                t,tochar(chksum));
X                return(FALSE);
X        }
X        return(type); /* return packet type */
X}
X/*
X *      b u f i l l
X */
Xbufill(buffer)
Xchar buffer[];
X{
X        int i;
X        char t;
X        i = 0;                   /* init data buffer pointer */
X        while(read(fd,&t,1) > 0) /* get the next character */
X        {
X                t = t & 0177;
X                filch++;
X                if (t<SP || t==DEL || t==quote)
X                {
X                        if (t=='\n') /* if newline, squeeze CR in first */
X                        {
X                                buffer[i++] = quote;
X                                buffer[i++] = ctl('\r');
X                        }
X                        buffer[i++] = quote;
X                        if (t != quote) t=ctl(t);
X                }
X                buffer[i++] = t;
X                if (i >= spsiz-8) return(i);
X        }
X        if (i==0) return(EOF);  /* wind up here only on EOF */
X        return(i);              /*  so the partial buffer isn't lost */
X}
X/*
X *      b u f e m p
X */
Xbufemp(buffer,fd,len)
Xchar buffer[];
Xint fd, len;
X{
X        int i;
X        char t;
X        for (i=0; i<len; i++)
X        {
X                t = buffer[i];
X                if (t == MYQUOTE)    /* handle quoted characters */
X                {
X                        t = buffer[++i];/* get the quoted character */
X                        if (t != MYQUOTE) t = ctl(t);/* decontrolify it */
X                }
X                if (t != 015)           /* don't pass CR */
X                        {
X                        filch++;
X                        write(fd,&t,1); /* put the char in the file */
X                        }
X        }
X}
X/*
X *      g e t f i l
X */
Xgetfil(filenm)
Xchar *filenm;
X{
X        if (filenm[0] == '\0')
X                fd = creat(packet,0644);/* if filename known, use it */
X        else
X            fd = creat(filenm,0644);/* else use sourcefile name */
X        return (fd > 0);           /* return false if file won't open */
X}
X/*
X *      g n x t f l
X */
Xgnxtfl()
X{
X        if (debug) fprintf(stderr, "gnxtfl\n");
X        filnam = *(filelist++);
X        if (filnam == 0) return FALSE;
X        else return TRUE;
X}
X/* spar fills the data array with appropriate send-init paramaters */
Xspar(data)
Xchar data[];
X{
X        data[0] = tochar(MAXPACK);  /* biggest packet I can receive */
X        data[1] = tochar(MYTIME);   /* when I want to be timed out */
X        data[2] = tochar(MYPAD);    /* how much padding I need */
X        data[3] = ctl(MYPCHAR);     /* padding character I want */
X        data[4] = tochar(MYEOL);    /* end-of-line character I want */
X        data[5] = MYQUOTE;          /* quote character I send */
X}
X/* rpar gets the other host's send-init parameters */
Xrpar(data)
Xchar data[];
X{
X        spsiz = unchar(data[0]);  /* maximum send packet size */
X        timint = unchar(data[1]); /* when I should time out */
X        pad = unchar(data[2]);    /* number of pads to send */
X        padchar = ctl(data[3]);   /* padding character to send */
X        eol = unchar(data[4]);    /* EOL character I must send */
X        quote = data[5];          /* incoming data quote char */
X}
TRIBBLE_EOF
ival=`wc -c utils.c`
set $ival
ival=$1
set    8361 utils.c
iam=$1
if test $ival = $iam
then echo '    sucessfull'
else echo '    failed'
fi