Annotation of coherent/e/bin/ckermit/ckuusr.c, revision 1.1

1.1     ! root        1: char *userv = "User Interface 5A(092), 23 Nov 92";
        !             2: 
        !             3: /*  C K U U S R --  "User Interface" for Unix Kermit (Part 1)  */
        !             4: 
        !             5: /*
        !             6:   Author: Frank da Cruz ([email protected], [email protected]),
        !             7:   Columbia University Center for Computing Activities.
        !             8:   First released January 1985.
        !             9:   Copyright (C) 1985, 1992, Trustees of Columbia University in the City of New
        !            10:   York.  Permission is granted to any individual or institution to use this
        !            11:   software as long as it is not sold for profit.  This copyright notice must be
        !            12:   retained.  This software may not be included in commercial products without
        !            13:   written permission of Columbia University.
        !            14: */
        !            15: 
        !            16: /*
        !            17:   NOTE: Because of the massive additions in functionality, and therefore
        !            18:   the increase in the number of commands, much code was moved from here to
        !            19:   the two new modules, ckuus4.c and ckuus5.c.  This module now contains only
        !            20:   the top-level command keyword table, the SET command keyword table, and
        !            21:   the top-level interactive command parser/dispatcher.  ckuus3.c contains the
        !            22:   rest of the SET and REMOTE command parsers; ckuus2.c contains the help
        !            23:   command parser and help text strings, and ckuus4.c and ckuus5.c contain
        !            24:   miscellaneous pieces that logically belong in the ckuusr.c file but had to
        !            25:   be moved because of size problems with some C compilers / linkers.
        !            26:   Later...  as the other modules became too large, a ckuus6.c was created.
        !            27:   Still later...  ckuus7.c.
        !            28:   Also: ckuusy.c contains the UNIX-style command-line interface;
        !            29:   ckuusx.c contains routines needed by both the command-line interface and
        !            30:   the interactive command parser.
        !            31: */
        !            32: 
        !            33: /*
        !            34:  The ckuus*.c modules depend on the existence of C library features like fopen,
        !            35:  fgets, feof, (f)printf, argv/argc, etc.  Other functions that are likely to
        !            36:  vary among Unix implementations -- like setting terminal modes or interrupts
        !            37:  -- are invoked via calls to functions that are defined in the system-
        !            38:  dependent modules, ck?[ft]io.c.  The command line parser processes any
        !            39:  arguments found on the command line, as passed to main() via argv/argc.  The
        !            40:  interactive parser uses the facilities of the cmd package (developed for this
        !            41:  program, but usable by any program).  Any command parser may be substituted
        !            42:  for this one.  The only requirements for the Kermit command parser are these:
        !            43: 
        !            44: 1. Set parameters via global variables like duplex, speed, ttname, etc.  See
        !            45:    ckmain.c for the declarations and descriptions of these variables.
        !            46: 
        !            47: 2. If a command can be executed without the use of Kermit protocol, then
        !            48:    execute the command directly and set the variable sstate to 0. Examples
        !            49:    include 'set' commands, local directory listings, the 'connect' command.
        !            50: 
        !            51: 3. If a command requires the Kermit protocol, set the following variables:
        !            52: 
        !            53:     sstate                             string data
        !            54:       'x' (enter server mode)            (none)
        !            55:       'r' (send a 'get' command)         cmarg, cmarg2
        !            56:       'v' (enter receive mode)           cmarg2
        !            57:       'g' (send a generic command)       cmarg
        !            58:       's' (send files)                   nfils, cmarg & cmarg2 OR cmlist
        !            59:       'c' (send a remote host command)   cmarg
        !            60: 
        !            61:     cmlist is an array of pointers to strings.
        !            62:     cmarg, cmarg2 are pointers to strings.
        !            63:     nfils is an integer.
        !            64: 
        !            65:     cmarg can be a filename string (possibly wild), or
        !            66:        a pointer to a prefabricated generic command string, or
        !            67:        a pointer to a host command string.
        !            68:     cmarg2 is the name to send a single file under, or
        !            69:        the name under which to store an incoming file; must not be wild.
        !            70:        If it's the name for receiving, a null value means to store the
        !            71:        file under the name it arrives with.
        !            72:     cmlist is a list of nonwild filenames, such as passed via argv.
        !            73:     nfils is an integer, interpreted as follows:
        !            74:       -1: filespec (possibly wild) in cmarg, must be expanded internally.
        !            75:        0: send from stdin (standard input).
        !            76:       >0: number of files to send, from cmlist.
        !            77: 
        !            78:  The screen() function is used to update the screen during file transfer.
        !            79:  The tlog() function writes to a transaction log.
        !            80:  The debug() function writes to a debugging log.
        !            81:  The intmsg() and chkint() functions provide the user i/o for interrupting
        !            82:    file transfers.
        !            83: */
        !            84: 
        !            85: #ifndef NOICP
        !            86: /* Includes */
        !            87:  
        !            88: #include "ckcdeb.h"
        !            89: #include "ckcasc.h"
        !            90: #include "ckcker.h"
        !            91: #include "ckuusr.h"
        !            92: #include "ckcxla.h"
        !            93: #include "ckcnet.h"                    /* Network symbols */
        !            94:  
        !            95: #ifdef datageneral
        !            96: #include <packets:common.h>
        !            97: #define fgets(stringbuf,max,fd) dg_fgets(stringbuf,max,fd)
        !            98: #endif /* datageneral */
        !            99: 
        !           100: /* External Kermit Variables, see ckmain.c for description. */
        !           101:  
        !           102: extern int size, local, sndsrc, xitsta, server, displa, binary, msgflg, 
        !           103:   escape, duplex, nfils, quiet, tlevel, pflag, zincnt, atcapr, atdiso, verwho;
        !           104:  
        !           105: extern long vernum;
        !           106: extern char *versio;
        !           107: extern char *ckxsys, *cmarg, *cmarg2, **cmlist;
        !           108: #ifndef NOHELP
        !           109: extern char *introtxt[];
        !           110: #endif /* NOHELP */
        !           111: extern char *PWDCMD, *WHOCMD, *TYPCMD;
        !           112: extern char ttname[];
        !           113: #ifndef NOFRILLS
        !           114: extern int rmailf;                     /* MAIL command items */
        !           115: extern char optbuf[];
        !           116: #endif /* NOFRILLS */
        !           117: extern CHAR sstate;
        !           118: 
        !           119: #ifdef NETCONN
        !           120: extern int network;                    /* Have active network connection */
        !           121: #endif /* NETCONN */
        !           122: 
        !           123: #ifndef NOMSEND                                /* Multiple SEND */
        !           124: extern char *msfiles[];
        !           125: #endif /* NOMSEND */
        !           126: extern char fspec[];                   /* Most recent filespec */
        !           127: 
        !           128: #ifndef NOCSETS
        !           129: extern int nfilc;
        !           130: extern struct keytab fcstab[];
        !           131: #endif /* NOCSETS */
        !           132: 
        !           133: int rcflag = 0;                                /* Pointer to home directory string */
        !           134: int repars,                            /* Reparse needed */
        !           135:     techo = 0,                         /* Take echo */
        !           136:     terror = 0;                                /* Take error action, 1 = quit */
        !           137: #ifndef NOSCRIPT
        !           138: int secho = 1;
        !           139: #endif /* NOSCRIPT */
        !           140: 
        !           141: #ifndef NOXMIT
        !           142: /* Variables for TRANSMIT command */
        !           143: 
        !           144: int xmitx = 1;                 /* Whether to echo during TRANSMIT */
        !           145: int xmitf = 0;                 /* Character to fill empty lines */
        !           146: int xmitl = 0;                 /* 0 = Don't send linefeed too */
        !           147: int xmitp = LF;                        /* Host line prompt */
        !           148: int xmits = 0;                 /* Use shift-in/shift-out, 0 = no */
        !           149: int xmitw = 0;                 /* Milliseconds to pause during TRANSMIT */
        !           150: #endif /* NOXMIT */
        !           151: 
        !           152: /* Declarations from ck?fio.c module */
        !           153:  
        !           154: extern char *SPACMD, *SPACM2;          /* SPACE commands */
        !           155:  
        !           156: /* Command-oriented items */
        !           157: 
        !           158: #ifdef DCMDBUF
        !           159: extern char *cmdbuf;                   /* Command buffers */
        !           160: extern char *atmbuf;
        !           161: extern char *line;                     /* Character buffer for anything */
        !           162: extern int *ifcmd;
        !           163: #else
        !           164: extern char cmdbuf[];                  /* Command buffers */
        !           165: extern char atmbuf[];
        !           166: extern char line[];                    /* Character buffer for anything */
        !           167: extern int ifcmd[];
        !           168: #endif /* DCMDBUF */
        !           169: 
        !           170: char *lp;                              /* Pointer to line buffer */
        !           171: 
        !           172: #ifndef NOSPL
        !           173: extern char inpbuf[];                  /* Buffer for INPUT and REINPUT */
        !           174: char *inpbp = inpbuf;                  /* And pointer to same */
        !           175: extern char lblbuf[];                  /* Buffer for labels */
        !           176: #endif /* NOSPL */
        !           177: 
        !           178: char psave[80] = { NUL };              /* For saving & restoring prompt */
        !           179: 
        !           180: extern char tmpbuf[];                  /* Temporary buffer */
        !           181:  
        !           182: extern int success;                    /* Command success/failure flag */
        !           183: 
        !           184: #ifndef NOSPL
        !           185: int                                    /* SET INPUT parameters. */
        !           186:   indef = 5,                           /* 5 seconds default timeout */
        !           187:   intime = 0,                          /* 0 = proceed */
        !           188:   incase = 0,                          /* 0 = ignore */
        !           189:   inecho = 1,                          /* 1 = echo on */
        !           190:   insilence = 0;                       /* 0 = no silence constraint */
        !           191:  
        !           192: int maclvl = -1;                       /* Macro nesting level */
        !           193: int mecho = 0;                         /* Macro echo, 0 = don't */
        !           194: int merror = 0;                                /* Macro error action */
        !           195: char varnam[6];                                /* For variable names */
        !           196: extern int macargc[];                  /* ARGC from macro invocation */
        !           197: 
        !           198: extern char *m_arg[MACLEVEL][NARGS];   /* Stack of macro arguments */
        !           199:  
        !           200: extern char **a_ptr[];                 /* Array pointers */
        !           201: extern int a_dim[];                    /* Array dimensions */
        !           202: 
        !           203: #ifdef DCMDBUF
        !           204: extern struct cmdptr *cmdstk;          /* The command stack itself */
        !           205: #else
        !           206: extern struct cmdptr cmdstk[];         /* The command stack itself */
        !           207: #endif /* DCMDBUF */
        !           208: extern int cmdlvl;                     /* Current position in command stack */
        !           209: #endif /* NOSPL */
        !           210: 
        !           211: static int x, y, z = 0;                        /* Local workers */
        !           212: static char *s;
        !           213: 
        !           214: #define xsystem(s) zsyscmd(s)
        !           215: 
        !           216: /* Top-Level Interactive Command Keyword Table */
        !           217:  
        !           218: struct keytab cmdtab[] = {
        !           219: #ifndef NOPUSH
        !           220:     "!",          XXSHE, CM_INV,       /* shell escape */
        !           221: #endif /* NOPUSH */
        !           222:     "#",          XXCOM, CM_INV,       /* comment */
        !           223: #ifndef NOSPL
        !           224:     ":",           XXLBL, CM_INV,      /* label */
        !           225: #endif /* NOSPL */
        !           226: #ifndef NOPUSH
        !           227:     "@",           XXSHE, CM_INV,      /* DCL escape */
        !           228: #endif /* NOPUSH */
        !           229: #ifndef NOSPL
        !           230:     "asg",         XXASS, CM_INV,       /* invisible synonym for assign */
        !           231:     "ask",         XXASK, 0,           /* ask */
        !           232:     "askq",        XXASKQ,0,            /* ask quietly */
        !           233:     "assign",      XXASS, 0,            /* assign */
        !           234: #endif /* NOSPL */
        !           235: #ifndef NOFRILLS
        !           236:     "bug",         XXBUG, 0,           /* bug report instructions */
        !           237: #endif /* NOFRILLS */
        !           238:     "bye",         XXBYE, 0,           /* bye to remote server */
        !           239:     "c",           XXCON, CM_INV|CM_ABR, /* invisible synonym for connect */
        !           240: #ifndef NOFRILLS
        !           241:     "cat",         XXTYP, CM_INV,      /* display a local file */
        !           242: #endif /* NOFRILLS */
        !           243:     "cd",          XXCWD, 0,           /* change directory */
        !           244:     "check",       XXCHK, 0,           /* check for a feature */
        !           245: #ifndef NOFRILLS
        !           246:     "clear",       XXCLE, 0,           /* clear input buffer */
        !           247: #endif /* NOFRILLS */
        !           248:     "close",      XXCLO, 0,            /* close a log file */
        !           249: #ifdef NOFRILLS
        !           250:     "comment",     XXCOM, CM_INV,      /* comment */
        !           251: #else
        !           252:     "comment",     XXCOM, 0,           /* comment */
        !           253: #endif /* NOFRILLS */
        !           254:     "connect",     XXCON, 0,           /* connect to remote system */
        !           255:     "cwd",        XXCWD, CM_INV,       /* invisisble synonym for cd */
        !           256: #ifndef NOSPL
        !           257:     "dcl",         XXDCL, CM_INV,      /* declare an array */
        !           258:     "declare",     XXDCL, 0,           /* declare an array */
        !           259:     "decrement",   XXDEC, 0,           /* decrement a numeric variable */
        !           260:     "define",      XXDEF, 0,           /* define a macro */
        !           261: #endif /* NOSPL */
        !           262: #ifndef NOFRILLS
        !           263:     "delete",      XXDEL, 0,           /* delete a file */
        !           264: #endif /* NOFRILLS */
        !           265: #ifndef NODIAL
        !           266:     "dial",       XXDIAL,0,            /* dial a phone number */
        !           267: #endif /* NODIAL */
        !           268: #ifndef MAC
        !           269:     "directory",   XXDIR, 0,           /* directory of files */
        !           270: #endif /* MAC */
        !           271: #ifndef NOFRILLS
        !           272:     "disable",     XXDIS, 0,           /* disable server function */
        !           273: #endif /* NOFRILLS */
        !           274: #ifndef NOSPL
        !           275:     "do",          XXDO,  0,           /* execute a macro */
        !           276: #endif /* NOSPL */
        !           277: #ifndef NOFRILLS
        !           278:     "e-packet",    XXERR, CM_INV,      /* Send an Error packet */
        !           279: #endif /* NOFRILLS */
        !           280:     "echo",        XXECH, 0,           /* echo argument */
        !           281: #ifndef NOSPL
        !           282:     "else",        XXELS, CM_INV,      /* ELSE part of IF statement */
        !           283: #endif /* NOSPL */
        !           284: #ifndef NOFRILLS
        !           285:     "enable",      XXENA, 0,           /* ENABLE a server function */
        !           286: #endif /* NOFRILLS */
        !           287: #ifndef NOSPL
        !           288:     "end",         XXEND, 0,           /* END command file or macro */
        !           289: #endif /* NOSPL */
        !           290:     "ex",          XXEXI, CM_INV|CM_ABR, /* Let "ex" still be EXIT */
        !           291:     "exit",       XXEXI, 0,            /* exit the program */
        !           292:     "extproc",     XXCOM, CM_INV,       /* dummy command */
        !           293:     "finish",      XXFIN, 0,           /* FINISH */
        !           294: #ifndef NOSPL
        !           295:     "for",         XXFOR, 0,           /* FOR loop */
        !           296: #endif /* NOSPL */
        !           297: #ifndef NOFRILLS
        !           298: #ifndef MAC
        !           299:     "fot",        XXDIR, CM_INV,       /* "fot" = "dir" (for Chris) */
        !           300: #endif /* MAC */
        !           301: #endif /* NOFRILLS */
        !           302:     "g",           XXGET, CM_INV|CM_ABR, /* Invisible abbreviation for GET */
        !           303: #ifndef NOSPL
        !           304:     "ge",          XXGET, CM_INV|CM_ABR, /* Ditto */
        !           305: #endif /* NOSPL */
        !           306:     "get",         XXGET, 0,           /* GET */
        !           307: #ifndef NOSPL
        !           308: #ifndef NOFRILLS
        !           309:     "getok",       XXGOK, 0,           /* GETOK (ask for Yes/No) */
        !           310: #endif /* NOFRILLS */
        !           311: #endif /* NOSPL */
        !           312: #ifndef NOSPL
        !           313:     "goto",        XXGOTO,0,           /* goto label in take file or macro */
        !           314: #endif /* NOSPL */
        !           315:     "hangup",      XXHAN, 0,           /* hangup dialed phone connection */
        !           316:     "help",       XXHLP, 0,            /* display help text */
        !           317: #ifndef NOSPL
        !           318:     "i",           XXINP, CM_INV|CM_ABR, /* invisible synonym for INPUT */
        !           319:     "if",          XXIF,  0,           /* if (condition) command */
        !           320:     "in",          XXINP, CM_INV|CM_ABR, /* invisible synonym for INPUT */
        !           321:     "increment",   XXINC, 0,           /* increment a numeric variable */
        !           322:     "input",       XXINP, 0,           /* input string from comm line */
        !           323: #endif /* NOSPL */
        !           324: #ifndef NOHELP
        !           325:      "introduction", XXINT, 0,         /* Print introductory text */
        !           326: #endif /* NOHELP */
        !           327: #ifndef NOFRILLS
        !           328:     "l",           XXLOG, CM_INV|CM_ABR,/* invisible synonym for log */
        !           329: #endif /* NOFRILLS */
        !           330:     "log",        XXLOG, 0,            /* open a log file */
        !           331: #ifndef NOFRILLS
        !           332: #ifndef MAC
        !           333:     "ls",          XXDIR, CM_INV,      /* invisible synonym for directory */
        !           334: #endif /* MAC */
        !           335:     "mail",        XXMAI, 0,           /* mail file to user */
        !           336:     "man",         XXHLP, CM_INV,       /* Synonym for help */
        !           337: #endif /* NOFRILLS */
        !           338: #ifndef NOMSEND
        !           339:     "mget",        XXGET, CM_INV,      /* MGET = GET */
        !           340: #endif /* NOMSEND */
        !           341: #ifndef NOSPL
        !           342:     "mpause",      XXMSL, CM_INV,      /* Millisecond sleep */
        !           343: #endif /* NOSPL */
        !           344: #ifndef NOMSEND
        !           345:     "ms",          XXMSE, CM_INV|CM_ABR,
        !           346:     "msend",       XXMSE, 0,           /* Multiple SEND */
        !           347: #endif /* NOMSEND */
        !           348: #ifndef NOSPL
        !           349:     "msleep",      XXMSL, 0,           /* Millisecond sleep */
        !           350: #endif /* NOSPL */
        !           351: #ifndef NOMSEND
        !           352:     "mput",        XXMSE, CM_INV,      /* MPUT = MSEND */
        !           353: #endif /* NOMSEND */
        !           354: #ifndef NOFRILLS
        !           355:     "mv",          XXREN, CM_INV,      /* rename a local file */
        !           356: #endif /* NOFRILLS */
        !           357: #ifndef NOSPL
        !           358:     "o",           XXOUT, CM_INV|CM_ABR,/* invisible synonym for OUTPUT */
        !           359:     "open",        XXOPE, 0,           /* open file for reading or writing */
        !           360:     "output",      XXOUT, 0,           /* output string to comm line */
        !           361: #endif /* NOSPL */
        !           362: #ifdef SUNX25
        !           363:     "pad",         XXPAD, 0,            /* PAD commands */
        !           364: #endif /* SUNX25 */
        !           365: #ifndef NOSPL
        !           366:     "pause",       XXPAU, 0,           /* sleep for specified interval */
        !           367: #ifdef TCPSOCKET
        !           368:     "ping",        XXPNG, 0,           /* PING (for TCP/IP) */
        !           369: #endif /* TCPSOCKET */
        !           370:     "pop",         XXEND, CM_INV,      /* allow POP as synonym for END */
        !           371: #endif /* NOSPL */
        !           372: #ifndef NOFRILLS
        !           373:     "print",       XXPRI, 0,           /* PRINT */
        !           374: #ifndef NOPUSH
        !           375:     "pu",          XXSHE, CM_INV,      /* PU = PUSH */
        !           376:     "push",        XXSHE, 0,           /* PUSH command (like RUN, !) */
        !           377: #endif /* NOPUSH */
        !           378:     "put",        XXSEN, CM_INV,       /* PUT = SEND */
        !           379: #ifndef MAC
        !           380:     "pwd",         XXPWD, 0,            /* print working directory */
        !           381: #endif /* MAC */
        !           382: #endif /* NOFRILLS */
        !           383:     "quit",       XXQUI, 0,            /* quit from program = exit */
        !           384:     "r",           XXREC, CM_INV,      /* invisible synonym for receive */
        !           385: #ifndef NOSPL
        !           386:     "read",        XXREA, 0,            /* read */
        !           387: #endif /* NOSPL */
        !           388:     "receive",    XXREC, 0,            /* receive files */
        !           389: #ifndef NODIAL
        !           390:     "redial",      XXRED, 0,           /* redial */
        !           391: #endif /* NODIAL */
        !           392: #ifndef NOSPL
        !           393:     "reinput",     XXREI, 0,            /* reinput */
        !           394: #endif /* NOSPL */
        !           395:     "remote",     XXREM, 0,            /* send generic command to server */
        !           396: #ifndef NOFRILLS
        !           397:     "rename",      XXREN, 0,           /* rename a local file */
        !           398:     "replay",      XXTYP, CM_INV,      /* replay (for now, just type) */
        !           399: #endif /* NOFRILLS */
        !           400: #ifndef NOSPL
        !           401:     "return",      XXRET, 0,           /* return from function */
        !           402: #endif /* NOSPL */
        !           403: #ifndef NOFRILLS
        !           404:     "rm",          XXDEL, CM_INV,      /* invisible synonym for delete */
        !           405: #endif /* NOFRILLS */
        !           406: #ifndef NOPUSH
        !           407:     "run",         XXSHE, 0,           /* run a program or command */
        !           408: #endif /* NOPUSH */
        !           409:     "s",           XXSEN, CM_INV|CM_ABR, /* invisible synonym for send */
        !           410: #ifndef NOSCRIPT
        !           411:     "script",     XXLOGI,0,            /* execute a uucp-style script */
        !           412: #endif /* NOSCRIPT */
        !           413:     "send",       XXSEN, 0,            /* send files */
        !           414: #ifndef NOSERVER
        !           415:     "server",     XXSER, 0,            /* be a server */
        !           416: #endif /* NOSERVER */
        !           417:     "set",        XXSET, 0,            /* set parameters */
        !           418: #ifndef NOSHOW
        !           419:     "show",       XXSHO, 0,            /* show parameters */
        !           420: #endif /* NOSHOW */
        !           421: #ifndef NOSPL
        !           422: #ifndef NOFRILLS
        !           423:     "sleep",       XXPAU, CM_INV,      /* sleep for specified interval */
        !           424: #endif /* NOFRILLS */
        !           425: #endif /* NOSPL */
        !           426: #ifndef MAC
        !           427: #ifndef NOFRILLS
        !           428:     "sp",          XXSPA, CM_INV|CM_ABR,
        !           429:     "spa",         XXSPA, CM_INV|CM_ABR,
        !           430: #endif /* NOFRILLS */
        !           431:     "space",       XXSPA, 0,           /* show available disk space */
        !           432: #endif /* MAC */
        !           433: #ifndef NOFRILLS
        !           434: #ifndef NOPUSH
        !           435:     "spawn",       XXSHE, CM_INV,      /* synonym for PUSH, RUN */
        !           436: #endif /* NOPUSH */
        !           437: #endif /* NOFRILLS */
        !           438:     "statistics",  XXSTA, 0,           /* display file transfer stats */
        !           439: #ifndef NOSPL
        !           440:     "stop",        XXSTO, 0,           /* stop all take files */
        !           441: #endif /* NOSPL */
        !           442: #ifndef NOJC
        !           443:     "suspend",     XXSUS, 0,           /* Suspend */
        !           444: #endif /* NOJC */
        !           445:     "take",       XXTAK, 0,            /* take commands from file */
        !           446: #ifndef NOFRILLS
        !           447: #ifdef NETCONN
        !           448:     "telnet",      XXTEL, 0,           /* telnet */
        !           449: #endif /* NETCONN */
        !           450:     "test",        XXTES, CM_INV,      /* (for testing) */
        !           451: #endif /* NOFRILLS */
        !           452: #ifndef NOCSETS
        !           453:     "translate",   XXXLA, 0,           /* translate local file char sets */
        !           454: #endif
        !           455: #ifndef NOXMIT
        !           456:     "transmit",    XXTRA, 0,           /* raw upload file */
        !           457: #endif /* NOXMIT */
        !           458: #ifndef NOFRILLS
        !           459:     "type",        XXTYP, 0,           /* display a local file */
        !           460: #endif /* NOFRILLS */
        !           461:     "version",     XXVER, 0            /* version number display */
        !           462: #ifndef NOSPL
        !           463: ,   "wait",        XXWAI, 0            /* wait (like pause) */
        !           464: ,   "while",       XXWHI, 0            /* while */
        !           465: #endif /* NOSPL */
        !           466: #ifndef MAC
        !           467: #ifndef NOFRILLS
        !           468: ,   "who",         XXWHO, 0            /* who */
        !           469: #endif /* NOFRILLS */
        !           470: #endif /* MAC */
        !           471: #ifndef NOSPL
        !           472: ,   "write",       XXWRI, 0            /* write */
        !           473: ,   "xif",         XXIFX, 0            /* Extended IF */
        !           474: #endif /* NOSPL */
        !           475: #ifndef NOCSETS
        !           476: ,   "xlate",       XXXLA, CM_INV       /* translate local file char sets */
        !           477: #endif
        !           478: #ifndef NOXMIT
        !           479: ,   "xmit",        XXTRA, CM_INV       /* raw upload file */
        !           480: #endif /* NOXMIT */
        !           481: ,   "z",           XXSUS, CM_INV       /* Suspend */
        !           482: #ifndef NOSPL
        !           483: ,   "_assign",     XXASX, CM_INV       /* used internally by FOR, etc */
        !           484: ,   "_define",     XXDFX, CM_INV       /* used internally by FOR, etc */
        !           485: ,   "_getargs",    XXGTA, CM_INV        /* used internally by FOR, etc */
        !           486: ,   "_putargs",    XXPTA, CM_INV        /* used internally by FOR, etc */
        !           487: #endif /* NOSPL */
        !           488: };
        !           489: int ncmd = (sizeof(cmdtab) / sizeof(struct keytab));
        !           490: 
        !           491: char toktab[] = {
        !           492: #ifndef NOPUSH
        !           493:     '!',                               /* Shell escape */
        !           494: #endif /* NOPUSH */
        !           495:     '#',                               /* Comment */
        !           496:     ';',                               /* Comment */
        !           497: #ifndef NOSPL
        !           498:     ':',                               /* Label */
        !           499: #endif /* NOSPL */
        !           500: #ifndef NOPUSH
        !           501:     '@',                               /* DCL escape */
        !           502: #endif /* NOPUSH */
        !           503:     '\0'                               /* End of this string */
        !           504: };
        !           505: 
        !           506: #ifndef NOSPL
        !           507: #ifndef NOFRILLS
        !           508: struct keytab yesno[] = {
        !           509:     "no",    0, 0,
        !           510:     "ok",    1, 0,
        !           511:     "yes",   1, 0
        !           512: };
        !           513: int nyesno = (sizeof(yesno) / sizeof(struct keytab));
        !           514: #endif /* NOFRILLS */
        !           515: #endif /* NOSPL */
        !           516: 
        !           517: /* Parameter keyword table */
        !           518:  
        !           519: struct keytab prmtab[] = {
        !           520:     "attributes",       XYATTR,  0,
        !           521:     "b",               XYBACK,  CM_INV|CM_ABR,
        !           522:     "ba",              XYBACK,  CM_INV|CM_ABR,
        !           523:     "background",       XYBACK,  0,
        !           524:     "baud",            XYSPEE,  CM_INV,
        !           525:     "block-check",     XYCHKT,  0,
        !           526: #ifdef DYNAMIC
        !           527:     "buffers",          XYBUF,   0,
        !           528: #endif /* DYNAMIC */
        !           529: #ifndef MAC
        !           530:     "carrier",          XYCARR,  0,
        !           531: #endif /* MAC */
        !           532: #ifndef NOSPL
        !           533:     "case",             XYCASE,  0,
        !           534: #endif /* NOSPL */
        !           535:     "command",          XYCMD,   0,
        !           536: #ifndef NOSPL
        !           537:     "count",            XYCOUN,  0,
        !           538: #endif /* NOSPL */
        !           539:     "d",               XYDELA,  CM_INV|CM_ABR,
        !           540:     "de",              XYDELA,  CM_INV|CM_ABR,
        !           541:     "debug",            XYDEBU,  CM_INV,
        !           542: #ifdef VMS
        !           543:     "default",          XYDFLT,  0,
        !           544: #else
        !           545: #ifndef MAC
        !           546:     "default",          XYDFLT,  CM_INV,
        !           547: #endif /* MAC */
        !           548: #endif /* VMS */
        !           549:     "delay",           XYDELA,  0,
        !           550: #ifndef NODIAL
        !           551:     "dial",             XYDIAL,  0,
        !           552: #endif /* NODIAL */
        !           553:     "duplex",          XYDUPL,  0,
        !           554:     "escape-character", XYESC,   0,
        !           555:     "file",            XYFILE,  0,
        !           556:     "flow-control",    XYFLOW,  0,
        !           557:     "handshake",       XYHAND,  0,
        !           558: #ifdef NETCONN
        !           559:     "host",             XYHOST,  0,
        !           560: #endif /* NETCONN */
        !           561:     "incomplete",      XYIFD,   CM_INV,
        !           562: #ifndef NOSPL
        !           563:     "i",               XYINPU,  CM_INV|CM_ABR,
        !           564:     "in",              XYINPU,  CM_INV|CM_ABR,
        !           565:     "input",            XYINPU,  0,
        !           566: #ifndef MAC
        !           567: #ifndef NOSETKEY
        !           568:     "key",             XYKEY,   0,
        !           569: #endif /* NOSETKEY */
        !           570: #endif /* MAC */
        !           571: #endif /* NOSPL */
        !           572:     "l",                XYLINE,  CM_INV|CM_ABR,
        !           573: #ifndef NOCSETS
        !           574:     "language",         XYLANG,  0,
        !           575: #endif /* NOCSETS */
        !           576:     "line",             XYLINE,  0,
        !           577:     "local-echo",      XYLCLE,  CM_INV,
        !           578: #ifndef NOSPL
        !           579:     "macro",            XYMACR,  0,
        !           580: #endif /* NOSPL */
        !           581: #ifdef COMMENT
        !           582: #ifdef VMS
        !           583:     "messages",         XYMSGS,  0,
        !           584: #endif /* VMS */
        !           585: #endif /* COMMENT */
        !           586: #ifndef NODIAL
        !           587:     "modem-dialer",    XYMODM,  0,
        !           588: #endif
        !           589: #ifdef NETCONN
        !           590:     "network",          XYNET,   0,
        !           591: #endif /* NETCONN */
        !           592: #ifdef SUNX25
        !           593:     "pad",              XYPAD,   0,
        !           594: #endif /* SUNX25 */
        !           595:     "parity",          XYPARI,  0,
        !           596:     "port",             XYLINE,  CM_INV,
        !           597: #ifndef NOFRILLS
        !           598:     "prompt",          XYPROM,  0,
        !           599: #endif /* NOFRILLS */
        !           600:     "quiet",           XYQUIE,  0,
        !           601:     "receive",          XYRECV,  0,
        !           602:     "retry-limit",      XYRETR,  0,
        !           603: #ifndef NOSCRIPT
        !           604:     "script",          XYSCRI,  0,
        !           605: #endif /* NOSCRIPT */
        !           606:     "send",             XYSEND,  0,
        !           607: #ifndef NOSERVER
        !           608:     "server",           XYSERV,  0,
        !           609: #endif /* NOSERVER */
        !           610: #ifdef UNIX
        !           611:     "session-log",      XYSESS,  0,
        !           612: #endif /* UNIX */
        !           613:     "speed",           XYSPEE,  0,
        !           614: #ifndef NOJC
        !           615:     "suspend",          XYSUSP,  0,
        !           616: #endif /* NOJC */
        !           617:     "take",             XYTAKE,  0,
        !           618: #ifdef TNCODE
        !           619:     "telnet",           XYTEL,   0,
        !           620: #endif /* TNCODE */
        !           621:     "terminal",         XYTERM,  0,
        !           622:     "transfer",         XYXFER,  0,
        !           623: #ifndef NOXMIT
        !           624:     "transmit",         XYXMIT,  0,
        !           625: #endif /* NOXMIT */
        !           626: #ifndef NOCSETS
        !           627:     "unknown-char-set", XYUNCS,  0,
        !           628: #endif /* NOCSETS */
        !           629:     "window-size",      XYWIND,  0
        !           630: #ifdef UNIX
        !           631: ,   "wildcard-expansion", XYWILD, 0
        !           632: #endif /* UNIX */
        !           633: #ifdef SUNX25
        !           634: ,   "x.25",             XYX25,   0,
        !           635:     "x25",              XYX25,   CM_INV
        !           636: #endif /* SUNX25 */
        !           637: #ifndef NOCSETS
        !           638: ,   "xfer",             XYXFER,  CM_INV
        !           639: #endif /* NOCSETS */
        !           640: #ifndef NOXMIT
        !           641: ,   "xmit",             XYXMIT,  CM_INV
        !           642: #endif /* NOXMIT */
        !           643: };
        !           644: int nprm = (sizeof(prmtab) / sizeof(struct keytab)); /* How many parameters */
        !           645:  
        !           646: /* Table of networks */
        !           647: #ifdef NETCONN
        !           648: struct keytab netcmd[] = {
        !           649: #ifdef DECNET
        !           650:     "decnet",        NET_DEC,  0,
        !           651: #endif /* DECNET */
        !           652: #ifdef NPIPE
        !           653:     "named-pipe",    NET_PIPE, 0,
        !           654: #endif /* NPIPE */
        !           655: #ifdef TCPSOCKET
        !           656:     "tcp/ip",        NET_TCPB, 0
        !           657: #endif /* TCPSOCKET */
        !           658: #ifdef SUNX25
        !           659: ,   "x",            NET_SX25, CM_INV|CM_ABR,
        !           660:     "x.25",         NET_SX25, 0,
        !           661:     "x25",          NET_SX25, CM_INV
        !           662: #endif /* SUNX25 */
        !           663: };
        !           664: int nnets = (sizeof(netcmd) / sizeof(struct keytab)); /* How many networks */
        !           665: #endif /* NETCONN */
        !           666: 
        !           667: /* Remote Command Table */
        !           668:  
        !           669: struct keytab remcmd[] = {
        !           670:     "cd",        XZCWD, 0,
        !           671:     "cwd",       XZCWD, CM_INV,
        !           672:     "delete",    XZDEL, 0,
        !           673:     "directory", XZDIR, 0,
        !           674:     "help",      XZHLP, 0,
        !           675: #ifndef NOPUSH
        !           676:     "host",      XZHOS, 0,
        !           677: #endif /* NOPUSH */
        !           678: #ifndef NOFRILLS
        !           679:     "kermit",    XZKER, 0,
        !           680:     "login",     XZLGI, 0,
        !           681:     "logout",    XZLGO, 0,
        !           682:     "print",     XZPRI, 0,
        !           683: #endif /* NOFRILLS */
        !           684:     "set",       XZSET, 0,
        !           685:     "space",    XZSPA, 0
        !           686: #ifndef NOFRILLS
        !           687: ,   "type",     XZTYP, 0,
        !           688:     "who",      XZWHO, 0
        !           689: #endif /* NOFRILLS */
        !           690: };
        !           691: int nrmt = (sizeof(remcmd) / sizeof(struct keytab));
        !           692:  
        !           693: struct keytab logtab[] = {
        !           694: #ifdef DEBUG
        !           695:     "debugging",    LOGD, 0,
        !           696: #endif /* DEBUG */
        !           697:     "packets",     LOGP, 0,
        !           698:     "session",      LOGS, 0
        !           699: #ifdef TLOG
        !           700: ,   "transactions", LOGT, 0
        !           701: #endif /* TLOG */
        !           702: };
        !           703: int nlog = (sizeof(logtab) / sizeof(struct keytab));
        !           704:  
        !           705: struct keytab writab[] = {
        !           706: #ifndef NOSPL
        !           707:     "append-file",     LOGW, CM_INV,
        !           708: #endif /* NOSPL */
        !           709:     "debug-log",       LOGD, 0,
        !           710:     "error",           LOGE, 0,
        !           711: #ifndef NOSPL
        !           712:     "file",            LOGW, 0,
        !           713: #endif /* NOSPL */
        !           714:     "packet-log",      LOGP, 0,
        !           715:     "screen",          LOGX, 0,
        !           716:     "session-log",     LOGS, 0,
        !           717:     "sys$output",      LOGX, CM_INV,
        !           718:     "transaction-log", LOGT, 0
        !           719: };
        !           720: int nwri = (sizeof(writab) / sizeof(struct keytab));
        !           721: 
        !           722: #define CLR_DEV  1
        !           723: #define CLR_INP  2
        !           724: 
        !           725: static struct keytab clrtab[] = {      /* Keywords for CLEAR command */
        !           726: #ifndef NOSPL
        !           727:     "both",          CLR_DEV|CLR_INP, 0,
        !           728: #endif /* NOSPL */
        !           729:     "device-buffer", CLR_DEV,         0,
        !           730: #ifndef NOSPL
        !           731:     "input-buffer",  CLR_INP,         0
        !           732: #endif /* NOSPL */
        !           733: };
        !           734: int nclear = (sizeof(clrtab) / sizeof(struct keytab));
        !           735: 
        !           736: struct keytab clstab[] = {             /* Keywords for CLOSE command */
        !           737: #ifndef NOSPL
        !           738:     "append-file",     LOGW, CM_INV,
        !           739: #endif /* NOSPL */
        !           740: #ifdef DEBUG
        !           741:     "debug-log",       LOGD, 0,
        !           742: #endif /* DEBUG */
        !           743:     "packet-log",      LOGP, 0,
        !           744: #ifndef NOSPL
        !           745:     "read-file",       LOGR, 0,
        !           746: #endif /* NOSPL */
        !           747:     "session-log",     LOGS, 0
        !           748: #ifdef TLOG
        !           749: ,   "transaction-log", LOGT, 0
        !           750: #endif /* TLOG */
        !           751: #ifndef NOSPL
        !           752: ,   "write-file",      LOGW, 0
        !           753: #endif /* NOSPL */
        !           754: };
        !           755: int ncls = (sizeof(clstab) / sizeof(struct keytab));
        !           756: 
        !           757: /* SHOW command arguments */
        !           758:  
        !           759: struct keytab shotab[] = {
        !           760: #ifndef NOSPL
        !           761:     "arguments", SHARG, 0,
        !           762:     "arrays", SHARR, 0,
        !           763: #endif /* NOSPL */
        !           764:     "attributes", SHATT, 0,
        !           765:     "character-sets", SHCSE, 0,
        !           766:     "communications", SHCOM, 0,
        !           767: #ifndef NOSPL
        !           768:     "count", SHCOU, 0,
        !           769: #endif /* NOSPL */
        !           770: #ifdef VMS
        !           771:     "default", SHDFLT, 0,
        !           772: #else
        !           773:     "default", SHDFLT, CM_INV,
        !           774: #endif /* VMS */
        !           775: #ifndef NODIAL
        !           776:     "dial", SHDIA, 0,
        !           777: #endif /* NODIAL */
        !           778:     "escape", SHESC, 0,
        !           779:     "features", SHFEA, 0,
        !           780:     "file", SHFIL, 0,
        !           781: #ifndef NOSPL
        !           782:     "functions", SHFUN, 0,
        !           783:     "globals", SHVAR, 0,
        !           784: #endif /* NOSPL */
        !           785: #ifndef NOSETKEY
        !           786:     "key", SHKEY, 0,
        !           787: #endif /* NOSETKEY */
        !           788: #ifdef VMS
        !           789:     "labeled-file-info", SHLBL, 0,
        !           790: #endif /* VMS */
        !           791: #ifndef NOCSETS
        !           792:     "languages", SHLNG, 0,
        !           793: #endif /* NOCSETS */
        !           794: #ifndef NOSPL
        !           795:     "macros", SHMAC, 0,
        !           796: #endif /* NOSPL */
        !           797:     "modem-signals", SHMOD, 0,
        !           798:     "network", SHNET, 0,
        !           799: #ifdef SUNX25
        !           800:     "pad", SHPAD, 0,
        !           801: #endif /* SUNX25 */
        !           802:     "parameters", SHPAR, CM_INV,
        !           803:     "protocol", SHPRO, 0,
        !           804: #ifndef NOSPL
        !           805:     "scripts", SHSCR, 0,
        !           806: #endif /* NOSPL */
        !           807: #ifndef NOSERVER
        !           808:     "server", SHSER, 0,
        !           809: #endif /* NOSERVER */
        !           810:     "status", SHSTA, 0,
        !           811: #ifdef MAC
        !           812:     "stack", SHSTK, 0,                 /* debugging */
        !           813: #endif /* MAC */
        !           814:     "terminal", SHTER, 0
        !           815: #ifndef NOXMIT
        !           816: ,   "transmit", SHXMI, 0
        !           817: #endif /* NOXMIT */
        !           818: #ifndef NOSPL
        !           819: ,   "variables", SHBUI, 0
        !           820: #endif /* NOSPL */
        !           821: #ifndef NOFRILLS
        !           822: ,   "versions", SHVER, 0
        !           823: #endif /* NOFRILLS */
        !           824: #ifndef NOXMIT
        !           825: ,   "xmit", SHXMI, CM_INV
        !           826: #endif /* NOXMIT */
        !           827: };
        !           828: int nsho = (sizeof(shotab) / sizeof(struct keytab));
        !           829: 
        !           830: #ifdef SUNX25
        !           831: struct keytab padtab[] = {              /* PAD commands */
        !           832:     "clear",      XYPADL, 0,
        !           833:     "interrupt",  XYPADI, 0,
        !           834:     "reset",      XYPADR, 0,
        !           835:     "status",     XYPADS, 0
        !           836: };
        !           837: int npadc = (sizeof(padtab) / sizeof(struct keytab));
        !           838: #endif /* SUNX25 */
        !           839: 
        !           840: struct keytab enatab[] = {             /* ENABLE commands */
        !           841:     "all",        EN_ALL,  0,
        !           842: #ifndef datageneral
        !           843:     "bye",        EN_BYE,  0,
        !           844: #endif /* datageneral */
        !           845:     "cd",         EN_CWD,  0,
        !           846:     "cwd",        EN_CWD,  CM_INV,
        !           847:     "delete",     EN_DEL,  0,
        !           848:     "directory",  EN_DIR,  0,
        !           849:     "finish",     EN_FIN,  0,
        !           850:     "get",        EN_GET,  0,
        !           851:     "host",       EN_HOS,  0,
        !           852:     "send",       EN_SEN,  0,
        !           853:     "set",        EN_SET,  0,
        !           854:     "space",      EN_SPA,  0,
        !           855:     "type",       EN_TYP,  0,
        !           856:     "who",        EN_WHO,  0
        !           857: };
        !           858: int nena = (sizeof(enatab) / sizeof(struct keytab));
        !           859: 
        !           860: #ifndef NOSPL
        !           861: #ifdef COMMENT
        !           862: struct mtab mactab[MAC_MAX] = {                /* Preinitialized macro table */
        !           863:     NULL, NULL, 0
        !           864: };
        !           865: #else
        !           866: struct mtab *mactab;                   /* Dynamically allocated macro table */
        !           867: #endif /* COMMENT */
        !           868: int nmac = 0;
        !           869: 
        !           870: struct keytab mackey[MAC_MAX];         /* Macro names as command keywords */
        !           871: #endif /* NOSPL */
        !           872: 
        !           873: /* Forward declarations of functions */
        !           874: 
        !           875: _PROTOTYP (int doask,   ( int  ) );
        !           876: _PROTOTYP (int dodef,   ( int  ) );
        !           877: _PROTOTYP (int dodel,   ( void ) );
        !           878: _PROTOTYP (int dodial,  ( int  ) );
        !           879: _PROTOTYP (int dodir,   ( void ) );
        !           880: _PROTOTYP (int doelse,  ( void ) );
        !           881: _PROTOTYP (int dofor,   ( void ) );
        !           882: _PROTOTYP (int dogta,   ( int  ) );
        !           883: _PROTOTYP (int doincr,  ( int  ) );
        !           884: _PROTOTYP (int dopaus,  ( int  ) );
        !           885: _PROTOTYP (int doping,  ( void ) );
        !           886: _PROTOTYP (int dorenam, ( void ) );
        !           887: 
        !           888: #ifdef TCPSOCKET
        !           889: int
        !           890: doping() {
        !           891:     char *p;
        !           892:     int x;
        !           893: 
        !           894:     if (network)                       /* If we have a current connection */
        !           895:       strcpy(line,ttname);             /* get the host name */
        !           896:     else *line = '\0';                 /* as default host to be pinged. */
        !           897:     for (p = line; *p; p++)            /* Remove ":service" from end. */
        !           898:       if (*p == ':') { *p = '\0'; break; }
        !           899:     if ((x = cmtxt("IP host name or number", line, &s, xxstring)) < 0)
        !           900:       return(x);
        !           901: /* Construct PING command */
        !           902: #ifdef VMS
        !           903: #ifdef MULTINET                                /* TGV MultiNet */
        !           904:     sprintf(line,"multinet ping %s /num=1",s);
        !           905: #else
        !           906:     sprintf(line,"ping %s 56 1",s);    /* Other VMS TCP/IP's */
        !           907: #endif /* MULTINET */
        !           908: #else                                  /* Not VMS */
        !           909:     sprintf(line,"ping %s",s);
        !           910: #endif /* VMS */
        !           911:     conres();                          /* Make console normal  */
        !           912: #ifdef DEC_TCPIP
        !           913:     printf("\n");                      /* Prevent prompt-stomping */
        !           914: #endif /* DEC_TCPIP */
        !           915:     x = zshcmd(line);
        !           916:     concb((char)escape);
        !           917:     return(success = 1);               /* We don't know the status */
        !           918: }
        !           919: #endif /* TCPSOCKET */
        !           920: 
        !           921: /*  D O C M D  --  Do a command  */
        !           922:  
        !           923: /*
        !           924:  Returns:
        !           925:    -2: user typed an illegal command
        !           926:    -1: reparse needed
        !           927:     0: parse was successful (even tho command may have failed).
        !           928: */ 
        !           929: int
        !           930: docmd(cx) int cx; {
        !           931: 
        !           932:     debug(F101,"docmd entry, cx","",cx);
        !           933: 
        !           934: /*
        !           935:   Massive switch() broken up into many smaller ones, for the benefit of
        !           936:   compilers that run out of space when trying to handle large switch
        !           937:   statements.
        !           938: */
        !           939:     switch (cx) {
        !           940:       case -4:                 /* EOF */
        !           941: #ifdef OSK
        !           942:        if (msgflg)  printf("\n");
        !           943: #else
        !           944:        if (msgflg)  printf("\r\n");
        !           945: #endif /* OSK */
        !           946:          doexit(GOOD_EXIT,xitsta);
        !           947:       case -3:                         /* Null command */
        !           948:        return(0);
        !           949:       case -9:                         /* Like -2, but errmsg already done */
        !           950:       case -1:                         /* Reparse needed */
        !           951:        return(cx);
        !           952:       case -6:                         /* Special */
        !           953:       case -2:                         /* Error, maybe */
        !           954: #ifndef NOSPL
        !           955: /*
        !           956:   Maybe they typed a macro name.  Let's look it up and see.
        !           957: */
        !           958:        if (cx == -6)                   /* If they typed CR */
        !           959:          strcat(cmdbuf,"\015");        /*  add it back to command buffer. */
        !           960:        if (ifcmd[cmdlvl] == 2)         /* Watch out for IF commands. */
        !           961:          ifcmd[cmdlvl]--;
        !           962:        repars = 1;                     /* Force reparse */
        !           963:        cmres();
        !           964:        cx = XXDO;                      /* Try DO command */
        !           965: #else
        !           966:        return(cx);
        !           967: #endif /* NOSPL */
        !           968:       default:
        !           969:        break;
        !           970:     }
        !           971:  
        !           972: #ifndef NOSPL
        !           973: /* Copy macro args from/to two levels up, used internally by _floop et al. */
        !           974:     if (cx == XXGTA || cx == XXPTA) {  /* _GETARGS, _PUTARGS */
        !           975:        int x;
        !           976:        debug(F101,"docmd XXGTA","",XXGTA);
        !           977:        debug(F101,"docmd cx","",cx);
        !           978:        debug(F101,"docmd XXGTA maclvl","",maclvl);
        !           979:        x = dogta(cx);
        !           980:        debug(F101,"docmd dogta returns","",x);
        !           981:        debug(F101,"docmd dogta maclvl","",maclvl);
        !           982:        return(x);
        !           983:     }
        !           984: #endif /* NOSPL */
        !           985: 
        !           986: #ifndef NOSPL
        !           987: /* ASK, ASKQ, READ */
        !           988:     if (cx == XXASK || cx == XXASKQ || cx == XXREA) {
        !           989:        return(doask(cx));
        !           990:     }
        !           991: #endif /* NOSPL */
        !           992: 
        !           993: #ifndef NOFRILLS
        !           994:     if (cx == XXBUG) {                 /* BUG */
        !           995:        if ((x = cmcfm()) < 0) return(x);
        !           996:        return(dobug());
        !           997:     }
        !           998: #endif /* NOFRILLS */
        !           999: 
        !          1000:     if (cx == XXBYE) {                 /* BYE */
        !          1001:        if ((x = cmcfm()) < 0) return(x);
        !          1002:        sstate = setgen('L',"","","");
        !          1003:        if (local) ttflui();            /* If local, flush tty input buffer */
        !          1004:        return(0);
        !          1005:     } 
        !          1006: 
        !          1007: #ifndef NOFRILLS
        !          1008:     if (cx == XXCLE) {                 /* CLEAR */
        !          1009:        if ((x = cmkey(clrtab,nclear,"buffer(s) to clear",
        !          1010: #ifdef NOSPL
        !          1011:                  "device-buffer"
        !          1012: #else
        !          1013:                  "both"
        !          1014: #endif /* NOSPL */
        !          1015:                  ,xxstring)) < 0) return(x);
        !          1016:        if ((y = cmcfm()) < 0) return(y);
        !          1017: 
        !          1018:        /* Clear device input buffer if requested */
        !          1019:        y = (x & CLR_DEV) ? ttflui() : 0;
        !          1020: #ifndef NOSPL
        !          1021:        /* Clear INPUT command buffer if requested */
        !          1022:        if (x & CLR_INP) {
        !          1023:            for (x = 0; x < INPBUFSIZ; x++)
        !          1024:              inpbuf[x] = 0;
        !          1025:            inpbp = inpbuf;
        !          1026:        }
        !          1027: #endif /* NOSPL */
        !          1028:        return(success = (y == 0));
        !          1029:     }
        !          1030: #endif /* NOFRILLS */
        !          1031: 
        !          1032:     if (cx == XXCOM) {                 /* COMMENT */
        !          1033:        if ((x = cmtxt("Text of comment line","",&s,NULL)) < 0)
        !          1034:          return(x);
        !          1035:        /* Don't change SUCCESS flag for this one */
        !          1036:        return(0);
        !          1037:     } 
        !          1038: 
        !          1039:     if (cx == XXCON) {                 /* CONNECT */
        !          1040:        if ((x = cmcfm()) < 0)
        !          1041:          return(x);
        !          1042:        return(success = doconect());
        !          1043:     }
        !          1044: 
        !          1045:     if (cx == XXCWD)                   /* CWD */
        !          1046:       return(success = docd());
        !          1047: 
        !          1048:     if (cx == XXCHK)                   /* CHECK */
        !          1049:       return(success = dochk());
        !          1050: 
        !          1051:     if (cx == XXCLO) {                 /* CLOSE */
        !          1052:        x = cmkey(clstab,ncls,"Which log or file to close","",xxstring);
        !          1053:        if (x == -3) {
        !          1054:            printf("?You must say which file or log\n");
        !          1055:            return(-9);
        !          1056:        }
        !          1057:        if (x < 0) return(x);
        !          1058:        if ((y = cmcfm()) < 0) return(y);
        !          1059:        y = doclslog(x);
        !          1060:        success = (y == 1);
        !          1061:        return(success);
        !          1062:     }
        !          1063: 
        !          1064: #ifndef NOSPL
        !          1065:     if (cx == XXDEC || cx == XXINC)    /* DECREMENT, INCREMENT */
        !          1066:       return(doincr(cx));
        !          1067: #endif /* NOSPL */
        !          1068: 
        !          1069: #ifndef NOSPL
        !          1070:     if (cx == XXDEF || cx == XXASS || cx == XXASX || cx == XXDFX)
        !          1071:       return(dodef(cx));               /* DEFINE, ASSIGN */
        !          1072: #endif /* NOSPL */
        !          1073: 
        !          1074: #ifndef NOSPL    
        !          1075:     if (cx == XXDCL) {                 /* DECLARE an array */
        !          1076:        if ((y = cmfld("Array name","",&s,NULL)) < 0) {
        !          1077:            if (y == -3) {
        !          1078:                printf("?Array name required\n");
        !          1079:                return(-9);
        !          1080:            } else return(y);
        !          1081:        }
        !          1082:        if ((y = arraynam(s,&x,&z)) < 0) return(y);
        !          1083:        if ((y = cmcfm()) < 0) return(y);
        !          1084:        if (dclarray((char)x,z) < 0) {
        !          1085:            printf("?Declare failed\n");
        !          1086:            return(success = 0);
        !          1087:        }
        !          1088:        return(success = 1);
        !          1089:     }
        !          1090: #endif /* NOSPL */
        !          1091: 
        !          1092: 
        !          1093: #ifndef NODIAL
        !          1094:     if (cx == XXRED || cx == XXDIAL)   /* DIAL or REDIAL */
        !          1095:       return(dodial(cx));
        !          1096: #endif /* NODIAL */
        !          1097:  
        !          1098: #ifndef NOFRILLS
        !          1099:     if (cx == XXDEL)                   /* DELETE */
        !          1100:       return(dodel());
        !          1101: #endif /* NOFRILLS */
        !          1102: 
        !          1103: #ifndef MAC
        !          1104:     if (cx == XXDIR)                   /* DIRECTORY */
        !          1105:       return(dodir());
        !          1106: #endif /* MAC */
        !          1107:  
        !          1108: #ifndef NOSPL
        !          1109:     if (cx == XXELS)                   /* ELSE */
        !          1110:       return(doelse());
        !          1111: #endif /* NOSPL */
        !          1112: 
        !          1113: #ifndef NOFRILLS
        !          1114:     if (cx == XXENA || cx == XXDIS) {  /* ENABLE, DISABLE */
        !          1115:        s = (cx == XXENA) ?
        !          1116:          "Server function to enable" :
        !          1117:            "Server function to disable";
        !          1118: 
        !          1119:        if ((x = cmkey(enatab,nena,s,"",xxstring)) < 0) {
        !          1120:            if (x == -3) {
        !          1121:                printf("?Name of server function required\n");
        !          1122:                return(-9);
        !          1123:            } else return(x);
        !          1124:        }
        !          1125:        if ((y = cmcfm()) < 0) return(y);
        !          1126:        return(doenable(cx,x));
        !          1127:     }
        !          1128: #endif /* NOFRILLS */
        !          1129: 
        !          1130: #ifndef NOSPL
        !          1131:     if (cx == XXRET) {                 /* RETURN */
        !          1132:        if (cmdlvl == 0) {              /* At top level, nothing happens... */
        !          1133:            if ((x = cmcfm()) < 0)
        !          1134:              return(x);
        !          1135:            return(success = 1);
        !          1136:        } else if (cmdstk[cmdlvl].src == CMD_TF) { /* In TAKE file, like POP */
        !          1137:            if ((x = cmtxt("optional return value","",&s,NULL)) < 0)
        !          1138:              return(x);                /* Allow trailing text, but ignore. */
        !          1139:            if ((x = cmcfm()) < 0)
        !          1140:              return(x);
        !          1141:            popclvl();                  /* pop command level */
        !          1142:            return(success = 1);        /* always succeeds */
        !          1143:        } else if (cmdstk[cmdlvl].src == CMD_MD) { /* Within macro */  
        !          1144:            if ((x = cmtxt("optional return value","",&s,NULL)) < 0)
        !          1145:              return(x);
        !          1146:            return(doreturn(s));        /* Trailing text is return value. */
        !          1147:        } else return(-2);
        !          1148:     }
        !          1149: #endif /* NOSPL */
        !          1150: 
        !          1151: #ifndef NOSPL
        !          1152:     if (cx == XXDO) {                  /* DO (a macro) */
        !          1153:        if (nmac == 0) {
        !          1154:            printf("\n?No macros defined\n");
        !          1155:            return(-2);
        !          1156:        }
        !          1157:        for (y = 0; y < nmac; y++) {    /* copy the macro table */
        !          1158:            mackey[y].kwd = mactab[y].kwd; /* into a regular keyword table */
        !          1159:            mackey[y].kwval = y;        /* with value = pointer to macro tbl */
        !          1160:            mackey[y].flgs = mactab[y].flgs;
        !          1161:        }
        !          1162:        /* parse name as keyword */
        !          1163:        if ((x = cmkey(mackey,nmac,"macro","",xxstring)) < 0) {
        !          1164:            if (x == -3) {
        !          1165:                printf("?Macro name required\n");
        !          1166:                return(-9);
        !          1167:            } else return(x);
        !          1168:        }
        !          1169:        if ((y = cmtxt("optional arguments","",&s,xxstring)) < 0)
        !          1170:          return(y);                    /* get args */
        !          1171:        return(dodo(x,s) < 1 ? (success = 0) : 1);
        !          1172:     }
        !          1173: #endif /* NOSPL */
        !          1174: 
        !          1175:     if (cx == XXECH) {                 /* ECHO */
        !          1176:        if ((x = cmtxt("Material to be echoed","",&s,xxstring)) < 0)
        !          1177:          return(x);
        !          1178:        if (*s == '{') {                /* Strip enclosing braces */
        !          1179:            x = (int)strlen(s);
        !          1180:            if (s[x-1] == '}') {
        !          1181:                s[x-1] = NUL;
        !          1182:                s++;
        !          1183:            }
        !          1184:        }
        !          1185:        printf("%s\n",s);
        !          1186:        return(1);                      /* Always succeeds */
        !          1187:     }
        !          1188: 
        !          1189: #ifndef NOSPL
        !          1190:     if (cx == XXOPE)                   /* OPEN */
        !          1191:       return(doopen());
        !          1192: #endif /* NOSPL */
        !          1193: 
        !          1194: #ifndef NOSPL
        !          1195:     if (cx == XXOUT) {                 /* OUTPUT */
        !          1196:        if ((x = cmtxt("Text to be output","",&s,NULL)) < 0)
        !          1197:          return(x);
        !          1198:        debug(F110,"OUTPUT 1",s,0);
        !          1199:        if (*s == '{') {                /* Strip enclosing braces, */
        !          1200:            x = (int)strlen(s);         /* if any. */
        !          1201:            if (s[x-1] == '}') {
        !          1202:                s[x-1] = NUL;
        !          1203:                s++;
        !          1204:            }
        !          1205:        }
        !          1206:        debug(F110,"OUTPUT 2",s,0);
        !          1207:        for (x = 0, y = 0; s[x]; x++, y++) { /* Convert \B, \L to \\B, \\L */
        !          1208:            if (x > 0 &&
        !          1209:                (s[x] == 'B' || s[x] == 'b' || s[x] == 'L' || s[x] == 'l'))
        !          1210:              if ((x == 1 && s[x-1] == CMDQ) ||
        !          1211:                  (x > 1 && s[x-1] == CMDQ && s[x-2] != CMDQ))
        !          1212:                line[y++] = CMDQ;
        !          1213:            line[y] = s[x];
        !          1214:        }
        !          1215:        line[y++] = '\0';               /* Now expand variables, etc. */
        !          1216:        debug(F110,"OUTPUT 3",line,0);
        !          1217:        s = line+y+1;
        !          1218:        x = LINBUFSIZ - strlen(line) - 1;
        !          1219:        debug(F101,"OUTPUT size","",x);
        !          1220:        if (xxstring(line,&s,&x) < 0)
        !          1221:          return(success = 0);
        !          1222:        s = line+y+1;
        !          1223:        debug(F110,"OUTPUT 4",s,0);
        !          1224:        return(success = dooutput(s));
        !          1225:     }
        !          1226: #endif /* NOSPL */
        !          1227: 
        !          1228: #ifdef SUNX25
        !          1229:     if (cx == XXPAD) {                 /* PAD commands */
        !          1230:        x = cmkey(padtab,npadc,"PAD command","",xxstring);
        !          1231:        if (x == -3) {
        !          1232:            printf("?You must specify a PAD command to execute\n");
        !          1233:            return(-2);
        !          1234:        }
        !          1235:        if (x < 0) return(x);
        !          1236:     
        !          1237:        switch (x) {
        !          1238:          case XYPADL: 
        !          1239:            if (x25stat() < 0)
        !          1240:              printf("Sorry, you must 'set network' & 'set host' first\r\n");
        !          1241:            else {
        !          1242:                x25clear();
        !          1243:                initpad();
        !          1244:            }
        !          1245:            break;
        !          1246:          case XYPADS:
        !          1247:            if (x25stat() < 0)
        !          1248:              printf("Not connected\r\n");
        !          1249:            else {
        !          1250:                extern int linkid, lcn;
        !          1251:                conol("Connected thru ");
        !          1252:                conol(ttname);
        !          1253:                printf(", Link id %d, Logical channel number %d\r\n",
        !          1254:                       linkid,lcn);
        !          1255:            }
        !          1256:            break;
        !          1257:          case XYPADR:
        !          1258:            if (x25stat() < 0)
        !          1259:              printf("Sorry, you must 'set network' & 'set host' first\r\n");
        !          1260:            else
        !          1261:              x25reset(0,0);
        !          1262:            break;
        !          1263:          case XYPADI:
        !          1264:            if (x25stat() < 0)
        !          1265:              printf("Sorry, you must 'set network' & 'set host' first\r\n");
        !          1266:            else 
        !          1267:              x25intr(0);
        !          1268:        }
        !          1269:        return(0);
        !          1270: }
        !          1271: #endif /* SUNX25 */
        !          1272: 
        !          1273: #ifndef NOSPL
        !          1274:     if (cx == XXPAU || cx == XXWAI || cx == XXMSL) /* PAUSE, WAIT, etc */
        !          1275:       return(dopaus(cx));
        !          1276: #endif /* NOSPL */
        !          1277: 
        !          1278: #ifndef NOFRILLS
        !          1279:     if (cx == XXPRI) {
        !          1280:        if ((x = cmifi("File to print","",&s,&y,xxstring)) < 0) {
        !          1281:            if (x == -3) {
        !          1282:                printf("?A file specification is required\n");
        !          1283:                return(-9);
        !          1284:            } else return(x);
        !          1285:        }
        !          1286:        if (y != 0) {
        !          1287:            printf("?Wildcards not allowed\n");
        !          1288:            return(-9);
        !          1289:        }
        !          1290:        strcpy(line,s);
        !          1291:        if ((x = cmtxt("Local print command options, or carriage return","",&s,
        !          1292:                       xxstring)) < 0) return(x);
        !          1293:        return(success = (zprint(s,line) == 0) ? 1 : 0);
        !          1294:     }
        !          1295: 
        !          1296: #ifdef TCPSOCKET
        !          1297:     if (cx == XXPNG)                   /* PING an IP host */
        !          1298:       return(doping());
        !          1299: #endif /* TCPSOCKET */
        !          1300: 
        !          1301: #ifndef MAC
        !          1302:     if (cx == XXPWD) {                 /* PWD */
        !          1303:        if ((x = cmcfm()) < 0) return(x);
        !          1304:        xsystem(PWDCMD);
        !          1305:        return(success = 1);            /* blind faith */
        !          1306:     }
        !          1307: #endif /* MAC */
        !          1308: #endif /* NOFRILLS */
        !          1309: 
        !          1310:     if (cx == XXQUI || cx == XXEXI) {  /* EXIT, QUIT */
        !          1311:        if ((y = cmnum("exit status code","",10,&x,xxstring)) < 0) {
        !          1312:            if (y == -3)
        !          1313:              x = xitsta;
        !          1314:            else return(y);
        !          1315:        }
        !          1316:        if ((y = cmcfm()) < 0) return(y);
        !          1317: #ifdef VMS
        !          1318:        doexit(GOOD_EXIT,x);
        !          1319: #else
        !          1320: #ifdef OSK
        !          1321: /* Returning any codes here makes the OS-9 shell print an error message. */
        !          1322:        doexit(GOOD_EXIT,-1);
        !          1323: #else
        !          1324: #ifdef datageneral
        !          1325:         doexit(GOOD_EXIT,x);
        !          1326: #else
        !          1327:        doexit(x,-1);
        !          1328: #endif /* datageneral */
        !          1329: #endif /* OSK */
        !          1330: #endif /* VMS */
        !          1331:     }
        !          1332: 
        !          1333: #ifndef NOFRILLS
        !          1334:     if (cx == XXERR) {                 /* ERROR */
        !          1335:        if ((x = cmcfm()) < 0) return(x);
        !          1336:        ttflui();
        !          1337:        sstate = 'a';
        !          1338:        return(0);
        !          1339:     }
        !          1340: #endif /* NOFRILLS */
        !          1341: 
        !          1342:     if (cx == XXFIN) {                 /* FINISH */
        !          1343:        if ((x = cmcfm()) < 0) return(x);
        !          1344:        sstate = setgen('F',"","","");
        !          1345:        if (local) ttflui();            /* If local, flush tty input buffer */
        !          1346:        return(0);
        !          1347:     }
        !          1348: 
        !          1349: #ifndef NOSPL
        !          1350:     if (cx == XXFOR)                   /* FOR loop */
        !          1351:       return(dofor());
        !          1352: #endif /* NOSPL */
        !          1353: 
        !          1354:     if (cx == XXGET) {                 /* GET */
        !          1355:        x = cmtxt("Name of remote file(s), or carriage return","",&cmarg,
        !          1356:                  xxstring);
        !          1357: #ifndef NOFRILLS
        !          1358:        if ((x == -2) || (x == -1)) return(x);
        !          1359: #else
        !          1360:        if (x < 0) return(x);
        !          1361: #endif /* NOFRILLS */
        !          1362:        if (*cmarg == '{') {            /* Strip any enclosing braces */
        !          1363:            x = (int)strlen(cmarg);     /* This allows preservation of */
        !          1364:            if (cmarg[x-1] == '}') {    /* leading and/or trailing */
        !          1365:                cmarg[x-1] = NUL;       /* spaces. */
        !          1366:                cmarg++;
        !          1367:            }
        !          1368:        }
        !          1369:        x = doget();
        !          1370: #ifdef MAC
        !          1371:        if (sstate == 'r')
        !          1372:            scrcreate();
        !          1373: #endif /* MAC */
        !          1374:        return(x);
        !          1375:     }
        !          1376: 
        !          1377: #ifndef NOSPL
        !          1378: #ifndef NOFRILLS
        !          1379:     if (cx == XXGOK) {                 /* GETOK */
        !          1380:        return(success = doask(cx));
        !          1381:     }
        !          1382: #endif /* NOFRILLS */
        !          1383: #endif /* NOSPL */
        !          1384: 
        !          1385:     if (cx == XXHLP) {                 /* HELP */
        !          1386: #ifdef NOHELP
        !          1387:        return(dohlp(XXHLP));        
        !          1388: #else
        !          1389:        x = cmkey2(cmdtab,ncmd,"C-Kermit command","help",toktab,xxstring);
        !          1390:        debug(F101,"HELP command x","",x);
        !          1391:        if (x == -5) {
        !          1392:            y = chktok(toktab);
        !          1393:            debug(F101,"top-level cmkey token","",y);
        !          1394:            ungword();
        !          1395:            switch (y) {
        !          1396: #ifndef NOPUSH
        !          1397:              case '!': x = XXSHE; break;
        !          1398: #endif /* NOPUSH */
        !          1399:              case '#': x = XXCOM; break;
        !          1400:              case ';': x = XXCOM; break;
        !          1401: #ifndef NOSPL
        !          1402:              case ':': x = XXLBL; break;
        !          1403: #endif /* NOSPL */
        !          1404:              case '&': x = XXECH; break;
        !          1405:              default:
        !          1406:                printf("\n?Invalid - %s\n",cmdbuf);
        !          1407:                x = -2;
        !          1408:            }
        !          1409:        }
        !          1410:        return(dohlp(x));
        !          1411: #endif /* NOHELP */
        !          1412:     }
        !          1413:  
        !          1414: #ifndef NOHELP
        !          1415:     if (cx == XXINT)                   /* INTRO */
        !          1416:       return(hmsga(introtxt));
        !          1417: #endif /* NOHELP */
        !          1418: 
        !          1419:     if (cx == XXHAN) {                 /* HANGUP */
        !          1420:        if ((x = cmcfm()) < 0) return(x);
        !          1421: #ifndef NODIAL
        !          1422:        if ((x = mdmhup()) < 1)
        !          1423: #endif /* NODIAL */
        !          1424:          x = (tthang() > -1);
        !          1425:        return(success = x);
        !          1426:     }
        !          1427: 
        !          1428: #ifndef NOSPL
        !          1429:     if (cx == XXGOTO) {                        /* GOTO */
        !          1430: /* Note, here we don't set SUCCESS/FAILURE flag */
        !          1431:        if ((y = cmfld("label","",&s,xxstring)) < 0) {
        !          1432:            if (y == -3) {
        !          1433:                printf("?Label name required\n");
        !          1434:                return(-9);
        !          1435:            } else return(y);
        !          1436:        }
        !          1437:        strcpy(lblbuf,s);
        !          1438:        if ((x = cmcfm()) < 0) return(x);
        !          1439:        s = lblbuf;
        !          1440:        return(dogoto(s));
        !          1441:     }
        !          1442: #endif /* NOSPL */
        !          1443: 
        !          1444: #ifndef NOSPL
        !          1445: /* IF, Extended IF, WHILE */
        !          1446:     if (cx == XXIF || cx == XXIFX || cx == XXWHI) {
        !          1447:        return(doif(cx));
        !          1448:     }
        !          1449: #endif /* NOSPL */
        !          1450: 
        !          1451: #ifndef NOSPL
        !          1452:     if (cx == XXINP || cx == XXREI) {  /* INPUT and REINPUT */
        !          1453:        y = cmnum("seconds to wait for input","1",10,&x,xxstring);
        !          1454:        if (y < 0) {
        !          1455:            return(y);
        !          1456:        }
        !          1457:        if (x <= 0) x = 1;
        !          1458:        if ((y = cmtxt("Material to be input","",&s,xxstring)) < 0)
        !          1459:          return(y);
        !          1460: #ifdef COMMENT
        !          1461: /*
        !          1462:   Now it's ok -- null argument means wait for any character.
        !          1463: */
        !          1464:        if (*s == '\0') {
        !          1465:            printf("?Text required\n");
        !          1466:            return(-9);
        !          1467:        }
        !          1468: #endif /* COMMENT */
        !          1469:        if (*s == '{') {
        !          1470:            y = (int)strlen(s);
        !          1471:            if (s[y-1] == '}') {
        !          1472:                s[y-1] = NUL;
        !          1473:                s++;
        !          1474:            }
        !          1475:        }
        !          1476:        if (cx == XXINP) {              /* INPUT */
        !          1477:            debug(F110,"calling doinput",s,0);
        !          1478:            success = doinput(x,s);     /* Go try to input the search string */
        !          1479:        } else {                        /* REINPUT */
        !          1480:            debug(F110,"xxrei line",s,0);
        !          1481:            success = doreinp(x,s);
        !          1482:        }
        !          1483:        if (intime && !success) {       /* TIMEOUT-ACTION = QUIT? */
        !          1484:            popclvl();                  /* If so, pop command level. */
        !          1485:            if (pflag && cmdlvl == 0) {
        !          1486:                if (cx == XXINP) printf("?Input timed out\n");
        !          1487:                if (cx == XXREI) printf("?Reinput failed\n");
        !          1488:            }
        !          1489:        }
        !          1490:        return(success);                /* Return do(re)input's return code */
        !          1491:     }
        !          1492: #endif /* NOSPL */
        !          1493: 
        !          1494: #ifndef NOSPL
        !          1495:     if (cx == XXLBL) {                 /* LABEL */
        !          1496:        if ((x = cmfld("label","",&s,xxstring)) < 0) {
        !          1497:            if (x == -3) {
        !          1498:                printf("?Label name required\n");
        !          1499:                return(-9);
        !          1500:            } else return(x);
        !          1501:        }
        !          1502:        if ((x = cmcfm()) < 0) return(x);
        !          1503:        return(0);
        !          1504:     }
        !          1505: #endif /* NOSPL */
        !          1506: 
        !          1507:     if (cx == XXLOG) {                 /* LOG */
        !          1508:        x = cmkey(logtab,nlog,"What to log","",xxstring);
        !          1509:        if (x == -3) {
        !          1510:            printf("?Type of log required\n");
        !          1511:            return(-9);
        !          1512:        }
        !          1513:        if (x < 0) return(x);
        !          1514:        x = dolog(x);
        !          1515:        if (x < 0)
        !          1516:          return(x);
        !          1517:        else
        !          1518:          return(success = x);
        !          1519:     }
        !          1520:  
        !          1521: #ifndef NOSCRIPT
        !          1522:     if (cx == XXLOGI) {                        /* UUCP-style script */
        !          1523:        if ((x = cmtxt("expect-send expect-send ...","",&s,xxstring)) < 0)
        !          1524:          return(x);
        !          1525: #ifdef VMS
        !          1526:        conres();                       /* For Ctrl-C to work... */
        !          1527: #endif /* VMS */
        !          1528:        return(success = dologin(s));   /* Return 1=completed, 0=failed */
        !          1529:     }
        !          1530: #endif /* NOSCRIPT */
        !          1531:  
        !          1532:     if (cx == XXREC) {                 /* RECEIVE */
        !          1533:        cmarg2 = "";
        !          1534:        x = cmofi("Name under which to store the file, or CR","",&s,
        !          1535:                  xxstring);
        !          1536:        if ((x == -1) || (x == -2)) return(x);
        !          1537:        if ((x = cmcfm()) < 0) return(x);
        !          1538:        strcpy(line,s);
        !          1539:        cmarg2 = line;
        !          1540:        debug(F111,"cmofi cmarg2",cmarg2,x);
        !          1541:        sstate = 'v';
        !          1542: #ifdef MAC
        !          1543:        scrcreate();
        !          1544: #endif /* MAC */
        !          1545:        if (local) displa = 1;
        !          1546:        return(0);
        !          1547:     }
        !          1548:  
        !          1549:     if (cx == XXREM) {                 /* REMOTE */
        !          1550:        x = cmkey(remcmd,nrmt,"Remote Kermit server command","",xxstring);
        !          1551:        if (x == -3) {
        !          1552:            printf("?You must specify a command for the remote server\n");
        !          1553:            return(-9);
        !          1554:        }
        !          1555:        return(dormt(x));
        !          1556:     }
        !          1557: 
        !          1558: #ifndef NOFRILLS
        !          1559:     if (cx == XXREN)                   /* RENAME */
        !          1560:       return(dorenam());
        !          1561: #endif /* NOFRILLS */
        !          1562: 
        !          1563:     if (cx == XXSEN || cx == XXMAI) {  /* SEND, MAIL */
        !          1564:        cmarg = cmarg2 = "";
        !          1565:        if ((x = cmifi("File(s) to send","",&s,&y,xxstring)) < 0) {
        !          1566:            if (x == -3) {
        !          1567:                printf("?A file specification is required\n");
        !          1568:                return(-9);
        !          1569:            } else return(x);
        !          1570:        }
        !          1571:        nfils = -1;                     /* Files come from internal list. */
        !          1572:        strcpy(line,s);                 /* Save copy of string just parsed. */
        !          1573:        strncpy(fspec,s,FSPECL);        /* and here for \v(filespec) */
        !          1574:        if (cx == XXSEN) {              /* SEND command */
        !          1575:            debug(F101,"Send: wild","",y);
        !          1576:            if (y == 0) {
        !          1577:                if ((x = cmtxt("Name to send it with","",&cmarg2,
        !          1578:                               xxstring)) < 0)
        !          1579:                  return(x);
        !          1580:            } else {
        !          1581:                if ((x = cmcfm()) < 0) return(x);
        !          1582:            }
        !          1583:            cmarg = line;               /* File to send */
        !          1584:            debug(F110,"Sending:",cmarg,0);
        !          1585:            if (*cmarg2 != '\0') debug(F110," as:",cmarg2,0);
        !          1586:        } else {                        /* MAIL */
        !          1587: #ifndef NOFRILLS
        !          1588:            if (!atdiso || !atcapr) {   /* Disposition attribute off? */
        !          1589:                printf("?Disposition Attribute is Off\n");
        !          1590:                return(-2);
        !          1591:            }
        !          1592:            debug(F101,"Mail: wild","",y);
        !          1593:            *optbuf = NUL;              /* Wipe out any old options */
        !          1594:            if ((x = cmtxt("Address to mail to","",&s,xxstring)) < 0)
        !          1595:              return(x);
        !          1596:            if ((int)strlen(s) == 0) {
        !          1597:                printf("?Address required\n");
        !          1598:                return(-9);
        !          1599:            }
        !          1600:            strcpy(optbuf,s);
        !          1601:            if ((int)strlen(optbuf) > 94) { /* Ensure legal size */
        !          1602:                printf("?Option string too long\n");
        !          1603:                return(-2);
        !          1604:            }
        !          1605:            cmarg = line;               /* File to send */
        !          1606:            debug(F110,"Mailing:",cmarg,0);
        !          1607:            debug(F110,"To:",optbuf,0);
        !          1608:            rmailf = 1;                 /* MAIL modifier flag for SEND */
        !          1609: #else
        !          1610:            printf("?Sorry, MAIL feature not configured.\n");
        !          1611:            return(-2);
        !          1612: #endif /* NOFRILLS */
        !          1613:        }
        !          1614:        sstate = 's';                   /* Set start state to SEND */
        !          1615: #ifdef MAC
        !          1616:        scrcreate();
        !          1617: #endif /* MAC */
        !          1618:        if (local) {                    /* If in local mode, */
        !          1619:            displa = 1;                 /* turn on file transfer display */
        !          1620: #ifdef COMMENT
        !          1621: /* Redundant -- this is done later in sipkt() */
        !          1622:            ttflui();                   /* and flush tty input buffer. */
        !          1623: #endif /* COMMENT */
        !          1624:        }
        !          1625:        return(0);
        !          1626:     }
        !          1627:  
        !          1628: #ifndef NOMSEND
        !          1629:     if (cx == XXMSE) {                 /* MSEND command */
        !          1630:        nfils = 0;                      /* Like getting a list of */
        !          1631:        lp = line;                      /* files on the command line */
        !          1632:        while (1) {
        !          1633:            char *p;
        !          1634:            if ((x = cmifi("Names of files to send, separated by spaces","",
        !          1635:                           &s,&y,xxstring)) < 0) {
        !          1636:                if (x == -3) {
        !          1637:                    if (nfils <= 0) {
        !          1638:                        printf("?A file specification is required\n");
        !          1639:                        return(-9);
        !          1640:                    } else break;
        !          1641:                }
        !          1642:                return(x);
        !          1643:            }
        !          1644:            msfiles[nfils++] = lp;      /* Got one, count it, point to it, */
        !          1645:            p = lp;                     /* remember pointer, */
        !          1646:            while (*lp++ = *s++) ;      /* and copy it into buffer */
        !          1647:            debug(F111,"msfiles",msfiles[nfils-1],nfils-1);
        !          1648:            if (nfils == 1) *fspec = NUL; /* Take care of \v(filespec) */
        !          1649:            if (((int)strlen(fspec) + (int)strlen(p) + 1) < FSPECL) {
        !          1650:                strcat(fspec,p);
        !          1651:                strcat(fspec," ");
        !          1652:            }
        !          1653:        }
        !          1654:        cmlist = msfiles;               /* Point cmlist to pointer array */
        !          1655:        cmarg2 = "";                    /* No internal expansion list (yet) */
        !          1656:        sndsrc = nfils;                 /* Filenames come from cmlist */
        !          1657:        sstate = 's';                   /* Set start state to SEND */
        !          1658: #ifdef MAC
        !          1659:        scrcreate();
        !          1660: #endif /* MAC */
        !          1661:        if (local) {                    /* If in local mode, */
        !          1662:            displa = 1;                 /* turn on file transfer display */
        !          1663:            ttflui();                   /* and flush tty input buffer. */
        !          1664:        }
        !          1665:        return(0);
        !          1666:     }
        !          1667: #endif /* NOMSEND */
        !          1668: 
        !          1669: #ifndef NOSERVER
        !          1670:     if (cx == XXSER) {                 /* SERVER */
        !          1671:        if ((x = cmcfm()) < 0) return(x);
        !          1672:        sstate = 'x';
        !          1673: #ifdef MAC
        !          1674:        scrcreate();
        !          1675: #endif /* MAC */
        !          1676:        if (local) displa = 1;
        !          1677: #ifdef AMIGA
        !          1678:        reqoff();                       /* No DOS requestors while server */
        !          1679: #endif /* AMIGA */
        !          1680:     return(0);
        !          1681:     }
        !          1682: #endif /* NOSERVER */
        !          1683: 
        !          1684:     if (cx == XXSET) {                 /* SET command */
        !          1685:        x = cmkey(prmtab,nprm,"Parameter","",xxstring);
        !          1686:        if (x == -3) {
        !          1687:            printf("?You must specify a parameter to set\n");
        !          1688:            return(-9);
        !          1689:        }
        !          1690:        if (x < 0) return(x);
        !          1691:        /* have to set success separately for each item in doprm()... */
        !          1692:        /* actually not really, could have just had doprm return 0 or 1 */
        !          1693:        /* and set success here... */
        !          1694:        y = doprm(x,0);
        !          1695:        if (y == -3) {
        !          1696:            printf("?More fields required\n");
        !          1697:            return(-9);
        !          1698:        } else return(y);
        !          1699:     }
        !          1700: 
        !          1701: #ifndef NOPUSH
        !          1702:     if (cx == XXSHE) {                 /* SHELL (system) command */
        !          1703:        if (cmtxt("System command to execute","",&s,xxstring) < 0)
        !          1704:          return(-1);
        !          1705:        conres();                       /* Make console normal  */
        !          1706:        x = zshcmd(s);
        !          1707:        concb((char)escape);
        !          1708:        return(success = x);
        !          1709:     }
        !          1710: #endif /* NOPUSH */
        !          1711: 
        !          1712: #ifndef NOSHOW
        !          1713:     if (cx == XXSHO) {                 /* SHOW */
        !          1714:        x = cmkey(shotab,nsho,"","parameters",xxstring);
        !          1715:        if (x < 0) return(x);
        !          1716:        return(doshow(x));
        !          1717:     }
        !          1718: #endif /* NOSHOW */
        !          1719:  
        !          1720: #ifndef MAC
        !          1721:     if (cx == XXSPA) {                 /* SPACE */
        !          1722: #ifdef datageneral
        !          1723:        /* AOS/VS can take an argument after its "space" command. */
        !          1724:        if ((x = cmtxt("Confirm, or local directory name","",&s,xxstring)) < 0)
        !          1725:          return(x);
        !          1726:        if (*s == NUL) xsystem(SPACMD);
        !          1727:        else {
        !          1728:            sprintf(line,"space %s",s);
        !          1729:            xsystem(line);
        !          1730:        }
        !          1731: #else
        !          1732: #ifdef OS2
        !          1733:        if ((x = cmtxt("Press Enter for current disk,\n\
        !          1734:  or specify a disk letter like A:","",&s,xxstring)) < 0)
        !          1735:          return(x);
        !          1736:        if (*s == NUL) {                /* Current disk */
        !          1737:            printf(" Free space: %ldK\n", zdskspace(0)/1024L);
        !          1738:        } else {
        !          1739:            int drive = toupper(*s);
        !          1740:            printf(" Drive %c: %ldK free\n", drive, 
        !          1741:                   zdskspace(drive - 'A' + 1) / 1024L);
        !          1742:        }
        !          1743: #else
        !          1744: #ifdef UNIX
        !          1745: #ifdef COMMENT
        !          1746:        if ((x = cmtxt("Confirm for current disk,\n\
        !          1747:  or specify a disk device or directory","",&s,xxstring)) < 0)
        !          1748:          return(x);
        !          1749: #else
        !          1750:        x = cmdir("Confirm for current disk,\n\
        !          1751:  or specify a disk device or directory","",&s,xxstring);
        !          1752:        if (x == -3)
        !          1753:          s = "";
        !          1754:        else if (x < 0)
        !          1755:          return(x);
        !          1756:        if ((x = cmcfm()) < 0) return(x);
        !          1757: #endif /* COMMENT */
        !          1758:        if (*s == NUL) {                /* Current disk */
        !          1759:            xsystem(SPACMD);
        !          1760:        } else {                        /* Specified disk */
        !          1761:            sprintf(line,"%s %s",SPACM2,s);
        !          1762:            xsystem(line);
        !          1763:        }
        !          1764: #else
        !          1765:        if ((x = cmcfm()) < 0) return(x);
        !          1766:        xsystem(SPACMD);
        !          1767: #endif /* UNIX */
        !          1768: #endif /* OS2 */
        !          1769: #endif /* datageneral */
        !          1770:        return(success = 1);            /* Pretend it worked */
        !          1771:     }
        !          1772: #endif /* MAC */
        !          1773:  
        !          1774:     if (cx == XXSTA) {                 /* STATISTICS */
        !          1775:        if ((x = cmcfm()) < 0) return(x);
        !          1776:        return(success = dostat());
        !          1777:     }
        !          1778: 
        !          1779:     if (cx == XXSTO || cx == XXEND) {  /* STOP, END, or POP */
        !          1780:        if ((y = cmnum("exit status code","0",10,&x,xxstring)) < 0)
        !          1781:          return(y);
        !          1782:        if ((y = cmtxt("Message to print","",&s,xxstring)) < 0)
        !          1783:          return(y);
        !          1784:        if (*s == '{') {                /* Strip any enclosing braces */
        !          1785:            x = (int)strlen(s);
        !          1786:            if (s[x-1] == '}') {
        !          1787:                s[x-1] = NUL;
        !          1788:                s++;
        !          1789:            }
        !          1790:        }
        !          1791:        if (*s) printf("%s\n",s);
        !          1792:        if (cx == XXSTO) dostop(); else popclvl(); 
        !          1793:        return(success = (x == 0));
        !          1794:     }
        !          1795: 
        !          1796:     if (cx == XXSUS) {                 /* SUSPEND */
        !          1797:        if ((y = cmcfm()) < 0) return(y);
        !          1798: #ifdef NOJC
        !          1799:        printf("Sorry, this version of Kermit cannot be suspended\n");
        !          1800: #else
        !          1801:        stptrap(0);
        !          1802: #endif /* NOJC */
        !          1803:        return(0);
        !          1804:     }
        !          1805: 
        !          1806:     if (cx == XXTAK) {                 /* TAKE */
        !          1807:        if (tlevel > MAXTAKE-1) {
        !          1808:            printf("?Take files nested too deeply\n");
        !          1809:            return(-2);
        !          1810:        }
        !          1811:        if ((y = cmifi("C-Kermit command file","",&s,&x,xxstring)) < 0) { 
        !          1812:            if (y == -3) {
        !          1813:                printf("?A file name is required\n");
        !          1814:                return(-9);
        !          1815:            } else return(y);
        !          1816:        }
        !          1817:        if (x != 0) {
        !          1818:            printf("?Wildcards not allowed in command file name\n");
        !          1819:            return(-9);
        !          1820:        }
        !          1821:        strcpy(line,s);
        !          1822:        if ((y = cmcfm()) < 0) return(y);
        !          1823:        return(success = dotake(line));
        !          1824:     }
        !          1825:  
        !          1826: #ifdef NETCONN
        !          1827:     if (cx == XXTEL) {                 /* TELNET */
        !          1828:        if ((y = setlin(XYHOST,0)) < 0) return(y);
        !          1829:        return (success = (y == 0) ? 0 : doconect());
        !          1830:     }
        !          1831: #endif /* NETCONN */
        !          1832: 
        !          1833: #ifndef NOXMIT
        !          1834:     if (cx == XXTRA) {                 /* TRANSMIT */
        !          1835:        if ((x = cmifi("File to transmit","",&s,&y,xxstring)) < 0) {
        !          1836:            if (x == -3) {
        !          1837:                printf("?Name of an existing file\n");
        !          1838:                return(-9);
        !          1839:            } else return(x);
        !          1840:        }
        !          1841:        if (y != 0) {
        !          1842:            printf("?Only a single file may be transmitted\n");
        !          1843:            return(-2);
        !          1844:        }
        !          1845:        strcpy(line,s);                 /* Save copy of string just parsed. */
        !          1846:        if ((y = cmcfm()) < 0) return(y); /* Confirm the command */
        !          1847:        debug(F111,"calling transmit",line,xmitp);
        !          1848:        return(success = transmit(line,(char)xmitp)); /* Do the command */
        !          1849:     }
        !          1850: #endif /* NOXMIT */
        !          1851: 
        !          1852: #ifndef NOFRILLS
        !          1853:     if (cx == XXTYP) {                 /* TYPE */
        !          1854: #ifndef MAC
        !          1855:        char *tc;
        !          1856: #endif /* MAC */
        !          1857:        if ((x = cmifi("File to type","",&s,&y,xxstring)) < 0) {
        !          1858:            if (x == -3) {
        !          1859:                printf("?Name of an existing file\n");
        !          1860:                return(-9);
        !          1861:            } else return(x);
        !          1862:        }
        !          1863:        if (y != 0) {
        !          1864:            printf("?A single file please\n");
        !          1865:            return(-2);
        !          1866:        }
        !          1867: #ifndef MAC
        !          1868:        if (!(tc = getenv("CK_TYPE"))) tc = TYPCMD;
        !          1869:        sprintf(line,"%s %s",tc,s);
        !          1870:        if ((y = cmcfm()) < 0) return(y); /* Confirm the command */
        !          1871:        xsystem(line);
        !          1872:        return(success = 1);
        !          1873: #else
        !          1874:        strcpy(line,s);
        !          1875:        if ((y = cmcfm()) < 0) return(y); /* Confirm the command */
        !          1876:        return(success = dotype(line));
        !          1877: #endif /* MAC */
        !          1878:     }
        !          1879: #endif /* NOFRILLS */
        !          1880: 
        !          1881: #ifndef NOFRILLS
        !          1882:     if (cx == XXTES) {                 /* TEST */
        !          1883:        /* Fill this in with whatever is being tested... */
        !          1884:        if ((y = cmcfm()) < 0) return(y); /* Confirm the command */
        !          1885: 
        !          1886: #ifndef NOSPL
        !          1887: #ifdef COMMENT
        !          1888:        { int d, i, j;                  /* Dump all arrays */
        !          1889:          char c, **p;
        !          1890:          for (i = 0; i < 27; i++) {
        !          1891:              p = a_ptr[i];
        !          1892:              d = a_dim[i];
        !          1893:              c = (i == 0) ? 64 : i + 96;
        !          1894:              if (d && p) {
        !          1895:                  fprintf(stderr,"&%c[%d]\n",c,d);
        !          1896:                  for (j = 0; j <= d; j++) {
        !          1897:                      if (p[j]) {
        !          1898:                          fprintf(stderr,"  &%c[%2d] = [%s]\n",c,j,p[j]);
        !          1899:                      }
        !          1900:                  }       
        !          1901:              }
        !          1902:          }
        !          1903:       }
        !          1904: #else /* Not COMMENT */
        !          1905:        printf("cmdlvl = %d, tlevel = %d, maclvl = %d\n",cmdlvl,tlevel,maclvl);
        !          1906:        if (maclvl < 0) {
        !          1907:            printf("%s\n",
        !          1908:             "Call me from inside a macro and I'll dump the argument stack");
        !          1909:            return(0);
        !          1910:        }
        !          1911:        printf("Macro level: %d, ARGC = %d\n     ",maclvl,macargc[maclvl]);
        !          1912:        for (y = 0; y < 10; y++) printf("%7d",y);
        !          1913:        for (x = 0; x <= maclvl; x++) {
        !          1914:            printf("\n%2d:  ",x);
        !          1915:            for (y = 0; y < 10; y++) {
        !          1916:                s = m_arg[x][y];
        !          1917:                printf("%7s",s ? s : "(none)");
        !          1918:            }
        !          1919:        }
        !          1920:        printf("\n");
        !          1921: #endif /* COMMENT */
        !          1922: #endif /* NOSPL */
        !          1923:        return(0);
        !          1924:     }
        !          1925: #endif /* NOFRILLS */
        !          1926: 
        !          1927: #ifndef NOCSETS
        !          1928:     if (cx == XXXLA) {    /* TRANSLATE <ifn> from-cs to-cs <ofn> */
        !          1929:        int incs, outcs;
        !          1930:        if ((x = cmifi("File to translate","",&s,&y,xxstring)) < 0) {
        !          1931:            if (x == -3) {
        !          1932:                printf("?Name of an existing file\n");
        !          1933:                return(-9);
        !          1934:            } else return(x);
        !          1935:        }
        !          1936:        if (y != 0) {
        !          1937:            printf("?A single file please\n");
        !          1938:            return(-2);
        !          1939:        }
        !          1940:        strcpy(line,s);                 /* Save copy of string just parsed. */
        !          1941: 
        !          1942:        if ((incs = cmkey(fcstab,nfilc,"from character-set","",xxstring)) < 0)
        !          1943:          return(incs);
        !          1944:        if ((outcs = cmkey(fcstab,nfilc,"to character-set","",xxstring)) < 0)
        !          1945:          return(outcs);
        !          1946:        if ((x = cmofi("output file",CTTNAM,&s,xxstring)) < 0) return(x);
        !          1947:        strncpy(tmpbuf,s,50);
        !          1948:        if ((y = cmcfm()) < 0) return(y); /* Confirm the command */
        !          1949:        return(success = xlate(line,tmpbuf,incs,outcs)); /* Execute it */
        !          1950:     }
        !          1951: #endif /* NOCSETS */
        !          1952: 
        !          1953:     if (cx == XXVER) {                 /* VERSION */
        !          1954:        if ((y = cmcfm()) < 0) return(y);
        !          1955:        printf("%s,%s\n Numeric: %ld",versio,ckxsys,vernum);
        !          1956:        if (verwho) printf("-%d\n",verwho); else printf("\n");
        !          1957:        return(success = 1);
        !          1958:     }
        !          1959: 
        !          1960: #ifndef MAC
        !          1961: #ifndef NOFRILLS
        !          1962:     if (cx == XXWHO) {                 /* WHO */
        !          1963:        char *wc;
        !          1964: #ifdef datageneral
        !          1965:         xsystem(WHOCMD);
        !          1966: #else
        !          1967:        if ((y = cmtxt("user name","",&s,xxstring)) < 0) return(y);
        !          1968:        if (!(wc = getenv("CK_WHO"))) wc = WHOCMD;
        !          1969:        sprintf(line,"%s %s",wc,s);
        !          1970:        xsystem(line);
        !          1971: #endif /* datageneral */
        !          1972:        return(success = 1);
        !          1973:     }
        !          1974: #endif /* NOFRILLS */
        !          1975: #endif /* MAC */
        !          1976: 
        !          1977: #ifndef NOFRILLS
        !          1978:     if (cx == XXWRI) {                 /* WRITE */
        !          1979:        if ((x = cmkey(writab,nwri,"to file or log","",xxstring)) < 0) {
        !          1980:            if (x == -3) printf("?Write to what?\n");
        !          1981:            return(x);
        !          1982:        }
        !          1983:        if ((y = cmtxt("text","",&s,xxstring)) < 0) return(y);
        !          1984:        if (*s == '{') {                /* Strip enclosing braces */
        !          1985:            y = (int)strlen(s);
        !          1986:            if (s[y-1] == '}') {
        !          1987:                s[y-1] = NUL;
        !          1988:                s++;
        !          1989:            }
        !          1990:        }
        !          1991:        switch (x) {
        !          1992:          case LOGD: y = ZDFILE; break;
        !          1993:          case LOGP: y = ZPFILE; break;
        !          1994:          case LOGS: y = ZSFILE; break;
        !          1995:          case LOGT: y = ZTFILE; break;
        !          1996: #ifndef NOSPL
        !          1997:          case LOGW: y = ZWFILE; break;
        !          1998: #endif /* NOSPL */
        !          1999:          case LOGX:
        !          2000:          case LOGE:
        !          2001: 
        !          2002: #ifndef MAC
        !          2003:            if (x == LOGE) fprintf(stderr,"%s",s);
        !          2004:            else
        !          2005: #endif /* MAC */
        !          2006:              printf("%s",s);
        !          2007:            if (
        !          2008: #ifndef NOSPL
        !          2009:                cmdlvl == 0
        !          2010: #else
        !          2011:                tlevel == -1
        !          2012: #endif /* NOSPL */
        !          2013:                )
        !          2014: #ifndef MAC
        !          2015:              if (x == LOGE) fprintf(stderr,"\n");
        !          2016:              else
        !          2017: #endif /* MAC */
        !          2018:                printf("\n");
        !          2019:            return(success = 1);
        !          2020:          default: return(-2);
        !          2021:        }
        !          2022:        if ((x = zsout(y,s)) < 0)
        !          2023:          printf("?File or log not open\n");
        !          2024:        return(success = (x == 0) ? 1 : 0);
        !          2025:     }
        !          2026: #endif /* NOFRILLS */
        !          2027: 
        !          2028:     debug(F101,"docmd unk arg","",cx);
        !          2029:     return(-2);                                /* None of the above. */
        !          2030: } /* end of docmnd() */
        !          2031: 
        !          2032: #endif /* NOICP */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.