BSD 4_3 development
[unix-history] / usr / contrib / kermit / ckcmai.c
CommitLineData
ee2abe03
C
1char *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
56char *hlptxt = "C-Kermit Server Commands:\n\
57\n\
58GET filespec, SEND filespec, FINISH, REMOTE HELP\n\
59\n\0";
60#else
61char *hlptxt = "C-Kermit Server Commands Supported:\n\
62\n\
63GET filespec REMOTE CWD [directory] REMOTE SPACE [directory]\n\
64SEND filespec REMOTE DIRECTORY [filespec] REMOTE HOST command\n\
65FINISH REMOTE DELETE filespec REMOTE WHO [user]\n\
66REMOTE HELP REMOTE TYPE filespec BYE\n\
67\n\0";
68#endif
69char *srvtxt = "\r\n\
70C-Kermit server starting. Return to your local machine by typing\r\n\
71its escape sequence for closing the connection, and issue further\r\n\
72commands from there. To shut down the C-Kermit server, issue the\r\n\
73FINISH or BYE command and then reconnect.\n\
74\r\n\0";
75\f
76/* Declarations for Send-Init Parameters */
77
78int 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
96CHAR 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
106int 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
114CHAR 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
124CHAR filnam[50]; /* Name of current file. */
125
126int nfils; /* Number of files in file group */
127long fsize; /* Size of current file */
128
129/* Communication line variables */
130
131CHAR ttname[50]; /* Name of communication line. */
132
133int 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
146long 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
154int tsecs; /* Seconds for transaction */
155
156/* Flags */
157
158int 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
180char parser(); /* The parser itself */
181char sstate = 0; /* Starting state for automaton */
182char *cmarg = ""; /* Pointer to command data */
183char *cmarg2 = ""; /* Pointer to 2nd command data */
184char **cmlist; /* Pointer to file list in argv */
185\f
186/* Miscellaneous */
187
188char **xargv; /* Global copies of argv */
189int xargc; /* and argc */
190
191extern char *dftty; /* Default tty name from ckx???.c */
192extern int dfloc; /* Default location: remote/local */
193extern int dfprty; /* Default parity */
194extern int dfflow; /* Default flow control */
195\f
196/* M A I N -- C-Kermit main program */
197
198main(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}