|
|
1.1 root 1: char *versio = "C-Kermit 5A(179) BETA, 8 Feb 92"; /* Version herald. */
2: long vernum = 501179L;
3: /*
4: String and numeric version numbers, keep these two in sync!
5: Second digit of vernum: 0 = A, 1 = B, etc.
6: */
7:
8: #ifndef VERWHO
9: /* Change verwho in following line, or with -DVERWHO=x in makefile CFLAGS. */
10: #define VERWHO 0
11: #endif /* VERWHO */
12: int verwho = VERWHO; /* Who produced this version, 0 = Columbia University */
13: /*
14: IMPORTANT: If you are working on your own private version of C-Kermit, please
15: include some special notation, like your site name or your initials, in the
16: "versio" string, e.g. "5A(159)-XXX", and use a nonzero code for the "verwho"
17: variable (e.g. in the USA use your zip code). Unless we stick to this
18: discipline, divergent copies of C-Kermit will begin to appear that are
19: intistinguishable from each other, which is a big support issue. Also, if
20: you have edited C-Kermit and made copies available to others, please add
21: appropriate text to the BUG command (ckuus6.c, function dobug()).
22: */
23: #define CKCMAI
24:
25: /* C K C M A I -- C-Kermit Main program */
26:
27: /*
28: Author: Frank da Cruz ([email protected], [email protected]),
29: Columbia University Center for Computing Activities.
30: First released January 1985.
31: Copyright (C) 1985, 1992, Trustees of Columbia University in the City of New
32: York. Permission is granted to any individual or institution to use, copy, or
33: redistribute this software as long as it is not sold for profit, provided this
34: copyright notice is retained.
35: */
36: /*
37: The Kermit file transfer protocol was developed at the Columbia University
38: Center for Computing Activities (CUCCA). It is named after Kermit the Frog,
39: star of the television series THE MUPPET SHOW; the name is used by permission
40: of Henson Associates, Inc. "Kermit" is also Celtic for "free".
41: */
42: /*
43: Thanks to at least the following people for their contributions to this
44: program over the years, and apologies to anybody I missed:
45:
46: Chris Adie, Edinburgh U, Scotland (OS/2 support)
47: Larry Afrin, Clemson U
48: Barry Archer, U of Missouri
49: Robert Andersson, Oslo, Norway
50: Chris Armstrong, Brookhaven National Lab (OS/2)
51: William Bader, Moravian College
52: Fuat Baran, CUCCA
53: Stan Barber, Rice U
54: Jim Barbour, U of Colorado
55: Nelson Beebe, U of Utah
56: Karl Berry, UMB
57: Charles Brooks, EDN
58: Mike Brown, Purdue U
59: Mark Buda, DEC (VAX/VMS)
60: Bjorn Carlsson, Stockholm University Computer Center QZ
61: Bill Catchings, formerly of CUCCA
62: Bob Cattani, Columbia U CS Dept
63: John Chandler, Harvard U / Smithsonian Astronomical Observatory
64: John L. Chmielewski, AT&T, Lisle, IL
65: Howard Chu, U of Michigan
66: Bill Coalson, McDonnell Douglas
67: Bertie Coopersmith, London, UK
68: Alan Crosswell, CUCCA
69: Jeff Damens, formerly of CUCCA
70: Mark Davies, Bath U, UK
71: Joe R. Doupnik, Utah State U
72: S. Dezawa, Fujifilm, Japan
73: Frank Dreano (Honeywell)
74: Kristoffer Eriksson, Peridot Konsult AB, Oerebro, Sweden
75: John R. Evans, IRS, Kansas City
76: Glenn Everhart, RCA Labs
77: Herm Fischer, Encino, CA (extensive contributions to version 4.0)
78: Carl Fongheiser, CWRU
79: Marcello Frutig, Catholic University, Sao Paulo, Brazil (X.25 support)
80: Hirofumi Fujii, Japan Nat'l Lab for High Energy Physics, Tokyo (Kanji)
81: Andy Fyfe, Caltech
82: Christine M. Gianone, CUCCA
83: John Gilmore, UC Berkeley
84: German Goldszmidt, IBM
85: Chris Green, Essex U, UK
86: Yekta Gursel, MIT
87: Jim Guyton, Rand Corp
88: Stan Hanks, Rice U.
89: Ken Harrenstein, SRI
90: James Harvey, Indiana/Purdue U (VMS)
91: Rob Healey, [email protected]
92: Chuck Hedrick, Rutgers U
93: Ron Heiby, Technical Systems Division, Motorola Computer Group
94: Steve Hemminger, Tektronix
95: Christian Hemsing, RWTH Aachen, Germany (OS-9)
96: Andrew Herbert, Monash Univ, Australia
97: Mike Hickey, ITI
98: Randy Huntziger, National Library of Medicine
99: Larry Jacobs, Transarc
100: Mark B. Johnson, Apple Computer
101: Peter Jones, U of Quebec Montreal
102: Phil Julian, SAS Institute
103: Marion Kananson, [email protected]
104: Sergey Kartashoff, Institute of..., Moscow, USSR
105: Howie Kaye, CUCCA
106: Rob Kedoin, Linotype Co, Hauppauge, NY (OS/2)
107: Terry Kennedy, St Peter's College, Jersey City, NJ (VAX/VMS, 2.11 BSD)
108: Douglas Kingston, morgan.com
109: Tom Kloos, Sequent Computer Systems
110: Jim Knutson, U of Texas at Austin
111: Thomas Krueger, UWM
112: Bo Kullmar, Central Bank of Sweden, Kista
113: John Kunze, UC Berkeley
114: Bob Larson, USC (OS-9)
115: Bert Laverman, Groningen U, Netherlands
116: David Lawyer, UC Irvine
117: S.O. Lidie, Lehigh U
118: Tor Lillqvist, Helsinki University, Finland
119: Kevin Lowey, U of Saskatchewan (OS/2)
120: David MacKenzie, Environmental Defense Fund, University of Maryland
121: John Mackin, University of Sidney, Australia
122: Martin Maclaren, Bath U, UK
123: Chris Maio, Columbia U CS Dept
124: Fulvio Marino, Olivetti, Ivrea, Italy
125: Peter Mauzey, AT&T
126: Tye McQueen, Utah State U
127: Hellmuth Michaelis
128: Leslie Mikesell, American Farm Bureau
129: Martin Minow, DEC (VAX/VMS)
130: Ray Moody, Purdue U
131: Bruce J Moore (Atari ST)
132: Steve Morley, Convex
133: Tony Movshon, NYU
134: Dan Murphy, ???
135: Gary Mussar,
136: Jim Noble, Planning Research Corporation (Macintosh)
137: Ian O'Brien, Bath U, UK
138: Paul Placeway, Ohio State U (Macintosh & more)
139: Piet W. Plomp, ICCE, Groningen University, Netherlands
140: Ken Poulton, HP Labs
141: Manfred Prange, Oakland U
142: Frank Prindle, NADC
143: Anton Rang
144: Scott Ribe
145: Alan Robiette, Oxford University, UK
146: Michel Robitaille, U of Montreal (Mac)
147: Kai Uwe Rommel, Technische Universitaet Muenchen (OS/2)
148: Larry Rosenman (Amiga)
149: Jay Rouman, U of Michigan
150: Jack Rouse, SAS Institute (Data General and/or Apollo)
151: Stew Rubenstein, Harvard U (VAX/VMS)
152: Eric Schnoebelen, Convex
153: Benn Schreiber, DEC
154: Dan Schullman, DEC (modems, DIAL command, etc)
155: John Schultz, 3M
156: Steven Schultz, Contel (PDP-11)
157: Gordon Scott, Micro Focus, Newbury UK
158: Gisbert W. Selke, WIdO, Bonn, Germany
159: David Sizeland, U of London Medical School
160: Bradley Smith, UCLA
161: Richard Smith, Cal State
162: Ryan Stanisfer
163: Peter Svanberg, Royal Techn. HS, Sweden
164: Andy Tanenbaum, Vrije U, Amsterdam, Netherlands
165: Markku Toijala, Helsinki U of Technology
166: Rick Troxel, NIH
167: Warren Tucker, Tridom Corp, Mountain Park, GA
168: Dave Tweten, AMES-NAS
169: Walter Underwood, Ford Aerospace
170: Pieter Van Der Linden, Centre Mondial, Paris
171: Ge van Geldorp, Netherlands
172: Fred van Kempen, MINIX User Group, Voorhout, Netherlands
173: Wayne Van Pelt, GE/CRD
174: Mark Vasoll, Oklahoma State U (V7 UNIX)
175: Paul Vixie (DEC)
176: Roger Wallace, Raytheon
177: Stephen Walton, Calif State U, Northridge (Amiga)
178: Jamie Watson, Switzerland (RS/6000)
179: Rick Watson, U of Texas (Macintosh)
180: Lauren Weinstein
181: Joachim Wiesel, U of Karlsruhe
182: Michael Williams, UCLA
183: Patrick Wolfe, Kuck & Associates, Inc.
184: Gregg Wonderly, Oklahoma State U (V7 UNIX)
185: Farrell Woods, Concurrent (formerly Masscomp)
186: Dave Woolley, CAP Communication Systems, London
187: Jack Woolley, SCT Corp
188: Ken Yap, U of Rochester
189: John Zeeff, Ann Arbor, MI
190: */
191: /*
192: ckcsym.h is used for for defining symbols that normally would be defined
193: using -D or -d on the cc command line, for use with compilers that don't
194: support this feature.
195: */
196: #include "ckcsym.h"
197: #include "ckcasc.h" /* ASCII character symbols */
198: #include "ckcdeb.h" /* Debug & other symbols */
199: #include "ckcker.h" /* Kermit symbols */
200: #include "ckcnet.h" /* Network symbols */
201: #ifndef NOSPL
202: #include "ckuusr.h"
203: #endif /* NOSPL */
204:
205: #ifndef NOSERVER
206: /* Text message definitions.. each should be 256 chars long, or less. */
207: #ifdef MAC
208: char *hlptxt = "\r\
209: Mac Kermit Server Commands:\r\
210: \r\
211: BYE\r\
212: FINISH\r\
213: GET filespec\r\
214: REMOTE CD directory\r\
215: REMOTE HELP\r\
216: SEND filespec\r\
217: \r\0";
218: #else
219: #ifdef AMIGA
220: char *hlptxt = "C-Kermit Server Commands:\n\
221: \n\
222: GET filespec, SEND filespec, FINISH, BYE, REMOTE HELP\n\
223: \n\0";
224: #else
225: #ifdef OS2
226: char *hlptxt = "C-Kermit Server REMOTE Commands:\n\
227: \n\
228: GET files REMOTE CD [dir] REMOTE DIRECTORY [files]\n\
229: SEND files REMOTE SPACE [dir] REMOTE HOST command\n\
230: FINISH REMOTE DELETE files REMOTE TYPE files\n\
231: BYE REMOTE HELP REMOTE SET parameter value\n\
232: \n\0";
233: #else
234: #ifdef MINIX
235: char *hlptxt = "C-Kermit Server REMOTE Commands:\n\
236: GET SEND BYE FINISH REMOTE: CD DEL DIR HELP HOST SET SPACE TYPE WHO\n\0";
237: #else
238: #ifdef VMS
239: char *hlptxt = "C-Kermit Server REMOTE Commands:\r\n\
240: \r\n\
241: GET files REMOTE CD [dir] REMOTE DIRECTORY [files]\r\n\
242: SEND files REMOTE SPACE [dir] REMOTE HOST command\r\n\
243: MAIL files REMOTE DELETE files REMOTE WHO [user]\r\n\
244: BYE REMOTE PRINT files REMOTE TYPE files\r\n\
245: FINISH REMOTE HELP REMOTE SET parameter value\r\n\
246: \0";
247: #else
248: char *hlptxt = "C-Kermit Server REMOTE Commands:\n\
249: \n\
250: GET files REMOTE CD [dir] REMOTE DIRECTORY [files]\n\
251: SEND files REMOTE SPACE [dir] REMOTE HOST command\n\
252: MAIL files REMOTE DELETE files REMOTE WHO [user]\n\
253: BYE REMOTE PRINT files REMOTE TYPE files\n\
254: FINISH REMOTE HELP REMOTE SET parameter value\n\
255: \n\0";
256: #endif
257: #endif
258: #endif
259: #endif
260: #endif
261:
262: #ifdef MINIX
263: char *srvtxt = "\r\n\
264: Entering server mode.\r\n\
265: \n\0";
266: #else
267: #ifdef OSK
268: char *srvtxt = "\r\l\
269: C-Kermit server starting. Return to your local machine by typing\r\l\
270: its escape sequence for closing the connection, and issue further\r\l\
271: commands from there. To shut down the C-Kermit server, issue the\r\l\
272: BYE command to logout, or the FINISH command and then reconnect.\r\l\
273: \l\0";
274: #else
275: char *srvtxt = "\r\n\
276: C-Kermit server starting. Return to your local machine by typing\r\n\
277: its escape sequence for closing the connection, and issue further\r\n\
278: commands from there. To shut down the C-Kermit server, issue the\r\n\
279: BYE command to logout, or the FINISH command and then reconnect.\r\n\
280: \r\n\0";
281: #endif
282: #endif
283: #else
284: char *srvtxt = "";
285: #endif /* NOSERVER */
286:
287: /* Declarations for Send-Init Parameters */
288:
289: int spsiz = DSPSIZ, /* Current packet size to send */
290: spmax = DSPSIZ, /* (PWP) Biggest packet size we can send */
291: /* (see rcalcpsz()) */
292: spsizr = DSPSIZ, /* Send-packet size requested */
293: spsizf = 0, /* Flag to override what you ask for */
294: rpsiz = DRPSIZ, /* Biggest we want to receive */
295: urpsiz = DRPSIZ, /* User-requested rpsiz */
296: maxrps = MAXRP, /* Maximum incoming long packet size */
297: maxsps = MAXSP, /* Maximum outbound l.p. size */
298: maxtry = MAXTRY, /* Maximum retries per packet */
299: wslots = 1, /* Window size in use */
300: wslotr = 1, /* Window size requested */
301: wslotn = 1, /* Window size negotiated */
302: timeouts = 0, /* For statistics reporting */
303: spackets = 0, /* ... */
304: rpackets = 0, /* ... */
305: retrans = 0, /* ... */
306: crunched = 0, /* ... */
307: wmax = 0, /* ... */
308: timint = DMYTIM, /* Timeout interval I use */
309: srvtim = DSRVTIM, /* Server command wait timeout */
310: srvdis = 0, /* Server file xfer display */
311: pkttim = DMYTIM, /* Normal packet wait timeout */
312: rtimo = URTIME, /* Timeout I want you to use */
313: timef = 0, /* Flag to override what you ask */
314: npad = MYPADN, /* How much padding to send */
315: mypadn = MYPADN, /* How much padding to ask for */
316: bctr = 1, /* Block check type requested */
317: bctu = 1, /* Block check type used */
318: ebq = MYEBQ, /* 8th bit prefix */
319: ebqflg = 0, /* 8th-bit quoting flag */
320: rqf = -1, /* Flag used in 8bq negotiation */
321: rq = 0, /* Received 8bq bid */
322: sq = 'Y', /* Sent 8bq bid */
323: rpt = 0, /* Repeat count */
324: rptq = MYRPTQ, /* Repeat prefix */
325: rptflg = 0; /* Repeat processing flag */
326:
327: int capas = 9, /* Position of Capabilities */
328: atcapb = 8, /* Attribute capability */
329: atcapr = 1, /* requested */
330: atcapu = 0, /* used */
331: swcapb = 4, /* Sliding Window capability */
332: swcapr = 1, /* requested (allowed) */
333: swcapu = 0, /* used */
334: lpcapb = 2, /* Long Packet capability */
335: lpcapr = 1, /* requested */
336: lpcapu = 0, /* used */
337: lscapb = 32, /* Locking Shift capability */
338: lscapr = 1, /* requested by default */
339: lscapu = 0; /* used */
340:
341: /* Flags for whether to use particular attributes */
342:
343: int atenci = 1, /* Encoding in */
344: atenco = 1, /* Encoding out */
345: atdati = 1, /* Date in */
346: atdato = 1, /* Date out */
347: atdisi = 1, /* Disposition in/out */
348: atdiso = 1,
349: atleni = 1, /* Length in/out (both kinds) */
350: atleno = 1,
351: atblki = 1, /* Blocksize in/out */
352: atblko = 1,
353: attypi = 1, /* File type in/out */
354: attypo = 1,
355: atsidi = 1, /* System ID in/out */
356: atsido = 1,
357: atsysi = 1, /* System-dependent parameters in/out */
358: atsyso = 1;
359:
360: CHAR padch = MYPADC, /* Padding character to send */
361: mypadc = MYPADC, /* Padding character to ask for */
362: seol = MYEOL, /* End-Of-Line character to send */
363: eol = MYEOL, /* End-Of-Line character to look for */
364: ctlq = CTLQ, /* Control prefix in incoming data */
365: myctlq = CTLQ; /* Outbound control character prefix */
366:
367: struct zattr iattr; /* Incoming file attributes */
368:
369: /* File related variables, mainly for the benefit of VAX/VMS */
370:
371: int fblksiz = DBLKSIZ; /* File blocksize */
372: int frecl = DLRECL; /* File record length */
373: int frecfm = XYFF_S; /* File record format (default = stream) */
374: int forg = XYFO_S; /* File organization (sequential) */
375: int fcctrl = XYFP_N; /* File carriage control (ctrl chars) */
376:
377: #ifdef VMS
378: /* VMS labeled file options */
379: int lf_opts = LBL_NAM;
380: #else
381: int lf_opts = 0;
382: #endif /* VMS */
383:
384: /* Packet-related variables */
385:
386: int pktnum = 0, /* Current packet number */
387: sndtyp = 0, /* Type of packet just sent */
388: rsn, /* Received packet sequence number */
389: rln, /* Received packet length */
390: size, /* Current size of output pkt data */
391: osize, /* Previous output packet data size */
392: maxsize, /* Max size for building data field */
393: spktl = 0, /* Length packet being sent */
394: rprintf, /* REMOTE PRINT flag */
395: rmailf; /* MAIL flag */
396:
397: CHAR
398: #ifdef NO_MORE /* Buffers used before sliding windows... */
399: sndpkt[MAXSP+100], /* Entire packet being sent */
400: recpkt[MAXRP+200], /* Packet most recently received */
401: data[MAXSP+4], /* Packet data buffer */
402: #endif
403: #ifdef DYNAMIC
404: *srvcmd = (CHAR *)0, /* Where to decode server command */
405: #else
406: srvcmd[MAXRP+4], /* Where to decode server command */
407: #endif
408: padbuf[95], /* Buffer for send-padding */
409: *recpkt,
410: *rdatap, /* Pointer to received packet data */
411: *data = (CHAR *)0, /* Pointer to send-packet data */
412: *srvptr, /* Pointer to srvcmd */
413: mystch = SOH, /* Outbound packet-start character */
414: stchr = SOH; /* Incoming packet-start character */
415:
416: /* File-related variables */
417:
418: char filnam[257]; /* Name of current file. */
419: char cmdfil[80]; /* Application file name. */
420:
421: int nfils = 0; /* Number of files in file group */
422: long fsize; /* Size of current file */
423: int wildxpand = 0; /* Who expands wildcards */
424: int clfils = 0; /* Flag for command-line files */
425: int stayflg = 0; /* Flag for "stay", i.e. "-S" */
426:
427: /* Communication line variables */
428:
429: char ttname[50]; /* Name of communication line. */
430:
431: #ifdef MAC
432: int connected = 0; /* true if connected */
433: int startconnected; /* initial state of connected */
434: #endif /* MAC */
435:
436: long speed = -1L; /* Line speed */
437: int mdmspd = 1; /* Modem changes speed flag */
438:
439: #ifndef NODIAL
440: int dialhng = 1; /* Whether to hangup before dialing */
441: int dialtmo = 0; /* Secs to wait for call to complete */
442: int dialksp = 0; /* Kermit spoof in modem */
443: int dialdpy = 0; /* Dial display */
444: int dialmnp = 0; /* Dial MNP-negotiation enabled */
445: char *dialini = (char *) 0; /* User-spec'd dialer init string */
446: #endif /* NODIAL */
447:
448: int parity, /* Parity specified, 0,'e','o',etc */
449: autopar = 0, /* Automatic parity change flag */
450: sosi = 0, /* Shift-In/Out flag */
451: flow, /* Flow control */
452: turn = 0, /* Line turnaround handshake flag */
453: turnch = XON, /* Line turnaround character */
454: duplex = 0, /* Duplex, full by default */
455: escape = DFESC, /* Escape character for connect */
456: delay = DDELAY, /* Initial delay before sending */
457: tnlm = 0, /* Terminal newline mode */
458: mdmtyp = 0; /* Modem type (initially none) */
459:
460: /* Networks for SET HOST */
461:
462: #define MYHOSTL 100
463: char myhost[MYHOSTL]; /* Local host name */
464: int network = 0; /* Network vs tty connection */
465: int nettype = NET_TCPB; /* Assume TCP/IP (BSD sockets) */
466:
467: #ifdef SUNX25
468: extern initpad();
469: int revcall = 0; /* X.25 reverse call not selected */
470: int closgr = -1; /* X.25 closed user group not selected */
471: int cudata = 0; /* X.25 call user data not specified */
472: char udata[MAXCUDATA]; /* X.25 call user data */
473: #endif /* SUNX25 */
474:
475: /* Other recent additions */
476:
477: int tlevel = -1; /* Take-file command level */
478: #ifndef NOSPL
479: extern int maclvl; /* Macro invocation level */
480: #endif /* NOSPL */
481: int carrier = CAR_AUT; /* Pay attention to carrier signal */
482: int cdtimo = 0; /* Carrier wait timeout */
483: int xitsta = GOOD_EXIT; /* Program exit status */
484: #ifdef VMS /* Default filename collision action */
485: int fncact = XYFX_X; /* REPLACE for VAX/VMS */
486: #else
487: int fncact = XYFX_B; /* BACKUP for everybody else */
488: #endif /* VMS */
489: int bgset = -1; /* BACKGROUND mode set explicitly */
490: #ifdef UNIX
491: int suspend = DFSUSP; /* Whether SUSPEND command, etc, */
492: #else /* is to be allowed. */
493: int suspend = 0;
494: #endif /* UNIX */
495:
496: /* Statistics variables */
497:
498: long filcnt, /* Number of files in transaction */
499: flci, /* Characters from line, current file */
500: flco, /* Chars to line, current file */
501: tlci, /* Chars from line in transaction */
502: tlco, /* Chars to line in transaction */
503: ffc, /* Chars to/from current file */
504: tfc, /* Chars to/from files in transaction */
505: rptn; /* Repeated characters compressed */
506:
507: int tsecs; /* Seconds for transaction */
508:
509: /* Flags */
510:
511: int deblog = 0, /* Flag for debug logging */
512: debses = 0, /* Flag for DEBUG SESSION */
513: pktlog = 0, /* Flag for packet logging */
514: seslog = 0, /* Session logging */
515: tralog = 0, /* Transaction logging */
516: displa = 0, /* File transfer display on/off */
517: stdouf = 0, /* Flag for output to stdout */
518: stdinf = 0, /* Flag for input from stdin */
519: xflg = 0, /* Flag for X instead of F packet */
520: hcflg = 0, /* Doing Host command */
521: fncnv = 1, /* Flag for file name conversion */
522: binary = 0, /* Flag for binary file */
523: savmod = 0, /* Saved file mode (whole session) */
524: bsave = 0, /* Saved file mode (per file) */
525: bsavef = 0, /* Flag if bsave was used. */
526: cmask = 0177, /* Connect byte mask */
527: fmask = 0377, /* File byte mask */
528: warn = 0, /* Flag for file warning */
529: quiet = 0, /* Be quiet during file transfer */
530: local = 0, /* Flag for external tty vs stdout */
531: server = 0, /* Flag for being a server */
532: cflg = 0, /* Connect before transaction */
533: cnflg = 0, /* Connect after transaction */
534: cxseen = 0, /* Flag for cancelling a file */
535: czseen = 0, /* Flag for cancelling file group */
536: discard = 0, /* Flag for file to be discarded */
537: keep = 0, /* Keep incomplete files */
538: unkcs = 1, /* Keep file w/unknown character set */
539: nakstate = 0, /* In a state where we can send NAKs */
540: dblchar = -1; /* Character to double when sending */
541:
542: /* Variables passed from command parser to protocol module */
543:
544: #ifndef NOSPL
545: _PROTOTYP( int parser, (int) ); /* The parser itself */
546: char *clcmds = NULL; /* Pointer to command-line commands */
547: #endif /* NOSPL */
548:
549: CHAR sstate = (CHAR) 0; /* Starting state for automaton */
550: CHAR zstate = (CHAR) 0; /* For remembering sstate */
551: char *cmarg = ""; /* Pointer to command data */
552: char *cmarg2 = ""; /* Pointer to 2nd command data */
553: char **cmlist; /* Pointer to file list in argv */
554:
555: /* Flags for the ENABLE and DISABLE commands */
556:
557: int en_cwd = 1; /* CD/CWD */
558: int en_del = 1; /* DELETE */
559: int en_dir = 1; /* DIRECTORY */
560: int en_fin = 1; /* FINISH/BYE */
561: int en_get = 1; /* GET */
562: #ifndef NOPUSH
563: int en_hos = 1; /* HOST enabled */
564: #else
565: int en_hos = 0; /* HOST disabled */
566: #endif /* NOPUSH */
567: int en_sen = 1; /* SEND */
568: int en_set = 1; /* SET */
569: int en_spa = 1; /* SPACE */
570: int en_typ = 1; /* TYPE */
571: int en_who = 1; /* WHO */
572: int en_bye = 1; /* BYE */
573:
574: /* Miscellaneous */
575:
576: char **xargv; /* Global copies of argv */
577: int xargc; /* and argc */
578: int xargs; /* an immutable copy of argc */
579: char *xarg0; /* and of argv[0] */
580:
581: extern char *dftty; /* Default tty name from ck?tio.c */
582: extern int dfloc; /* Default location: remote/local */
583: extern int dfprty; /* Default parity */
584: extern int dfflow; /* Default flow control */
585:
586: /*
587: Buffered file input and output buffers. See getpkt() in ckcfns.c
588: and zoutdump() in the system-dependent file i/o module (usually ck?fio.c).
589: */
590: #ifndef DYNAMIC
591: /* Now we allocate them dynamically, see getiobs() below. */
592: char zinbuffer[INBUFSIZE], zoutbuffer[OBUFSIZE];
593: #endif
594: char *zinptr, *zoutptr;
595: int zincnt, zoutcnt;
596:
597: _PROTOTYP( int getiobs, (void) );
598:
599: /* M A I N -- C-Kermit main program */
600:
601: #ifndef NOCCTRAP
602: #include <setjmp.h>
603: extern jmp_buf cmjbuf;
604: #ifdef GEMDOS /* Special for Atari ST */
605: cc_clean();
606: #endif /* GEMDOS */
607: #endif /* NOCCTRAP */
608:
609: #ifdef aegis
610: /* On the Apollo, intercept main to insert a cleanup handler */
611: int
612: ckcmai(argc,argv) int argc; char **argv;
613: #else
614: #ifdef MAC
615: int main (void)
616: #else
617: int
618: main(argc,argv) int argc; char **argv;
619: #endif /* MAC */
620: #endif /* aegis */
621: {
622:
623: /* Do some initialization */
624:
625: if (sysinit() < 0) /* System-dependent initialization. */
626: fatal("Can't initialize!");
627: connoi(); /* Console interrupts off */
628: #ifndef MAC
629: xargc = xargs = argc; /* Make global copies of argc */
630: xargv = argv; /* ...and argv. */
631: xarg0 = argv[0];
632: #endif /* MAC */
633: sstate = 0; /* No default start state. */
634: #ifdef DYNAMIC
635: if (getiobs() < 0)
636: fatal("Can't allocate i/o buffers!");
637: #endif /* DYNAMIC */
638: ckhost(myhost,MYHOSTL); /* Name of local host */
639: strcpy(ttname,dftty); /* Set up default tty name. */
640: local = dfloc; /* And whether it's local or remote. */
641: parity = dfprty; /* Set initial parity, */
642: flow = dfflow; /* and flow control. */
643:
644: #ifndef COHERENT
645: if (local) if (ttopen(ttname,&local,0,0) < 0) { /* If default tty line */
646: printf("%s: Can't open device\n",ttname); /* is external, open it */
647: local = 0; /* now... */
648: strcpy(ttname,CTTNAM);
649: }
650: #endif
651:
652: speed = ttgspd(); /* Get transmission speed. */
653:
654: #ifdef SUNX25
655: initpad(); /* Initialize X.25 PAD */
656: #endif /* SUNX25 */
657:
658: if (inibufs(SBSIZ,RBSIZ) < 0) /* Allocate packet buffers */
659: fatal("Can't allocate packet buffers!");
660:
661: #ifndef NOICP
662:
663: #ifdef MAC
664: cmdini();
665: #else /* Not MAC */
666: /* Attempt to take ini file before doing command line */
667:
668: *cmdfil = '\0'; /* Assume no command file. */
669: prescan(); /* But first check for -y option */
670:
671: #ifndef NOCCTRAP
672: setint(); /* Set up interrupts */
673: if (setjmp(cmjbuf)) { /* Control-C trap returns to here. */
674: doexit(GOOD_EXIT,-1); /* Exit with good status. */
675: } else {
676: #endif /* NOCCTRAP */
677: cmdini(); /* Sets tlevel */
678: while (tlevel > -1) { /* Execute init file. */
679: sstate = parser(0); /* Loop getting commands. */
680: if (sstate) proto(); /* Enter protocol if requested. */
681: }
682: #ifndef NOCCTRAP
683: }
684: #endif /* NOCCTRAP */
685:
686: /*
687: In UNIX there are two ways to invoke Kermit with a cmdfile:
688: (1) From the kermit command line, e.g. "kermit cmdfile [ options... ]"
689: argv[0] = "kermit"
690: argv[1] = "cmdfile"
691: (2) By executing a cmdfile whose first line is like "#!/path/kermit"
692: argv[0] = "/path/kermit" (sometimes just "kermit")
693: argv[1] = "/path/cmdfile"
694: */
695: if (argc > 1) {
696: if (*argv[1] != '-') {
697: if (zchki(argv[1]) > 0) {
698: strcpy(cmdfil,argv[1]);
699: }
700: }
701: }
702: if (*cmdfil) { /* If we got one, */
703: dotake(cmdfil); /* execute it */
704: while (tlevel > -1) { /* until it runs out. */
705: sstate = parser(1); /* Loop getting commands. */
706: if (sstate) proto(); /* Enter protocol if requested. */
707: }
708: }
709: *cmdfil = '\0';
710: #endif /* MAC */
711: #endif /* NOICP */
712:
713: #ifndef NOCMDL
714: /* Look for a UNIX-style command line... */
715:
716: if (argc > 1) { /* Command line arguments? */
717: sstate = cmdlin(); /* Yes, parse. */
718: zstate = sstate; /* Remember sstate around protocol */
719: if (cflg) conect(); /* Connect first if requested */
720: if (sstate) {
721: if (displa) concb((char)escape); /* (for console "interrupts") */
722: #ifndef NOCCTRAP
723: setint(); /* Set up interrupts */
724: if (setjmp(cmjbuf)) { /* Control-C trap returns to here. */
725: #ifdef GEMDOS
726: cc_clean();
727: #endif /* GEMDOS */
728: if (cnflg) conect(); /* connect again if requested, */
729: } else {
730: #endif /* NOCCTRAP */
731: proto(); /* Take any requested action, then */
732: if (!quiet) /* put cursor back at left margin, */
733: conoll("");
734: if (cnflg) conect(); /* connect if requested, */
735: #ifndef NOCCTRAP
736: }
737: #endif /* NOCCTRAP */
738: }
739: /*
740: If interactive commands were given on the command line (using the
741: -C "command, command, ..." option), assign them to a macro called
742: "cl_commands", then execute the macro and leave it defined for
743: subsequent re-execution if desired.
744: */
745: #ifndef NOSPL
746: if (clcmds) { /* Check for -C commands */
747: int x;
748: x = addmac("cl_commands",clcmds); /* Put macro in table */
749: if (x > -1) { /* If successful, */
750: dodo(x,NULL); /* set up for macro execution */
751: while (maclvl > -1) { /* Loop getting macro commands. */
752: sstate = parser(1);
753: if (sstate) proto(); /* Enter protocol if requested. */
754: }
755: }
756: }
757: #endif /* NOSPL */
758: #ifndef NOICP
759: /*
760: If a command-line action argument was given and -S ("stay") was not given,
761: exit now.
762: */
763: if ((cflg || cnflg || zstate) && !stayflg)
764: #endif /* NOICP */
765: doexit(GOOD_EXIT,xitsta); /* exit with good status */
766: }
767: #endif /* NOCMDL */
768:
769: #ifdef NOICP /* No interactive command parser */
770: else {
771: #ifndef NOCMDL
772: usage(); /* Command-line-only version */
773: doexit(BAD_EXIT,-1);
774: #else /* Neither one! */
775: doexit(BAD_EXIT,-1);
776: #endif /* NOCMDL */
777: }
778: #else /* not NOICP */
779: /*
780: If no action requested on command line, or if -S ("stay") was included,
781: enter the interactive command parser.
782: */
783: herald(); /* Display program herald. */
784:
785: #ifndef NOCCTRAP /* If not no Control-C trap */
786: ccagain:
787: if (setjmp(cmjbuf)) { /* Control-C trap returns to here. */
788: #ifdef GEMDOS
789: cc_clean();
790: #endif /* GEMDOS */
791: fixcmd(); /* Pop command stacks, etc. */
792: debug(F100,"ckcmai got interrupt","",0);
793: goto ccagain; /* set up trap again. */
794: } else {
795: debug(F100,"ckcmai setting interrupt trap","",0);
796: setint(); /* Set up command interrupt traps */
797: }
798: #else /* NOCCTRAP */
799: setint(); /* Set up command interrupt traps */
800: #endif /* NOCCTRAP */
801:
802: #ifdef MAC
803: while (1) {
804: extern char *lfiles; /* fake pointer cast */
805:
806: if (connected) {
807: debug(F100, "main: calling macparser", "", 0);
808: sstate = newparser(1, 1, 0L);
809:
810: /* ignore null command state */
811: if (sstate == 'n')
812: sstate = '\0';
813:
814: if (sstate)
815: proto();
816: }
817: else {
818: /*
819: * process take files the finder gave us.
820: */
821: if ((tlevel == -1) && lfiles)
822: startlfile();
823:
824: debug(F100, "main: calling parser", "", 0);
825: sstate = parser(0);
826: if (sstate == 'c') /* if MAC connect */
827: sstate = 0;
828: if (sstate)
829: proto();
830: }
831: }
832: #else /* Not MAC */
833:
834: /*
835: Running from an application file, or a command filename was
836: specified on the command line.
837: */
838: if (*cmdfil) dotake(cmdfil); /* Command file spec'd on cmd line */
839: while(1) { /* Loop getting commands. */
840: sstate = parser(0);
841: if (sstate) proto(); /* Enter protocol if requested. */
842: }
843: #endif /* MAC */
844: #endif /* NOICP */
845: }
846:
847: #ifdef DYNAMIC
848: /* Allocate file i/o buffers */
849:
850: char *zinbuffer, *zoutbuffer;
851:
852: int
853: getiobs() {
854: zinbuffer = (char *)malloc(INBUFSIZE);
855: if (!zinbuffer) return(-1);
856: zoutbuffer = (char *)malloc(OBUFSIZE);
857: if (!zoutbuffer) return(-1);
858: debug(F100,"getiobs ok","",0);
859: return(0);
860: }
861: #endif /* DYNAMIC */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.