1: char *versio = "C-Kermit, 4C(057) 31 Jul 85"; 2: 3: /* C K C M A I -- C-Kermit Main program */ 4: 5: /* 6: Authors: Frank da Cruz, Bill Catchings, Jeff Damens; 7: Columbia University Center for Computing Activities, 1984-85. 8: Copyright (C) 1985, Trustees of Columbia University in the City of New York. 9: Permission is granted to any individual or institution to use, copy, or 10: redistribute this software so long as it is not sold for profit, provided this 11: copyright notice is retained. 12: */ 13: /* 14: The Kermit file transfer protocol was developed at Columbia University. 15: It is named after Kermit the Frog, star of the television series THE 16: MUPPET SHOW; the name is used by permission of Henson Associates, Inc. 17: "Kermit" is also Celtic for "free". 18: */ 19: /* 20: Thanks to Herm Fischer of Encino CA for extensive contributions to version 4, 21: and to the following people for their contributions over the years: 22: 23: Larry Afrin, Clemson U 24: Charles Brooks, EDN 25: Bob Cattani, Columbia CS Dept 26: Alan Crosswell, CUCCA 27: Carl Fongheiser, CWRU 28: Yekta Gursel, MIT 29: Jim Guyton, Rand Corp 30: Stan Hanks, Rice U. 31: Ken Harrenstein, SRI 32: Steve Hemminger, Tektronix 33: Randy Huntziger, NLM 34: Chris Maio, Columbia CS Dept 35: Martin Minow, DEC 36: Tony Movshon, NYU 37: Ken Poulton, HP Labs 38: Frank Prindle, NADC 39: Stew Rubenstein, Harvard 40: Dan Schullman, DEC 41: Bradley Smith, UCLA 42: Dave Tweten, AMES-NAS 43: Walter Underwood, Ford Aerospace 44: Pieter Van Der Linden, Centre Mondial (Paris) 45: Mark Vasoll & Gregg Wonderly, Oklahoma State University 46: Lauren Weinstein, Vortex 47: 48: and many others. 49: */ 50: 51: #include "ckcker.h" 52: #include "ckcdeb.h" 53: 54: /* Text message definitions.. each should be 256 chars long, or less. */ 55: #ifdef MAC 56: char *hlptxt = "C-Kermit Server Commands:\n\ 57: \n\ 58: GET filespec, SEND filespec, FINISH, REMOTE HELP\n\ 59: \n\0"; 60: #else 61: char *hlptxt = "C-Kermit Server Commands Supported:\n\ 62: \n\ 63: GET filespec REMOTE CWD [directory] REMOTE SPACE [directory]\n\ 64: SEND filespec REMOTE DIRECTORY [filespec] REMOTE HOST command\n\ 65: FINISH REMOTE DELETE filespec REMOTE WHO [user]\n\ 66: REMOTE HELP REMOTE TYPE filespec BYE\n\ 67: \n\0"; 68: #endif 69: char *srvtxt = "\r\n\ 70: C-Kermit server starting. Return to your local machine by typing\r\n\ 71: its escape sequence for closing the connection, and issue further\r\n\ 72: commands from there. To shut down the C-Kermit server, issue the\r\n\ 73: FINISH or BYE command and then reconnect.\n\ 74: \r\n\0"; 75: 76: /* Declarations for Send-Init Parameters */ 77: 78: int spsiz = DSPSIZ, /* Biggest packet size we can send */ 79: spsizf = 0, /* Flag to override what you ask for */ 80: rpsiz = DRPSIZ, /* Biggest we want to receive */ 81: timint = DMYTIM, /* Timeout interval I use */ 82: rtimo = URTIME, /* Timeout I want you to use */ 83: timef = 0, /* Flag to override what you ask */ 84: npad = MYPADN, /* How much padding to send */ 85: mypadn = MYPADN, /* How much padding to ask for */ 86: chklen = 1, /* Length of block check */ 87: bctr = 1, /* Block check type requested */ 88: bctu = 1, /* Block check type used */ 89: ebq = MYEBQ, /* 8th bit prefix */ 90: ebqflg = 0, /* 8th-bit quoting flag */ 91: rpt = 0, /* Repeat count */ 92: rptq = MYRPTQ, /* Repeat prefix */ 93: rptflg = 0, /* Repeat processing flag */ 94: capas = 0; /* Capabilities */ 95: 96: CHAR padch = MYPADC, /* Padding character to send */ 97: mypadc = MYPADC, /* Padding character to ask for */ 98: seol = MYEOL, /* End-Of-Line character to send */ 99: eol = MYEOL, /* End-Of-Line character to look for */ 100: ctlq = CTLQ, /* Control prefix in incoming data */ 101: myctlq = CTLQ; /* Outbound control character prefix */ 102: 103: 104: /* Packet-related variables */ 105: 106: int pktnum = 0, /* Current packet number */ 107: prvpkt = -1, /* Previous packet number */ 108: sndtyp, /* Type of packet just sent */ 109: size, /* Current size of output pkt data */ 110: osize, /* Previous output packet data size */ 111: maxsize, /* Max size for building data field */ 112: spktl; /* Length packet being sent */ 113: 114: CHAR sndpkt[MAXPACK*2], /* Entire packet being sent */ 115: recpkt[RBUFL], /* Packet most recently received */ 116: data[MAXPACK+4], /* Packet data buffer */ 117: srvcmd[MAXPACK*2], /* Where to decode server command */ 118: *srvptr, /* Pointer to above */ 119: mystch = SOH, /* Outbound packet-start character */ 120: stchr = SOH; /* Incoming packet-start character */ 121: 122: /* File-related variables */ 123: 124: CHAR filnam[50]; /* Name of current file. */ 125: 126: int nfils; /* Number of files in file group */ 127: long fsize; /* Size of current file */ 128: 129: /* Communication line variables */ 130: 131: CHAR ttname[50]; /* Name of communication line. */ 132: 133: int parity, /* Parity specified, 0,'e','o',etc */ 134: flow, /* Flow control, 1 = xon/xoff */ 135: speed = -1, /* Line speed */ 136: turn = 0, /* Line turnaround handshake flag */ 137: turnch = XON, /* Line turnaround character */ 138: duplex = 0, /* Duplex, full by default */ 139: escape = 034, /* Escape character for connect */ 140: delay = DDELAY, /* Initial delay before sending */ 141: mdmtyp = 0; /* Modem type (initially none) */ 142: 143: 144: /* Statistics variables */ 145: 146: long filcnt, /* Number of files in transaction */ 147: flci, /* Characters from line, current file */ 148: flco, /* Chars to line, current file */ 149: tlci, /* Chars from line in transaction */ 150: tlco, /* Chars to line in transaction */ 151: ffc, /* Chars to/from current file */ 152: tfc; /* Chars to/from files in transaction */ 153: 154: int tsecs; /* Seconds for transaction */ 155: 156: /* Flags */ 157: 158: int deblog = 0, /* Flag for debug logging */ 159: pktlog = 0, /* Flag for packet logging */ 160: seslog = 0, /* Session logging */ 161: tralog = 0, /* Transaction logging */ 162: displa = 0, /* File transfer display on/off */ 163: stdouf = 0, /* Flag for output to stdout */ 164: xflg = 0, /* Flag for X instead of F packet */ 165: hcflg = 0, /* Doing Host command */ 166: fncnv = 1, /* Flag for file name conversion */ 167: binary = 0, /* Flag for binary file */ 168: savmod = 0, /* Saved file mode */ 169: warn = 0, /* Flag for file warning */ 170: quiet = 0, /* Be quiet during file transfer */ 171: local = 0, /* Flag for external tty vs stdout */ 172: server = 0, /* Flag for being a server */ 173: cnflg = 0, /* Connect after transaction */ 174: cxseen = 0, /* Flag for cancelling a file */ 175: czseen = 0, /* Flag for cancelling file group */ 176: keep = 0; /* Keep incomplete files */ 177: 178: /* Variables passed from command parser to protocol module */ 179: 180: char parser(); /* The parser itself */ 181: char sstate = 0; /* Starting state for automaton */ 182: char *cmarg = ""; /* Pointer to command data */ 183: char *cmarg2 = ""; /* Pointer to 2nd command data */ 184: char **cmlist; /* Pointer to file list in argv */ 185: 186: /* Miscellaneous */ 187: 188: char **xargv; /* Global copies of argv */ 189: int xargc; /* and argc */ 190: 191: extern char *dftty; /* Default tty name from ckx???.c */ 192: extern int dfloc; /* Default location: remote/local */ 193: extern int dfprty; /* Default parity */ 194: extern int dfflow; /* Default flow control */ 195: 196: /* M A I N -- C-Kermit main program */ 197: 198: main(argc,argv) int argc; char **argv; { 199: 200: char *strcpy(); 201: 202: /* Do some initialization */ 203: 204: xargc = argc; /* Make global copies of argc */ 205: xargv = argv; /* ...and argv. */ 206: sstate = 0; /* No default start state. */ 207: strcpy(ttname,dftty); /* Set up default tty name. */ 208: local = dfloc; /* And whether it's local or remote. */ 209: parity = dfprty; /* Set initial parity, */ 210: flow = dfflow; /* and flow control. */ 211: sysinit(); /* And any system-dependent things. */ 212: 213: /* Look for a UNIX-style command line... */ 214: 215: if (argc > 1) { /* Command line arguments? */ 216: sstate = cmdlin(); /* Yes, parse. */ 217: if (sstate) { 218: proto(); /* Take any requested action, then */ 219: if (!quiet) conoll(""); /* put cursor back at left margin, */ 220: if (cnflg) conect(); /* connect if requested, */ 221: doexit(GOOD_EXIT); /* and then exit with status 0. */ 222: } 223: } 224: 225: /* If no action requested on command line, enter interactive parser */ 226: 227: cmdini(); /* Initialize command parser */ 228: while(sstate = parser()) { /* Loop getting commands. */ 229: if (sstate) proto(); /* Enter protocol if requested. */ 230: } 231: }