Commit | Line | Data |
---|---|---|
ee2abe03 C |
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 | \f | |
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 | \f | |
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 | \f | |
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 | \f | |
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 | \f | |
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 | } |