|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.