|
|
1.1 ! root 1: char *versio = "C-Kermit, 4E(070) 29 Jan 88"; ! 2: ! 3: /* C K C M A I -- C-Kermit Main program */ ! 4: ! 5: /* ! 6: 4E, add long packet support, plus changes for Apollo and Data General ! 7: support from SAS Institute, and for Macintosh from Planning Research Corp, ! 8: plus several important bug fixes. ! 9: */ ! 10: /* ! 11: Author: Frank da Cruz, ! 12: Columbia University Center for Computing Activities (CUCCA), 1984-88. ! 13: Copyright (C) 1984, 1988, Trustees of Columbia University in the City of New ! 14: York. Permission is granted to any individual or institution to use, copy, or ! 15: redistribute this software so long as it is not sold for profit, provided this ! 16: copyright notice is retained. ! 17: */ ! 18: /* ! 19: The Kermit file transfer protocol was developed at Columbia University. ! 20: It is named after Kermit the Frog, star of the television series THE ! 21: MUPPET SHOW; the name is used by permission of Henson Associates, Inc. ! 22: "Kermit" is also Celtic for "free". ! 23: */ ! 24: /* ! 25: Thanks to Herm Fischer of Encino CA for extensive contributions to version 4, ! 26: and to the following people for their contributions over the years: ! 27: ! 28: Larry Afrin, Clemson U ! 29: Stan Barber, Rice U ! 30: Charles Brooks, EDN ! 31: Bill Catchings, formerly of CUCCA ! 32: Bob Cattani, Columbia U CS Dept ! 33: Howard Chu, U of Michigan ! 34: Bill Coalson, McDonnell Douglas ! 35: Alan Crosswell, CUCCA ! 36: Jeff Damens, formerly of CUCCA ! 37: Joe R. Doupnik, Utah State U ! 38: Glenn Everhart, RCA Labs ! 39: Carl Fongheiser, CWRU ! 40: Yekta Gursel, MIT ! 41: Jim Guyton, Rand Corp ! 42: Stan Hanks, Rice U. ! 43: Ken Harrenstein, SRI ! 44: Ron Heiby, Motorola Micromputer Division ! 45: Steve Hemminger, Tektronix ! 46: Randy Huntziger, NLM ! 47: Phil Julian, SAS Institute ! 48: Jim Knutson, U of Texas at Austin ! 49: John Kunze, UC Berkeley ! 50: David Lawyer, UC Irvine ! 51: S.O. Lidie, Lehigh U ! 52: Chris Maio, Columbia U CS Dept ! 53: Leslie Mikesall, American Farm Bureau ! 54: Martin Minow, DEC ! 55: Tony Movshon, NYU ! 56: Dan Murphy, ??? ! 57: Jim Noble, Planning Research Corporation ! 58: Paul Placeway, Ohio State U ! 59: Ken Poulton, HP Labs ! 60: Frank Prindle, NADC ! 61: Scott Ribe, ??? ! 62: Jack Rouse, SAS Institute ! 63: Stew Rubenstein, Harvard ! 64: Dan Schullman, DEC ! 65: Gordon Scott, Micro Focus, Newbury UK ! 66: David Sizeland, U of London Medical School ! 67: Bradley Smith, UCLA ! 68: Markku Toijala, Helsinki U of Technology ! 69: Dave Tweten, AMES-NAS ! 70: Walter Underwood, Ford Aerospace ! 71: Pieter Van Der Linden, Centre Mondial (Paris) ! 72: Wayne Van Pelt, GE/CRD ! 73: Mark Vasoll & Gregg Wonderly, Oklahoma State University ! 74: Stephen Walton, Ametek Computer ! 75: Lauren Weinstein ! 76: Joachim Wiesel, U of Karlsruhe ! 77: Dave Woolley, CAP Communication Systems, London ! 78: ! 79: and many others. ! 80: */ ! 81: ! 82: #include "ckcsym.h" /* Macintosh needs this */ ! 83: #include "ckcker.h" ! 84: #include "ckcdeb.h" ! 85: ! 86: /* Text message definitions.. each should be 256 chars long, or less. */ ! 87: #ifdef MAC ! 88: char *hlptxt = "\r\ ! 89: MacKermit Server Commands:\r\ ! 90: \r\ ! 91: BYE\r\ ! 92: FINISH\r\ ! 93: GET filespec\r\ ! 94: REMOTE CWD directory\r\ ! 95: REMOTE HELP\r\ ! 96: SEND filespec\r\ ! 97: \r\0"; ! 98: #else ! 99: #ifdef AMIGA ! 100: char *hlptxt = "C-Kermit Server Commands:\n\ ! 101: \n\ ! 102: GET filespec, SEND filespec, FINISH, BYE, REMOTE HELP\n\ ! 103: \n\0"; ! 104: #else ! 105: char *hlptxt = "C-Kermit Server REMOTE Commands:\n\ ! 106: \n\ ! 107: GET files REMOTE CWD [dir] REMOTE DIRECTORY [files]\n\ ! 108: SEND files REMOTE SPACE [dir] REMOTE HOST command\n\ ! 109: FINISH REMOTE DELETE files REMOTE WHO [user]\n\ ! 110: BYE REMOTE HELP REMOTE TYPE files\n\ ! 111: \n\0"; ! 112: #endif ! 113: #endif ! 114: char *srvtxt = "\r\n\ ! 115: C-Kermit server starting. Return to your local machine by typing\r\n\ ! 116: its escape sequence for closing the connection, and issue further\r\n\ ! 117: commands from there. To shut down the C-Kermit server, issue the\r\n\ ! 118: FINISH or BYE command and then reconnect.\n\ ! 119: \r\n\0"; ! 120: ! 121: /* Declarations for Send-Init Parameters */ ! 122: ! 123: int spsiz = DSPSIZ, /* Biggest packet size we can send */ ! 124: spsizf = 0, /* Flag to override what you ask for */ ! 125: rpsiz = DRPSIZ, /* Biggest we want to receive */ ! 126: urpsiz = DRPSIZ, /* User-requested rpsiz */ ! 127: maxrps = MAXRP, /* Maximum incoming long packet size */ ! 128: maxsps = MAXSP, /* Maximum outbound l.p. size */ ! 129: maxtry = MAXTRY, /* Maximum retries per packet */ ! 130: wsize = 1, /* Window size */ ! 131: timint = DMYTIM, /* Timeout interval I use */ ! 132: rtimo = URTIME, /* Timeout I want you to use */ ! 133: timef = 0, /* Flag to override what you ask */ ! 134: npad = MYPADN, /* How much padding to send */ ! 135: mypadn = MYPADN, /* How much padding to ask for */ ! 136: bctr = 1, /* Block check type requested */ ! 137: bctu = 1, /* Block check type used */ ! 138: ebq = MYEBQ, /* 8th bit prefix */ ! 139: ebqflg = 0, /* 8th-bit quoting flag */ ! 140: rqf = -1; /* Flag used in 8bq negotiation */ ! 141: rq = 0; /* Received 8bq bid */ ! 142: sq = 'Y', /* Sent 8bq bid */ ! 143: rpt = 0, /* Repeat count */ ! 144: rptq = MYRPTQ, /* Repeat prefix */ ! 145: rptflg = 0; /* Repeat processing flag */ ! 146: ! 147: int capas = 10, /* Position of Capabilities */ ! 148: atcapb = 8, /* Attribute capability */ ! 149: atcapr = 0, /* requested */ ! 150: atcapu = 0, /* used */ ! 151: swcapb = 4, /* Sliding Window capability */ ! 152: swcapr = 0, /* requested */ ! 153: swcapu = 0, /* used */ ! 154: lpcapb = 2, /* Long Packet capability */ ! 155: lpcapr = 1, /* requested */ ! 156: lpcapu = 0; /* used */ ! 157: ! 158: CHAR padch = MYPADC, /* Padding character to send */ ! 159: mypadc = MYPADC, /* Padding character to ask for */ ! 160: seol = MYEOL, /* End-Of-Line character to send */ ! 161: eol = MYEOL, /* End-Of-Line character to look for */ ! 162: ctlq = CTLQ, /* Control prefix in incoming data */ ! 163: myctlq = CTLQ; /* Outbound control character prefix */ ! 164: ! 165: ! 166: /* Packet-related variables */ ! 167: ! 168: int pktnum = 0, /* Current packet number */ ! 169: prvpkt = -1, /* Previous packet number */ ! 170: sndtyp, /* Type of packet just sent */ ! 171: rsn, /* Received packet sequence number */ ! 172: rln, /* Received packet length */ ! 173: size, /* Current size of output pkt data */ ! 174: osize, /* Previous output packet data size */ ! 175: maxsize, /* Max size for building data field */ ! 176: spktl = 0; /* Length packet being sent */ ! 177: ! 178: CHAR sndpkt[MAXSP+100], /* Entire packet being sent */ ! 179: recpkt[MAXRP+200], /* Packet most recently received */ ! 180: *rdatap, /* Pointer to received packet data */ ! 181: data[MAXSP+4], /* Packet data buffer */ ! 182: srvcmd[MAXRP+4], /* Where to decode server command */ ! 183: *srvptr, /* Pointer to above */ ! 184: mystch = SOH, /* Outbound packet-start character */ ! 185: stchr = SOH; /* Incoming packet-start character */ ! 186: ! 187: /* File-related variables */ ! 188: ! 189: #ifdef datageneral ! 190: CHAR filnam[256]; /* Name of current file. */ ! 191: #else ! 192: CHAR filnam[50]; /* Name of current file. */ ! 193: #endif ! 194: ! 195: int nfils; /* Number of files in file group */ ! 196: long fsize; /* Size of current file */ ! 197: ! 198: /* Communication line variables */ ! 199: ! 200: CHAR ttname[50]; /* Name of communication line. */ ! 201: ! 202: int parity, /* Parity specified, 0,'e','o',etc */ ! 203: flow, /* Flow control, 1 = xon/xoff */ ! 204: speed = -1, /* Line speed */ ! 205: turn = 0, /* Line turnaround handshake flag */ ! 206: turnch = XON, /* Line turnaround character */ ! 207: duplex = 0, /* Duplex, full by default */ ! 208: escape = 034, /* Escape character for connect */ ! 209: delay = DDELAY, /* Initial delay before sending */ ! 210: mdmtyp = 0; /* Modem type (initially none) */ ! 211: ! 212: int tlevel = -1; /* Take-file command level */ ! 213: ! 214: /* Statistics variables */ ! 215: ! 216: long filcnt, /* Number of files in transaction */ ! 217: flci, /* Characters from line, current file */ ! 218: flco, /* Chars to line, current file */ ! 219: tlci, /* Chars from line in transaction */ ! 220: tlco, /* Chars to line in transaction */ ! 221: ffc, /* Chars to/from current file */ ! 222: tfc; /* Chars to/from files in transaction */ ! 223: ! 224: int tsecs; /* Seconds for transaction */ ! 225: ! 226: /* Flags */ ! 227: ! 228: int deblog = 0, /* Flag for debug logging */ ! 229: pktlog = 0, /* Flag for packet logging */ ! 230: seslog = 0, /* Session logging */ ! 231: tralog = 0, /* Transaction logging */ ! 232: displa = 0, /* File transfer display on/off */ ! 233: stdouf = 0, /* Flag for output to stdout */ ! 234: xflg = 0, /* Flag for X instead of F packet */ ! 235: hcflg = 0, /* Doing Host command */ ! 236: fncnv = 1, /* Flag for file name conversion */ ! 237: binary = 0, /* Flag for binary file */ ! 238: savmod = 0, /* Saved file mode */ ! 239: cmask = 0177; /* Connect byte mask */ ! 240: fmask = 0377; /* File byte mask */ ! 241: warn = 0, /* Flag for file warning */ ! 242: quiet = 0, /* Be quiet during file transfer */ ! 243: local = 0, /* Flag for external tty vs stdout */ ! 244: server = 0, /* Flag for being a server */ ! 245: cnflg = 0, /* Connect after transaction */ ! 246: cxseen = 0, /* Flag for cancelling a file */ ! 247: czseen = 0, /* Flag for cancelling file group */ ! 248: keep = 0; /* Keep incomplete files */ ! 249: ! 250: /* Variables passed from command parser to protocol module */ ! 251: ! 252: char parser(); /* The parser itself */ ! 253: char sstate = 0; /* Starting state for automaton */ ! 254: char *cmarg = ""; /* Pointer to command data */ ! 255: char *cmarg2 = ""; /* Pointer to 2nd command data */ ! 256: char **cmlist; /* Pointer to file list in argv */ ! 257: ! 258: /* Miscellaneous */ ! 259: ! 260: char **xargv; /* Global copies of argv */ ! 261: int xargc; /* and argc */ ! 262: ! 263: extern char *dftty; /* Default tty name from ckx???.c */ ! 264: extern int dfloc; /* Default location: remote/local */ ! 265: extern int dfprty; /* Default parity */ ! 266: extern int dfflow; /* Default flow control */ ! 267: ! 268: /* M A I N -- C-Kermit main program */ ! 269: ! 270: #ifdef apollo ! 271: /* On the Apollo, intercept main to insert a cleanup handler */ ! 272: ckcmai(argc,argv) int argc; char **argv; { ! 273: #else ! 274: main(argc,argv) int argc; char **argv; { ! 275: #endif ! 276: ! 277: char *strcpy(); ! 278: ! 279: /* Do some initialization */ ! 280: ! 281: xargc = argc; /* Make global copies of argc */ ! 282: xargv = argv; /* ...and argv. */ ! 283: sstate = 0; /* No default start state. */ ! 284: strcpy(ttname,dftty); /* Set up default tty name. */ ! 285: local = dfloc; /* And whether it's local or remote. */ ! 286: parity = dfprty; /* Set initial parity, */ ! 287: flow = dfflow; /* and flow control. */ ! 288: if (sysinit() < 0) doexit(BAD_EXIT); /* And system-dependent things. */ ! 289: ! 290: /*** attempt to take ini file before doing command line ***/ ! 291: ! 292: cmdini(); /* Sets tlevel */ ! 293: while (tlevel > -1) { /* Execute init file. */ ! 294: sstate = parser(); /* Loop getting commands. */ ! 295: if (sstate) proto(); /* Enter protocol if requested. */ ! 296: } ! 297: ! 298: /* Look for a UNIX-style command line... */ ! 299: ! 300: if (argc > 1) { /* Command line arguments? */ ! 301: sstate = cmdlin(); /* Yes, parse. */ ! 302: if (sstate) { ! 303: proto(); /* Take any requested action, then */ ! 304: if (!quiet) conoll(""); /* put cursor back at left margin, */ ! 305: if (cnflg) conect(); /* connect if requested, */ ! 306: doexit(GOOD_EXIT); /* and then exit with status 0. */ ! 307: } ! 308: } ! 309: ! 310: /* If no action requested on command line, enter interactive parser */ ! 311: ! 312: herald(); /* Display program herald. */ ! 313: while(1) { /* Loop getting commands. */ ! 314: sstate = parser(); ! 315: if (sstate) proto(); /* Enter protocol if requested. */ ! 316: } ! 317: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.