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

Defined functions

ckcmai defined in line 741; used 1 times
getiobs defined in line 984; used 2 times
main defined in line 745; never used

Defined variables

capas defined in line 454; used 2 times
clcmds defined in line 671; used 3 times
cmdfil defined in line 547; used 7 times
connected defined in line 560; used 1 times
data defined in line 529; used 73 times
hlptxt defined in line 367; used 1 times
iattr defined in line 494; never used
myhost defined in line 581; used 11 times
recpkt defined in line 528; used 64 times
rptn defined in line 629; used 7 times
sndpkt defined in line 527; never used
srvcmd defined in line 532; used 17 times
srvtxt defined in line 403; never used
startconnected defined in line 561; never used
stayflg defined in line 553; used 4 times
xarg0 defined in line 709; used 3 times
xargc defined in line 707; used 33 times
xargs defined in line 708; used 4 times
xargv defined in line 706; used 57 times
zinbuffer defined in line 982; used 5 times
zoutbuffer defined in line 982; used 7 times
zoutcnt defined in line 725; used 14 times
zoutptr defined in line 724; used 4 times
zstate defined in line 675; used 2 times

Defined macros

CKCMAI defined in line 31; never used
MYHOSTL defined in line 580; used 2 times
VERWHO defined in line 18; used 2 times
Last modified: 1992-11-24
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 6407
Valid CSS Valid XHTML 1.0 Strict