[comp.os.minix] What to do with rs232 on Minix-ST

hcj@lzaz.ATT.COM (HC Johnson) (12/23/88)

OK, now that I have rs232 working on Minix-ST what can I do with it?

Anyone have sources for XMODEM, YMODEM , or anyother MODEM ?
How about Kermit sources?
UUCP anyone?

Howard Johnson
ATT-BL
lzaz!hcj

glenne@hpnmdla.HP.COM (Glenn Elmore) (12/28/88)

>OK, now that I have rs232 working on Minix-ST what can I do with it?

Howard, 
  How about the KA9Q TCP/IP package? there are MIDI and AUX drivers.
How fast is supported? The package has Telnet, SMTP and FTP as well
as finger on the newer versions...

Glenn Elmore -N6GN-

N6GN @ N6IIU-1
glenn@n6gn.norcal.ampr
glenne@hpnmd.hp.com 

muller@munnari.oz (Paul Muller) (12/31/88)

I have the sources (as, I imagine, would many others) to X/YMODEM, SEAlink,
and one or two others that elude me at the moment. I also have a few uucp
sources here, one sould compile for V7, has Andy seen any? I was surprised
to find that one wan't included when I first read his book.
If anyone is really interested I may be able to organise an anonymous ft or
a posting.
4 hours until 1989, if '88 was the year of networking and Unix, what will
'89 be like, AARRRRRRRGGGGGGGGGGGGGHHHHHHHHHHHHHHH!
I think I'll just get drunk......
Byeeeee,
Paul.

ast@cs.vu.nl (Andy Tanenbaum) (01/04/89)

In article <2625@munnari.oz> muller@munnari.oz (Paul Muller) writes:
>I have the sources (as, I imagine, would many others) to X/YMODEM, SEAlink,
>and one or two others that elude me at the moment. I also have a few uucp
>sources here, one sould compile for V7, has Andy seen any? I was surprised
>to find that one wan't included when I first read his book.

I haven't seen any.  The reason I didn't mention X/YMODEM in the book probably
has to do with the fact that I don't have the foggiest idea of what 
(it is)/(they are).  I know about uucp, kermit, X.25, 802, and OSI.  Does this
supersede any of these?  I hope it supersedes OSI, because that is the one
most in need of being superseded.  For MINIX, I suspect kermit is going to be
the standard file transfer mechanism (other than the Amoeba networking for
people with Ethernets).  Kermit is available on all known machines, and the
MINIX version seems pretty stable and reasonably efficient.

Andy Tanenbaum (ast@cs.vu.nl)

muller@munnari.oz (Paul Muller) (01/04/89)

Here is the source (hopefully compatible with V7, can't check yet) for an
XMODEM protocol driver. Can someone please send me feedback as to whether
or not it works? I think it should run faster than KERMIT, but it requires
8,N,1 line settings, good luck.
I hope that the code illustrates the idea of XMODEM to you Andy. Any further
info reqd?
yours,
pm
(muller@munnari.oz)

---------------------------start---------------------------------
/*
 *  XMODEM -- Implements the Christensen XMODEM protocol, 
 *            for packetized file up/downloading.    
 *
 *        I have tried to keep the 4.2isms (select system call, 4.2BSD/v7 tty
 *        structures, gettimeofday system call, etc.) in the source file
 *        getput.c; but I make no guarantees.  Also, I have made no attempt to
 *        keep variable names under 7 characters (although a cursory check
 *        shows that all variables are unique within 7 first characters).
 *        See the README file for some notes on SYS V adaptations.
 *        The program has been successfully run on VAXes (4.3BSD) and SUN-3s
 *        (2.x/3.x) against MEX-PC and ZCOMM/DSZ.
 *
 *   -- Based on UMODEM 3.5 by Lauren Weinstein, Richard Conn, and others.
 *
 *  XMODEM Version 1.0  - by Brian Kantor, UCSD (3/84)
 *
 *  Version 2.0 (CRC-16 and Modem7 batch file transfer) -- Steve Grandi, NOAO (5/85)
 *
 *  Version 2.1 (1K packets) -- Steve Grandi, NOAO (7/85)
 *
 *  Version 2.2 (general clean-ups and multi-character read speed-ups) -- Steve Grandi, NOAO (9/85)
 *
 *  Version 2.3 (napping while reading packet; split into several source files) -- Steve Grandi, NOAO (1/86)
 *
 *  Version 3.0 (Ymodem batch receive; associated changes) -- Steve Grandi, NOAO (2/86)
 *
 *  Version 3.1 (Ymodem batch send; associated changes) -- Steve Grandi, NOAO (8/86)
 *
 *  Version 3.2 (general cleanups) -- Steve Grandi, NOAO (9/86)
 *
 *  Released to the world (1/87)
 *
 *  Version 3.3 (see update.doc) -- Steve Grandi, NOAO (5/87)
 *
 *  Version 3.4 (see update.doc) -- Steve Grandi, NOAO (10/87)
 *
 *  Released to the world (1/88)
 *
 *  Please send bug fixes, additions and comments to:
 *        {ihnp4,hao}!noao!grandi   grandi@noao.arizona.edu
 */
 
#include "xmodem.h"
 
main(argc, argv)
int argc;
char **argv;
{
        char *getenv();
        FILE *fopen();
        char *unix_cpm();
        char *strcpy();
        char *strcat();
        
        char *fname = filename;                /* convenient place to stash file names */
        char *logfile = "xmodem.log";        /* Name of LOG File */
        
        char *stamptime();                /* for timestamp */
 
        char *defname = "xmodem.in";        /* default file name if none given */
 
        struct stat filestatbuf;        /* file status info */
 
        int index;
        char flag;
        long expsect;
 
        /* initialize option flags */
 
        XMITTYPE = 't';                /* assume text transfer */
        DEBUG = FALSE;                /* keep debugging info in log */
        RECVFLAG = FALSE;        /* not receive */
        SENDFLAG = FALSE;        /* not send either */
        BATCH = FALSE;                /* nor batch */
        CRCMODE = FALSE;        /* use checksums for now */
        DELFLAG = FALSE;        /* don't delete old log file */
        LOGFLAG = TRUE;                /* keep log */
        LONGPACK = FALSE;         /* do not use long packets on transmit */
        MDM7BAT = FALSE;        /* no MODEM7 batch mode */
        YMDMBAT = FALSE;        /* no YMODEM batch mode */
        TOOBUSY = FALSE;        /* not too busy for sleeping in packet read */
 
        printf("XMODEM Version %d.%d", VERSION/10, VERSION%10);
        printf(" -- UNIX-Microcomputer Remote File Transfer Facility\n");
 
        if (argc == 1)
                {
                help();
                exit(-1);
                }
 
        index = 0;                /* set index for flag loop */
 
        while ((flag = argv[1][index++]) != '\0')
            switch (flag) {
                case '-' : break;
                case 'X' :
                case 'x' : DEBUG = TRUE;  /* turn on debugging log */
                           break;
                case 'C' :
                case 'c' : CRCMODE = TRUE; /* enable CRC on receive */
                           break;
                case 'D' :
                case 'd' : DELFLAG = TRUE;  /* delete log file */
                           break;
                case 'L' :
                case 'l' : LOGFLAG = FALSE;  /* turn off log  */
                           break;
                case 'm' :
                case 'M' : MDM7BAT = TRUE;  /* turn on MODEM7 batch protocol */
                           BATCH   = TRUE;
                           break;
                case 'y' :
                case 'Y' : YMDMBAT = TRUE;  /* turn on YMODEM batch protocol */
                           BATCH   = TRUE;
                           break;
                case 'k' :
                case 'K' : LONGPACK = TRUE;  /* use 1K packets on transmit */
                           break;
                case 't' :
                case 'T' : TOOBUSY = TRUE;  /* turn off sleeping */
                           break;
                case 'R' :
                case 'r' : RECVFLAG = TRUE;  /* receive file */
                           XMITTYPE = gettype(argv[1][index++]);  /* get t/b */
                           break;
                case 'S' :
                case 's' : SENDFLAG = TRUE;  /* send file */
                           XMITTYPE = gettype(argv[1][index++]);
                           break;
                default  : printf ("Invalid Flag %c ignored\n", flag);
                           break;
           }
 
        if (DEBUG)
                LOGFLAG = TRUE;
 
        if (LOGFLAG)
           { 
             if ((fname = getenv("HOME")) == 0)        /* Get HOME variable */
                error("Fatal - Can't get Environment!", FALSE);
             fname = strcat(fname, "/");
             fname = strcat(fname, logfile);
             if (!DELFLAG)
                LOGFP = fopen(fname, "a");  /* append to LOG file */
             else
                LOGFP = fopen(fname, "w");  /* new LOG file */
             if (!LOGFP)
                error("Fatal - Can't Open Log File", FALSE);
 
             fprintf(LOGFP,"\n++++++++  %s", stamptime());
             fprintf(LOGFP,"XMODEM Version %d.%d\n", VERSION/10, VERSION%10);
             fprintf(LOGFP,"Command line: %s %s", argv[0], argv[1]);
             for (index=2; index<argc; ++index)
                fprintf(LOGFP, " %s", argv[index]);
             fprintf(LOGFP, "\n");
           }
 
        getspeed();                /* get tty-speed for time estimates */
 
        if (RECVFLAG && SENDFLAG)
                error("Fatal - Both Send and Receive Functions Specified", FALSE);
 
        if (MDM7BAT && YMDMBAT)
                error("Fatal - Both YMODEM and MODEM7 Batch Protocols Specified", FALSE);
 
        if (!RECVFLAG && !SENDFLAG)
                error("Fatal - Either Send or Receive Function must be chosen!",FALSE);
        
        if (SENDFLAG && argc==2)
                error("Fatal - No file specified to send",FALSE);
 
        if (RECVFLAG && argc==2)
                {
                /* assume we really want CRC-16 in batch, unless we specify MODEM7 mode */ 
                CRCMODE = MDM7BAT ? FALSE : TRUE;
                printf("Ready for BATCH RECEIVE");
                printf(" in %s mode\n", (XMITTYPE == 't') ? "text" : "binary");
                printf("Send several Control-X characters to cancel\n");
                logit("Batch Receive Started");
                logitarg(" in %s mode\n", (XMITTYPE == 't') ? "text" : "binary");
                strcpy(fname, defname);
                }
 
        if (RECVFLAG && argc>2)
                {
                if(open(argv[2], 0) != -1)  /* check for overwriting */
                        {
                        logit("Warning -- Target File Exists and is Being Overwritten\n");
                        printf("Warning -- Target File Exists and is Being Overwritten\n");
                        }
                printf("Ready to RECEIVE File %s", argv[2]);
                printf(" in %s mode\n", (XMITTYPE == 't') ? "text" : "binary");
                printf("Send several Control-X characters to cancel\n");
                logitarg("Receiving in %s mode\n", (XMITTYPE == 't') ? "text" : "binary");
                strcpy(fname,argv[2]);
                }
 
        if (RECVFLAG)
                {  
                setmodes();                /* set tty modes for transfer */
 
                while(rfile(fname) != FALSE);  /* receive files */
 
                restoremodes(FALSE);        /* restore normal tty modes */
 
                sleep(2);                /* give other side time to return to terminal mode */
                exit(0);
                }
 
        if (SENDFLAG && BATCH) 
                {
                if (YMDMBAT)
                        {
                        printf("Ready to YMODEM BATCH SEND");
                        printf(" in %s mode\n", (XMITTYPE == 't') ? "text" : "binary");
                        logit("YMODEM Batch Send Started");
                        logitarg(" in %s mode\n", (XMITTYPE == 't') ? "text" : "binary");
                        }
                else if (MDM7BAT)
                        {
                        printf("Ready to MODEM7 BATCH SEND");
                        printf(" in %s mode\n", (XMITTYPE == 't') ? "text" : "binary");
                        logit("MODEM7 Batch Send Started");
                        logitarg(" in %s mode\n", (XMITTYPE == 't') ? "text" : "binary");
                        }
                printf("Send several Control-X characters to cancel\n");
 
                setmodes();
                for (index=2; index<argc; index++) {
                        if (stat(argv[index], &filestatbuf) < 0) {
                                logitarg("\nFile %s not found\n", argv[index]);
                                continue;
                        }
                        sfile(argv[index]);
                }
                sfile("");
                restoremodes(FALSE);
 
                logit("Batch Send Complete\n");
                sleep(2);
                exit (0);
                }
 
        if (SENDFLAG && !BATCH) 
                {
                if (stat(argv[2], &filestatbuf) < 0)
                        error("Can't find requested file", FALSE);
                expsect = (filestatbuf.st_size/128)+1;
                        
                printf("File %s Ready to SEND", argv[2]);
                printf(" in %s mode\n", (XMITTYPE == 't') ? "text" : "binary");
                printf("Estimated File Size %ldK, %ld Sectors, %ld Bytes\n",
                      (filestatbuf.st_size/1024)+1, expsect,
                    filestatbuf.st_size);
                projtime(expsect, stdout);
                printf("Send several Control-X characters to cancel\n");
                logitarg("Sending in %s mode\n", (XMITTYPE == 't') ? "text" : "binary");
 
                setmodes();
                sfile(argv[2]);
                restoremodes(FALSE);
 
                sleep(2);
                exit(0);
                }
}
 
#include <ctype.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sgtty.h>
#include <signal.h>
 
/* define macros to print messages in log file */
#define  logit(string) if(LOGFLAG)fprintf(LOGFP,string)
#define  logitarg(string,argument) if(LOGFLAG)fprintf(LOGFP,string,argument)
 
#define             VERSION        34        /* Version Number */
#define      FALSE      0
#define      TRUE       1
 
 
/*  ASCII Constants  */
#define      SOH          001 
#define             STX        002
#define             ETX        003
#define      EOT        004
#define             ENQ        005
#define      ACK          006
#define             LF                012   /* Unix LF/NL */
#define             CR                015  
#define      NAK          025
#define             SYN        026
#define             CAN        030
#define             ESC        033
 
/*  XMODEM Constants  */
#define      TIMEOUT          -1
#define      ERRORMAX          10    /* maximum errors tolerated while transferring a packet */
#define      WAITFIRST  1     /* seconds between startup characters in read */
#define      STERRORMAX        60    /* maximum "errors" tolerated in read startup */
#define      CRCSWMAX        30    /* maximum time to try CRC mode before switching */
#define      NAKMAX        120   /* maximum times to wait for initial NAK when sending */
#define      RETRYMAX          5     /* maximum retries to be made certain handshaking routines */
#define      KSWMAX        5     /* maximum errors before switching to 128 byte packets */
#define      EOTMAX        10    /* maximum times sender will send an EOT to end transfer */
#define      SLEEPNUM        100   /* target number of characters to collect during sleepy time */
#define             BBUFSIZ        1024  /* buffer size */
#define      NAMSIZ        11    /* length of a CP/M file name string */
#define             CTRLZ        032   /* CP/M EOF for text (usually!) */
#define      CRCCHR        'C'   /* CRC request character */
#define      KCHR        'K'   /* 1K block request character */
#define      BAD_NAME        'u'   /* Bad filename indicator */
 
#define      CREATMODE        0644  /* mode for created files */
 
/* GLOBAL VARIABLES */
 
int ttyspeed;                /* tty speed (bits per second) */
unsigned char buff[BBUFSIZ];        /* buffer for data */
int nbchr;                /* number of chars read so far for buffered read */
long filelength;        /* length specified in YMODEM header */
long fileread;                /* characters actually read so far in file */
char filename[256];        /* place to construct filenames */
FILE *LOGFP;                /* descriptor for LOG file */
 
/* option flags and state variables */
char        XMITTYPE;        /* text or binary? */
int        DEBUG;                /* keep debugging info in log? */
int        RECVFLAG;        /* receive? */
int        SENDFLAG;        /* send? */
int        BATCH;                /* batch? (Now used as a state variable) */
int        CRCMODE;        /* CRC or checksums? */
int        DELFLAG;        /* don't delete old log file? */
int        LOGFLAG;        /* keep log? */
int        LONGPACK;         /* do not use long packets on transmit? */
int        MDM7BAT;        /* MODEM7 batch protocol */
int        YMDMBAT;        /* YMODEM batch protocol */
int        TOOBUSY;        /* turn off sleeping in packet read routine */
int        CHECKLENGTH;        /* Are we truncating a file to a YMODEM length? */
 
 
/*   CRC-16 constants.  From Usenet contribution by Mark G. Mendel, 
     Network Systems Corp.  (ihnp4!umn-cs!hyper!mark)
*/
 
    /* the CRC polynomial. */
#define        P        0x1021
 
    /* number of bits in CRC */
#define W        16
 
    /* the number of bits per char */
#define B        8
----------------------------------------------------------------
the xmodem.h file is contained within the file. I just unpacked
the file straight to the serial port, so I hadn't
time to play format niceties, sorry.