|
|
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.