|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.