applied 050_ck_patch.patch
authorIan Beckwith <ianb@erislabs.net>
Wed, 12 May 2010 00:21:23 +0000 (01:21 +0100)
committerIan Beckwith <ianb@erislabs.net>
Wed, 12 May 2010 00:21:23 +0000 (01:21 +0100)
.pc/050_ck_patch.patch/.timestamp [new file with mode: 0644]
.pc/050_ck_patch.patch/ckcmai.c [new file with mode: 0644]
.pc/applied-patches
ckcmai.c

diff --git a/.pc/050_ck_patch.patch/.timestamp b/.pc/050_ck_patch.patch/.timestamp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/.pc/050_ck_patch.patch/ckcmai.c b/.pc/050_ck_patch.patch/ckcmai.c
new file mode 100644 (file)
index 0000000..33504dc
--- /dev/null
@@ -0,0 +1,3592 @@
+#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 */
index 6b6c6e7..bdc5957 100644 (file)
@@ -2,3 +2,4 @@
 020_man-hyphen-quoting.patch
 030_fix-if-else.patch
 040_pam-password-prompting.patch
+050_ck_patch.patch
index 33504dc..d0567e1 100644 (file)
--- a/ckcmai.c
+++ b/ckcmai.c
@@ -97,7 +97,7 @@ char *ck_s_name = "C-Kermit";
 #endif /* OS2 */
 
 char *ck_s_who = "";                    /* Where customized, "" = not. */
-char *ck_patch = "";                    /* Patch info, if any. */
+char *ck_patch = "3";                    /* Patch info, if any. */
 
 #define CKVERLEN 128
 char versiox[CKVERLEN];                 /* Version string buffer  */