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