/* * os9ker.c Os9 kermit main program */ #define EXTERN /* global variables are actually declared here */ #include "os9inc.h" /* * K e r m i t File Transfer Utility * * UNIX Kermit, Columbia University, 1981, 1982, 1983 * Bill Catchings, Bob Cattani, Chris Maio, Frank da Cruz, Alan Crosswell * * Also: Jim Guyton, Rand Corporation * Walter Underwood, Ford Aerospace * Glenn Seaton, Kennedy Space Center * Bradley Bosch, * Robert Larson, U. of Southern California * James Jones * * * usage: kermit c [lbe line baud escapechar] to connect * kermit s [d..iflb line baud] file ... to send files * kermit r [d..iflb line baud] to receive files * * where c=connect, s=send, r=receive, * d=debug, i=image mode, f=no filename conversion, l=tty line, * b=baud rate, e=escape char. * * For remote Kermit, format is either: * kermit r to receive files * or kermit s file ... to send files * */ /* * OS-9 Version and differences * kermit s[ifdl] path filename is send format * OS-9 version has time-out on rx data of MAXTRY * if not server "W"ait mode. * * Host Server command * Kermit h[idfl path] Host Server mode * Kermit g[idf]l path filename Get file from a server * Kermit q[idf]l path Tell Host Server to terminate * */ /* * Modification History: * * 07/02/85 ral Add connect command from Brad Bosch's os9 kermit * Rewrite setstat/getstat for putting in raw mode (os9raw.c) * Add flushinput call to send packet routine * Rewrite timeout code to be system independent and more * comprehensive. (routine readtimed) * Add compile switches for timeout * Add nooverlap switch for good performance on CoCo and others * (coco can't overlap disk and serial i/o, and will timeout * often if the code assumes it can. Others should overlap to * maximize performance.) * Fix problems with image vs. text. Make CRLF processing the * default, (eliminate 'u' mode) * Make lowercasing of received filenames the default * Add handling of nak and timeout in get and quit commands * Allow / in filenames sent in get command * Fix long-standing bug in receiving SOH in the middle of a * packet * Miscellaneous indentation and other coding fixes. * (Don't blame the indentation on me, someone's tab to space * converter must have done this mess.) * 06/29/85 ral Split into smaller separately compilable files, * move #defines, #includes, and global variables to os9inc.h * rename everything so it fits with Columbia distribution * * April 9, 1985 Move Option messages, debug show Rpack * rx cksum if bad. * Feburary 27, 1985 Defined rpack type char for OS-9/68k * December 12, 1984 fix OS-9 time-out, Server to standard * November 19, 1984 Added OS9 time-out for Rx data. W.G. Seaton * November 14, 1984 Added Host Server Mode W.G. Seaton * - Added include kermserv.c for server function * - Added include kermget.c for get function * November 9,1984 Modified for OS9 by W.G. Seaton,NASA KSC * Oct. 17 Included fixes from Alan Crosswell (CUCCA) for IBM_UTS: * - Changed MYEOL character from \n to \r. * - Change char to int in bufill so getc would return -1 on * EOF instead of 255 (-1 truncated to 8 bits) * - Added read() in rpack to eat the EOL character * - Added fflush() call in printmsg to force the output * NOTE: The last three changes are not conditionally compiled * since they should work equally well on any system. * * Added support for error packets and cleaned up the printing * routines. */ /* * m a i n * * Main routine - parse command and options, set up the * tty lines, and dispatch to the appropriate routine. */ main(argc, argv) int argc; /* Character pointers to and count of */ char **argv; /* command line arguments */ { char *ttyname, /* tty name for LINE argument */ *cp; /* char pointer */ int speed, /* speed of assigned tty, */ len, num, /* length, number */ qflg, cflg, /* GET, CONNECT flags */ rflg, sflg; /* flags for RECEIVE, SEND */ struct sgbuf insave, /* Input scf mode save */ outsave, /* Output scf mode save */ linesave; /* mode of tty line in LINE option */ if (argc < 2) usage(); /* Make sure there's a command line */ cp = *++argv; argv++; argc -= 2; /* Set up pointers to args */ /* Initialize these values and hope the first packet gets across OK */ eol = CR; /* EOL for outgoing packets */ quote = '#'; /* Standard control-quote char "#" */ pad = 0; /* No padding */ padchar = NULL; /* Use null if any padding wanted */ speed = cflg = sflg = rflg = 0; /* Turn off all parse flags */ uflg = server = qflg = gflg = hflg = 0; ttyname = 0; /* Default is remote mode */ image = FALSE; filnamcnv = TRUE; escchr = ESCCHR; /* Default escape character */ while ((*cp) != NULL) /* Parse characters in first arg. */ switch (*cp++) { case 'c': cflg++; break; /* C = Connect command */ case 's': sflg++; break; /* S = Send command */ case 'r': rflg++; break; /* R = Receive command */ case 'g': gflg++; break; /* G = Get file from server */ case 'h': hflg++; break; /* H = Host Server Command */ case 'q': qflg++; break; /* Q = tell remote Host to quit */ case 'u': uflg++; break; /* U = Unix mode file transfer */ case 'd': debug++; break; /* D = Increment debug mode count */ case 'f': filnamcnv = FALSE; break; /* F = don't do case conversion */ case 'i': image = TRUE; break; /* I = Image mode; 8-bit, no CRLF map */ case 'l': /* L = specify tty line to use */ if (argc--) ttyname = *argv++; else usage(); if (debug) printf("Line to remote host is %s\n", ttyname); break; case 'e': /* E = specify escape char */ if (argc--) escchr = **argv++; else usage(); if (debug) printf("Escape char is \"%c\"\n",escchr); break; case 'b': /* B = specify baud rate */ printmsg("Speed setting not yet implemented."); exit(1); } /* Done parsing */ /* Only one command allowed */ if ((cflg + qflg + gflg + hflg + sflg + rflg) != 1) usage(); if (ttyname) { /* LINE was specified, we operate in local mode */ ttyfd = open(ttyname, 3); /* Open the line for update */ if (ttyfd < 0) { printmsg("Cannot open %s", ttyname); exit(1); } remot = FALSE; /* Indicate we're in local mode */ } else { /* No LINE specified so we operate */ /* in remote mode (ie. controlling */ /* tty is the communications line) */ ttyfd = 0; remot = TRUE; } /* * Tell User Options and Modes Invoked. */ if (debug) { printf("Debugging level = %d\n\n", debug); if (cflg) puts("Connect command"); else if (sflg) puts("Send command"); else if (rflg) puts("Receive command"); else if (gflg) puts("Get command"); else if (hflg) puts("Host Server command"); else if (qflg) puts("Quit to Host Server command"); else if (uflg) puts("Unix file transfer Mode"); } /* Put the proper tty into the correct mode */ if (remot) { /* If remote, use controlling tty */ raw(0, &insave); /* put input in raw mode */ raw(1, &outsave); /* ditto for output */ } else { /* Local, use assigned line */ raw(ttyfd,&linesave); /* put assigned line in raw mode */ } /* All set up, now execute the command that was given. */ if (cflg) connect(); /* Connect command */ else { if (gflg) { /* Set up Get Function */ /* Get file to request */ if (argc--) filnam = *argv++; else usage(); /* Parameter error quit */ fp = NULL; /* No files open yet */ filelist = argv; /* set up list of files to request */ filecount = argc; /* Number of files to get */ getsw(); /* Initate remote Get */ } if (hflg) servsw(); /* Initate Server Mode */ if (qflg) quitsw(); /* Initate Quit mode */ if (sflg) { /* Send command */ /* Get file to send */ if (argc--) filnam = *argv++; else { if (remot){ /* restore controlling scf device */ /* modes in reverse order */ cook(1, &outsave); cook(0, &insave); } else /* restore assigned line */ cook(ttyfd, &linesave); usage(); } fp = NULL; /* Indicate no file open yet */ filelist = argv; /* Set up the rest of the file list */ filecount = argc; /* Number of files left to send */ /* Send the file(s) */ printmsg(sendsw() == FALSE ? "Send failed." : "done."); } if (rflg) { /* Receive command */ printmsg(recsw() == FALSE ? "Receive failed.": "done."); } } if (remot) { cook(1, &outsave); /* restore controlling scf modes */ cook(0, &insave); /* in reverse order */ } else cook(ttyfd, &linesave); /* restore assigned line */ }