--- /dev/null
+#define EDITDATE "10 Apr 2004" /* Update these with each edit */
+#define EDITNDATE "20040410" /* Keep them in sync */
+/* Sat Apr 10 12:05:49 2004 */
+
+/*
+ ckcsym.h is used for for defining symbols that normally would be defined
+ using -D or -d on the cc command line, for use with compilers that don't
+ support this feature. Must be before any tests for preprocessor symbols.
+*/
+#include "ckcsym.h"
+/*
+ Consolidated program version information (for UNIX also see ckuver.h).
+ See makever() below for how they are used.
+*/
+/* #ifdef COMMENT */ /* Uncomment this for test version */
+#ifndef OS2
+#ifndef BETATEST
+#define BETATEST
+#endif /* BETATEST */
+#endif /* OS2 */
+/* #endif */ /* COMMENT */
+
+#ifdef BETATEST
+#ifdef OS2
+#ifdef __DATE__
+#define BETADATE
+#endif /* __DATE__ */
+#endif /* OS2 */
+#endif /* BETATEST */
+
+#ifndef MAC
+/*
+ Note: initialize ck_s_test to "" if this is not a test version.
+ Use (*ck_s_test != '\0') to decide whether to print test-related messages.
+*/
+#ifndef BETATEST
+#ifndef OS2 /* UNIX, VMS, etc... (i.e. C-Kermit) */
+char *ck_s_test = ""; /* "Dev","Alpha","Beta","RC", or "" */
+char *ck_s_tver = ""; /* Test version number or "" */
+#else /* OS2 */
+char *ck_s_test = ""; /* (i.e. K95) */
+char *ck_s_tver = "";
+#endif /* OS2 */
+#else
+char *ck_s_test = ""; /* Development */
+char *ck_s_tver = "";
+#endif /* BETATEST */
+#else /* MAC */
+char *ck_s_test = "Pre-Alpha"; /* Mac Kermit is always a test... */
+char *ck_s_tver = "";
+#endif /* MAC */
+
+#ifdef BETADATE /* Date of this version or edit */
+char *ck_s_date = __DATE__; /* Compilation date */
+#else
+char *ck_s_date = EDITDATE; /* See top */
+
+#endif /* BETADATE */
+char *buildid = EDITNDATE; /* See top */
+
+#ifdef UNIX
+static char sccsid[] = "@(#)C-Kermit 8.0.211";
+#endif /* UNIX */
+
+char *ck_s_ver = "8.0.211"; /* C-Kermit version string */
+long ck_l_ver = 800211L; /* C-Kermit version number */
+
+#ifdef OS2
+char *ck_s_xver = "2.2.0"; /* Product-specific version string */
+long ck_l_xver = 2200L; /* Product-specific version number */
+#else
+#ifdef MAC
+char *ck_s_xver = "0.995"; /* Product-specific version string */
+long ck_l_xver = 995L; /* Product-specific version number */
+#else
+char *ck_s_xver = ""; /* Don't touch these... */
+long ck_l_xver = 0L; /* they are computed at runtime */
+#endif /* MAC */
+#endif /* OS2 */
+
+#ifdef OS2
+#ifdef IKSDONLY
+#ifdef NT
+char *ck_s_name = "IKS-NT";
+#else /* NT */
+char *ck_s_name = "IKS-OS/2";
+#endif /* NT */
+#else /* IKSDONLY */
+char *ck_s_name = "Kermit 95"; /* Program name */
+#endif /* IKSDONLY */
+#else
+#ifdef MAC
+char *ck_s_name = "Mac Kermit";
+#else
+char *ck_s_name = "C-Kermit";
+#endif /* MAC */
+#endif /* OS2 */
+
+char *ck_s_who = ""; /* Where customized, "" = not. */
+char *ck_patch = ""; /* Patch info, if any. */
+
+#define CKVERLEN 128
+char versiox[CKVERLEN]; /* Version string buffer */
+char *versio = versiox; /* These are filled in at */
+long vernum, xvernum; /* runtime from above. */
+
+#define CKCMAI
+
+#include "ckcasc.h" /* ASCII character symbols */
+#include "ckcdeb.h" /* Debug & other symbols */
+
+char * myname = NULL; /* The name I am called by */
+#ifndef OS2
+char * exedir = NULL; /* Directory I was executed from */
+#endif /* OS2 */
+char * myhome = NULL; /* Home directory override */
+
+/* C K C M A I -- C-Kermit Main program */
+
+/*
+ Author: Frank da Cruz (fdc@columbia.edu),
+ Columbia University Academic Information Systems, New York City.
+
+COPYRIGHT NOTICE:
+*/
+
+#ifdef OS2
+char *wiksdcpr[] = {
+"Windows Internet Kermit Service Daemon (WIKSD):",
+"Copyright (C) 1985, 2004, Trustees of Columbia University in the City of New",
+"York. All rights reserved.",
+" ",
+"PERMISSIONS:",
+" ",
+" The WIKSD software may be obtained directly, in binary form only, from",
+" the Kermit Project at Columbia University by any individual for his or",
+" her OWN USE, and by any company or other organization for its own",
+" INTERNAL DISTRIBUTION and use, including installation on servers that",
+" are accessed by customers or clients, WITHOUT EXPLICIT LICENSE. All",
+" other forms of redistribution must be licensed from the Kermit Project",
+" at Columbia University. These permissions apply only to the nonsecure",
+" version of WIKSD.",
+" ",
+"DISCLAIMER:",
+" ",
+" THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE",
+" TRUSTEES OF COLUMBIA UNIVERSITY IN THE CITY OF NEW YORK AS TO ITS",
+" FITNESS FOR ANY PURPOSE, AND WITHOUT WARRANTY BY THE TRUSTEES OF",
+" COLUMBIA UNIVERSITY IN THE CITY OF NEW YORK OF ANY KIND, EITHER",
+" EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED",
+" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.",
+" THE TRUSTEES OF COLUMBIA UNIVERSITY IN THE CITY OF NEW YORK SHALL NOT",
+" BE LIABLE FOR ANY DAMAGES, INCLUDING SPECIAL, INDIRECT, INCIDENTAL,",
+" OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM ARISING OUT OR IN",
+" CONNECTION WITH THE USE OF THE SOFTWARE, EVEN IF IT HAS BEEN OR IS",
+" HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. YOU SHALL",
+" INDEMNIFY AND HOLD HARMLESS THE TRUSTEES OF COLUMBIA UNIVERSITY IN",
+" THE CITY OF NEW YORK, ITS EMPLOYEES AND AGENTS FROM AND AGAINST ANY",
+" AND ALL CLAIMS, DEMANDS, LOSS, DAMAGE OR EXPENSE (INCLUDING",
+" ATTORNEYS' FEES) ARISING OUT OF YOUR USE OF THIS SOFTWARE.",
+" ",
+"The above copyright notice, permissions notice, and disclaimer may not be",
+"removed, altered, or obscured and shall be included in all copies of the",
+"WIKSD software. The Trustees of Columbia University in the City of",
+"New York reserve the right to revoke this permission if any of the terms",
+"of use set forth above are breached.",
+" ",
+"For further information, contact the Kermit Project, Columbia University,",
+"612 West 115th Street, New York NY 10025-7799, USA; Phone +1 (212) 854 3703,",
+"Fax +1 (212) 662 6442, kermit@columbia.edu, http://www.columbia.edu/kermit/",
+""
+};
+#endif /* OS2 */
+
+char *copyright[] = {
+
+#ifdef pdp11
+"Copyright (C) 1985, 2004, Trustees of Columbia University, NYC.",
+"All rights reserved.",
+" ",
+#else
+#ifdef OS2
+"Copyright (C) 1985, 2004, Trustees of Columbia University in the City of New",
+"York. All rights reserved. This software is furnished under license",
+"and may not be reproduced without license to do so. This copyright notice",
+"must not be removed, altered, or obscured.",
+" ",
+" THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE",
+" TRUSTEES OF COLUMBIA UNIVERSITY IN THE CITY OF NEW YORK AS TO ITS",
+" FITNESS FOR ANY PURPOSE, AND WITHOUT WARRANTY BY THE TRUSTEES OF",
+" COLUMBIA UNIVERSITY IN THE CITY OF NEW YORK OF ANY KIND, EITHER",
+" EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED",
+" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.",
+" THE TRUSTEES OF COLUMBIA UNIVERSITY IN THE CITY OF NEW YORK SHALL NOT",
+" BE LIABLE FOR ANY DAMAGES, INCLUDING SPECIAL, INDIRECT, INCIDENTAL,",
+" OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM ARISING OUT OR IN",
+" CONNECTION WITH THE USE OF THE SOFTWARE, EVEN IF IT HAS BEEN OR IS",
+" HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. YOU SHALL",
+" INDEMNIFY AND HOLD HARMLESS THE TRUSTEES OF COLUMBIA UNIVERSITY IN",
+" THE CITY OF NEW YORK, ITS EMPLOYEES AND AGENTS FROM AND AGAINST ANY",
+" AND ALL CLAIMS, DEMANDS, LOSS, DAMAGE OR EXPENSE (INCLUDING",
+" ATTORNEYS' FEES) ARISING OUT OF YOUR USE OF THIS SOFTWARE.",
+" ",
+#else
+"Copyright (C) 1985, 2004,",
+" The Trustees of Columbia University in the City of New York.",
+" All rights reserved.",
+" ",
+"PERMISSIONS:",
+" ",
+"The C-Kermit software may be obtained directly from the Kermit Project at",
+"Columbia University (or from any source explicitly licensed by the Kermit",
+"Project or implicitly licensed by Clause (A) below) by any individual for",
+"his or her OWN USE, and by any company or other organization for its own",
+"INTERNAL DISTRIBUTION and use, including installation on servers that are",
+"accessed by customers or clients, WITHOUT EXPLICIT LICENSE.",
+" ",
+"Conditions for REDISTRIBUTION are as follows:",
+" ",
+"(A) The C-Kermit software, in source and/or binary form, may be",
+" included WITHOUT EXPLICIT LICENSE in distributions of OPERATING",
+" SYSTEMS that have OSI (Open Source Initiative, www.opensource.org)",
+" approved licenses, even if non-Open-Source applications (but not",
+" operating systems) are included in the same distribution. Such",
+" distributions include, but are not limited to, CD-ROM, FTP site,",
+" Web site, or preinstalled software on a new GENERAL-PURPOSE",
+" computer, as long as the primary character of the distribution is",
+" an Open Source operating system with accompanying utilities. The",
+" C-Kermit source code may not be changed without the consent of the",
+" Kermit Project, which will not be unreasonably withheld (this is",
+" simply a matter of keeping a consistent and supportable code base).",
+" ",
+"(B) Inclusion of C-Kermit software in whole or in part, in any form, in",
+" or with any product not covered by Clause (A), or its distribution",
+" by any commercial enterprise to its actual or potential customers",
+" or clients except as in Clause (A), requires a license from the",
+" Kermit Project, Columbia University; contact kermit@columbia.edu.",
+" ",
+"The name of Columbia University may not be used to endorse or promote",
+"products derived from or including the C-Kermit software without specific",
+"prior written permission.",
+" ",
+"DISCLAIMER:",
+" ",
+" THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE",
+" TRUSTEES OF COLUMBIA UNIVERSITY IN THE CITY OF NEW YORK AS TO ITS",
+" FITNESS FOR ANY PURPOSE, AND WITHOUT WARRANTY BY THE TRUSTEES OF",
+" COLUMBIA UNIVERSITY IN THE CITY OF NEW YORK OF ANY KIND, EITHER",
+" EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED",
+" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.",
+" THE TRUSTEES OF COLUMBIA UNIVERSITY IN THE CITY OF NEW YORK SHALL NOT",
+" BE LIABLE FOR ANY DAMAGES, INCLUDING SPECIAL, INDIRECT, INCIDENTAL,",
+" OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM ARISING OUT OF OR",
+" IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN IF IT HAS BEEN OR IS",
+" HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. YOU SHALL",
+" INDEMNIFY AND HOLD HARMLESS THE TRUSTEES OF COLUMBIA UNIVERSITY IN",
+" THE CITY OF NEW YORK, ITS EMPLOYEES AND AGENTS FROM AND AGAINST ANY",
+" AND ALL CLAIMS, DEMANDS, LOSS, DAMAGE OR EXPENSE (INCLUDING",
+" ATTORNEYS' FEES) ARISING OUT OF YOUR USE OF THIS SOFTWARE.",
+" ",
+"The above copyright notice, permissions notice, and disclaimer may not be",
+"removed, altered, or obscured and shall be included in all copies of the",
+"C-Kermit software. The Trustees of Columbia University in the City of",
+"New York reserve the right to revoke this permission if any of the terms",
+"of use set forth above are breached.",
+#endif /* OS2 */
+#endif /* pdp11 */
+
+#ifdef OS2
+"Portions Copyright (C) 1995, Oy Online Solutions Ltd., Jyvaskyla, Finland.",
+#endif /* OS2 */
+
+#ifdef CK_AUTHENTICATION
+"Portions Copyright (C) 1990, Massachusetts Institute of Technology.",
+#ifdef CK_ENCRYPTION
+"Portions Copyright (C) 1991, 1993 Regents of the University of California.",
+"Portions Copyright (C) 1991, 1992, 1993, 1994, 1995 by AT&T.",
+"Portions Copyright (C) 1995, 1997, Eric Young <eay@cryptosoft.com>.",
+#endif /* CK_ENCRYPTION */
+#ifdef CK_SRP
+"Portions Copyright (C) 1997, Stanford University.",
+#endif /* CK_SRP */
+#endif /* CK_AUTHENTICATION */
+
+#ifndef pdp11
+" ",
+"For further information, contact the Kermit Project, Columbia University,",
+"612 West 115th Street, New York NY 10025-7799, USA; phone +1 (212) 854 3703,",
+"fax +1 (212) 663 8202 or +1 (212) 662 6442, email kermit@columbia.edu,",
+"Web http://www.columbia.edu/kermit/ or http://www.kermit-project.org/.",
+#endif /* pdp11 */
+""};
+
+/*
+DOCUMENTATION:
+
+ "Using C-Kermit" by Frank da Cruz and Christine M. Gianone,
+ Digital Press / Butterworth-Heinemann, Woburn MA, USA.
+ Second edition (1997), ISBN 1-55558-164-1.
+ Order from Digital Press: +1 (800) 366-2665
+ Or from Columbia University: +1 (212) 854-3703
+
+For Kermit 95, also:
+
+ "Kermit 95" by Christine M. Gianone and Frank da Cruz,
+ Manning Publications, Greenwich CT, USA (1998) - Online.
+
+ACKNOWLEDGMENTS:
+
+ The Kermit file transfer protocol was developed at the Columbia University
+ Center for Computing Activities (CUCCA), which was since renamed to Columbia
+ University Academic Information Systems (AcIS). Kermit is named after
+ Kermit the Frog, star of the television series THE MUPPET SHOW; the name is
+ used by permission of Henson Associates, Inc.
+
+ Thanks to at least the following people for their contributions to this
+ program over the years, and apologies to anyone who was inadvertantly
+ omitted:
+
+ Chris Adie, Edinburgh U, Scotland (OS/2)
+ Robert Adsett, University of Waterloo, Canada
+ Larry Afrin, Clemson U
+ Russ Allbery, Stanford U
+ Jeffrey Altman, Columbia University
+ Greg Andrews, Telebit Corp
+ Barry Archer, U of Missouri
+ Robert Andersson, International Systems A/S, Oslo, Norway
+ Chris Armstrong, Brookhaven National Lab (OS/2)
+ William Bader, Software Consulting Services, Nazareth, PA
+ Fuat Baran, Columbia U
+ Stan Barber, Rice U
+ Jim Barbour, U of Colorado
+ Donn Baumgartner, Dell
+ Nelson Beebe, U of Utah
+ Gerry Belanger, Cognitronics
+ Karl Berry, UMB
+ Mark Berryman, SAIC
+ Dean W Bettinger, SUNY
+ Gary Bilkus
+ Peter Binderup, Denmark
+ David Bolen, Advanced Networks and Services, Inc.
+ Marc Boucher, U of Montreal
+ Charles Brooks, EDN
+ Bob Brown
+ Mike Brown, Purdue U
+ Jack Bryans, California State U at Long Beach
+ Mark Buda, DEC (VMS)
+ Fernando Cabral, Padrao iX, Brasilia
+ Bjorn Carlsson, Stockholm University Computer Centre QZ, Sweden
+ Bill Catchings, (formerly of) Columbia U
+ Bob Cattani, Columbia U CS Dept
+ Davide Cervone, Rochester U
+ Seth Chaiklin, Denmark
+ John Chandler, Harvard U / Smithsonian Astronomical Observatory
+ Bernard Chen, UCLA
+ Andrew A Chernov, RELCOM Team, Moscow
+ John L Chmielewski, AT&T, Lisle, IL
+ Howard Chu, U of Michigan
+ Bill Coalson, McDonnell Douglas
+ Bertie Coopersmith, London
+ Chet Creider, U of Western Ontario
+ Alan Crosswell, Columbia U
+ Jeff Damens, (formerly of) Columbia U
+ Mark Davies, Bath U, UK
+ Sin-itirou Dezawa, Fujifilm, Japan
+ Joe R. Doupnik, Utah State U
+ Frank Dreano, Honeywell
+ John Dunlap, U of Washington
+ Alex Dupuy, SMART.COM
+ David Dyck, John Fluke Mfg Co.
+ Stefaan A. Eeckels, Eurokom, Luxembourg
+ Nick Efthymiou
+ Paul Eggert, Twin Sun, Inc., El Segundo, CA
+ Bernie Eiben, DEC
+ Peter Eichhorn, Assyst International
+ Kristoffer Eriksson, Peridot Konsult AB, Oerebro, Sweden
+ John R. Evans, IRS, Kansas City
+ Glenn Everhart, RCA Labs
+ Charlie Finan, Cray Research
+ Herm Fischer, Encino, CA (extensive contributions to version 4.0)
+ Carl Fongheiser, CWRU
+ Mike Freeman, Bonneville Power Authority
+ Marcello Frutig, Catholic University, Sao Paulo, Brazil (X.25 support)
+ Hirofumi Fujii, Japan Nat'l Lab for High Energy Physics, Tokyo (Kanji)
+ Chuck Fuller, Westinghouse Corporate Computer Services
+ Andy Fyfe, Caltech
+ Christine M. Gianone, Columbia U
+ John Gilmore, UC Berkeley
+ Madhusudan Giyyarpuram, HP
+ Rainer Glaschick, Siemens AG, Paderborn
+ William H. Glass
+ German Goldszmidt, IBM
+ Chuck Goodhart, NASA
+ Alistair Gorman, New Zealand
+ Richard Gration, ADFA, Australia
+ Chris Green, Essex U, UK
+ Alan Grieg, Dundee Tech, Scotland
+ Yekta Gursel, MIT
+ Jim Guyton, Rand Corp
+ Michael Haertel
+ Bruno Haible
+ Bob Hain, UMN
+ Marion Hakanson, ORST
+ Richard Hamilton
+ John Hamilston, Iowa State U
+ Simon Hania, Netherlands
+ Stan Hanks, Rice U.
+ Ken Harrenstein, SRI
+ Eugenia Harris, Data General (AOS/VS)
+ David Harrison, Kingston Warren Corp
+ Lucas Hart, Oregon State University
+ James Harvey, Indiana/Purdue U (VMS)
+ Rob Healey
+ Chuck Hedrick, Rutgers U
+ Ron Heiby, Technical Systems Division, Motorola Computer Group
+ Steve Hemminger, Tektronix
+ Christian Hemsing, RWTH Aachen, Germany (OS-9)
+ Randolph Herber, US DOE,
+ Andrew Herbert, Monash Univ, Australia
+ Marcus Herbert, Germany
+ Mike Hickey, ITI
+ Dan Hildebrand, QNX Software Systems Inc, Kanata, ON (QNX)
+ R E Hill
+ Stephan Hoffman-Emden
+ Sven Holmstrom, ABB Utilities AB, Sweden
+ Bill Homer, Cray Research
+ Ray Hunter, The Wollongong Group
+ Randy Huntziger, National Library of Medicine
+ Larry Jacobs, Transarc
+ Steve Jenkins, Lancaster University, UK
+ Dave Johnson, Gradient Technologies
+ Mark B Johnson, Apple Computer
+ Jyke Jokinen, Tampere University of Technology, Finland (QNX)
+ Eric F Jones, AT&T
+ Luke Jones, AT&T
+ Peter Jones, U of Quebec Montreal
+ Phil Julian, SAS Institute
+ Peter Kabal, U of Quebec
+ Mic Kaczmarczik, U of Texas at Austin
+ Sergey Kartashoff, Inst. of Precise Mechanics & Computer Equipment, Moscow
+ Howie Kaye, Columbia U
+ Rob Kedoin, Linotype Co, Hauppauge, NY (OS/2)
+ Phil Keegstra
+ Mark Kennedy, IBM
+ Terry Kennedy, St Peter's College, Jersey City, NJ (VMS and more)
+ "Carlo Kid", Technical University of Delft, Netherlands
+ Tim Kientzle
+ Paul Kimoto, Cornell U
+ Douglas Kingston, morgan.com
+ Lawrence Kirby, Wiltshire, UK
+ Tom Kloos, Sequent Computer Systems
+ Jim Knutson, U of Texas at Austin
+ John T. Kohl (BSDI)
+ Scott Kramer, SRI International, Menlo Park, CA
+ John Kraynack, US Postal Service
+ David Kricker, Encore Computer
+ Thomas Krueger, UWM
+ Bo Kullmar, ABC Klubben, Stockholm, and Central Bank of Sweden, Kista
+ R. Brad Kummer, AT&T Bell Labs, Atlanta, GA
+ John Kunze, UC Berkeley
+ David Lane, BSSI / BellSouth (Stratus VOS, X.25)
+ Bob Larson, USC (OS-9)
+ Bert Laverman, Groningen U, Netherlands
+ Steve Layton
+ David Lawyer, UC Irvine
+ David LeVine, National Semiconductor Corporation
+ Daniel S. Lewart, UIUC
+ S.O. Lidie, Lehigh U
+ Tor Lillqvist, Helsinki U, Finland
+ David-Michael Lincke, U of St Gallen, Switzerland
+ Robert Lipe (for SCO makefile entries & advice)
+ Dean Long
+ Mike Long, Analog Devices, Norwood MA
+ Kevin Lowey, U of Saskatchewan (OS/2)
+ Andy Lowry, Columbia U
+ James Lummel, Caprica Telecomputing Resources (QNX)
+ David MacKenzie, Environmental Defense Fund, U of Maryland
+ John Mackin, University of Sidney, Australia
+ Martin Maclaren, Bath U, UK
+ Chris Maio, Columbia U CS Dept
+ Montserrat Mane, HP, Grenoble, France
+ Fulvio Marino, Olivetti, Ivrea, Italy
+ Arthur Marsh, dircsa.org.au
+ Peter Mauzey, Lucent Technologies
+ Tye McQueen, Utah State U
+ Ted Medin
+ Hellmuth Michaelis, Hanseatischer Computerservice GmbH, Hamburg, Germany
+ Leslie Mikesell, American Farm Bureau
+ Todd Miller, Courtesan Consulting
+ Martin Minow, DEC (VMS)
+ Pawan Misra, Bellcore
+ Ken Mizialko, IBM, Manassas, VA
+ Wolfgang Moeller, DECUS Germany
+ Ray Moody, Purdue U
+ Bruce J Moore, Allen-Bradley Co, Highland Heights, OH (Atari ST)
+ Steve Morley, Convex
+ Peter Mossel, Columbia U
+ Tony Movshon, NYU
+ Lou Muccioli, Swanson Analysis Systems
+ Dan Murphy
+ Neal P. Murphy, Harsof Systems, Wonder Lake IL
+ Gary Mussar
+ John Nall, FSU
+ Jack Nelson, U of Pittsburgh
+ Jim Noble, Planning Research Corporation (Macintosh)
+ Ian O'Brien, Bath U, UK
+ Melissa O'Neill, SFU
+ John Owens
+ Thomas Pinkl, Health Business Systems Inc.
+ Michael Pins, Iowa Computer Aided Engineering Network
+ Andre' Pirard, University of Liege, Belgium
+ Paul Placeway, Ohio State U
+ Piet W. Plomp, ICCE, Groningen University, Netherlands
+ Ken Poulton, HP Labs
+ Manfred Prange, Oakland U
+ Christopher Pratt, APV Baker, UK
+ Frank Prindle, NADC
+ Tony Querubin, U of Hawaii
+ Jean-Pierre Radley
+ Anton Rang
+ Scott Ribe
+ Alan Robiette, Oxford University, UK
+ Michel Robitaille, U of Montreal (Mac)
+ Huw Rogers, Schweizerische Kreditanstalt, Zuerich
+ Nigel Roles, Cambridge, England
+ Kai Uwe Rommel, Technische Universitaet Muenchen (OS/2)
+ Larry Rosenman (Amiga)
+ Jay Rouman, U of Michigan
+ Jack Rouse, SAS Institute (Data General and/or Apollo)
+ Stew Rubenstein, Harvard U (VMS)
+ Gerhard Rueckle, FH Darmstadt, Fb. E/Automatisierungstechnik
+ John Santos, EG&H
+ Bill Schilit, Columbia U
+ Ulli Schlueter, RWTH Aachen, Germany (OS-9, etc)
+ Michael Schmidt, U of Paderborn, Germany
+ Eric Schnoebelen, Convex
+ Benn Schreiber, DEC
+ Dan Schullman, DEC (modems, DIAL command, etc)
+ John Schultz, 3M
+ Steven Schultz, Contel (PDP-11)
+ APPP Scorer, Leeds Polytechnic, UK
+ Gordon Scott, Micro Focus, Newbury UK
+ Gisbert W. Selke, WIdO, Bonn, Germany
+ David Singer, IBM Almaden Research Labs
+ David Sizeland, U of London Medical School
+ Fridrik Skulason, Iceland
+ Rick Sladkey (Linux)
+ Dave Slate
+ Bradley Smith, UCLA
+ Fred Smith, Merk / Computrition
+ Richard S Smith, Cal State
+ Ryan Stanisfer, UNT
+ Bertil Stenstroem, Stockholm University Computer Centre (QZ), Sweden
+ James Sturdevant, CAP GEMENI AMERICA, Minneapolis
+ Peter Svanberg, Royal Techn. HS, Sweden
+ James R. Swenson, Accu-Weather, Inc.
+ Ted T'so, MIT (Linux)
+ Andy Tanenbaum, Vrije U, Amsterdam, Netherlands
+ Glen Thobe
+ Markku Toijala, Helsinki U of Technology
+ Teemu Torma, Helsinki U of Technology
+ Linus Torvalds, Helsinki
+ Rick Troxel, NIH
+ Warren Tucker, Tridom Corp, Mountain Park, GA
+ Dave Tweten, AMES-NAS
+ G Uddeborg, Sweden
+ Walter Underwood, Ford Aerospace
+ Pieter Van Der Linden, Centre Mondial, Paris
+ Ge van Geldorp, Netherlands
+ Fred van Kempen, MINIX User Group, Voorhout, Netherlands
+ Wayne Van Pelt, GE/CRD
+ Mark Vasoll, Oklahoma State U (V7 UNIX)
+ Konstantin Vinogradov, ICSTI, Moscow
+ Paul Vixie, DEC
+ Bernie Volz, Process Software
+ Eduard Vopicka, Prague University of Economics, Czech Republic
+ Dimitri Vulis, CUNY
+ Roger Wallace, Raytheon
+ Stephen Walton, Calif State U, Northridge (Amiga)
+ Jamie Watson, Adasoft, Switzerland (AIX)
+ Rick Watson, U of Texas (Macintosh)
+ Scott Weikart (Association for Progressive Communications)
+ Robert Weiner, Programming Plus, New York City
+ Lauren Weinstein, Vortex Technlogy
+ David Wexelblat, AT&T
+ Clark Wierda, Illuminati Online
+ Joachim Wiesel, U of Karlsruhe
+ Lon Willett, U of Utah
+ Michael Williams, UCLA
+ Nate Williams, U of Montana
+ David Wilson
+ Joellen Windsor, U of Arizona
+ Patrick Wolfe, Kuck & Associates, Inc.
+ Gregg Wonderly, Oklahoma State U (V7 UNIX)
+ Farrell Woods, Concurrent (formerly Masscomp)
+ Dave Woolley, CAP Communication Systems, London
+ Jack Woolley, SCT Corp
+ Frank Wortner
+ Ken Yap, formerly of U of Rochester
+ John Zeeff, Ann Arbor, MI
+*/
+
+#include "ckcker.h" /* Kermit symbols */
+#include "ckcnet.h" /* Network symbols */
+
+#ifdef CK_SSL
+#include "ck_ssl.h"
+#endif /* CK_SSL */
+
+#ifndef NOSPL
+#include "ckuusr.h"
+#endif /* NOSPL */
+
+#ifdef OS2ONLY
+#define INCL_VIO /* Needed for ckocon.h */
+#include <os2.h>
+#undef COMMENT
+#endif /* OS2ONLY */
+
+#ifdef NT
+#include <windows.h>
+#include <tapi.h>
+#include "ckntap.h"
+#endif /* NT */
+
+#ifndef NOSERVER
+/* Text message definitions.. each should be 256 chars long, or less. */
+#ifdef MINIX
+char *srvtxt = "\r\n\
+Entering server mode.\r\n\0";
+#else
+#ifdef OLDMSG
+/*
+ It seems there was a large installation that was using C-Kermit 5A(165)
+ or thereabouts, which had deployed thousands of MS-DOS Kermit scripts in
+ scattered locations that looked for strings in the old server message,
+ which changed in 5A(183), August 1992.
+*/
+char *srvtxt = "\r\n\
+C-Kermit server starting. Return to your local machine by typing\r\n\
+its escape sequence for closing the connection, and issue further\r\n\
+commands from there. To shut down the C-Kermit server, issue the\r\n\
+FINISH or BYE command and then reconnect.\n\
+\r\n\0";
+#else
+#ifdef OSK
+char *srvtxt = "\r\012\
+Entering server mode. If your local Kermit software is menu driven, use\r\012\
+the menus to send commands to the server. Otherwise, enter the escape\r\012\
+sequence to return to your local Kermit prompt and issue commands from\r\012\
+there. Use SEND and GET for file transfer. Use REMOTE HELP for a list of\r\012\
+other available services. Use BYE or FINISH to end server mode.\r\012\0";
+#else /* UNIX, VMS, AOS/VS, and all others */
+char *srvtxt = "\r\n\
+Entering server mode. If your local Kermit software is menu driven, use\r\n\
+the menus to send commands to the server. Otherwise, enter the escape\r\n\
+sequence to return to your local Kermit prompt and issue commands from\r\n\
+there. Use SEND and GET for file transfer. Use REMOTE HELP for a list of\r\n\
+other available services. Use BYE or FINISH to end server mode.\r\n\0";
+#endif /* OSK */
+#endif /* OLDMSG */
+#endif /* MINIX */
+#else /* server mode disabled */
+char *srvtxt = "";
+#endif /* NOSERVER */
+
+int initflg = 0; /* sysinit() has executed... */
+int howcalled = I_AM_KERMIT; /* How I was called */
+int hmtopline = 0;
+int quitting = 0; /* I'm in the act of quitting */
+
+#ifdef IKSDCONF
+char * iksdconf = IKSDCONF; /* IKSD configuration file */
+int iksdcf = 0; /* Has IKSD c.f. been processed? */
+#endif /* IKSDCONF */
+
+int srvcdmsg = 0; /* [Server] CD message */
+char * cdmsgfile[8] = { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL };
+char * cdmsgstr = NULL;
+char * ckcdpath = NULL;
+
+#ifdef NLCHAR /* Text-file line terminator */
+CHAR feol = NLCHAR;
+#else
+CHAR feol = 0;
+#endif /* NLCHAR */
+
+int fblksiz = DBLKSIZ; /* File blocksize */
+int frecl = DLRECL; /* File record length */
+int frecfm = XYFF_S; /* File record format (default = stream) */
+int forg = XYFO_S; /* File organization (sequential) */
+int fcctrl = XYFP_N; /* File carriage control (ctrl chars) */
+int filecase = FILECASE; /* Case matters in filenames */
+int stathack = 1; /* Fast directory lookups by default */
+
+char uidbuf[UIDBUFLEN] = { NUL, NUL }; /* User ID buffer */
+int cfilef = 0; /* Application ("kerbang") file flag */
+char cmdfil[CKMAXPATH + 1] = { NUL, NUL }; /* Application file name */
+int haveurl = 0; /* URL given on command line */
+
+#ifndef NOXFER
+/* Multi-protocol support */
+
+struct ck_p ptab[NPROTOS] = { /* Initialize the Kermit part ... */
+ { "Kermit",
+ DRPSIZ, /* Receive packet size */
+ DSPSIZ, /* Send packet size */
+ 0, /* Send-packet-size-set flag */
+ DFWSIZ, /* Window size */
+
+#ifdef NEWDEFAULTS
+ PX_CAU, /* Control char unprefixing... */
+#else
+ PX_ALL,
+#endif /* NEWDEFAULTS */
+
+#ifdef VMS /* Default filename collision action */
+ XYFX_X, /* REPLACE for VAX/VMS */
+#else
+ XYFX_B, /* BACKUP for everybody else */
+#endif /* VMS */
+
+#ifdef OS2 /* Flag for file name conversion */
+ XYFN_L, /* Literal for OS2 */
+#else
+ XYFN_C, /* Converted for others */
+#endif /* OS2 */
+
+ PATH_OFF, /* Send pathnames OFF */
+ PATH_AUTO, /* Receive pathnames AUTO */
+ NULL, /* Host receive initiation string (binary) */
+ NULL, /* Host receive initiation string (text) */
+ NULL, /* Host server string */
+ NULL, /* External protocol send command (binary) */
+ NULL, /* External protocol send command (text) */
+ NULL, /* External protocol receive command (bin) */
+ NULL } /* External protocol receive command (txt) */
+#ifdef CK_XYZ
+,
+{"XMODEM", 128,128,-1,-1, 1,-1,-1,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
+{"XMODEM-CRC",128,128,-1,-1, -1,-1,-1,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
+{"YMODEM", -1, -1,-1,-1, -1,-1,-1,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
+{"YMODEM-g", -1, -1,-1,-1, -1,-1,-1,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
+{"ZMODEM", -1, -1,-1,-1,PX_WIL,-1,-1,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
+{"Other", -1, -1,-1,-1, -1,-1,-1,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL}
+#endif /* CK_XYZ */
+};
+
+/* Declarations for Send-Init Parameters */
+
+int spsiz = DSPSIZ, /* Current packet size to send */
+ spmax = DSPSIZ, /* Biggest packet size we can send */
+ lastspmax = DSPSIZ, /* Send-packet size last used */
+ spsizr = DSPSIZ, /* Send-packet size requested */
+ spsizf = 0, /* Flag to override size negotiation */
+ rpsiz = DRPSIZ, /* Biggest we want to receive */
+ urpsiz = DRPSIZ, /* User-requested receive pkt size */
+ maxrps = MAXRP, /* Maximum incoming long packet size */
+ maxsps = MAXSP, /* Maximum outbound l.p. size */
+ maxtry = MAXTRY, /* Maximum retries per packet */
+ wslots = 1, /* Window size currently in use */
+ wslotr = DFWSIZ, /* Window size from SET WINDOW */
+ wslotn = 1, /* Window size negotiated in S-pkt */
+ timeouts = 0, /* For statistics reporting */
+ spackets = 0, /* ... */
+ rpackets = 0, /* ... */
+ retrans = 0, /* ... */
+ crunched = 0, /* ... */
+ wmax = 0, /* ... */
+ wcur = 0, /* ... */
+ srvidl = 0, /* Server idle timeout */
+ srvdis = 1, /* Server file xfer display */
+ srvtim = DSRVTIM, /* Server command wait timeout */
+ srvping = 1, /* Server keepalive */
+/*
+ timint is the timeout interval I use when waiting for a packet.
+ pkttim is the SET RECEIVE TIMEOUT value, sent to the other Kermit.
+ rtimo is the SET SEND TIMEOUT value. rtimo is the initial value of
+ timint. timint is changed by the value in the incoming negotiation
+ packet unless a SET SEND TIMEOUT command was given.
+*/
+ timint = DMYTIM, /* Timeout interval I use */
+ pkttim = URTIME, /* Timeout I want you to use */
+ rtimo = DMYTIM, /* Normal packet wait timeout */
+ timef = 0, /* Flag to override what you ask */
+#ifdef CK_TIMERS
+ rttflg = 1, /* Use dynamic round-trip timers */
+#else
+ rttflg = 0, /* Use fixed timer */
+#endif /* CK_TIMERS */
+ mintime = 1, /* Minimum timeout */
+ maxtime = 0, /* Maximum timeout */
+
+ npad = MYPADN, /* How much padding to send */
+ mypadn = MYPADN, /* How much padding to ask for */
+ bctr = DFBCT, /* Block check type requested */
+ bctu = 1, /* Block check type used */
+ bctl = 1, /* Block check length */
+ c_save = -1, /* Block check saving and restoring */
+ ss_save = -1, /* Slow-start saving and restoring */
+ ebq = MYEBQ, /* 8th bit prefix */
+ ebqflg = 0, /* 8th-bit quoting flag */
+ rqf = -1, /* Flag used in 8bq negotiation */
+ rq = 0, /* Received 8bq bid */
+ sq = 'Y', /* Sent 8bq bid */
+ rpt = 0, /* Repeat count */
+ rptq = MYRPTQ, /* Repeat prefix */
+ rptflg = 0, /* Repeat processing flag */
+ rptena = 1, /* Repeat processing enabled */
+ xfrcan = 1, /* Transfer cancellation enabled */
+ xfrint = 1, /* Transfer interruption enabled */
+ xfrchr = 3, /* Transfer cancel char = Ctrl-C */
+ xfrnum = 3, /* Need three of them by default */
+ g_xfrxla = -1;
+ char * xfrmsg = NULL; /* Message for f.t. display screen */
+#endif /* NOXFER */
+
+#ifdef NOCSETS
+int xfrxla = 0; /* Character-set translation */
+#else
+int xfrxla = 1; /* enabled or disabled */
+#endif /* NOCSETS */
+
+#ifndef NOXFER
+int epktflg = 0; /* E-PACKET command active */
+
+int capas = 9, /* Position of Capabilities */
+ lpcapb = 2, /* Long Packet capability */
+ lpcapr = 1, /* requested */
+ lpcapu = 0, /* used */
+ swcapb = 4, /* Sliding Window capability */
+ swcapr = 1, /* requested (allowed) */
+ swcapu = 0, /* used */
+ atcapb = 8, /* Attribute capability */
+ atcapr = 1, /* requested */
+ atcapu = 0, /* used */
+ rscapb = 16, /* RESEND capability */
+ rscapr = 1, /* requested by default */
+ rscapu = 0, /* used */
+ lscapb = 32, /* Locking Shift capability */
+ lscapr = 1, /* requested by default */
+ lscapu = 0; /* used */
+
+/* Flags for whether to use particular attributes */
+
+int atenci = 1, /* Encoding in */
+ atenco = 1, /* Encoding out */
+ atdati = 1, /* Date in */
+ atdato = 1, /* Date out */
+ atdisi = 1, /* Disposition in/out */
+ atdiso = 1,
+ atleni = 1, /* Length in/out (both kinds) */
+ atleno = 1,
+ atblki = 1, /* Blocksize in/out */
+ atblko = 1,
+ attypi = 1, /* File type in/out */
+ attypo = 1,
+ atsidi = 1, /* System ID in/out */
+ atsido = 1,
+ atsysi = 1, /* System-dependent parameters in/out */
+ atsyso = 1;
+
+int dispos = 0; /* Disposition */
+
+#ifdef CK_PERMS
+int atlpri = 1,
+ atlpro = 1,
+ atgpri = 1,
+ atgpro = 1;
+#endif /* CK_PERMS */
+
+int atfrmi = 1, /* Record Format in/out */
+ atfrmo = 1;
+
+#ifdef STRATUS
+int atcrei = 1, /* Creator ID in/out */
+ atcreo = 1,
+ atacti = 1, /* Account in/out */
+ atacto = 1;
+#endif /* STRATUS */
+
+int sprmlen = -1; /* Send/Receive protocol parameter */
+int rprmlen = -1; /* string length limits */
+int sendipkts = 1; /* Send I packets */
+
+CHAR padch = MYPADC, /* Padding character to send */
+ mypadc = MYPADC, /* Padding character to ask for */
+ seol = MYEOL, /* End-Of-Line character to send */
+ eol = MYEOL, /* End-Of-Line character to look for */
+ ctlq = CTLQ, /* Control prefix in incoming data */
+ myctlq = CTLQ, /* Outbound control character prefix */
+ myrptq = MYRPTQ; /* Repeat prefix I want to use */
+
+int rptmin = 3; /* Repeat-count minimum */
+
+int usepipes = 0, /* Used for xfer to/from pipes */
+ g_usepipes = -1;
+
+char * filefile = NULL; /* File containing list of filenames */
+/* CD message filename list */
+
+char whoareu[16] = { NUL, NUL }; /* System ID of other Kermit */
+int sysindex = -1; /* and index to its system ID struct */
+int myindex = -1;
+int wearealike = 0; /* 2 Kermits have compatible sysids */
+char * cksysid = /* My system ID */
+#ifdef UNIX
+ "U1"
+#else
+#ifdef VMS
+ "D7"
+#else
+#ifdef OSK
+ "UD"
+#else
+#ifdef AMIGA
+ "L3"
+#else
+#ifdef MAC
+ "A3"
+#else
+#ifdef OS2
+#ifdef NT
+ "UN"
+#else /* NT */
+ "UO"
+#endif /* NT */
+#else /* OS2 */
+#ifdef datageneral
+ "F3"
+#else
+#ifdef GEMDOS
+ "K2"
+#else
+#ifdef STRATUS
+ "MV"
+#else
+ ""
+#endif /* STRATUS */
+#endif /* GEMDOS */
+#endif /* datageneral */
+#endif /* OS2 */
+#endif /* MAC */
+#endif /* AMIGA */
+#endif /* OSK */
+#endif /* VMS */
+#endif /* UNIX */
+ ;
+
+int oopts = -1; /* O-Packet Options */
+int omode = -1; /* O-Packet Transfer Mode */
+int oname = -1; /* O-Packet Filename Options */
+int opath = -1; /* O-Packet Pathname Options */
+
+struct zattr iattr; /* Incoming file attributes */
+
+#ifdef VMS
+/* VMS labeled file default options - name only. */
+int lf_opts = LBL_NAM;
+#else
+#ifdef OS2
+/* OS/2 labeled file default options, all attributes but archived. */
+unsigned long int lf_opts = LBL_EXT|LBL_HID|LBL_RO|LBL_SYS;
+#else
+int lf_opts = 0;
+#endif /* OS2 */
+#endif /* VMS */
+
+/* Packet-related variables */
+
+int pktnum = 0, /* Current packet number */
+ sndtyp = 0, /* Type of packet just sent */
+ rcvtyp = 0, /* Type of packet just received */
+ rsn, /* Received packet sequence number */
+ rln, /* Received packet length */
+ size, /* Current size of output pkt data */
+ osize, /* Previous output packet data size */
+ maxsize, /* Max size for building data field */
+ spktl = 0, /* Length packet being sent */
+ rpktl = 0, /* Length of packet just received */
+ pktpaus = 0, /* Interpacket pause interval, msec */
+ rprintf, /* REMOTE PRINT flag */
+ rmailf, /* MAIL flag */
+ xferstat = -1, /* Status of last transaction */
+ filestatus = 0; /* Status of last file transfer */
+
+CHAR pktmsgbuf[PKTMSGLEN+1];
+CHAR *epktmsg = pktmsgbuf;
+
+#ifdef pdp11
+int srvcmdlen = MAXRP; /* srvcmd buffer length */
+#else
+#ifdef DYNAMIC
+int srvcmdlen = MAXRP;
+#else
+int srvcmdlen = 0;
+#endif /* DYNAMIC */
+#endif /* pdp11 */
+
+CHAR
+#ifdef pdp11
+ srvcmdbuf[MAXRP+4],
+ *srvcmd = srvcmdbuf,
+#else
+#ifdef DYNAMIC
+ *srvcmd = (CHAR *)0, /* Where to decode server command */
+#else
+ srvcmdbuf[MAXRP+4],
+ *srvcmd = srvcmdbuf,
+#endif /* DYNAMIC */
+#endif /* pdp11 */
+ padbuf[96], /* Buffer for send-padding */
+ *recpkt,
+ *rdatap, /* Pointer to received packet data */
+ *data = (CHAR *)0, /* Pointer to send-packet data */
+ *srvptr, /* Pointer to srvcmd */
+ mystch = SOH, /* Outbound packet-start character */
+ stchr = SOH; /* Incoming packet-start character */
+
+/* File-related variables */
+
+#ifndef NOMSEND /* Multiple SEND */
+struct filelist * filehead = NULL; /* SEND list */
+struct filelist * filetail = NULL;
+struct filelist * filenext = NULL;
+int addlist = 0;
+#endif /* NOMSEND */
+
+char filnam[CKMAXPATH + 1]; /* Name of current file. */
+char ofilnam[CKMAXPATH + 1]; /* Original name. */
+
+int pipesend = 0; /* Nonzero if sending from pipe */
+#ifdef PIPESEND
+char * sndfilter = NULL; /* Send and receive filters */
+char * rcvfilter = NULL;
+#endif /* PIPESEND */
+
+char ** sndarray = NULL; /* SEND /ARRAY pointer and range */
+#ifndef NOSPL
+int sndxlo = -1, sndxhi = -1, sndxin = -1;
+#endif /* NOSPL */
+#endif /* NOXFER */
+
+#ifndef NOSERVER
+int ngetpath = 0; /* GET search path */
+int fromgetpath = 0;
+char * getpath[MAXGETPATH];
+char * x_user = NULL; /* Server login information */
+char * x_passwd = NULL;
+char * x_acct = NULL;
+#endif /* NOSERVER */
+
+int x_login = 0; /* Login required */
+int x_logged = 0; /* User is logged in */
+
+extern int timelimit;
+
+#ifdef CK_LOGIN
+int logintimo = 300; /* Login timeout */
+char * userfile = NULL; /* Forbidden user file */
+#endif /* CK_LOGIN */
+#ifdef IKSD
+char * anonfile = NULL; /* Anonymous login init file */
+char * anonroot = NULL; /* Anonymous file-system root */
+int iks_timo = 300; /* 5 minutes idle timo */
+int iks_retry = 3; /* 3 attempts at login */
+#endif /* IKSD */
+
+#ifdef CKSYSLOG
+extern VOID zsyslog();
+extern int ckxlogging, ckxsyslog;
+#endif /* CKSYSLOG */
+
+int nzxopts = 0; /* Options for nzxpand() */
+int nfils = 0; /* Number of files in file group */
+long fsize = 0L; /* Size of current file */
+#ifdef UNIX
+int wildxpand = 0; /* Who expands wildcards */
+#else /* UNIX */
+#ifdef STRATUS
+int wildxpand = 1;
+#endif /* STRATUS */
+#endif /* UNIX */
+#ifdef UNIXOROSK
+int matchdot = 0; /* Whether to match dot files */
+#else
+int matchdot = 1;
+#endif /* UNIXOROSK */
+int matchfifo = 0; /* Whether to match FIFO "files" */
+int clfils = 0; /* Flag for command-line files */
+int stayflg = 0; /* Flag for "stay", i.e. "-S" */
+int xfinish = 0; /* Flag for FINISH = EXIT */
+long ztusec = -1L; /* Used with ztime() */
+long ztmsec = -1L; /* Ditto */
+
+/* Communication device / connection variables */
+
+char ttname[TTNAMLEN+1]; /* Name of communication device */
+
+#ifdef MAC
+int connected = 0; /* True if connected */
+int startconnected; /* initial state of connected */
+#endif /* MAC */
+
+long speed = -1L; /* Communication device speed */
+int wasclosed = 0; /* Connection was just closed */
+int whyclosed = WC_REMO; /* why it was closed */
+int qnxportlock = 0; /* QNX port locking on/off */
+
+#ifndef CLSONDISC
+#define CLSONDISC 0
+#endif /* CLSONDISC */
+
+int cxflow[CXT_MAX+1]; /* See initflow() */
+
+#ifndef NOSHOW
+char * floname[] = { /* Flow control names */
+ "none", "xon/xoff", "rts/cts", "dtr/cd", "etx/ack", "string",
+ "xxx1", "xxx2", "dtr/cts", "keep", "auto"
+};
+int nfloname = (sizeof(floname) / sizeof(char *));
+
+char * cxname[] = { /* Connection type names */
+ "remote", "direct-serial", "modem", "tcp/ip", "x.25", "decnet",
+ "lat", "netbios", "named-pipe", "ssh", "pipe"
+};
+int ncxname = (sizeof(cxname) / sizeof(char *));
+#endif /* NOSHOW */
+
+int parity = DEFPAR, /* Parity specified, 0,'e','o',etc */
+ hwparity = 0, /* Hardware parity for serial port */
+ stopbits = -1, /* Stop bits for serial port */
+ clsondisc = CLSONDISC, /* Serial port close on disconnect */
+ autopar = 0, /* Automatic parity change flag */
+ sosi = 0, /* Shift-In/Out flag */
+ flow = 0, /* Flow control (see initflow()) */
+ autoflow = 1, /* Automatic flow control */
+ turn = 0, /* Line turnaround handshake flag */
+ turnch = XON, /* Line turnaround character */
+ duplex = 0, /* Duplex, full by default */
+ escape = DFESC, /* Escape character for connect */
+ ckdelay = DDELAY, /* Initial delay before sending */
+ tnlm = 0; /* Terminal newline mode */
+
+/* Networks for SET HOST */
+
+#ifdef BIGBUFOK
+#define MYHOSTL 1024
+#else
+#define MYHOSTL 100
+#endif /* BIGBUFOK */
+
+char myhost[MYHOSTL]; /* Local host name */
+int network = 0; /* Network vs serial connection */
+int inserver = 0; /* Running as an Internet server */
+int isguest = 0; /* User is anonymous */
+char * clienthost = NULL; /* Peer host name or address */
+int tcp_incoming = 0; /* Incoming TCP connection? */
+
+#ifdef NETCONN
+#ifdef TCPSOCKET
+int nettype = NET_TCPB; /* Default network type */
+#else
+#ifdef SUNX25
+int nettype = NET_SX25;
+#else
+#ifdef IBMX25
+int nettype = NET_IX25;
+#else
+#ifdef HPX25
+int nettype = NET_HX25;
+#else
+#ifdef STRATUSX25
+int nettype = NET_VX25;
+#else
+#ifdef DECNET
+int nettype = NET_DEC;
+#else
+#ifdef SUPERLAT
+int nettype = NET_SLAT;
+#else
+int nettype = NET_NONE;
+#endif /* SUPERLAT */
+#endif /* DECNET */
+#endif /* STRATUSX25 */
+#endif /* HPX25 */
+#endif /* IBMX25 */
+#endif /* SUNX25 */
+#endif /* TCPSOCKET */
+#else /* NETCONN */
+int nettype = NET_NONE;
+#endif /* NETCONN */
+
+#ifdef ANYX25
+int revcall = 0; /* X.25 reverse call not selected */
+int closgr = -1; /* X.25 closed user group */
+int cudata = 0; /* X.25 call user data not specified */
+char udata[MAXCUDATA]; /* X.25 call user data */
+
+#ifdef IBMX25
+/*
+ I was unable to find any pre-defined MAX values for x25 addresses - the
+ addresses that I've seen have been around 10-12 characters 32 is probably
+ enough, 64 is hopefully safe for everyone.
+*/
+ x25addr_t local_nua = {'\0'}; /* local x.25 address */
+ x25addr_t remote_nua = {'\0'}; /* remote x.25 address */
+ char x25name[32] = {'\0'}; /* x25 device name, sx25a0 or sx25a1 */
+ char x25dev[64] = "/dev/x25pkt"; /* x25 device in /dev */
+ int x25port = 0; /* port used for X.25 - AIX only */
+#endif /* IBMX25 */
+
+#ifndef IBMX25
+/*
+ This condition is unrelated to the above IBMX25 condition.
+ IBM X.25 doesn't have PAD support.
+*/
+ CHAR padparms[MAXPADPARMS+1]; /* X.3 parameters */
+#endif /* IBMX25 */
+#endif /* ANYX25 */
+
+/* Other items */
+
+int isinterrupted = 0; /* Used in exception handling */
+int what = W_INIT; /* What I am doing */
+int lastxfer = 0; /* Last transfer (send or receive) */
+
+extern int mdmtyp; /* Modem (/network) type */
+
+#ifdef NT
+extern int StartedFromDialer;
+#ifdef NTSIG
+extern int TlsIndex;
+#endif /* NTSIG */
+#ifdef NTASM
+unsigned long ESPToRestore; /* Ditto */
+#endif /* NTASM */
+#endif /* NT */
+
+#ifdef OS2PM
+int os2pm = 0; /* OS/2 Presentation Manager flag */
+#endif /* OS2PM */
+
+/* Terminal screen size, if known, -1 means unknown. */
+
+#ifdef OS2
+#include "ckocon.h"
+#ifdef KUI
+int tt_rows[VNUM] = {24,24,25,1}; /* Rows (height) */
+int tt_cols[VNUM] = {80,80,80,80}; /* Columns (width) */
+int cmd_rows = 24, cmd_cols = 80; /* Command/console screen dimensions */
+#else /* KUI */
+int tt_rows[VNUM] = {-1,24,25,1}; /* Rows (height) */
+int tt_cols[VNUM] = {-1,80,80,80}; /* Columns (width) */
+int cmd_rows = -1, cmd_cols = -1; /* Command/console screen dimensions */
+#endif /* KUI */
+int k95stdio = 0; /* Stdio threads */
+int tt_bell = XYB_AUD | XYB_SYS; /* BELL AUDIBLE (system sounds) */
+#else /* OS2 */
+int tt_rows = -1; /* Rows (height) */
+int tt_cols = -1; /* Columns (width) */
+int cmd_rows = 24, cmd_cols = 80; /* Command/console screen dimensions */
+int tt_bell = XYB_AUD; /* BELL ON */
+#endif /* OS2 */
+
+int tt_print = 0; /* Transparent print disabled */
+int tt_escape = 1; /* Escaping back is enabled */
+int tt_scroll = 1; /* Scrolling operations are enabled */
+
+int tn_exit = 0; /* Exit on disconnect */
+
+int exitonclose = 0; /* Exit on close */
+int exithangup = 1; /* Hangup on exit */
+int haveline = 0; /* SET LINE or SET HOST in effect */
+int tlevel = -1; /* Take-file command level */
+int hints = 1; /* Whether to give hints */
+
+#ifdef NOLOCAL
+int remonly = 1; /* Remote-mode-only advisory (-R) */
+int nolocal = 1; /* Remote-only strictly enforced */
+#else
+int remonly = 0;
+int nolocal = 0;
+int cx_status = 0; /* CONNECT return status */
+#endif /* NOLOCAL */
+
+#ifndef NOSPL
+extern int cmdlvl; /* Command level */
+extern int maclvl; /* Macro invocation level */
+#endif /* NOSPL */
+
+int protocol = PROTO_K; /* File transfer protocol = Kermit */
+
+#ifdef NEWDEFAULTS
+int prefixing = PX_CAU;
+#else
+int prefixing = PX_ALL;
+#endif /* NEWDEFAULTS */
+
+extern short ctlp[]; /* Control-prefix table */
+
+int carrier = CAR_AUT; /* Pay attention to carrier signal */
+int cdtimo = 0; /* Carrier wait timeout */
+int xitsta = GOOD_EXIT; /* Program exit status */
+
+#ifdef VMS /* Default filename collision action */
+int fncact = XYFX_X; /* REPLACE for VMS */
+#else
+int fncact = XYFX_B; /* BACKUP for everybody else */
+#endif /* VMS */
+
+int fncsav = -1; /* For saving & restoring the above */
+int bgset = -1; /* BACKGROUND mode set explicitly */
+
+int cmdint = 1; /* Interrupts are allowed */
+#ifdef UNIX
+int xsuspend = DFSUSP; /* Whether SUSPEND command, etc, */
+#else /* is to be allowed. */
+int xsuspend = 0;
+#endif /* UNIX */
+
+/* Statistics variables */
+
+long filcnt, /* Number of files in transaction */
+ filrej, /* Number of files rejected in transaction */
+ flci, /* Characters from line, current file */
+ flco, /* Chars to line, current file */
+ tlci, /* Chars from line in transaction */
+ tlco, /* Chars to line in transaction */
+ ffc, /* Chars to/from current file */
+ tfc, /* Chars to/from files in transaction */
+ cps = 0L, /* Chars/sec last transfer */
+ peakcps = 0L, /* Peak chars/sec last transfer */
+ ccu, /* Control chars unprefixed in transaction */
+ ccp, /* Control chars prefixed in transaction */
+ rptn; /* Repeated characters compressed */
+
+int tsecs = 0; /* Seconds for transaction */
+int fsecs = 0; /* Per-file timer */
+
+#ifdef GFTIMER
+CKFLOAT
+ fpfsecs = 0.0, /* Floating point per-file timer */
+ fptsecs = 0.0; /* and per-transaction timer */
+#endif /* GFTIMER */
+
+/* Flags */
+
+int deblog = 0, /* Debug log is open */
+ debok = 1, /* Debug log is not disabled */
+ debxlen = 54, /* Default length for debug strings */
+ debses = 0, /* Flag for DEBUG SESSION */
+ debtim = 0, /* Include timestamp in debug log */
+ pktlog = 0, /* Flag for packet logging */
+ seslog = 0, /* Session logging */
+ dialog = 0, /* DIAL logging */
+ tralog = 0, /* Transaction logging */
+ tlogfmt = 1, /* Transaction log format (verbose) */
+ tlogsep = (int)',', /* Transaction log field separator */
+ displa = 0, /* File transfer display on/off */
+ stdouf = 0, /* Flag for output to stdout */
+ stdinf = 0, /* Flag for input from stdin */
+ xflg = 0, /* Flag for X instead of F packet */
+ hcflg = 0, /* Doing Host command */
+ dest = DEST_D, /* Destination for packet data */
+ zchkod = 0, /* zchko() should work for dirs too? */
+ zchkid = 0, /* zchki() should work for dirs too? */
+
+/* If you change this, also see struct ptab above... */
+
+#ifdef OS2 /* Flag for file name conversion */
+ fncnv = XYFN_L, /* Default is Literal in OS/2, */
+ f_save = XYFN_L, /* (saved copy of same) */
+#else
+ fncnv = XYFN_C, /* elsewhere Convert them */
+ f_save = XYFN_C, /* (ditto) */
+#endif /* OS2 */
+
+ fnspath = PATH_OFF, /* Send file path */
+ fnrpath = PATH_AUTO, /* Receive file path */
+ fackpath = 1, /* Send back path in ACK to F */
+ binary = XYFT_B, /* Default file transfer mode */
+ b_save = XYFT_B, /* Saved file mode */
+ eofmethod = 0, /* EOF detection method (length) */
+
+#ifdef OS2
+ cursor_save = -1, /* Cursor state */
+#endif /* OS2 */
+
+ xfermode = XMODE_A, /* Transfer mode, manual or auto */
+ xfiletype = -1, /* Transfer only text (or binary) */
+ recursive = 0, /* Recursive directory traversal */
+ nolinks = 2, /* Don't follow symbolic links */
+ skipbup = 0, /* Skip backup files when sending */
+ sendmode = SM_SEND, /* Which type of SEND operation */
+ slostart = 1, /* Slow start (grow packet lengths) */
+ cmask = 0377, /* CONNECT (terminal) byte mask */
+ fmask = 0377, /* File byte mask */
+ ckwarn = 0, /* Flag for file warning */
+ quiet = 0, /* Be quiet during file transfer */
+ local = 0, /* 1 = local mode, 0 = remote mode */
+ cxtype = CXT_REMOTE, /* Connection type */
+ server = 0, /* Flag for I Am Server */
+ query = 0, /* Flag for Query active */
+ justone = 0, /* Server should do Just One command */
+ urserver = 0, /* Flag for You Are Server */
+ bye_active = 0, /* Flag for BYE command active */
+ diractive = 0, /* Flag for DIRECTORY command active */
+ cdactive = 0, /* Flag for CD command active */
+ cflg = 0, /* Connect before transaction */
+ cnflg = 0, /* Connect after transaction */
+ cxseen = 0, /* Flag for cancelling a file */
+ czseen = 0, /* Flag for cancelling file group */
+ fatalio = 0, /* Flag for fatal i/o error */
+ discard = 0, /* Flag for file to be discarded */
+ keep = SET_AUTO, /* Keep incomplete files = AUTO */
+ unkcs = 1, /* Keep file w/unknown character set */
+#ifdef VMS
+ filepeek = 0, /* Inspection of files */
+#else
+#ifdef datgeneral
+ filepeek = 0,
+#else
+ filepeek = 1,
+#endif /* datageneral */
+#endif /* VMS */
+ nakstate = 0, /* In a state where we can send NAKs */
+ dblchar = -1, /* Character to double when sending */
+ moving = 0, /* MOVE = send, then delete */
+ reliable = SET_AUTO, /* Nonzero if transport is reliable */
+ xreliable = -1,
+ setreliable = 0,
+ urclear = 0, /* Nonzero for clear channel to you */
+ clearrq = SET_AUTO, /* SET CLEARCHANEL value */
+ cleared = 0,
+ streaming = 0, /* Nonzero if streaming is active */
+ streamok = 0, /* Nonzero if streaming negotiated */
+ streamrq = SET_AUTO, /* SET STREAMING value */
+ streamed = -1; /* Whether we streamed last time */
+
+char * snd_move = NULL; /* Move file after sending it */
+char * snd_rename = NULL; /* Rename file after sending it */
+char * rcv_move = NULL; /* Move file after receiving it */
+char * rcv_rename = NULL; /* Rename file after receiving it */
+
+char * g_snd_move = NULL;
+char * g_snd_rename = NULL;
+char * g_rcv_move = NULL;
+char * g_rcv_rename = NULL;
+
+long sendstart = 0L; /* SEND start position */
+long calibrate = 0L; /* Nonzero if calibration run */
+
+#ifdef CK_TRIGGER
+char *tt_trigger[TRIGGERS] = { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL };
+CHAR *tt_trmatch[TRIGGERS] = { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL };
+char *triggerval = NULL;
+#endif /* CK_TRIGGER */
+
+int ckxlogging = 0; /* Flag for syslogging active */
+int ikdbopen = 0; /* Flag for IKSD database active */
+int dbinited = 0; /* Flag for IKSDB record init'd */
+#ifndef CKSYSLOG
+int ckxsyslog = 0; /* Logging level 0 */
+#else
+#ifdef SYSLOGLEVEL
+int ckxsyslog = SYSLOGLEVEL; /* Logging level specified */
+#else
+int ckxsyslog = SYSLG_DF; /* Default logging level */
+#endif /* SYSLOGLEVEL */
+#endif /* CKSYSLOG */
+
+#ifndef NOHELP
+#ifndef NOCMDL
+_PROTOTYP( VOID iniopthlp, (void) ); /* Command-line help initializer */
+#endif /* NOCMDL */
+#endif /* NOHELP */
+
+_PROTOTYP( VOID getexedir, (void) );
+_PROTOTYP( int putnothing, (char) );
+
+#ifdef IKSD
+_PROTOTYP( VOID doiksdinit, (void) );
+_PROTOTYP( VOID iksdinit, (void) );
+_PROTOTYP( VOID doiklog, (void) );
+_PROTOTYP( int dbinit, (void) );
+#endif /* IKSD */
+
+/* Variables passed from command parser to protocol module */
+
+#ifndef NOSPL
+#ifndef NOICP
+#ifdef CK_APC
+_PROTOTYP( VOID apconect, (void) );
+#endif /* CK_APC */
+#ifdef OS2
+extern int initvik;
+#endif /* OS2 */
+#endif /* NOICP */
+#endif /* NOSPL */
+char *clcmds = NULL; /* Pointer to command-line commands */
+
+#ifndef NOSETKEY
+extern KEY *keymap;
+extern MACRO *macrotab;
+#endif /* NOSETKEY */
+
+#ifndef NOPUSH
+int nopush = 0; /* PUSH enabled */
+#else
+int nopush = 1; /* PUSH disabled */
+#endif /* NOPUSH */
+
+CHAR sstate = (CHAR) 0; /* Starting state for automaton */
+CHAR zstate = (CHAR) 0; /* For remembering sstate */
+char * printername = NULL; /* NULL if printer not redirected */
+int printpipe = 0; /* For SET PRINTER */
+int noprinter = 0;
+
+#ifndef NOXFER
+char *cmarg = ""; /* Pointer to command data */
+char *cmarg2 = ""; /* Pointer to 2nd command data */
+char **cmlist; /* Pointer to file list in argv */
+
+#ifdef CK_AUTODL /* Autodownload */
+int autodl = 1; /* Enabled by default */
+#else
+int autodl = 0; /* (or if not implemented). */
+#endif /* CK_AUTODL */
+int adl_err = 1; /* 1 = stop on error */
+#ifdef KUI
+int adl_ask = 1; /* 1 = file dialog on autodownload */
+#else
+int adl_ask = 0; /* 0 = no file dialog */
+#endif /* KUI */
+#ifdef OS2 /* AUTODOWNLOAD parameters */
+int adl_kmode = ADL_PACK, /* Match Packet to signal download */
+ adl_zmode = ADL_PACK;
+char * adl_kstr = NULL; /* KERMIT Download String */
+char * adl_zstr = NULL; /* ZMODEM Download String */
+#endif /* OS2 */
+
+int remfile = 0, rempipe = 0, remappd = 0; /* REMOTE output redirection */
+char * remdest = NULL;
+
+#ifndef NOSERVER
+/*
+ Server services:
+ 0 = disabled
+ 1 = enabled in local mode
+ 2 = enabled in remote mode
+ 3 = enabled in both local and remote modes
+ only as initial (default) values.
+*/
+int en_xit = 2; /* EXIT */
+int en_cwd = 3; /* CD/CWD */
+int en_cpy = 3; /* COPY */
+int en_del = 2; /* DELETE */
+int en_mkd = 3; /* MKDIR */
+int en_rmd = 2; /* RMDIR */
+int en_dir = 3; /* DIRECTORY */
+int en_fin = 3; /* FINISH */
+int en_get = 3; /* GET */
+#ifndef NOPUSH
+int en_hos = 2; /* HOST enabled */
+#else
+int en_hos = 0; /* HOST disabled */
+#endif /* NOPUSH */
+int en_ren = 3; /* RENAME */
+int en_sen = 3; /* SEND */
+int en_set = 3; /* SET */
+int en_spa = 3; /* SPACE */
+int en_typ = 3; /* TYPE */
+int en_who = 3; /* WHO */
+#ifdef datageneral
+/* Data General AOS/VS can't do this */
+int en_bye = 0; /* BYE */
+#else
+int en_bye = 2; /* PCs in local mode... */
+#endif /* datageneral */
+int en_asg = 3; /* ASSIGN */
+int en_que = 3; /* QUERY */
+int en_ret = 2; /* RETRIEVE */
+int en_mai = 3; /* MAIL */
+int en_pri = 3; /* PRINT */
+int en_ena = 3; /* ENABLE */
+#else
+int en_xit = 0, en_cwd = 0, en_cpy = 0, en_del = 0, en_mkd = 0, en_rmd = 0,
+ en_dir = 0, en_fin = 0, en_get = 0, en_hos = 0, en_ren = 0, en_sen = 0,
+ en_set = 0, en_spa = 0, en_typ = 0, en_who = 0, en_bye = 0, en_asg = 0,
+ en_que = 0, en_ret = 0, en_mai = 0, en_pri = 0, en_ena = 0;
+#endif /* NOSERVER */
+#endif /* NOXFER */
+
+/* Miscellaneous */
+
+char **xargv; /* Global copies of argv */
+int xargc; /* and argc */
+int xargs; /* an immutable copy of argc */
+char *xarg0; /* and of argv[0] */
+char *pipedata; /* Pointer to -P (pipe) data */
+
+extern char *dftty; /* Default tty name from ck?tio.c */
+extern int dfloc; /* Default location: remote/local */
+extern int dfprty; /* Default parity */
+extern int dfflow; /* Default flow control */
+
+#ifdef TNCODE
+extern int tn_deb;
+#endif /* TNCODE */
+/*
+ Buffered file input and output buffers. See getpkt() in ckcfns.c
+ and zoutdump() in the system-dependent file i/o module (usually ck?fio.c).
+*/
+#ifndef DYNAMIC
+/* Now we allocate them dynamically, see getiobs() below. */
+char zinbuffer[INBUFSIZE], zoutbuffer[OBUFSIZE];
+#endif /* DYNAMIC */
+char *zinptr, *zoutptr;
+int zincnt, zoutcnt;
+int zobufsize = OBUFSIZE;
+int zofbuffer = 1;
+int zofblock = 1;
+
+#ifdef SESLIMIT
+int seslimit = 0;
+#endif /* SESLIMIT */
+
+#ifdef CK_AUTHENTICATION
+#include "ckuath.h"
+#endif /* CK_AUTHENTICATION */
+
+_PROTOTYP( int getiobs, (VOID) );
+
+/* M A I N -- C-Kermit main program */
+
+#include <signal.h>
+
+#ifndef NOCCTRAP
+#include <setjmp.h>
+#include "ckcsig.h"
+ckjmpbuf cmjbuf;
+#ifdef GEMDOS /* Special for Atari ST */
+cc_clean(); /* This can't be right? */
+#endif /* GEMDOS */
+#endif /* NOCCTRAP */
+
+#ifndef NOXFER
+/* Info associated with a system ID */
+
+struct sysdata sysidlist[] = { /* Add others as needed... */
+ { "0", "anonymous", 0, NUL, 0, 0, 0 },
+ { "A1", "Apple II", 0, NUL, 0, 0, 3 }, /* fix this */
+ { "A3", "Macintosh", 1, ':', 0, 2, 1 },
+ { "D7", "VMS", 0, ']', 1, 0, 0 },
+ { "DA", "RSTS/E", 0, ']', 1, 0, 3 }, /* (i think...) */
+ { "DB", "RT11", 0, NUL, 1, 0, 3 }, /* (maybe...) */
+ { "F3", "AOS/VS", 1, ':', 0, 0, 2 },
+ { "I1", "VM/CMS", 0, NUL, 0, 0, 0 },
+ { "I2", "MVS/TSO", 0, NUL, 0, 0, 0 },
+ { "I4", "MUSIC", 0, NUL, 0, 0, 0 },
+ { "I7", "CICS", 0, NUL, 0, 0, 0 },
+ { "I9", "MVS/ROSCOE", 0, NUL, 0, 0, 0 },
+ { "K2", "Atari ST", 1, '\\', 1, 0, 3 },
+ { "L3", "Amiga", 1, '/', 1, 0, 2 },
+ { "MV", "Stratus VOS", 1, '>', 0, 1, 0 },
+ { "N3", "Apollo Aegis", 1, '/', 0, 3, 2 },
+ { "U1", "UNIX", 1, '/', 0, 3, 2 },
+ { "U8", "MS-DOS", 1, '\\', 1, 0, 3 },
+ { "UD", "OS-9", 1, '/', 0, 3, 2 },
+ { "UN", "Windows-32", 1, '\\', 1, 2, 3 },
+ { "UO", "OS/2", 1, '\\', 1, 2, 3 }
+};
+static int nxxsysids = (sizeof(sysidlist) / sizeof(struct sysdata));
+
+/* Given a Kermit system ID code, return the associated name string */
+/* and some properties of the filenames... */
+
+char *
+getsysid(s) char * s; { /* Get system-type name */
+ int i;
+ if (!s) return("");
+ for (i = 0; i < nxxsysids; i++)
+ if (!strcmp(sysidlist[i].sid_code,s))
+ return(sysidlist[i].sid_name);
+ return(s);
+}
+
+int
+getsysix(s) char *s; { /* Get system-type index */
+ int i;
+ if (!s) return(-1);
+ for (i = 0; i < nxxsysids; i++)
+ if (!strcmp(sysidlist[i].sid_code,s))
+ return(i);
+ return(-1);
+}
+#endif /* NOXFER */
+
+/* Tell if a pathname is absolute (versus relative) */
+/* This should be parceled out to each of the ck*fio.c modules... */
+int
+isabsolute(path) char * path; {
+ int rc = 0;
+ int x;
+ if (!path)
+ return(0);
+ if (!*path)
+ return(0);
+ x = (int) strlen(path);
+ debug(F111,"isabsolute",path,x);
+#ifdef VMS
+ rc = 0;
+ x = ckindex("[",path,0,0,0); /* 1-based */
+ if (!x)
+ x = ckindex("<",path,0,0,0);
+ debug(F111,"isabsolute left bracket",path,x);
+ if (!x) {
+ x = ckindex(":",path,-1,1,1);
+ if (x)
+ debug(F111,"isabsolute logical",path,x);
+ }
+ if (x > 0)
+ if (path[x] != '.') /* 0-based */
+ rc = 1;
+#else
+#ifdef UNIX
+ if (*path == '/'
+#ifdef DTILDE
+ || *path == '~'
+#endif /* DTILDE */
+ )
+ rc = 1;
+#else
+#ifdef OS2
+ if (*path == '/' || *path == '\\')
+ rc = 1;
+ else if (isalpha(*path) && x > 2)
+ if (*(path+1) == ':' && (*(path +2) == '/' || *(path+2) == '\\'))
+ rc = 1;
+#else
+#ifdef AMIGA
+ if (*path == '/'
+#ifdef DTILDE
+ || *path == '~'
+#endif /* DTILDE */
+ )
+ rc = 1;
+#else
+#ifdef OSK
+ if (*path == '/'
+#ifdef DTILDE
+ || *path == '~'
+#endif /* DTILDE */
+ )
+ rc = 1;
+#else
+#ifdef datageneral
+ if (*path == ':')
+ rc = 1;
+#else
+#ifdef MAC
+ rc = 0; /* Fill in later... */
+#else
+#ifdef STRATUS
+ rc = 0; /* Fill in later... */
+#else
+#ifdef GEMDOS
+ if (*path == '/' || *path == '\\')
+ rc = 1;
+ else if (isalpha(*path) && x > 1)
+ if (*(path+1) == ':')
+ rc = 1;
+#endif /* GEMDOS */
+#endif /* STRATUS */
+#endif /* MAC */
+#endif /* datageneral */
+#endif /* OSK */
+#endif /* AMIGA */
+#endif /* OS2 */
+#endif /* UNIX */
+#endif /* VMS */
+ debug(F101,"isabsolute rc","",rc);
+ return(rc);
+}
+
+/* See if I have direct access to the keyboard */
+
+int
+is_a_tty(n) int n; {
+#ifdef UNIX
+ extern int ttfdflg;
+ if (ttfdflg > 0)
+ return(1);
+#endif /* UNIX */
+#ifdef KUI
+ return 1;
+#else /* KUI */
+#ifdef NT
+ if (isWin95())
+ return(1);
+ else
+ return(_isatty(n));
+#else
+#ifdef IKSD
+ if (inserver)
+ return(1);
+ else
+#endif /* IKSD */
+ return(isatty(n));
+#endif /* NT */
+#endif /* KUI */
+}
+
+#ifndef NOXFER
+VOID
+initxlist() {
+ extern char * sndexcept[], * rcvexcept[];
+ int i;
+ for (i = 0; i < NSNDEXCEPT; i++) {
+ sndexcept[i] = NULL;
+ rcvexcept[i] = NULL;
+ }
+}
+#endif /* NOXFER */
+
+/* Initialize flow control table */
+
+VOID
+initflow() { /* Default values for flow control */
+#ifdef VMS /* for each kind of connection. */
+ /* The VMS telnet terminal driver treats "none" as request to lose chars */
+ cxflow[CXT_REMOTE] = FLO_XONX; /* Remote mode... */
+#else
+#ifdef HPUX
+ /* Ditto for HP-UX */
+ cxflow[CXT_REMOTE] = FLO_XONX; /* Remote mode... */
+#else
+ /* The temptation is to make this one FLO_KEEP but don't!!! */
+ /* It totally wrecks binary-file transfer when coming in via Telnet. */
+ /* In UNIX at least... */
+ cxflow[CXT_REMOTE] = FLO_NONE;
+#endif /* HPUX */
+#endif /* VMS */
+
+#ifdef VMS
+ cxflow[CXT_DIRECT] = FLO_XONX; /* Direct serial connections... */
+#else
+ cxflow[CXT_DIRECT] = FLO_NONE;
+#endif /* VMS */
+
+#ifdef CK_RTSCTS
+ cxflow[CXT_MODEM] = FLO_RTSC; /* Modem connections... */
+#else
+#ifdef VMS
+ cxflow[CXT_MODEM] = FLO_XONX;
+#else
+ cxflow[CXT_MODEM] = FLO_NONE;
+#endif /* VMS */
+#endif /* CK_RTSCTS */
+
+#ifdef VMS
+ cxflow[CXT_TCPIP] = FLO_XONX; /* TCP/IP connections... */
+#else
+ cxflow[CXT_TCPIP] = FLO_NONE;
+#endif /* VMS */
+
+ cxflow[CXT_SSH] = FLO_NONE;
+ cxflow[CXT_X25] = FLO_NONE; /* Other kinds of networks... */
+ cxflow[CXT_DECNET] = FLO_XONX;
+ cxflow[CXT_LAT] = FLO_XONX;
+ cxflow[CXT_NETBIOS] = FLO_NONE;
+ cxflow[CXT_NPIPE] = FLO_NONE;
+ cxflow[CXT_PIPE] = FLO_NONE;
+ flow = cxflow[cxtype]; /* Initial flow setting. */
+ debug(F101,"initflow","",flow);
+}
+
+#ifndef NOXFER
+/* Initialize file transfer protocols */
+
+VOID
+initproto(y, upbstr, uptstr, srvstr, sndbstr, sndtstr, rcvbstr, rcvtstr)
+ int y;
+ char * upbstr, * uptstr, * srvstr, * sndbstr, * sndtstr, * rcvbstr,
+ * rcvtstr;
+/* initproto */ {
+
+ if (upbstr) /* Convert null strings */
+ if (!*upbstr) /* to null pointers */
+ upbstr = NULL;
+
+ if (uptstr) /* Convert null strings */
+ if (!*uptstr) /* to null pointers */
+ uptstr = NULL;
+
+ if (sndbstr)
+ if (!*sndbstr)
+ sndbstr = NULL;
+
+ if (sndtstr)
+ if (!*sndtstr)
+ sndtstr = NULL;
+
+ if (rcvbstr)
+ if (!*rcvbstr)
+ rcvbstr = NULL;
+
+ if (rcvtstr)
+ if (!*rcvtstr)
+ rcvtstr = NULL;
+
+ if (srvstr)
+ if (!*srvstr)
+ srvstr = NULL;
+
+ protocol = y; /* Set protocol */
+
+ if (ptab[protocol].rpktlen > -1)
+ urpsiz = ptab[protocol].rpktlen;
+ if (ptab[protocol].spktflg > -1)
+ spsizf = ptab[protocol].spktflg;
+ if (ptab[protocol].spktlen > -1) {
+ spsiz = ptab[protocol].spktlen;
+ debug(F101,"initproto spsiz","",spsiz);
+ if (spsizf) {
+ spsizr = spmax = spsiz;
+ debug(F101,"initproto spsizr","",spsizr);
+ }
+ }
+ if (ptab[protocol].winsize > -1)
+ wslotr = ptab[protocol].winsize;
+ if (ptab[protocol].prefix > -1)
+ prefixing = ptab[protocol].prefix;
+ if (ptab[protocol].fnca > -1)
+ fncact = ptab[protocol].fnca;
+ if (ptab[protocol].fncn > -1)
+ fncnv = ptab[protocol].fncn;
+ if (ptab[protocol].fnsp > -1)
+ fnspath = ptab[protocol].fnsp;
+ if (ptab[protocol].fnrp > -1)
+ fnrpath = ptab[protocol].fnrp;
+
+ makestr(&(ptab[protocol].h_b_init),upbstr);
+ makestr(&(ptab[protocol].h_t_init),uptstr);
+ makestr(&(ptab[protocol].h_x_init),srvstr);
+ makestr(&(ptab[protocol].p_b_scmd),sndbstr);
+ makestr(&(ptab[protocol].p_t_scmd),sndtstr);
+ makestr(&(ptab[protocol].p_b_rcmd),rcvbstr);
+ makestr(&(ptab[protocol].p_t_rcmd),rcvtstr);
+}
+#endif /* NOXFER */
+
+#ifndef NOCMDL
+VOID
+#ifdef CK_ANSIC
+docmdline(void * threadinfo)
+#else /* CK_ANSIC */
+docmdline(threadinfo) VOID * threadinfo;
+#endif /* CK_ANSIC */
+{
+#ifdef NTSIG
+ setint();
+ if (threadinfo) { /* Thread local storage... */
+ TlsSetValue(TlsIndex,threadinfo);
+ debug( F100, "docmdline called with threadinfo block", "", 0 );
+ } else
+ debug( F100, "docmdline threadinfo is NULL","",0);
+#endif /* NTSIG */
+#ifdef CK_LOGIN
+#ifdef NT
+#ifdef IKSD
+ if (inserver)
+ setntcreds();
+#endif /* IKSD */
+#endif /* NT */
+#endif /* CK_LOGIN */
+ proto(); /* Take any requested action, then */
+ if (!quiet) /* put cursor back at left margin, */
+ conoll("");
+#ifndef NOLOCAL
+ if (cnflg) { /* Re-connect if requested */
+ cnflg = 0;
+ doconect(0,0);
+ if (ttchk() < 0)
+ dologend();
+ }
+#endif /* NOLOCAL */
+
+#ifdef NTSIG
+ ckThreadEnd(threadinfo);
+#endif /* NTSIG */
+ return;
+}
+
+void
+ikslogin() {
+ if (sstelnet
+#ifdef IKSD
+ || inserver /* Internet server */
+#endif /* IKSD */
+ ) {
+ char *s;
+ extern int fdispla; /* File-transfer display format */
+ extern char * ikprompt; /* IKSD prompt */
+
+#ifdef IKSD
+#ifdef CK_LOGIN
+ if (inserver) {
+ x_login = 1; /* Login required */
+ x_logged = 0; /* Not logged in yet */
+ cmsetp(ikprompt); /* Set up IKSD's prompt */
+#ifndef NOSERVER
+ en_mai = 0; /* MAIL is disabled */
+ en_who = 0; /* REMOTE WHO is disabled */
+ en_hos = 0; /* REMOTE HOST is disabled */
+ en_pri = 0; /* PRINT is disabled */
+#endif /* NOSERVER */
+ } else {
+ x_login = 0; /* Login not required */
+ x_logged = 1; /* Already logged in */
+ }
+#endif /* CK_LOGIN */
+#endif /* IKSD */
+ nolocal = 1; /* SET LINE/HOST not allowed */
+ fdispla = XYFD_N; /* No file-transfer display */
+#ifdef NETCONN
+ clienthost = ckgetpeer(); /* Get client's hostname */
+ debug(F110,"ikslogin clienthost",clienthost,0);
+#endif /* NETCONN */
+ ztime(&s); /* Get current date and time */
+
+#ifdef CK_LOGIN
+#ifdef CK_AUTHENTICATION
+ if (x_login) {
+ x_logged = ck_tn_auth_valid(); /* Did Telnet Auth succeed? */
+ debug(F111,"ikslogin","x_logged",x_logged);
+
+#ifdef NT
+ /* On Windows 9x, we do not have the ability in */
+ /* zvuser() at present to determine if the name */
+ /* approved in a Kerberos principal is really a */
+ /* an account in the Windows Access Control List */
+ if (isWin95() && x_logged == AUTH_VALID
+ && (ck_tn_authenticated() != AUTHTYPE_NTLM)
+#ifdef CK_SRP
+ && (ck_tn_authenticated() != AUTHTYPE_SRP)
+#endif /* CK_SRP */
+ ) {
+ auth_finished(AUTH_USER);
+ x_logged = AUTH_USER;
+ printf("WARNING:\r\n");
+ printf(
+" The Telnet authentication method used cannot provide for automated\r\n");
+ printf(
+" login to Windows 95 or Windows 98. A password must be entered\r\n");
+ printf(
+" locally to validate your userid. Telnet authentication (and encryption)\r\n"
+ );
+ printf(
+" can be used to validate the host (and protect the privacy of your password.)\
+\r\n"
+ );
+ }
+#endif /* NT */
+
+ if (x_logged == AUTH_VALID) {
+#ifdef CK_SSL
+ if ((ssl_active_flag || tls_active_flag) &&
+ (!TELOPT_U(TELOPT_AUTHENTICATION) ||
+ ck_tn_authenticated() == AUTHTYPE_NULL ||
+ ck_tn_authenticated() == AUTHTYPE_AUTO)
+ ) {
+#ifdef SSL_KRB5
+ if (tls_is_krb5(0)) {
+ printf("Authenticated using Kerberos 5\r\n");
+#ifdef CKSYSLOG
+ if (ckxsyslog >= SYSLG_LI && ckxlogging) {
+ extern char szUserNameAuthenticated[];
+ cksyslog(SYSLG_LI, 1, "AUTH_VALID",
+ "Kerberos 5",
+ szUserNameAuthenticated
+ );
+ }
+#endif /* CKSYSLOG */
+ } else
+#endif /* SSL_KRB5 */
+ {
+ printf("Authenticated using X.509 certificate\r\n");
+#ifdef CKSYSLOG
+ if (ckxsyslog >= SYSLG_LI && ckxlogging) {
+ extern char szUserNameAuthenticated[];
+ cksyslog(SYSLG_LI, 1, "AUTH_VALID",
+ "X.509 certificate",
+ szUserNameAuthenticated
+ );
+ }
+#endif /* CKSYSLOG */
+ }
+ } else
+#endif /* CK_SSL */
+ {
+ printf("Authenticated using %s\r\n",
+ AUTHTYPE_NAME(ck_tn_authenticated()));
+#ifdef CKSYSLOG
+ if (ckxsyslog >= SYSLG_LI && ckxlogging) {
+ extern char szUserNameAuthenticated[];
+ cksyslog(SYSLG_LI, 1, "AUTH_VALID",
+ AUTHTYPE_NAME(ck_tn_authenticated()),
+ szUserNameAuthenticated
+ );
+ }
+#endif /* CKSYSLOG */
+ }
+ zvuser(uidbuf);
+ if (zvpass("") == 0)
+ x_logged = 0;
+ } else if (x_logged == AUTH_USER && !strcmp(uidbuf,"anonymous")) {
+ extern char szUserNameAuthenticated[];
+ zvuser(uidbuf);
+ debug(F110,"szUserNameAuthenticated",
+ szUserNameAuthenticated,0);
+ if (zvpass(szUserNameAuthenticated) == 0) {
+ /* Anonymous login failed. Force a username prompt. */
+ x_logged = 0;
+ uidbuf[0] = '\0';
+ } else {
+#ifdef CK_SSL
+ if ((ssl_active_flag || tls_active_flag) &&
+ (!TELOPT_U(TELOPT_AUTHENTICATION) ||
+ ck_tn_authenticated() == AUTHTYPE_NULL ||
+ ck_tn_authenticated() == AUTHTYPE_AUTO)) {
+ printf("Authenticated using X.509 certificate\r\n");
+#ifdef CKSYSLOG
+ if (ckxsyslog >= SYSLG_LI && ckxlogging) {
+ extern char szUserNameAuthenticated[];
+ cksyslog(SYSLG_LI, 1, "AUTH_USER",
+ "X.509 certificate",
+ szUserNameAuthenticated
+ );
+ }
+#endif /* CKSYSLOG */
+ } else
+#endif /* CK_SSL */
+ {
+ printf("Authenticated using %s\r\n",
+ AUTHTYPE_NAME(ck_tn_authenticated())
+ );
+#ifdef CKSYSLOG
+ if (ckxsyslog >= SYSLG_LI && ckxlogging) {
+ cksyslog(SYSLG_LI, 1, "AUTH_USER",
+ AUTHTYPE_NAME(ck_tn_authenticated()),
+ szUserNameAuthenticated
+ );
+ }
+#endif /* CKSYSLOG */
+ }
+ }
+ } else {
+#ifdef CKSYSLOG
+ if (ckxsyslog >= SYSLG_LI && ckxlogging &&
+ x_logged == AUTH_USER) {
+ extern char szUserNameAuthenticated[];
+ cksyslog(SYSLG_LI, 1, "AUTH_USER",
+ AUTHTYPE_NAME(ck_tn_authenticated()),
+ szUserNameAuthenticated
+ );
+ }
+#endif /* CKSYSLOG */
+ x_logged = 0;
+ if (!strcmp("(unknown)",uidbuf)
+#ifdef NT
+ || !stricmp("administrator",uidbuf)
+#ifdef UNIX
+ || !strcmp("root",uidbuf)
+#else
+#ifdef Plan9
+ || !strcmp("root",uidbuf)
+#else
+#ifdef OSK
+ || !strcmp("root",uidbuf)
+#endif /* OSK */
+#endif /* Plan9 */
+#endif /* UNIX */
+#endif /* NT */
+ )
+ uidbuf[0] = '\0';
+ }
+ }
+#endif /* CK_AUTHENTICATION */
+#endif /* CK_LOGIN */
+
+#ifdef IKSD
+ if (inserver)
+ printf("\r\nInternet Kermit Service ready at %s%s\r\n",s,versio);
+ else
+#endif /* IKSD */
+ printf("\r\nC-Kermit ready at %s%s\r\n",s,versio);
+ if (*myhost)
+ printf("%s\r\n", myhost);
+ printf("\r\n");
+ }
+#ifdef CK_LOGIN
+#ifdef IKSD
+ if (inserver) {
+ int i;
+ extern int arg_x; /* Flag for '-x' on command line */
+#ifndef NOSPL
+ extern struct mtab *mactab; /* For ON_LOGIN macro. */
+ extern int nmac;
+#endif /* NOSPL */
+
+ debug(F110,"MAIN clienthost",clienthost,0);
+ srvidl = timelimit = logintimo; /* For interactive login */
+ rtimer(); /* Reset timer */
+ for (i = 0; i < iks_retry && !x_logged; i++) { /* Count retries */
+ if (gtimer() > logintimo)
+ break;
+#ifdef TNCODE
+ tn_wait("login loop");
+ tn_push();
+#endif /* TNCODE */
+ debug(F101,"MAIN LOGIN try","",i);
+ what = W_NOTHING; /* Because proto() changes this */
+
+#ifdef IKS_OPTION
+ debug(F111,"MAIN LOGIN",
+ "TELOPT_SB(TELOPT_KERMIT).kermit.me_start",
+ TELOPT_SB(TELOPT_KERMIT).kermit.me_start
+ );
+ /* Kermit server negotiated */
+ if (TELOPT_SB(TELOPT_KERMIT).kermit.me_start) {
+ debug(F101,"IKSD starting in server mode","",0);
+ arg_x = 1; /* Enter server mode */
+ sstate = 'x';
+#ifdef IKSDPOPBACK
+ justone = 1; /* Execute one command at a time. */
+#endif /* IKSDPOPBACK */
+ proto(); /* Enter protocol if requested. */
+#ifdef NTSIG
+ ck_ih();
+#endif /* NTSIG */
+ if (x_logged) /* Logged in */
+ break;
+ } else { /* Not in client/server mode */
+#endif /* IKS_OPTION */
+ debug(F101,"IKSD starting with Username prompt","",0);
+ x_logged = ckxlogin((CHAR *)uidbuf,NULL,NULL,1);
+ if (sstate) { /* Received a packet at prompt */
+#ifdef IKSDPOPBACK
+ justone = 1; /* Go handle it */
+#endif /* IKSDPOPBACK */
+ proto();
+ }
+ if (!x_logged) { /* In case we are at the prompt... */
+ printf("Access denied.\n");
+ uidbuf[0] = '\0'; /* Forget the name if we have one */
+ }
+#ifdef IKS_OPTION
+ }
+#endif /* IKS_OPTION */
+ }
+ srvidl = timelimit = iks_timo; /* Reset command timelimit */
+ debug(F101,"MAIN LOGIN","",x_logged);
+ if (!x_logged) { /* Logins failed. */
+ if (TELOPT_SB(TELOPT_KERMIT).kermit.me_start)
+ errpkt((CHAR *)"Login Timeout");
+ msleep(500);
+ doexit(BAD_EXIT,0);
+ }
+ what = W_NOTHING; /* Stay in known state */
+#ifndef NOSERVER
+ if (isguest) {
+ en_pri = 0; /* No printing for anonymous users */
+ en_mai = 0; /* No email for anonymous users */
+ en_mkd = 0; /* Or directory creation */
+ en_rmd = 0; /* Or directory removal */
+ en_ena = 0; /* Or ENABLing DISABLEd items */
+ }
+#endif /* NOSERVER */
+
+#ifndef NOSPL
+/*
+ If a macro named "on_login" is defined, execute it. Also remove it from the
+ macro table so the user cannot see what it does. Execute it as part of the
+ iksd.conf file.
+*/
+ if (nmac) { /* Any macros defined? */
+ int k; /* Yes */
+ char * cmd = "on_login"; /* MSVC 2.x compiler error */
+ k = mlook(mactab,cmd,nmac); /* Look up "on_exit" */
+ if (k >= 0) { /* If found, */
+#ifdef IKSDCONF
+ int saved = iksdcf;
+ iksdcf = 0;
+#endif /* IKSDCONF */
+ if (dodo(k,"",0) > -1) /* set it up, */
+ parser(1); /* execute it */
+#ifdef IKSDCONF
+ iksdcf = saved;
+#endif /* IKSDCONF */
+ delmac(cmd,1); /* and delete it */
+ }
+ }
+#endif /* NOSPL */
+ } /* if (inserver) */
+#else /* CK_LOGIN */
+ if (inserver)
+ srvidl = timelimit = iks_timo; /* Set idle limits for IKS */
+#endif /* CK_LOGIN */
+#endif /* IKSD */
+}
+
+VOID
+#ifdef CK_ANSIC
+failcmdline(void * foo)
+#else /* CK_ANSIC */
+failcmdline(foo) VOID * foo;
+#endif /* CK_ANSIC */
+{
+#ifdef GEMDOS
+ cc_clean();
+#endif /* GEMDOS */
+#ifndef NOLOCAL
+ if (cnflg) doconect(0,0); /* connect again if requested. */
+ if (ttchk() < 0)
+ dologend();
+#endif /* NOLOCAL */
+}
+#endif /* NOCMDL */
+
+#ifndef NOICP
+VOID
+#ifdef CK_ANSIC
+dotakeini(void * threadinfo) /* Execute init file. */
+#else /* CK_ANSIC */
+dotakeini(threadinfo) VOID * threadinfo; /* Execute init file. */
+#endif /* CK_ANSIC */
+/* dotakeini */ {
+#ifdef NTSIG
+ setint();
+ if (threadinfo) { /* Thread local storage... */
+ TlsSetValue(TlsIndex,threadinfo);
+ debug(F100, "dotakeini called with threadinfo block","", 0);
+ } else
+ debug(F100, "dotakeini - threadinfo is NULL", "", 0);
+#endif /* NTSIG */
+#ifdef CK_LOGIN
+#ifdef NT
+#ifdef IKSD
+ if (inserver)
+ setntcreds();
+#endif /* IKSD */
+#endif /* NT */
+#endif /* CK_LOGIN */
+ cmdini(); /* Sets tlevel */
+
+ debug(F111,"dotakeini","inserver",inserver);
+ debug(F111,"dotakeini","sstelnet",sstelnet);
+
+#ifdef COMMENT
+/* Wrong place for this... */
+#ifndef NOXFER
+#ifdef CK_FAST
+ dofast(); /* By now FAST defaults should be OK */
+#endif /* CK_FAST */
+#endif /* NOXFER */
+#endif /* COMMENT */
+
+ doinit(); /* Now do the initialization file */
+ debug(F101,"main executing init file","",tlevel);
+ while (tlevel > -1) {
+ sstate = (CHAR) parser(1); /* Execute one command at a time. */
+ if (sstate) proto(); /* Enter protocol if requested. */
+#ifdef NTSIG
+ ck_ih();
+#endif /* NTSIG */
+ }
+ debug(F101,"main exits init file","",tlevel);
+
+#ifdef NTSIG
+ ckThreadEnd(threadinfo);
+#endif /* NTSIG */
+ return;
+}
+
+VOID
+#ifdef CK_ANSIC
+failtakeini(void * threadinfo)
+#else /* CK_ANSIC */
+failtakeini(threadinfo) VOID * threadinfo;
+#endif /* CK_ANSIC */
+/* failtakeini */ {
+#ifdef GEMDOS
+ cc_clean(); /* Atari: Clean up after ^C-trap. */
+#endif /* GEMDOS */
+ if (!cfilef) {
+ conoll("Interrupt during initialization or command-line processing.");
+ conoll("C-Kermit quitting...");
+ }
+ doexit(BAD_EXIT,-1); /* Exit with bad status. */
+}
+
+VOID
+#ifdef CK_ANSIC
+doicp(void * threadinfo)
+#else /* CK_ANSIC */
+doicp(threadinfo) VOID * threadinfo;
+#endif /* CK_ANSIC */
+/* doicp */ {
+#ifdef NTSIG
+ setint();
+ if (threadinfo) { /* Thread local storage... */
+ if (!TlsSetValue(TlsIndex,threadinfo))
+ debug(F101,"doicp TlsSetValue failed","",GetLastError());
+ debug(F101, "doicp a threadinfo block - TlsIndex", "", TlsIndex);
+ } else {
+ debug(F100, "doicp received a null threadinfo", "", 0);
+ }
+#endif /* NTSIG */
+#ifdef CK_LOGIN
+#ifdef NT
+#ifdef IKSD
+ if (inserver)
+ setntcreds();
+#endif /* IKSD */
+#endif /* NT */
+#endif /* CK_LOGIN */
+#ifdef MAC
+ while (1) {
+ extern char *lfiles; /* Fake pointer cast */
+
+ if (connected) {
+ debug(F100, "doicp: calling macparser", "", 0);
+ sstate = newparser(1, 1, 0L);
+
+ /* ignore null command state */
+ if (sstate == 'n')
+ sstate = '\0';
+
+ if (sstate)
+ proto();
+ } else {
+ /*
+ * process take files the finder gave us.
+ */
+ if ((tlevel == -1) && lfiles)
+ startlfile();
+
+ debug(F100, "doicp: calling parser", "", 0);
+ sstate = (CHAR) parser(0);
+ if (sstate == 'c') /* if MAC connect */
+ sstate = 0;
+ if (sstate)
+ proto();
+ }
+ }
+#else /* Not MAC */
+
+#ifndef NOSPL
+/*
+ If interactive commands were given on the command line (using the
+ -C "command, command, ..." option), assign them to a macro called
+ "cl_commands", then execute the macro and leave it defined for
+ subsequent re-execution if desired.
+*/
+ if (clcmds) { /* Check for -C commands */
+ int x;
+ x = addmac("cl_commands",clcmds); /* Put macro in table */
+ if (x > -1) { /* If successful, */
+ dodo(x,NULL,CF_CMDL); /* set up for macro execution */
+ while (maclvl > -1) { /* Loop getting macro commands. */
+ sstate = (CHAR) parser(1);
+ if (sstate) proto(); /* Enter protocol if requested. */
+#ifdef NTSIG
+ ck_ih();
+#endif /* NTSIG */
+ }
+ }
+ debug(F100,"doicp calling herald","",0);
+ herald();
+ }
+#endif /* NOSPL */
+ while(1) { /* Loop getting commands. */
+ sstate = (CHAR) parser(0);
+ if (sstate) proto(); /* Enter protocol if requested. */
+#ifdef NTSIG
+ ck_ih();
+#endif /* NTSIG */
+ }
+#ifdef NTSIG
+ ckThreadEnd(threadinfo);
+#endif /* NTSIG */
+#endif /* MAC */
+}
+
+VOID
+#ifdef CK_ANSIC
+failicp(void * threadinfo)
+#else /* CK_ANSIC */
+failicp(threadinfo) VOID * threadinfo;
+#endif /* CK_ANSIC */
+{
+#ifdef GEMDOS
+ cc_clean();
+#endif /* GEMDOS */
+ fixcmd(); /* Pop command stacks, etc. */
+ clcmds = NULL;
+ debug(F100,"ckcmai got interrupt","",0);
+}
+#endif /* NOICP */
+
+#ifndef NOICP
+VOID
+#ifdef CK_ANSIC
+docmdfile(void * threadinfo) /* Execute application file */
+#else /* CK_ANSIC */
+docmdfile(threadinfo) VOID * threadinfo;
+#endif /* CK_ANSIC */
+/* docmdfile */ {
+#ifdef NTSIG
+ concb((char)escape);
+ setint();
+ if (threadinfo) { /* Thread local storage... */
+ TlsSetValue(TlsIndex,threadinfo);
+ debug(F100, "docmdfile called with threadinfo block","", 0);
+ } else debug(F100, "docmdfile - threadinfo is NULL", "", 0);
+#endif /* NTSIG */
+#ifdef CK_LOGIN
+#ifdef IKSD
+#ifdef NT
+ if (inserver)
+ setntcreds();
+#endif /* NT */
+#endif /* IKSD */
+#endif /* CK_LOGIN */
+ debug(F110,"main cmdfil",cmdfil,0);
+#ifndef NOSPL
+ addmac("\\%0",cmdfil);
+#endif /* NOSPL */
+ dotake(cmdfil); /* execute it */
+ while (tlevel > -1) { /* until it runs out. */
+ sstate = parser(1); /* Loop getting commands. */
+ if (sstate) proto(); /* Enter protocol if requested. */
+#ifdef NTSIG
+ ck_ih();
+#endif /* NTSIG */
+ }
+ cfilef = 1; /* Remember we did this */
+
+#ifdef NTSIG
+ ckThreadEnd(threadinfo);
+#endif /* NTSIG */
+ return;
+}
+
+VOID
+#ifdef CK_ANSIC
+failcmdfile(void * threadinfo)
+#else /* CK_ANSIC */
+failcmdfile(threadinfo) VOID * threadinfo;
+#endif /* CK_ANSIC */
+/* failcmdfile */ {
+#ifdef GEMDOS
+ cc_clean(); /* Atari: Clean up after ^C-trap. */
+#endif /* GEMDOS */
+ if (!cfilef) {
+ conoll("Interrupt during initialization or command-line processing.");
+ conoll("C-Kermit quitting...");
+ }
+ doexit(BAD_EXIT,-1); /* Exit with bad status. */
+}
+#endif /* NOICP */
+
+#ifndef NOXFER
+VOID
+setprefix(z) int z; { /* Initial control-char prefixing */
+#ifdef CK_SPEED
+ int i, val;
+
+ prefixing = z;
+ ptab[protocol].prefix = prefixing;
+ debug(F101,"setprefix","",prefixing);
+ switch (z) {
+ case PX_ALL: /* All */
+#ifdef COMMENT
+ /* Don't let Clear-Channel be dependent on prefixing */
+ clearrq = 0; /* Turn off clearchannel, fall thru */
+#endif /* COMMENT */
+ case PX_NON: /* None */
+ val = (z == PX_ALL) ? 1 : 0;
+ for (i =
+#ifdef UNPREFIXZERO
+ 0
+#else
+ 1
+#endif /* UNPREFIXZERO */
+ ; i < 32; i++)
+ ctlp[i] = val;
+ for (i = 127; i < 160; i++) ctlp[i] = val;
+ ctlp[(unsigned)255] = val;
+ if (z == PX_NON) { /* These are never safe */
+ if (network) { /* Assume network = telnet or rlogin */
+ ctlp[CR] = 1; /* Prefix CR because of NVT rules */
+ ctlp[XON] = ctlp[XOFF] = 1; /* Because of Telnet server */
+ ctlp[127] = ctlp[255] = 1; /* Telnet IAC */
+ ctlp[mystch] = ctlp[mystch+128] = 1; /* Kermit packet start */
+ } else {
+ ctlp[CR] = ctlp[255] = ctlp[mystch] = ctlp[mystch+128] = 1;
+ if (flow == FLO_XONX) /* Xon/Xoff forces prefixing */
+ ctlp[XON] = ctlp[XOFF] = ctlp[XON+128] = ctlp[XOFF+128] = 1;
+ }
+ }
+ break;
+
+ case PX_CAU: /* Cautious or Minimal */
+#ifdef COMMENT
+ /* Don't let CLEAR-CHANNEL be dependent on Prefixing */
+ clearrq = 0; /* Turn off clearchannel */
+#endif /* COMMENT */
+ case PX_WIL: /* Minimal ("wild") */
+ ctlp[0] = 1; /* Does not include 0 */
+ for (i = 1; i < 32; i++)
+ ctlp[i] = 0;
+ for (i = 127; i < 160; i++)
+ ctlp[i] = 0;
+ ctlp[mystch] = ctlp[mystch+128] = 1; /* Kermit start of packet */
+ if (seol != 13)
+ ctlp[seol] = ctlp[seol+128] = 1; /* Kermit end */
+ ctlp[13] = ctlp[141] = 1; /* In case of TELNET (NVT rules) */
+ ctlp[(unsigned)255] = 1; /* Ditto */
+
+ /* ^D, ^J, ^M, or ^U followed by tilde trigger Rlogin escape */
+
+ ctlp[4] = ctlp[4+128] = 1; /* In case of RLOGIN */
+ ctlp[10] = ctlp[10+128] = 1; /* In case of RLOGIN */
+ ctlp[21] = ctlp[21+128] = 1; /* In case of RLOGIN */
+
+ if (flow == FLO_XONX || /* Xon/Xoff forces prefixing these */
+ prefixing == PX_CAU || /* So does CAUTIOUS */
+ network) /* Networks too... */
+ ctlp[XON] = ctlp[XOFF] = ctlp[XON+128] = ctlp[XOFF+128] = 1;
+ if (prefixing == PX_CAU) { /* Cautious - add some more */
+#ifdef UNPREFIXZERO
+ ctlp[0] = 1;
+#endif /* UNPREFIXZERO */
+ ctlp[3] = ctlp[16] = 1; /* ^C, DLE */
+ ctlp[14] = ctlp[15] = 1; /* SO/SI */
+ ctlp[24] = ctlp[25] = 1; /* VMS might need these */
+ ctlp[26] = ctlp[26+128] = 1; /* UNIX suspend */
+ ctlp[28] = ctlp[29] = ctlp[30] = 1; /* Assorted esc chars */
+ ctlp[131] = ctlp[141] = ctlp[144] = 1; /* and 8-bit versions */
+ ctlp[(unsigned)255] = ctlp[156] = ctlp[157] = ctlp[158] = 1;
+ }
+ break;
+ }
+#endif /* CK_SPEED */
+}
+#endif /* NOXFER */
+
+VOID
+makever() { /* Make version string from pieces */
+ int x, y;
+#ifndef OS2
+#ifndef MAC
+ ck_s_xver = ck_s_ver; /* Fill in C-Kermit version number */
+ ck_l_xver = ck_l_ver; /* for UNIX, VMS, etc. */
+#endif /* MAC */
+#endif /* OS2 */
+ x = strlen(ck_s_name);
+ y = strlen(ck_s_xver);
+ if (y + x + 1 < CKVERLEN) {
+ ckmakmsg(versio,CKVERLEN,ck_s_name," ",ck_s_xver,NULL);
+ } else {
+ ckstrncpy(versio,"C-Kermit",CKVERLEN);
+ return;
+ }
+ x += y + 1;
+ if (*ck_s_who) {
+ y = strlen(ck_s_who);
+ if (CKVERLEN < x + y + 1)
+ return;
+ ckstrncat(versio,"-",CKVERLEN);
+ ckstrncat(versio,ck_s_who,CKVERLEN);
+ }
+ x += y + 1;
+ y = strlen(ck_s_test);
+ if (y > 0 && y + x + 1 < CKVERLEN) {
+ ckstrncat(versio," ",CKVERLEN);
+ ckstrncat(versio,ck_s_test,CKVERLEN);
+ x += y + 1;
+ y = strlen(ck_s_tver);
+ if (y > 0 && y + x + 1 < CKVERLEN) {
+ ckstrncat(versio,".",CKVERLEN);
+ ckstrncat(versio,ck_s_tver,CKVERLEN);
+ x += y + 1;
+ }
+ }
+ y = strlen(ck_s_date);
+ if (y > 0 && y + x + 2 < CKVERLEN) {
+ ckstrncat(versio,", ",CKVERLEN);
+ ckstrncat(versio,ck_s_date,CKVERLEN);
+ }
+ vernum = ck_l_ver;
+ xvernum = ck_l_xver;
+ debug(F110,"Kermit version",versio,0);
+}
+
+union ck_short shortbytes; /* For determining byte order */
+int byteorder = 0; /* 0 = Big Endian; 1 = Little Endian */
+int bigendian = 1;
+/* NOTE: MUST BE 0 or 1 - nothing else */
+
+#ifndef NOSPL
+#define SCRIPTLEN 10240
+#endif /* NOSPL */
+
+#ifdef NETCONN
+#ifndef NOCMDL
+#ifndef NOURL
+VOID
+dourl() {
+ int rc = 0;
+ char * port = NULL;
+ extern int ttnproto;
+ extern struct urldata g_url;
+
+#ifdef COMMENT
+ /* NOTE: debug() doesn't work yet - must use printf's */
+ printf("URL: %s\n",g_url.sav ? g_url.sav : "(none)");
+ printf("Type: %s\n",g_url.svc ? g_url.svc : "(none)");
+ printf("User: %s\n",g_url.usr ? g_url.usr : "(none)");
+ printf("Pass: %s\n",g_url.psw ? g_url.psw : "(none)");
+ printf("Host: %s\n",g_url.hos ? g_url.hos : "(none)");
+/* printf("Port: %s\n",g_url.por ? g_url.por : "(none)"); */
+ printf("Path: %s\n",g_url.pth ? g_url.pth : "(none)");
+#endif /* COMMENT */
+
+ if (!ckstrcmp(g_url.svc,"iksd",-1,0) ||
+ !ckstrcmp(g_url.svc,"kermit",-1,0)) {
+ extern char pwbuf[];
+ extern int pwflg;
+#ifdef OS2
+ extern int pwcrypt;
+#endif /* OS2 */
+
+ if (!g_url.hos) {
+ printf("?Incomplete IKSD URL\n");
+ doexit(BAD_EXIT,1);
+ }
+ if (!g_url.usr)
+ makestr(&g_url.usr,"anonymous");
+ if (!g_url.psw) {
+ char * tmpbuf = NULL;
+ if (!(tmpbuf = (char *)malloc(1024)))
+ fatal("dourl: out of memory");
+ if (!ckstrcmp(g_url.usr,"anonymous",-1,0)) {
+ ckmakmsg(tmpbuf,1024,uidbuf,"@",myhost,NULL);
+ makestr(&g_url.psw,tmpbuf);
+ } else {
+ readpass(" Password:",tmpbuf,1024);
+ makestr(&g_url.psw,tmpbuf);
+ }
+ free(tmpbuf);
+ }
+ port = "kermit";
+ ttnproto = NP_TELNET;
+ nettype = NET_TCPB;
+ mdmtyp = -nettype;
+ local = -1;
+ ckstrncpy(uidbuf,g_url.usr,UIDBUFLEN);
+ if (g_url.psw) {
+ ckstrncpy(pwbuf,g_url.psw,PWBUFL);
+ pwflg = 1;
+#ifdef OS2
+ pwcrypt = 0;
+#endif /* OS2 */
+ }
+ ckmakmsg(ttname,
+ TTNAMLEN,
+ g_url.hos,
+ ":",
+ g_url.por ? g_url.por : port,
+ NULL
+ );
+ rc = ttopen(ttname,&local,mdmtyp,0);
+ if (rc > -1) {
+ network = 1;
+ exitonclose = 1;
+#ifdef CKLOGDIAL
+ dolognet();
+#endif /* CKLOGDIAL */
+ } else {
+ printf("?Connection failed: %s\n",g_url.sav);
+ doexit(BAD_EXIT,1);
+ }
+ /* Also need to check here for secure authentication already done */
+
+#ifdef NOSPL
+ cflg = 1;
+#else
+ {
+ char * script = NULL;
+ if (!(script = (char *)malloc(SCRIPTLEN)))
+ fatal("dourl: out of memory");
+ if (!g_url.pth) { /* Write the appropriate script */
+ cflg = 1;
+ ckmakxmsg(script,SCRIPTLEN,
+ "if not eq {\\v(authstate)} {user} ",
+ "if not eq {\\v(authstate)} {valid} { ",
+ "remote login ", /* No path */
+ g_url.usr, /* Just log in and CONNECT */
+ " ",
+ g_url.psw,
+ ", if fail exit 1 {IKSD login failed} }",
+ ", connect",
+ NULL,NULL,NULL,NULL);
+ /* printf("CLCMDS 1: %s\n",script); */
+ } else {
+ /* does the path specify a file or a directory? */
+ int len = strlen(g_url.pth);
+ if (ISDIRSEP(g_url.pth[len-1])) {
+ ckmakxmsg(script,SCRIPTLEN, /* Directory name given */
+ "if not eq {\\v(authstate)} {user} \
+if not eq {\\v(authstate)} {valid} { remote login ",
+ g_url.usr,
+ " ",
+ g_url.psw,
+ ", if fail exit 1 {IKSD login failed} }",
+ ", set macro error on",
+ ", set xfer displ brief",
+ ", set xfer bell off",
+ ", remote cd ",
+ g_url.pth,
+ ", lineout directory",
+ ", connect"
+ );
+ /* printf("CLCMDS 2: %s\n",script); */
+ } else {
+ ckmakxmsg(script,SCRIPTLEN, /* Path given, try to GET */
+ "if not eq {\\v(authstate)} {user} \
+if not eq {\\v(authstate)} {valid} { remote login ",
+ g_url.usr,
+ " ",
+ g_url.psw,
+ ", if fail exit 1 {IKSD login failed} }",
+ ", set xfer displ brief",
+ ", set xfer bell off",
+ ", get ",
+ g_url.pth,
+ ", .rc := \\v(status)",
+ ", if open connection bye",
+ ", exit \\m(rc)"
+ );
+ /* printf("CLCMDS 2: %s\n",script); */
+ }
+ }
+ clcmds = script; /* Make this our -C cmdline macro */
+ /* printf("HAVEURL=%d\n",haveurl); */
+ }
+#endif /* NOSPL */
+ } else {
+ if (ckstrcmp(g_url.svc,"telnet",-1,0) &&
+#ifdef SSHBUILTIN
+ ckstrcmp(g_url.svc,"ssh",-1,0) &&
+#endif /* SSHBUILTIN */
+ ckstrcmp(g_url.svc,"ftp",-1,0)) {
+ printf("?Sorry, %s URLs not supported\n",
+ g_url.svc ? g_url.svc : "");
+ doexit(BAD_EXIT,1);
+ }
+ }
+}
+#endif /* NOCMDL */
+#endif /* NETCONN */
+#endif /* NOURL */
+
+/*
+ main()...
+
+ If you get complaints about "main: return type is not blah",
+ define MAINTYPE on the CC command line, e.g. "CFLAGS=-DMAINTYPE=blah"
+ (where "blah" is int, long, or whatever).
+
+ If the complaint is "Attempt to return a value from a function of type void"
+ then add -DMAINISVOID.
+*/
+#ifndef MAINTYPE
+#ifndef MAINISVOID
+#define MAINTYPE int
+#endif /* MAINISVOID */
+#endif /* MAINTYPE */
+
+#ifdef MAINISVOID
+#ifndef MAINTYPE
+#define MAINTYPE void
+#endif /* MAINTYPE */
+#endif /* MAINISVOID */
+
+#ifdef aegis
+/* On the Apollo, intercept main to insert a cleanup handler */
+int
+ckcmai(argc,argv) int argc; char **argv;
+#else
+#ifdef MAC /* Macintosh */
+int
+main (void)
+#else
+#ifdef __GNUC__ /* GCC compiler */
+int
+main(argc,argv) int argc; char **argv;
+#else
+#ifdef __DECC /* DEC Alpha with DEC C compiler */
+#ifdef __ALPHA
+int
+main(argc,argv) int argc; char **argv;
+#else /* DEC C compiler, not Alpha */
+#define MAINISVOID
+VOID
+main(argc,argv) int argc; char **argv;
+#endif /* __ALPHA */
+#else
+#ifdef STRATUS /* Stratus VOS */
+int
+main(argc,argv) int argc; char **argv;
+#else /* K-95 */
+#ifdef OS2
+#ifdef KUI
+#define MAINISVOID
+void
+Main( int argc, char ** argv )
+#else /* KUI */
+#define MAINISVOID
+VOID
+main(argc,argv) int argc; char **argv;
+#endif /* KUI */
+#else /* Not K95 */
+MAINTYPE /* All others... */
+main(argc,argv) int argc; char **argv;
+#endif /* OS2 */
+#endif /* STRATUS */
+#endif /* __DECC */
+#endif /* __GNUC__ */
+#endif /* MAC */
+#endif /* aegis */
+
+/* main */ {
+
+ char *p;
+
+#ifndef NOSETKEY
+ int i;
+#endif /* NOSETKEY */
+
+#ifdef datageneral
+ short *pfha = 016000000036; /* Get around LANG_RT problem */
+ *pfha = (short) 0; /* No user protection fault handler */
+#endif /* datageneral */
+
+/* Do some initialization */
+
+#ifndef MAC
+ xargc = xargs = argc; /* Make global copies of argc */
+ xargv = argv; /* ...and argv. */
+ xarg0 = argv[0];
+#ifdef NT
+ setOSVer();
+#endif /* NT */
+ zstrip(argv[0],&p); /* Get name we were invoked with */
+ makestr(&myname,p);
+ if (!ckstrcmp(myname,"telnet",-1,0)) howcalled = I_AM_TELNET;
+#ifdef CK_KERBEROS
+ else if (!ckstrcmp(myname,"ktelnet",-1,0)) howcalled = I_AM_TELNET;
+#endif /* CK_KERBEROS */
+ else if (!ckstrcmp(myname,"rlogin",-1,0)) howcalled = I_AM_RLOGIN;
+ else if (!ckstrcmp(myname,"iksd",-1,0)) howcalled = I_AM_IKSD;
+#ifdef NEWFTP
+ else if (!ckstrcmp(myname,"ftp",-1,0)) howcalled = I_AM_FTP;
+#endif /* NEWFTP */
+#ifndef NOHTTP
+ else if (!ckstrcmp(myname,"http",-1,0)) howcalled = I_AM_HTTP;
+#endif /* NOHTTP */
+#ifdef OS2
+ else if (!ckstrcmp(myname,"telnet.exe",-1,0)) howcalled = I_AM_TELNET;
+#ifdef SSHBUILTIN
+ else if (!ckstrcmp(myname,"ssh",-1,0)) howcalled = I_AM_SSH;
+ else if (!ckstrcmp(myname,"ssh.exe",-1,0)) howcalled = I_AM_SSH;
+#endif /* SSHBUILTIN */
+#ifdef CK_KERBEROS
+ else if (!ckstrcmp(myname,"ktelnet.exe",-1,0)) howcalled = I_AM_TELNET;
+#endif /* CK_KERBEROS */
+ else if (!ckstrcmp(myname,"rlogin.exe",-1,0)) howcalled = I_AM_RLOGIN;
+#ifdef NT
+ else if (!ckstrcmp(myname,"iksdnt",-1,0)) howcalled = I_AM_IKSD;
+ else if (!ckstrcmp(myname,"iksdnt.exe",-1,0)) howcalled = I_AM_IKSD;
+#endif /* NT */
+#ifdef NEWFTP
+ else if (!ckstrcmp(myname,"ftp.exe",-1,0)) howcalled = I_AM_FTP;
+#endif /* NEWFTP */
+#ifndef NOHTTP
+ else if (!ckstrcmp(myname,"http.exe",-1,0)) howcalled = I_AM_HTTP;
+#endif /* NOHTTP */
+#endif /* OS2 */
+ else if (!ckstrcmp(myname,"kermit-sshsub",-1,0)) howcalled = I_AM_SSHSUB;
+
+#ifndef NOICP
+ cmdini(); /* Must come before prescan */
+ debug(F100,"main cmdini() done","",0);
+#endif /* NOICP */
+ prescan(0); /* Pre-Check for debugging, etc */
+#endif /* MAC */
+ debug(F101,"MAIN feol","",feol);
+ makever(); /* Put together version strings */
+#ifndef NOSETKEY /* Allocate & initialize the keymap */
+ /* This code has been moved to before sysinit() for K95G */
+ if (!(keymap = (KEY *) malloc(sizeof(KEY)*KMSIZE)))
+ fatal("main: no memory for keymap");
+ if (!(macrotab = (MACRO *) malloc(sizeof(MACRO)*KMSIZE)))
+ fatal("main: no memory for macrotab");
+ for (i = 0; i < KMSIZE; i++) {
+ keymap[i] = (KEY) i;
+ macrotab[i] = NULL;
+ }
+#endif /* NOSETKEY */
+
+ shortbytes.x_short = 0xABCD; /* Get Endianness */
+ if (shortbytes.x_char[0] == 0xCD) { /* 0 = Big Endian */
+ byteorder = 1; /* 1 = Little Endian */
+ bigendian = 0; /* (for clarity in programming) */
+ } else {
+ byteorder = 0; /* Big Endian */
+ bigendian = 1;
+ }
+ if (sysinit() < 0) /* System-dependent initialization. */
+ fatal("Can't initialize!");
+ else
+ initflg = 1; /* Remember we did. */
+ debug(F111,"ckcmai myname",myname,howcalled);
+
+#ifdef UNIX
+ getexedir(); /* Compute exedir variable */
+#endif /* UNIX */
+
+#ifdef CKSYSLOG
+#ifdef SYSLOGLEVEL
+/*
+ If built with -DSYSLOGLEVEL on cc command line, this means we always
+ do syslogging at the indicated level.
+*/
+ zsyslog(); /* Open syslog */
+#else /* SYSLOGLEVEL */
+#ifdef IKSD
+ if (inserver)
+ zsyslog(); /* Open syslog */
+#endif /* IKSD */
+#endif /* SYSLOGLEVEL */
+#endif /* CKSYSLOG */
+
+#ifdef CK_KERBEROS
+ ini_kerb(); /* Initialize Kerberos data */
+#endif /* CK_KERBEROS */
+#ifdef CK_SSL
+ ssl_once_init();
+#endif /* CK_SSL */
+#ifdef TNCODE
+ tn_set_modes(); /* Init Telnet Option tables */
+#endif /* TNCODE */
+
+#ifdef CK_TTGWSIZ /* Initialize screen dimensions */
+#ifdef OS2
+ ttgcwsz();
+#else /* OS2 */
+ if (ttgwsiz() > 0) {
+ if (tt_rows > 0 && tt_cols > 0) {
+ cmd_rows = tt_rows;
+ cmd_cols = tt_cols;
+ }
+ }
+#endif /* OS2 */
+#endif /* CK_TTGWSIZ */
+
+#ifndef OS2
+#ifdef TCPSOCKET
+#ifdef CK_SOCKS
+ SOCKSinit(argv[0]); /* Internet relay package... */
+#endif /* CK_SOCKS */
+#endif /* TCPSOCKET */
+#endif /* OS2 */
+
+ initflow(); /* Initialize flow-control table */
+
+#ifndef NOICP
+#ifdef CKFLOAT
+ initfloat(); /* Deduce floating-point precision */
+#endif /* CKFLOAT */
+#endif /* NOICP */
+
+#ifndef NOXFER
+ initxlist(); /* Init exception lists */
+
+#ifdef CK_XYZ /* Initialize protocols... */
+
+#ifdef XYZ_INTERNAL /* XYZMODEM are internal ... */
+
+#ifdef COMMENT
+ /* Can't do this for XMODEM because if filename contains a "C" etc... */
+ initproto(PROTO_X, "rx %s","rx %s", NULL, NULL, NULL, NULL, NULL);
+ initproto(PROTO_XC,"rc %s","rc %s", NULL, NULL, NULL, NULL, NULL);
+#else /* COMMENT */
+ initproto(PROTO_X, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ initproto(PROTO_XC,NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+#endif /* COMMENT */
+ initproto(PROTO_Y, "rb","rb", NULL, NULL, NULL, NULL, NULL);
+ initproto(PROTO_G, "rb","rb", NULL, NULL, NULL, NULL, NULL);
+ initproto(PROTO_Z, "rz","rz", NULL, NULL, NULL, NULL, NULL);
+ initproto(PROTO_K,"kermit -ir","kermit -r","kermit -x",NULL,NULL,NULL,NULL);
+ /* Kermit Must be last */
+
+#else /* XYZMODEM are external protocols ... */
+
+ /* s1 s2 s3 s4 s5 s6 s7 */
+ initproto(PROTO_X, "rx %s","rx %s",NULL,"sx %s","sx -a %s","rx %s", "rx %s");
+ initproto(PROTO_XC,"rc %s","rc %s",NULL,"sx %s","sx -a %s","rc %s", "rc %s");
+ initproto(PROTO_Y, "rb", "rb", NULL,"sb %s","sb -a %s","rb", "rb" );
+ initproto(PROTO_G, "rb", "rb", NULL,"sb %s","sb -a %s","rb", "rb" );
+ initproto(PROTO_Z, "rz", "rz", NULL,"sz %s","sz -a %s","rz", "rz" );
+ initproto(PROTO_K, "kermit -ir","kermit -r","kermit -x",NULL,NULL,NULL,NULL);
+ /* Kermit must be last */
+
+#endif /* XYZ_INTERNAL */
+
+#else /* No XYZMODEM support */
+
+ initproto(PROTO_K,"kermit -ir","kermit -r","kermit -x",NULL,NULL,NULL,NULL);
+
+#endif /* CK_XYZ */
+#endif /* NOXFER */
+
+ connoi(); /* Console interrupts off */
+
+#ifndef NOXFER
+#ifdef OS2
+ /* Initialize Kermit and Zmodem Auto-Download Strings */
+ adl_kstr = strdup("KERMIT READY TO SEND...");
+ adl_zstr = strdup("rz\r");
+#endif /* OS2 */
+
+#ifdef PATTERNS
+ initpat(); /* Initialize filename patterns */
+#endif /* PATTERNS */
+#endif /* NOXFER */
+
+#ifndef NOCSETS
+ initcsets(); /* Initialize character sets */
+#endif /* NOCSETS */
+
+#ifndef NOICP
+#ifdef DFCDMSG
+ makestr(&cdmsgstr,DFCDMSG);
+ makelist(cdmsgstr,cdmsgfile,8); /* Initialize CD message filenames */
+#endif /* DFCDMSG */
+#endif /* NOICP */
+
+ sstate = 0; /* No default start state. */
+#ifdef DYNAMIC
+ if (getiobs() < 0)
+ fatal("Can't allocate i/o buffers!");
+#endif /* DYNAMIC */
+
+#ifndef NOSPL
+#ifndef NORANDOM
+ {
+ char stackdata[256];
+ unsigned int c = 1234, n;
+ /* try to make a random unsigned int to feed srand() */
+#ifndef VMS
+ /* time.h and MultiNet do not get along */
+ c = time(NULL);
+#endif /* VMS */
+ c *= getpid();
+ /* Referenced before set... DELIBERATELY */
+ for (n = 0; n < sizeof(stackdata); n++) /* IGNORE WARNING */
+ c += stackdata[n]; /* DELIBERATELY USED BEFORE SET */
+ srand((unsigned int)c);
+ }
+#endif /* NORANDOM */
+#endif /* NOSPL */
+
+ ckhost(myhost,MYHOSTL); /* Name of local host */
+ debug(F110,"main ckhost",myhost,0);
+#ifdef IKSD
+ if (!inserver) {
+#endif /* IKSD */
+ ckstrncpy(ttname,dftty,TTNAMLEN); /* Set up default tty name. */
+ local = nolocal ? 0 : dfloc; /* And whether it's local or remote. */
+ parity = dfprty; /* Set initial parity, */
+#ifndef NOXFER
+ myindex = getsysix(cksysid); /* System index */
+#endif /* NOXFER */
+ if (local) if (ttopen(ttname,&local,0,0) < 0) {
+#ifndef OS2
+ conol("Can't open device: ");
+ conoll(ttname);
+#endif /* OS2 */
+ local = 0;
+ ckstrncpy(ttname,CTTNAM,TTNAMLEN);
+ }
+ setflow(); /* Set appropriate flow control */
+ speed = ttgspd(); /* Get transmission speed. */
+#ifdef IKSD
+ }
+#endif /* IKSD */
+
+#ifdef ANYX25 /* All X.25 implementations */
+#ifndef IBMX25 /* except IBM have PAD support */
+ initpad(); /* Initialize X.25 PAD */
+#endif /* IBMX25 */
+#endif /* ANYX25 */
+
+#ifndef NOXFER
+ if (inibufs(SBSIZ,RBSIZ) < 0) /* Allocate packet buffers */
+ fatal("Can't allocate packet buffers!");
+#ifndef NOCKSPEED
+ setprefix(prefixing); /* Set up control char prefixing */
+#endif /* NOCKSPEED */
+#endif /* NOXFER */
+
+#ifndef NOICP
+ if (sstelnet
+#ifdef IKSD
+ || inserver
+#endif /* IKSD */
+ ) {
+ int on = 1, x = 0;
+ extern int ckxech, ttnet, ttnproto, cmdmsk;
+#ifdef SO_SNDBUF
+ extern int tcp_sendbuf;
+#endif
+#ifdef SO_RCVBUF
+ extern int tcp_recvbuf;
+#endif
+#ifdef SO_KEEPALIVE
+ extern int tcp_keepalive;
+#endif
+#ifdef SO_LINGER
+ extern int tcp_linger, tcp_linger_tmo;
+#endif /* SO_LINGER */
+#ifdef SO_DONTROUTE
+ extern int tcp_dontroute;
+#endif /* SO_DONTROUTE */
+#ifdef TCP_NODELAY
+ extern int tcp_nodelay;
+#endif /* TCP_NODELAY */
+#ifdef IKSD
+ extern int iklogopen;
+#endif /* IKSD */
+ extern int ttmdm;
+
+#ifdef UNIX
+ if (isatty(0))
+ fatal("Internet Kermit Service cannot be started at a terminal.");
+#endif /* UNIX */
+
+ reliable = xreliable = SET_ON; /* IKSD has reliable connection */
+#ifndef VMS
+ flow = 0; /* No flow control needed */
+#endif /* VMS */
+ bgset = 0; /* Not in background */
+ nopush = 1; /* No external processes */
+ parity = 0; /* 8 bits ... */
+ cmdmsk = 0xff; /* all the way */
+ cmask = 0xff;
+
+#ifdef IKSD
+ if (inserver) { /* If IKSD */
+ doiksdinit(); /* Execute IKSD configuration file */
+ while (tlevel > -1)
+ parser(1); /* (Ignore any file-xfer commands) */
+ iksdcf = 1; /* IKSD c.f. has been processed */
+ }
+ if (!iklogopen) (VOID) doiklog(); /* Open Kermit-specific log */
+#endif /* IKSD */
+
+#ifdef UNIX
+ setbuf(stdout,NULL); /* Don't buffer the output */
+ ckstrncpy(ttname,"0",TTNAMLEN); /* not "/dev/tty"... */
+#endif /* UNIX */
+ local = 0; /* We are in remote mode */
+ ckxech = 1; /* We will echo */
+#ifdef OS2
+ nettype = NET_TCPB; /* So ttopen() treats the connection */
+ mdmtyp = -nettype; /* as a network */
+#endif /* OS2 */
+ debug(F100,"main about to call ttopen() inserver","",0);
+ if (ttopen(ttname,&local,mdmtyp,0) < 0) { /* Open comm channel */
+ fatal("can't initialize i/o");
+ }
+#ifdef OS2
+ local = 0;
+ network = 1; /* Does use networking code */
+#else /* OS2 */
+ network = 0; /* Does not use networking code */
+#endif /* OS2 */
+ ttmdm = -1; /* Does not use a modem */
+ sstelnet = 1; /* Do server-side Telnet negotations */
+ debug(F111,"MAIN","sstelnet",sstelnet);
+ ttnet = NET_TCPB; /* Network type is TCP sockets */
+ ttnproto = NP_TELNET; /* Netword protocol is Telnet */
+#ifdef IKSDB
+ dbinit(); /* Initialize database record */
+#endif /* IKSDB */
+#ifndef OS2
+#ifdef CK_AUTHENTICATION
+ /* Before initializating Telnet/Rlogin negotiations, init Kerberos */
+ ck_auth_init(ckgetpeer(),"","",0);
+#endif /* CK_AUTHENTICATION */
+
+#ifdef NON_BLOCK_IO
+ on = 1;
+ x = socket_ioctl(0,FIONBIO,&on);
+ debug(F101,"main FIONBIO","",x);
+#endif /* NON_BLOCK_IO */
+#ifdef SO_OOBINLINE
+ on = 1;
+ x = setsockopt(0, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on));
+ debug(F101,"main SO_OOBINLINE","",x);
+#endif /* SO_OOBINLINE */
+
+#ifndef NOTCPOPTS
+#ifndef datageneral
+#ifdef SOL_SOCKET
+#ifdef TCP_NODELAY
+ no_delay(0,tcp_nodelay);
+#endif /* TCP_NODELAY */
+#ifdef SO_KEEPALIVE
+ keepalive(0,tcp_keepalive);
+#endif /* SO_KEEPALIVE */
+#ifdef SO_LINGER
+ ck_linger(0,tcp_linger, tcp_linger_tmo);
+#endif /* SO_LINGER */
+#ifdef SO_DONTROUTE
+ dontroute(0,tcp_dontroute);
+#endif /* SO_DONTROUTE */
+#ifdef SO_SNDBUF
+ sendbuf(0,tcp_sendbuf);
+#endif /* SO_SNDBUF */
+#ifdef SO_RCVBUF
+ recvbuf(0,tcp_recvbuf);
+#endif /* SO_RCVBUF */
+#endif /* SOL_SOCKET */
+#endif /* datageneral */
+#endif /* NOTCPOPTS */
+
+#ifdef CK_SSL
+ if (ck_ssleay_is_installed()) {
+ if (!ssl_tn_init(SSL_SERVER)) {
+ if (bio_err != NULL) {
+ BIO_printf(bio_err,"do_ssleay_init() failed\r\n");
+ ERR_print_errors(bio_err);
+ } else {
+ fflush(stderr);
+ fprintf(stderr,"do_ssleay_init() failed\r\n");
+ ERR_print_errors_fp(stderr);
+ }
+ switch (ttnproto) {
+ case NP_SSL:
+ case NP_TLS:
+ case NP_SSL_TELNET:
+ case NP_TLS_TELNET:
+ doexit(BAD_EXIT,1);
+ }
+ /* otherwise we will continue to accept the connection */
+ /* without SSL or TLS support unless required. */
+ if ( TELOPT_DEF_S_ME_MODE(TELOPT_START_TLS) != TN_NG_MU )
+ TELOPT_DEF_S_ME_MODE(TELOPT_START_TLS) = TN_NG_RF;
+ if ( TELOPT_DEF_S_U_MODE(TELOPT_START_TLS) != TN_NG_MU )
+ TELOPT_DEF_S_U_MODE(TELOPT_START_TLS) = TN_NG_RF;
+ if ( TELOPT_DEF_C_ME_MODE(TELOPT_START_TLS) != TN_NG_MU )
+ TELOPT_DEF_C_ME_MODE(TELOPT_START_TLS) = TN_NG_RF;
+ if ( TELOPT_DEF_C_U_MODE(TELOPT_START_TLS) != TN_NG_MU )
+ TELOPT_DEF_C_U_MODE(TELOPT_START_TLS) = TN_NG_RF;
+ } else {
+ if ( ck_ssl_incoming(0) < 0 ) {
+ doexit(BAD_EXIT,1);
+ }
+ }
+ }
+#endif /* CK_SSL */
+
+#ifdef TNCODE
+ tn_ini(); /* Start Telnet negotiation now */
+#endif /* TNCODE */
+#endif /* OS2 */
+ }
+ debug(F101,"main argc after prescan()","",argc);
+
+ /* Now process any relevant environment variables */
+
+#ifndef NODIAL
+ getdialenv(); /* Dialing */
+#ifdef NETCONN
+ ndinit(); /* Initialize network directory info */
+ getnetenv(); /* Network directories */
+#endif /* NETCONN */
+#endif /* NODIAL */
+
+#ifndef NOXFER
+#ifdef CK_FAST
+ dofast(); /* By now FAST defaults should be OK */
+#endif /* CK_FAST */
+#endif /* NOXFER */
+
+#ifndef NOCMDL
+ ikslogin(); /* IKSD Login and other stuff */
+#ifdef IKSD
+#ifdef NT
+ if ( inserver )
+ setntcreds();
+#endif /* NT */
+#endif /* IKSD */
+#endif /* NOCMDL */
+
+ if (howcalled == I_AM_SSHSUB) {
+ reliable = 1; /* We say the connection is reliable */
+ xreliable = 1; /* And that we said it was */
+ setreliable = 1; /* And pretend the "user" did too */
+ xfinish = 1; /* For REMOTE HELP response */
+ mdmtyp = 0; /* For ttopen() */
+ ckstrncpy(ttname,"0",TTNAMLEN+1); /* Use file descriptor 0 */
+ local = 0; /* And force remote mode */
+ ttopen(ttname,&local,mdmtyp,0); /* Open the "connection" */
+ sstate = 'x'; /* Initial state is Server */
+ proto(); /* Enter protocol */
+ doexit(GOOD_EXIT,xitsta); /* Exit when done */
+ }
+ debug(F111,"howcalled",myname,howcalled);
+
+#ifdef NOCCTRAP
+ dotakeini(0);
+#else /* NOCCTRAP */
+ debug(F100,"main about to cc_execute","",0);
+ setint();
+ cc_execute( ckjaddr(cmjbuf), dotakeini, failtakeini );
+#endif /* NOCCTRAP */
+
+ debug(F111,"main 2 cfilef",cmdfil,cfilef);
+ if (cmdfil[0]) { /* If we got one (see prescan())... */
+#ifdef NOCCTRAP
+ docmdfile(0); /* execute it. */
+#else /* NOCCTRAP */
+ setint();
+ cc_execute( ckjaddr(cmjbuf), docmdfile, failcmdfile );
+#endif /* NOCCTRAP */
+ }
+#ifndef OS2 /* Preserve name so we can delete it */
+ *cmdfil = '\0'; /* Done, nullify the file name */
+#endif /* OS2 */
+#endif /* NOICP */
+
+#ifndef NOCMDL
+/* Look for a UNIX-style command line... */
+
+ what = W_NOTHING;
+
+ debug(F101,"main argc","",argc);
+#ifndef NOHELP
+ iniopthlp(); /* Initialize cmdline arg help */
+#endif /* NOHELP */
+ if (
+#ifdef COMMENT
+ !cfilef &&
+#endif /* COMMENT */
+ argc > 1) { /* Command line arguments? */
+ sstate = (CHAR) cmdlin(); /* Yes, parse. */
+#ifdef NETCONN
+#ifndef NOURL
+ if (haveurl) { /* Was a URL given? */
+ dourl(); /* if so, do it. */
+ }
+#endif /* NOURL */
+#endif /* NETCONN */
+#ifndef NOXFER
+ zstate = sstate; /* Remember sstate around protocol */
+ debug(F101,"main zstate","",zstate);
+#endif /* NOXFER */
+
+#ifndef NOLOCAL
+ if (cflg) { /* Connect first if requested */
+ doconect(0,0);
+ if (ttchk() < 0)
+ dologend();
+ cflg = 0;
+ }
+#endif /* NOLOCAL */
+
+#ifndef NOXFER
+ if (sstate) {
+#ifndef NOLOCAL
+ if (displa) concb((char)escape); /* (for console "interrupts") */
+#endif /* NOLOCAL */
+#ifdef NOCCTRAP
+ docmdline(1);
+#else /* NOCCTRAP */
+ setint();
+ cc_execute( ckjaddr(cmjbuf), docmdline, failcmdline );
+#endif /* NOCCTRAP */
+ }
+#endif /* NOXFER */
+
+#ifndef NOICP
+/*
+ If a command-line action argument was given and -S ("stay") was not given,
+ exit now.
+*/
+ if ((cflg || cnflg || zstate) && !stayflg)
+#endif /* NOICP */
+ doexit(GOOD_EXIT,xitsta); /* Exit with good status */
+
+#ifndef NOLOCAL
+#ifndef NOICP
+ if (local) {
+#ifdef NETCONN
+ if ((cflg || cnflg) && tn_exit && ttchk() < 0)
+ doexit(GOOD_EXIT,xitsta); /* Exit with good status */
+#endif /* NETCONN */
+ if (exitonclose && !network &&
+ (carrier != CAR_OFF && (ttgmdm() & BM_DCD) == 0))
+ doexit(GOOD_EXIT,xitsta); /* Exit with good status */
+ if (exitonclose && network && ttchk() < 0)
+ doexit(GOOD_EXIT,xitsta); /* Exit with good status */
+ }
+#endif /* NOICP */
+#endif /* NOLOCAL */
+ }
+#endif /* NOCMDL */
+
+#ifdef NOICP /* No interactive command parser */
+#ifndef NOCMDL
+ else {
+
+ /* Command-line-only version */
+ fatal("?No command-line options given - type 'kermit -h' for help");
+ }
+#else /* Neither one! */
+ sstate = 'x';
+ justone = 0;
+ proto(); /* So go into server mode */
+ doexit(GOOD_EXIT,xitsta); /* exit with good status */
+
+#endif /* NOCMDL */
+#else /* not NOICP */
+/*
+ If no action requested on command line, or if -S ("stay") was included,
+ enter the interactive command parser.
+*/
+ if (!clcmds)
+ herald(); /* Display program herald. */
+
+#ifdef NOCCTRAP
+ debug(F100,"main NOCCTRAP setting interrupt trap","",0);
+ setint(); /* Set up command interrupt traps */
+ doicp(NULL);
+#else /* NOCCTRAP */
+ while (1) {
+ debug(F100,"main setting interrupt trap","",0);
+ setint(); /* Set up command interrupt traps */
+ if (!cc_execute(ckjaddr(cmjbuf), doicp, failicp))
+ break;
+ }
+#endif /* NOCCTRAP */
+#endif /* NOICP */
+#ifndef MAINISVOID
+ return(1);
+#endif /* MAINISVOID */
+}
+
+#ifdef DYNAMIC
+/* Allocate file i/o buffers */
+
+char *zinbuffer = NULL, *zoutbuffer = NULL;
+
+int
+getiobs() {
+ zinbuffer = (char *)malloc(INBUFSIZE);
+ if (!zinbuffer) return(-1);
+ zoutbuffer = (char *)malloc(zobufsize);
+ debug(F101,"zoutbuffer malloc","",zobufsize);
+ if (!zoutbuffer) return(-1);
+ debug(F100,"getiobs ok","",0);
+ return(0);
+}
+#endif /* DYNAMIC */