|
|
1.1 ! root 1: char *userv = "User Interface 4C(052), 2 Aug 85"; ! 2: ! 3: /* C K U U S R -- "User Interface" for Unix Kermit (Part 1) */ ! 4: ! 5: /* ! 6: Author: Frank da Cruz (SY.FDC@CU20B), ! 7: Columbia University Center for Computing Activities, January 1985. ! 8: Copyright (C) 1985, Trustees of Columbia University in the City of New York. ! 9: Permission is granted to any individual or institution to use, copy, or ! 10: redistribute this software so long as it is not sold for profit, provided this ! 11: copyright notice is retained. ! 12: */ ! 13: ! 14: /* ! 15: The ckuser module contains the terminal input and output functions for Unix ! 16: Kermit. It includes a simple Unix-style command line parser as well as ! 17: an interactive prompting keyword command parser. It depends on the existence ! 18: of Unix facilities like fopen, fgets, feof, (f)printf, argv/argc, etc. Other ! 19: functions that are likely to vary among Unix implementations -- like setting ! 20: terminal modes or interrupts -- are invoked via calls to functions that are ! 21: defined in the system-dependent modules, ck?[ft]io.c. ! 22: ! 23: The command line parser processes any arguments found on the command line, ! 24: as passed to main() via argv/argc. The interactive parser uses the facilities ! 25: of the cmd package (developed for this program, but usable by any program). ! 26: ! 27: Any command parser may be substituted for this one. The only requirements ! 28: for the Kermit command parser are these: ! 29: ! 30: 1. Set parameters via global variables like duplex, speed, ttname, etc. ! 31: See ckmain.c for the declarations and descriptions of these variables. ! 32: ! 33: 2. If a command can be executed without the use of Kermit protocol, then ! 34: execute the command directly and set the variable sstate to 0. Examples ! 35: include 'set' commands, local directory listings, the 'connect' command. ! 36: ! 37: 3. If a command requires the Kermit protocol, set the following variables: ! 38: ! 39: sstate string data ! 40: 'x' (enter server mode) (none) ! 41: 'r' (send a 'get' command) cmarg, cmarg2 ! 42: 'v' (enter receive mode) cmarg2 ! 43: 'g' (send a generic command) cmarg ! 44: 's' (send files) nfils, cmarg & cmarg2 OR cmlist ! 45: 'c' (send a remote host command) cmarg ! 46: ! 47: cmlist is an array of pointers to strings. ! 48: cmarg, cmarg2 are pointers to strings. ! 49: nfils is an integer. ! 50: ! 51: cmarg can be a filename string (possibly wild), or ! 52: a pointer to a prefabricated generic command string, or ! 53: a pointer to a host command string. ! 54: cmarg2 is the name to send a single file under, or ! 55: the name under which to store an incoming file; must not be wild. ! 56: cmlist is a list of nonwild filenames, such as passed via argv. ! 57: nfils is an integer, interpreted as follows: ! 58: -1: argument string is in cmarg, and should be expanded internally. ! 59: 0: stdin. ! 60: >0: number of files to send, from cmlist. ! 61: ! 62: The screen() function is used to update the screen during file transfer. ! 63: The tlog() function maintains a transaction log. ! 64: The debug() function maintains a debugging log. ! 65: The intmsg() and chkint() functions provide the user i/o for interrupting ! 66: file transfers. ! 67: */ ! 68: ! 69: /* Includes */ ! 70: ! 71: #include "ckcdeb.h" ! 72: #include <stdio.h> ! 73: #include <ctype.h> ! 74: #include <signal.h> ! 75: #include "ckcker.h" ! 76: #include "ckucmd.h" ! 77: #include "ckuusr.h" ! 78: ! 79: #ifdef vax11c ! 80: #define KERMRC "kermit.ini" ! 81: #else ! 82: #define KERMRC ".kermrc" ! 83: #endif ! 84: ! 85: /* External Kermit Variables, see ckmain.c for description. */ ! 86: ! 87: extern int size, spsiz, rpsiz, npad, timint, rtimo, speed, local, server, ! 88: displa, binary, fncnv, delay, parity, deblog, escape, xargc, flow, ! 89: turn, duplex, cxseen, czseen, nfils, ckxech, pktlog, seslog, tralog, stdouf, ! 90: turnch, chklen, bctr, bctu, dfloc, mdmtyp, keep, ! 91: rptflg, rptq, ebqflg, ebq, warn, quiet, cnflg, timef, spsizf, mypadn, tsecs; ! 92: ! 93: extern long filcnt, tlci, tlco, ffc, tfc, fsize; ! 94: ! 95: extern char *versio, *protv, *ckxv, *ckzv, *fnsv, *connv, *dftty, *cmdv; ! 96: extern char *dialv, *loginv; ! 97: extern char *ckxsys, *ckzsys, *cmarg, *cmarg2, **xargv, **cmlist; ! 98: extern CHAR mystch, stchr, sstate, mypadc, padch, eol, seol, ctlq, filnam[], ! 99: ttname[]; ! 100: extern char *DIRCMD, *PWDCMD, cmerrp[]; ! 101: char *strcpy(), *getenv(); ! 102: ! 103: /* Declarations from cmd package */ ! 104: ! 105: extern char cmdbuf[]; /* Command buffer */ ! 106: ! 107: /* Declarations from ck?fio.c module */ ! 108: ! 109: extern char *SPACMD, *zhome(); /* Space command, home directory. */ ! 110: extern int backgrd; /* Kermit executing in background */ ! 111: ! 112: /* The background flag is set by ckutio.c (via conint() ) to note whether */ ! 113: /* this kermit is executing in background ('&' on shell command line). */ ! 114: ! 115: ! 116: /* Variables and symbols local to this module */ ! 117: ! 118: char line[CMDBL+10], *lp; /* Character buffer for anything */ ! 119: char debfil[50]; /* Debugging log file name */ ! 120: char pktfil[50]; /* Packet log file name */ ! 121: char sesfil[50]; /* Session log file name */ ! 122: char trafil[50]; /* Transaction log file name */ ! 123: ! 124: int n, /* General purpose int */ ! 125: cflg, /* Command-line connect cmd given */ ! 126: action, /* Action selected on command line*/ ! 127: repars, /* Reparse needed */ ! 128: tlevel, /* Take command level */ ! 129: cwdf = 0; /* CWD has been done */ ! 130: ! 131: #define MAXTAKE 20 /* Maximum nesting of TAKE files */ ! 132: FILE *tfile[MAXTAKE]; /* File pointers for TAKE command */ ! 133: ! 134: char *homdir; /* Pointer to home directory string */ ! 135: char cmdstr[100]; ! 136: ! 137: /* C M D L I N -- Get arguments from command line */ ! 138: /* ! 139: Simple Unix-style command line parser, conforming with 'A Proposed Command ! 140: Syntax Standard for Unix Systems', Hemenway & Armitage, Unix/World, Vol.1, ! 141: No.3, 1984. ! 142: */ ! 143: cmdlin() { ! 144: char x; /* Local general-purpose int */ ! 145: cmarg = ""; /* Initialize globals */ ! 146: cmarg2 = ""; ! 147: action = cflg = 0; ! 148: ! 149: while (--xargc > 0) { /* Go through command line words */ ! 150: xargv++; ! 151: debug(F111,"xargv",*xargv,xargc); ! 152: if (**xargv == '-') { /* Got an option (begins with dash) */ ! 153: x = *(*xargv+1); /* Get the option letter */ ! 154: x = doarg(x); /* Go handle the option */ ! 155: if (x < 0) exit(GOOD_EXIT); ! 156: } else { /* No dash where expected */ ! 157: usage(); ! 158: exit(BAD_EXIT); ! 159: } ! 160: } ! 161: debug(F101,"action","",action); ! 162: if (!local) { ! 163: if ((action == 'g') || (action == 'r') || ! 164: (action == 'c') || (cflg != 0)) ! 165: fatal("-l and -b required"); ! 166: } ! 167: if (*cmarg2 != 0) { ! 168: if ((action != 's') && (action != 'r') && ! 169: (action != 'v')) ! 170: fatal("-a without -s, -r, or -g"); ! 171: } ! 172: if ((action == 'v') && (stdouf) && (!local)) { ! 173: if (isatty(1)) ! 174: fatal("unredirected -k can only be used in local mode"); ! 175: } ! 176: if ((action == 's') || (action == 'v') || ! 177: (action == 'r') || (action == 'x')) { ! 178: if (local) displa = 1; ! 179: if (stdouf) displa = 0; ! 180: } ! 181: ! 182: if (quiet) displa = 0; /* No display if quiet requested */ ! 183: ! 184: if (cflg) { ! 185: conect(); /* Connect if requested */ ! 186: if (action == 0) { ! 187: if (cnflg) conect(); /* And again if requested */ ! 188: doexit(GOOD_EXIT); /* Then exit indicating success */ ! 189: } ! 190: } ! 191: if (displa) concb(escape); /* (for console "interrupts") */ ! 192: return(action); /* Then do any requested protocol */ ! 193: } ! 194: ! 195: /* D O A R G -- Do a command-line argument. */ ! 196: ! 197: doarg(x) char x; { ! 198: int z; char *xp; ! 199: ! 200: xp = *xargv+1; /* Pointer for bundled args */ ! 201: while (x) { ! 202: switch (x) { ! 203: ! 204: case 'x': /* server */ ! 205: if (action) fatal("conflicting actions"); ! 206: action = 'x'; ! 207: break; ! 208: ! 209: case 'f': ! 210: if (action) fatal("conflicting actions"); ! 211: action = setgen('F',"","",""); ! 212: break; ! 213: ! 214: case 'r': /* receive */ ! 215: if (action) fatal("conflicting actions"); ! 216: action = 'v'; ! 217: break; ! 218: ! 219: case 'k': /* receive to stdout */ ! 220: if (action) fatal("conflicting actions"); ! 221: stdouf = 1; ! 222: action = 'v'; ! 223: break; ! 224: ! 225: case 's': /* send */ ! 226: if (action) fatal("conflicting actions"); ! 227: if (*(xp+1)) fatal("invalid argument bundling after -s"); ! 228: z = nfils = 0; /* Initialize file counter, flag */ ! 229: cmlist = xargv+1; /* Remember this pointer */ ! 230: while (--xargc > 0) { /* Traverse the list */ ! 231: *xargv++; ! 232: if (**xargv == '-') { /* Check for sending stdin */ ! 233: if (strcmp(*xargv,"-") != 0) break; ! 234: z++; ! 235: } ! 236: nfils++; /* Bump file counter */ ! 237: } ! 238: xargc++, *xargv--; /* Adjust argv/argc */ ! 239: if (nfils < 1) fatal("missing filename for -s"); ! 240: if (z > 1) fatal("-s: too many -'s"); ! 241: if (z == 1) { ! 242: if (nfils == 1) nfils = 0; ! 243: else fatal("invalid mixture of filenames and '-' in -s"); ! 244: } ! 245: if (nfils == 0) { ! 246: if (isatty(0)) fatal("sending from terminal not allowed"); ! 247: } ! 248: debug(F101,*xargv,"",nfils); ! 249: action = 's'; ! 250: break; ! 251: ! 252: /* cont'd... */ ! 253: ! 254: /* ...doarg(), cont'd */ ! 255: ! 256: case 'g': /* get */ ! 257: if (action) fatal("conflicting actions"); ! 258: if (*(xp+1)) fatal("invalid argument bundling after -g"); ! 259: *xargv++, xargc--; ! 260: if ((xargc == 0) || (**xargv == '-')) ! 261: fatal("missing filename for -g"); ! 262: cmarg = *xargv; ! 263: action = 'r'; ! 264: break; ! 265: ! 266: case 'c': /* connect before */ ! 267: cflg = 1; ! 268: break; ! 269: ! 270: case 'n': /* connect after */ ! 271: cnflg = 1; ! 272: break; ! 273: ! 274: case 'h': /* help */ ! 275: usage(); ! 276: return(-1); ! 277: ! 278: case 'a': /* "as" */ ! 279: if (*(xp+1)) fatal("invalid argument bundling after -a"); ! 280: *xargv++, xargc--; ! 281: if ((xargc < 1) || (**xargv == '-')) ! 282: fatal("missing name in -a"); ! 283: cmarg2 = *xargv; ! 284: break; ! 285: ! 286: case 'l': /* set line */ ! 287: if (*(xp+1)) fatal("invalid argument bundling after -l"); ! 288: *xargv++, xargc--; ! 289: if ((xargc < 1) || (**xargv == '-')) ! 290: fatal("communication line device name missing"); ! 291: strcpy(ttname,*xargv); ! 292: /* if (strcmp(ttname,dftty) == 0) local = dfloc; else local = 1; */ ! 293: local = (strcmp(ttname,CTTNAM) != 0); /* (better than old way) */ ! 294: debug(F101,"local","",local); ! 295: ttopen(ttname,&local,0); ! 296: break; ! 297: ! 298: case 'b': /* set baud */ ! 299: if (*(xp+1)) fatal("invalid argument bundling"); ! 300: *xargv++, xargc--; ! 301: if ((xargc < 1) || (**xargv == '-')) ! 302: fatal("missing baud"); ! 303: z = atoi(*xargv); /* Convert to number */ ! 304: if (chkspd(z) > -1) speed = z; /* Check it */ ! 305: else fatal("unsupported baud rate"); ! 306: break; ! 307: ! 308: case 'i': /* Treat files as binary */ ! 309: binary = 1; ! 310: break; ! 311: ! 312: /* cont'd... */ ! 313: ! 314: /* ...doarg(), cont'd */ ! 315: ! 316: ! 317: case 'w': /* File warning */ ! 318: warn = 1; ! 319: break; ! 320: ! 321: case 'q': /* Quiet */ ! 322: quiet = 1; ! 323: break; ! 324: ! 325: case 'd': /* debug */ ! 326: debopn("debug.log"); ! 327: break; ! 328: ! 329: case 'p': /* set parity */ ! 330: if (*(xp+1)) fatal("invalid argument bundling"); ! 331: *xargv++, xargc--; ! 332: if ((xargc < 1) || (**xargv == '-')) ! 333: fatal("missing parity"); ! 334: switch(x = **xargv) { ! 335: case 'e': ! 336: case 'o': ! 337: case 'm': ! 338: case 's': parity = x; break; ! 339: case 'n': parity = 0; break; ! 340: default: fatal("invalid parity"); ! 341: } ! 342: break; ! 343: ! 344: case 't': ! 345: turn = 1; /* Line turnaround handshake */ ! 346: turnch = XON; /* XON is turnaround character */ ! 347: duplex = 1; /* Half duplex */ ! 348: flow = 0; /* No flow control */ ! 349: break; ! 350: ! 351: default: ! 352: fatal("invalid argument, type 'kermit -h' for help"); ! 353: } ! 354: ! 355: x = *++xp; /* See if options are bundled */ ! 356: } ! 357: return(0); ! 358: } ! 359: ! 360: /* Misc */ ! 361: ! 362: fatal(msg) char *msg; { /* Fatal error message */ ! 363: fprintf(stderr,"\r\nFatal: %s\n",msg); ! 364: tlog(F110,"Fatal:",msg,0l); ! 365: doexit(BAD_EXIT); /* Exit indicating failure */ ! 366: } ! 367: ! 368: ! 369: ermsg(msg) char *msg; { /* Print error message */ ! 370: if (!quiet) fprintf(stderr,"\r\n%s - %s\n",cmerrp,msg); ! 371: tlog(F110,"Error -",msg,0l); ! 372: } ! 373: ! 374: /* Interactive command parser */ ! 375: ! 376: ! 377: /* Top-Level Keyword Table */ ! 378: ! 379: struct keytab cmdtab[] = { ! 380: "!", XXSHE, 0, ! 381: "%", XXCOM, CM_INV, ! 382: "bye", XXBYE, 0, ! 383: "c", XXCON, CM_INV, ! 384: "close", XXCLO, 0, ! 385: "connect", XXCON, 0, ! 386: "cwd", XXCWD, 0, ! 387: "dial", XXDIAL, 0, ! 388: "directory", XXDIR, 0, ! 389: "echo", XXECH, 0, ! 390: "exit", XXEXI, 0, ! 391: "finish", XXFIN, 0, ! 392: "get", XXGET, 0, ! 393: "help", XXHLP, 0, ! 394: "log", XXLOG, 0, ! 395: "quit", XXQUI, 0, ! 396: "r", XXREC, CM_INV, ! 397: "receive", XXREC, 0, ! 398: "remote", XXREM, 0, ! 399: "s", XXSEN, CM_INV, ! 400: "script", XXLOGI, 0, ! 401: "send", XXSEN, 0, ! 402: "server", XXSER, 0, ! 403: "set", XXSET, 0, ! 404: "show", XXSHO, 0, ! 405: "space", XXSPA, 0, ! 406: "statistics", XXSTA, 0, ! 407: "take", XXTAK, 0 ! 408: }; ! 409: int ncmd = (sizeof(cmdtab) / sizeof(struct keytab)); ! 410: ! 411: /* Parameter keyword table */ ! 412: ! 413: struct keytab prmtab[] = { ! 414: "baud", XYSPEE, CM_INV, ! 415: "block-check", XYCHKT, 0, ! 416: "delay", XYDELA, 0, ! 417: "duplex", XYDUPL, 0, ! 418: "end-of-packet", XYEOL, CM_INV, /* moved to send/receive */ ! 419: "escape-character", XYESC, 0, ! 420: "file", XYFILE, 0, ! 421: "flow-control", XYFLOW, 0, ! 422: "handshake", XYHAND, 0, ! 423: "incomplete", XYIFD, 0, ! 424: "line", XYLINE, 0, ! 425: "modem-dialer", XYMODM, 0, ! 426: "packet-length", XYLEN, CM_INV, /* moved to send/receive */ ! 427: "pad-character", XYPADC, CM_INV, /* moved to send/receive */ ! 428: "padding", XYNPAD, CM_INV, /* moved to send/receive */ ! 429: "parity", XYPARI, 0, ! 430: "prompt", XYPROM, 0, ! 431: "receive", XYRECV, 0, ! 432: "send", XYSEND, 0, ! 433: "speed", XYSPEE, 0, ! 434: "start-of-packet", XYMARK, CM_INV, /* moved to send/receive */ ! 435: "timeout", XYTIMO, CM_INV /* moved to send/receive */ ! 436: }; ! 437: int nprm = (sizeof(prmtab) / sizeof(struct keytab)); /* How many parameters */ ! 438: ! 439: ! 440: /* Remote Command Table */ ! 441: ! 442: struct keytab remcmd[] = { ! 443: "cwd", XZCWD, 0, ! 444: "delete", XZDEL, 0, ! 445: "directory", XZDIR, 0, ! 446: "help", XZHLP, 0, ! 447: "host", XZHOS, 0, ! 448: "space", XZSPA, 0, ! 449: "type", XZTYP, 0, ! 450: "who", XZWHO, 0 ! 451: }; ! 452: int nrmt = (sizeof(remcmd) / sizeof(struct keytab)); ! 453: ! 454: struct keytab logtab[] = { ! 455: "debugging", LOGD, 0, ! 456: "packets", LOGP, 0, ! 457: "session", LOGS, 0, ! 458: "transactions", LOGT, 0 ! 459: }; ! 460: int nlog = (sizeof(logtab) / sizeof(struct keytab)); ! 461: ! 462: /* Show command arguments */ ! 463: ! 464: #define SHPAR 0 /* Parameters */ ! 465: #define SHVER 1 /* Versions */ ! 466: ! 467: struct keytab shotab[] = { ! 468: "parameters", SHPAR, 0, ! 469: "versions", SHVER, 0 ! 470: }; ! 471: ! 472: /* C M D I N I -- Initialize the interactive command parser */ ! 473: ! 474: cmdini() { ! 475: ! 476: printf("%s,%s\nType ? for help\n",versio,ckxsys); ! 477: cmsetp("C-Kermit>"); /* Set default prompt. */ ! 478: ! 479: tlevel = -1; /* Take file level */ ! 480: ! 481: /* Look for init file in home or current directory. */ ! 482: ! 483: homdir = zhome(); ! 484: lp = line; ! 485: lp[0] = '\0'; ! 486: if (homdir) { ! 487: strcpy(lp,homdir); ! 488: if (lp[0] == '/') strcat(lp,"/"); ! 489: } ! 490: strcat(lp,KERMRC); ! 491: if ((tfile[0] = fopen(line,"r")) != NULL) { ! 492: tlevel = 0; ! 493: debug(F110,"init file",line,0); ! 494: } ! 495: if (homdir && (tlevel < 0)) { ! 496: strcpy(lp,KERMRC); ! 497: if ((tfile[0] = fopen(line,"r")) != NULL) { ! 498: tlevel = 0; ! 499: debug(F110,"init file",line,0); ! 500: } else { ! 501: debug(F100,"no init file","",0); ! 502: } ! 503: } ! 504: ! 505: congm(); /* Get console tty modes */ ! 506: } ! 507: ! 508: ! 509: /* T R A P -- Terminal interrupt handler */ ! 510: ! 511: trap() { ! 512: debug(F100,"terminal interrupt...","",0); ! 513: doexit(GOOD_EXIT); /* Exit indicating success */ ! 514: } ! 515: ! 516: /* P A R S E R -- Top-level interactive command parser. */ ! 517: ! 518: parser() { ! 519: int xx, cbn; ! 520: char *cbp; ! 521: ! 522: concb(escape); /* Put console in cbreak mode. */ ! 523: conint(trap); /* Turn on console terminal interrupts. */ ! 524: /* ! 525: sstate becomes nonzero when a command has been parsed that requires some ! 526: action from the protocol module. Any non-protocol actions, such as local ! 527: directory listing or terminal emulation, are invoked directly from below. ! 528: */ ! 529: if (local) printf("\n"); /*** Temporary kludge ***/ ! 530: sstate = 0; /* Start with no start state. */ ! 531: while (sstate == 0) { /* Parse cmds until action requested */ ! 532: while ((tlevel > -1) && feof(tfile[tlevel])) { /* If end of take */ ! 533: fclose(tfile[tlevel]); /* file, close it */ ! 534: tlevel--; /* and forget about it. */ ! 535: cmini(ckxech); /* and clear the cmd buffer. */ ! 536: } ! 537: if (tlevel > -1) { /* If in take file */ ! 538: cbp = cmdbuf; /* Get the next line. */ ! 539: cbn = CMDBL; ! 540: ! 541: /* Loop to get next command line and all continuation lines from take file. */ ! 542: ! 543: again: if (fgets(line,cbn,tfile[tlevel]) == NULL) continue; ! 544: lp = line; /* Got one, copy it. */ ! 545: while (*cbp++ = *lp++) ! 546: if (--cbn < 1) fatal("Command too long for internal buffer"); ! 547: if (*(cbp - 3) == '\\') { /* Continued on next line? */ ! 548: cbp -= 3; /* If so, back up pointer, */ ! 549: goto again; /* go back, get next line. */ ! 550: } ! 551: stripq(cmdbuf); /* Strip any quotes from cmd buffer. */ ! 552: ! 553: } else { /* No take file, get typein. */ ! 554: ! 555: prompt(); /* Issue interactive prompt. */ ! 556: cmini(ckxech); ! 557: } ! 558: repars = 1; ! 559: displa = 0; ! 560: while (repars) { ! 561: cmres(); /* Reset buffer pointers. */ ! 562: xx = cmkey(cmdtab,ncmd,"Command",""); ! 563: debug(F101,"top-level cmkey","",xx); ! 564: switch (docmd(xx)) { ! 565: case -4: /* EOF */ ! 566: doexit(GOOD_EXIT); /* ...exit successfully */ ! 567: case -1: /* Reparse needed */ ! 568: repars = 1; ! 569: continue; ! 570: case -2: /* Invalid command given */ ! 571: if (backgrd) /* if in background, terminate */ ! 572: fatal("Kermit command error in background execution"); ! 573: if (tlevel > -1) { /* If in take file, quit */ ! 574: ermsg("Kermit command error: take file terminated."); ! 575: fclose(tfile[tlevel]); ! 576: tlevel--; ! 577: } ! 578: cmini(ckxech); /* (fall thru) */ ! 579: case -3: /* Empty command OK at top level */ ! 580: default: /* Anything else (fall thru) */ ! 581: repars = 0; /* No reparse, get new command. */ ! 582: continue; ! 583: } ! 584: } ! 585: } ! 586: /* Got an action command; disable terminal interrupts and return start state */ ! 587: ! 588: if (!local) connoi(); /* Interrupts off only if remote */ ! 589: return(sstate); ! 590: } ! 591: ! 592: /* D O E X I T -- Exit from the program. */ ! 593: ! 594: doexit(exitstat) int exitstat; { ! 595: ! 596: ttclos(); /* Close external line, if any */ ! 597: if (local) { ! 598: strcpy(ttname,dftty); /* Restore default tty */ ! 599: local = dfloc; /* And default remote/local status */ ! 600: } ! 601: if (!quiet) conres(); /* Restore console terminal. */ ! 602: if (!quiet) connoi(); /* Turn off console interrupt traps. */ ! 603: ! 604: if (deblog) { /* Close any open logs. */ ! 605: debug(F100,"Debug Log Closed","",0); ! 606: *debfil = '\0'; ! 607: deblog = 0; ! 608: zclose(ZDFILE); ! 609: } ! 610: if (pktlog) { ! 611: *pktfil = '\0'; ! 612: pktlog = 0; ! 613: zclose(ZPFILE); ! 614: } ! 615: if (seslog) { ! 616: *sesfil = '\0'; ! 617: seslog = 0; ! 618: zclose(ZSFILE); ! 619: } ! 620: if (tralog) { ! 621: tlog(F100,"Transaction Log Closed","",0l); ! 622: *trafil = '\0'; ! 623: tralog = 0; ! 624: zclose(ZTFILE); ! 625: } ! 626: exit(exitstat); /* Exit from the program. */ ! 627: } ! 628: ! 629: /* B L D L E N -- Make length-encoded copy of string */ ! 630: ! 631: char * ! 632: bldlen(str,dest) char *str, *dest; { ! 633: int len; ! 634: len = strlen(str); ! 635: *dest = tochar(len); ! 636: strcpy(dest+1,str); ! 637: return(dest+len+1); ! 638: } ! 639: ! 640: ! 641: /* S E T G E N -- Construct a generic command */ ! 642: ! 643: setgen(type,arg1,arg2,arg3) char type, *arg1, *arg2, *arg3; { ! 644: char *upstr, *cp; ! 645: ! 646: cp = cmdstr; ! 647: *cp++ = type; ! 648: *cp = NUL; ! 649: if (*arg1 != NUL) { ! 650: upstr = bldlen(arg1,cp); ! 651: if (*arg2 != NUL) { ! 652: upstr = bldlen(arg2,upstr); ! 653: if (*arg3 != NUL) bldlen(arg3,upstr); ! 654: } ! 655: } ! 656: cmarg = cmdstr; ! 657: debug(F110,"setgen",cmarg,0); ! 658: ! 659: return('g'); ! 660: } ! 661: ! 662: /* D O C M D -- Do a command */ ! 663: ! 664: /* ! 665: Returns: ! 666: -2: user typed an illegal command ! 667: -1: reparse needed ! 668: 0: parse was successful (even tho command may have failed). ! 669: */ ! 670: ! 671: docmd(cx) int cx; { ! 672: int x, y; ! 673: char *s; ! 674: ! 675: switch (cx) { ! 676: ! 677: case -4: /* EOF */ ! 678: if (!quiet) printf("\r\n"); ! 679: doexit(GOOD_EXIT); ! 680: case -3: /* Null command */ ! 681: return(0); ! 682: case -2: /* Error */ ! 683: case -1: /* Reparse needed */ ! 684: return(cx); ! 685: ! 686: case XXBYE: /* bye */ ! 687: if ((x = cmcfm()) < 0) return(x); ! 688: if (!local) { ! 689: printf("You have to 'set line' first\n"); ! 690: return(0); ! 691: } ! 692: sstate = setgen('L',"","",""); ! 693: return(0); ! 694: ! 695: case XXCOM: /* comment */ ! 696: if ((x = cmtxt("Text of comment line","",&s)) < 0) return(x); ! 697: return(0); ! 698: ! 699: case XXCON: /* connect */ ! 700: if ((x = cmcfm()) < 0) return(x); ! 701: return(doconect()); ! 702: ! 703: case XXCWD: ! 704: if (cmtxt("Name of local directory, or carriage return",homdir,&s) < 0) ! 705: return(-1); ! 706: if (chdir(s)) perror(s); ! 707: cwdf = 1; ! 708: system(PWDCMD); ! 709: return(0); ! 710: ! 711: case XXCLO: ! 712: x = cmkey(logtab,nlog,"Which log to close",""); ! 713: if (x == -3) { ! 714: printf("?You must tell which log\n"); ! 715: return(-2); ! 716: } ! 717: if (x < 0) return(x); ! 718: if ((y = cmcfm()) < 0) return(y); ! 719: switch (x) { ! 720: ! 721: case LOGD: ! 722: if (deblog == 0) { ! 723: printf("?Debugging log wasn't open\n"); ! 724: return(0); ! 725: } ! 726: *debfil = '\0'; ! 727: deblog = 0; ! 728: return(zclose(ZDFILE)); ! 729: ! 730: case LOGP: ! 731: if (pktlog == 0) { ! 732: printf("?Packet log wasn't open\n"); ! 733: return(0); ! 734: } ! 735: *pktfil = '\0'; ! 736: pktlog = 0; ! 737: return(zclose(ZPFILE)); ! 738: ! 739: case LOGS: ! 740: if (seslog == 0) { ! 741: printf("?Session log wasn't open\n"); ! 742: return(0); ! 743: } ! 744: *sesfil = '\0'; ! 745: seslog = 0; ! 746: return(zclose(ZSFILE)); ! 747: ! 748: case LOGT: ! 749: if (tralog == 0) { ! 750: printf("?Transaction log wasn't open\n"); ! 751: return(0); ! 752: } ! 753: *trafil = '\0'; ! 754: tralog = 0; ! 755: return(zclose(ZTFILE)); ! 756: ! 757: default: ! 758: printf("\n?Unexpected log designator - %ld\n", x); ! 759: return(0); ! 760: } ! 761: ! 762: case XXDIAL: /* dial number */ ! 763: if ((x = cmtxt("Number to be dialed","",&s)) < 0) return(x); ! 764: return(dial(s)); ! 765: ! 766: case XXDIR: /* directory */ ! 767: if ((x = cmtxt("Directory/file specification",".",&s)) < 0) return(x); ! 768: lp = line; ! 769: sprintf(lp,"%s %s",DIRCMD,s); ! 770: system(line); ! 771: return(0); ! 772: ! 773: ! 774: case XXECH: /* echo */ ! 775: if ((x = cmtxt("Material to be echoed","",&s)) < 0) return(x); ! 776: for ( ; *s; s++) { ! 777: if ((x = *s) == 0134) { /* Convert octal escapes */ ! 778: s++; /* up to 3 digits */ ! 779: for (x = y = 0; *s >= '0' && *s <= '7' && y < 3; s++,y++) { ! 780: x = x * 8 + (int) *s - 48; ! 781: } ! 782: s--; ! 783: } ! 784: putchar(x); ! 785: } ! 786: printf("\n"); ! 787: return(0); ! 788: ! 789: case XXQUI: /* quit, exit */ ! 790: case XXEXI: ! 791: if ((x = cmcfm()) > -1) doexit(GOOD_EXIT); ! 792: else return(x); ! 793: ! 794: case XXFIN: /* finish */ ! 795: if ((x = cmcfm()) < 0) return(x); ! 796: if (!local) { ! 797: printf("You have to 'set line' first\n"); ! 798: return(0); ! 799: } ! 800: sstate = setgen('F',"","",""); ! 801: return(0); ! 802: ! 803: case XXGET: /* get */ ! 804: if (!local) { ! 805: printf("\nYou have to 'set line' first\n"); ! 806: return(0); ! 807: } ! 808: x = cmtxt("Name of remote file(s), or carriage return","",&cmarg); ! 809: if ((x == -2) || (x == -1)) return(x); ! 810: ! 811: /* If foreign file name omitted, get foreign and local names separately */ ! 812: ! 813: if (*cmarg == NUL) { ! 814: ! 815: if (tlevel > -1) { /* Input is from take file */ ! 816: ! 817: if (fgets(line,100,tfile[tlevel]) == NULL) ! 818: fatal("take file ends prematurely in 'get'"); ! 819: stripq(line); ! 820: cmarg = line; ! 821: if (fgets(cmdbuf,CMDBL,tfile[tlevel]) == NULL) ! 822: fatal("take file ends prematurely in 'get'"); ! 823: stripq(cmdbuf); ! 824: if (*cmdbuf == NUL) cmarg2 = line; else cmarg2 = cmdbuf; ! 825: ! 826: } else { /* Input is from terminal */ ! 827: ! 828: char psave[40]; /* Save old prompt */ ! 829: cmsavp(psave,40); ! 830: cmsetp(" Remote file specification: "); /* Make new one */ ! 831: cmini(ckxech); ! 832: x = -1; ! 833: prompt(); ! 834: while (x == -1) { /* Prompt till they answer */ ! 835: x = cmtxt("Name of remote file(s)","",&cmarg); ! 836: debug(F111," cmtxt",cmarg,x); ! 837: } ! 838: if (x < 0) { ! 839: cmsetp(psave); ! 840: return(x); ! 841: } ! 842: if (*cmarg == NUL) { /* If user types a bare CR, */ ! 843: printf("(cancelled)\n"); /* Forget about this. */ ! 844: cmsetp(psave); /* Restore old prompt, */ ! 845: return(0); /* and return. */ ! 846: } ! 847: strcpy(line,cmarg); /* Make a safe copy */ ! 848: cmarg = line; ! 849: cmsetp(" Local name to store it under: "); /* New prompt */ ! 850: cmini(ckxech); ! 851: x = -1; ! 852: prompt(); /* Prompt */ ! 853: while (x < 0) { /* Again, parse till answered */ ! 854: x = cmofi("Local file name","",&cmarg2); ! 855: if (x == -2) return(x); ! 856: if (x == -3) { /* If bare CR, */ ! 857: printf("(cancelled)\n"); /* escape from this... */ ! 858: cmsetp(psave); /* restore old prompt, */ ! 859: return(0); /* and return. */ ! 860: } ! 861: } ! 862: cmsetp(psave); /* Restore old prompt. */ ! 863: if ((x == cmcfm()) < 0) return(-2); ! 864: } ! 865: } ! 866: sstate = 'r'; /* All ok, set start state. */ ! 867: if (local) displa = 1; ! 868: return(0); ! 869: ! 870: case XXHLP: /* Help */ ! 871: x = cmkey(cmdtab,ncmd,"C-Kermit command","help"); ! 872: return(dohlp(x)); ! 873: ! 874: case XXLOG: /* Log */ ! 875: x = cmkey(logtab,nlog,"What to log",""); ! 876: if (x == -3) { ! 877: printf("?You must specify what is to be logged\n"); ! 878: return(-2); ! 879: } ! 880: if (x < 0) return(x); ! 881: return(dolog(x)); ! 882: ! 883: case XXLOGI: /* Send script remote system */ ! 884: if ((x = cmtxt("Text of login script","",&s)) < 0) return(x); ! 885: return( login(s) ); /* Return 0=completed, -2=failed */ ! 886: ! 887: case XXREC: /* Receive */ ! 888: cmarg2 = ""; ! 889: x = cmofi("Name under which to store the file, or CR","",&cmarg2); ! 890: if ((x == -1) || (x == -2)) return(x); ! 891: debug(F111,"cmofi cmarg2",cmarg2,x); ! 892: if ((x = cmcfm()) < 0) return(x); ! 893: sstate = 'v'; ! 894: if (local) displa = 1; ! 895: return(0); ! 896: ! 897: case XXREM: /* Remote */ ! 898: if (!local) { ! 899: printf("\nYou have to 'set line' first\n"); ! 900: return(-2); ! 901: } ! 902: x = cmkey(remcmd,nrmt,"Remote Kermit server command",""); ! 903: if (x == -3) { ! 904: printf("?You must specify a command for the remote server\n"); ! 905: return(-2); ! 906: } ! 907: return(dormt(x)); ! 908: ! 909: case XXSEN: /* Send */ ! 910: cmarg = cmarg2 = ""; ! 911: if ((x = cmifi("File(s) to send","",&s,&y)) < 0) { ! 912: if (x == -3) { ! 913: printf("?A file specification is required\n"); ! 914: return(-2); ! 915: } ! 916: return(x); ! 917: } ! 918: nfils = -1; /* Files come from internal list. */ ! 919: strcpy(line,s); /* Save copy of string just parsed. */ ! 920: debug(F101,"Send: wild","",y); ! 921: *cmarg2 = '\0'; /* Initialize send-as name */ ! 922: if (y == 0) { ! 923: if ((x = cmtxt("Name to send it with","",&cmarg2)) < 0) return(x); ! 924: } else { ! 925: if ((x = cmcfm()) < 0) return(x); ! 926: } ! 927: cmarg = line; /* File to send */ ! 928: debug(F110,"Sending:",cmarg,0); ! 929: if (*cmarg2 != '\0') debug(F110," as:",cmarg2,0); ! 930: sstate = 's'; /* Set start state */ ! 931: if (local) displa = 1; ! 932: return(0); ! 933: ! 934: case XXSER: /* Server */ ! 935: if ((x = cmcfm()) < 0) return(x); ! 936: sstate = 'x'; ! 937: if (local) displa = 1; ! 938: return(0); ! 939: ! 940: case XXSET: /* Set */ ! 941: x = cmkey(prmtab,nprm,"Parameter",""); ! 942: if (x == -3) { ! 943: printf("?You must specify a parameter to set\n"); ! 944: return(-2); ! 945: } ! 946: if (x < 0) return(x); ! 947: return(doprm(x)); ! 948: ! 949: /* XXSHE code by H. Fischer; copyright rights assigned to Columbia Univ */ ! 950: /* ! 951: Adapted to use getpwuid to find login shell because many systems do not ! 952: have SHELL in environment, and to use direct calling of shell rather ! 953: than intermediate system() call. -- H. Fischer ! 954: */ ! 955: case XXSHE: /* Local shell command */ ! 956: { ! 957: int pid; ! 958: if (cmtxt("Unix shell command to execute","",&s) < 0) return(-1); ! 959: conres(); /* Make console normal */ ! 960: #ifdef MSDOS ! 961: zxcmd(s); ! 962: #else ! 963: #ifdef vax11c ! 964: ! 965: system(s); /* Best we can do for VMS? */ ! 966: ! 967: #else /* All Unix systems... */ ! 968: ! 969: if ((pid = fork()) == 0) { /* Make child */ ! 970: char *shpath, *shname, *shptr; /* For finding desired shell */ ! 971: struct passwd *p; ! 972: extern struct passwd * getpwuid(); ! 973: extern int getuid(); ! 974: char *defShel = "/bin/sh"; /* Default */ ! 975: ! 976: p = getpwuid( getuid() ); /* Get login data */ ! 977: if ( p == (struct passwd *) NULL || !*(p->pw_shell) ) ! 978: shpath = defShel; ! 979: else ! 980: shpath = p->pw_shell; ! 981: shptr = shname = shpath; ! 982: while (*shptr != '\0') ! 983: if (*shptr++ == '/') shname = shptr; ! 984: if (*s == NUL) /* Interactive shell requested? */ ! 985: execl(shpath,shname,"-i",(char *)0); /* Yes, do that */ ! 986: else /* Otherwise, */ ! 987: execl(shpath,shname,"-c",s,(char *)0); /* exec the given command */ ! 988: exit(GOOD_EXIT); } /* Just punt if it didnt work */ ! 989: ! 990: else { /* Parent */ ! 991: ! 992: int wstat; /* Kermit must wait for child */ ! 993: int (*istat)(), (*qstat)(); ! 994: ! 995: istat = signal(SIGINT,SIG_IGN); /* Let the fork handle keyboard */ ! 996: qstat = signal(SIGQUIT,SIG_IGN); /* interrupts itself... */ ! 997: ! 998: while (((wstat = wait(0)) != pid) && (wstat != -1)) /* Wait for fork */ ! 999: ; ! 1000: signal(SIGINT,istat); /* Restore interrupts */ ! 1001: signal(SIGQUIT,qstat); ! 1002: } ! 1003: #endif ! 1004: #endif ! 1005: concb(escape); /* Console back in cbreak mode */ ! 1006: return(0); ! 1007: } ! 1008: ! 1009: case XXSHO: /* Show */ ! 1010: x = cmkey(shotab,2,"","parameters"); ! 1011: if (x < 0) return(x); ! 1012: if (y = (cmcfm()) < 0) return(y); ! 1013: switch (x) { ! 1014: ! 1015: case SHPAR: ! 1016: shopar(); ! 1017: break; ! 1018: ! 1019: case SHVER: ! 1020: printf("\nVersions:\n %s\n %s\n",versio,protv); ! 1021: printf(" %s\n",fnsv); ! 1022: printf(" %s\n %s\n %s for%s\n",cmdv,userv,ckxv,ckxsys); ! 1023: printf(" %s for%s\n %s\n",ckzv,ckzsys,connv); ! 1024: printf(" %s\n %s\n\n",dialv,loginv); ! 1025: break; ! 1026: ! 1027: default: ! 1028: printf("\nNothing to show...\n"); ! 1029: break; ! 1030: } ! 1031: return(0); ! 1032: ! 1033: case XXSPA: /* space */ ! 1034: if ((x = cmcfm()) < 0) return(x); ! 1035: system(SPACMD); ! 1036: return(0); ! 1037: ! 1038: case XXSTA: /* statistics */ ! 1039: if ((x = cmcfm()) < 0) return(x); ! 1040: printf("\nMost recent transaction --\n"); ! 1041: printf(" files: %ld\n",filcnt); ! 1042: printf(" total file characters : %ld\n",tfc); ! 1043: printf(" communication line in : %ld\n",tlci); ! 1044: printf(" communication line out : %ld\n",tlco); ! 1045: printf(" elapsed time : %d sec\n",tsecs); ! 1046: if (filcnt > 0) { ! 1047: if (tsecs > 0) { ! 1048: long lx; ! 1049: lx = (tfc / tsecs) * 10; ! 1050: printf(" effective baud rate : %ld\n",lx); ! 1051: if (speed > 0) { ! 1052: lx = (lx * 100) / speed; ! 1053: printf(" efficiency : %ld %%\n",lx); ! 1054: } ! 1055: } ! 1056: printf(" block check type used : %d\n",bctu); ! 1057: printf(" compression : "); ! 1058: if (rptflg) printf("yes [%c]\n",rptq); else printf("no\n"); ! 1059: printf(" 8th bit prefixing : "); ! 1060: if (ebqflg) printf("yes [%c]\n",ebq); else printf("no\n\n"); ! 1061: } else printf("\n"); ! 1062: return(0); ! 1063: ! 1064: case XXTAK: /* take */ ! 1065: if (tlevel > MAXTAKE-1) { ! 1066: printf("?Take files nested too deeply\n"); ! 1067: return(-2); ! 1068: } ! 1069: if ((y = cmifi("C-Kermit command file","",&s,&x)) < 0) { ! 1070: if (y == -3) { ! 1071: printf("?A file specification is required\n"); ! 1072: return(-2); ! 1073: } else return(y); ! 1074: } ! 1075: if (x != 0) { ! 1076: printf("?Wildcards not allowed in command file name\n"); ! 1077: return(-2); ! 1078: } ! 1079: strcpy(line,s); /* Make a safe copy of the string */ ! 1080: if ((y = cmcfm()) < 0) return(y); ! 1081: if ((tfile[++tlevel] = fopen(line,"r")) == NULL) { ! 1082: perror(line); ! 1083: debug(F110,"Failure to open",line,0); ! 1084: tlevel--; ! 1085: } ! 1086: return(0); ! 1087: ! 1088: default: ! 1089: printf("Not available - %s\n",cmdbuf); ! 1090: return(-2); ! 1091: } ! 1092: } ! 1093: ! 1094: /* S H O P A R -- Show Parameters */ ! 1095: ! 1096: shopar() { ! 1097: ! 1098: int i; ! 1099: extern struct keytab mdmtab[]; extern int nmdm; ! 1100: ! 1101: puts("\nCommunications Parameters:"); ! 1102: printf(" Line: %s, speed: %d, mode: ",ttname,speed); ! 1103: if (local) printf("local"); else printf("remote"); ! 1104: ! 1105: for (i = 0; i < nmdm; i++) { ! 1106: if (mdmtab[i].val == mdmtyp) { ! 1107: printf(", modem-dialer: %s",mdmtab[i].kwd); ! 1108: break; ! 1109: } ! 1110: } ! 1111: printf("\n Parity: "); ! 1112: switch (parity) { ! 1113: case 'e': printf("even"); break; ! 1114: case 'o': printf("odd"); break; ! 1115: case 'm': printf("mark"); break; ! 1116: case 's': printf("space"); break; ! 1117: case 0: printf("none"); break; ! 1118: default: printf("invalid - %d",parity); break; ! 1119: } ! 1120: printf(", duplex: "); ! 1121: if (duplex) printf("half, "); else printf("full, "); ! 1122: printf("flow: "); ! 1123: if (flow == 1) printf("xon/xoff"); ! 1124: else if (flow == 0) printf("none"); ! 1125: else printf("%d",flow); ! 1126: printf(", handshake: "); ! 1127: if (turn) printf("%d\n",turnch); else printf("none\n"); ! 1128: ! 1129: printf("\nProtocol Parameters: Send Receive"); ! 1130: if (timef || spsizf) printf(" (* = override)"); ! 1131: printf("\n Timeout: %11d%9d", rtimo, timint); ! 1132: if (timef) printf("*"); ! 1133: printf("\n Padding: %11d%9d\n", npad, mypadn); ! 1134: printf( " Pad Character:%11d%9d\n", padch, mypadc); ! 1135: printf( " Packet Start: %11d%9d\n", mystch, stchr); ! 1136: printf( " Packet End: %11d%9d\n", seol, eol); ! 1137: printf( " Packet Length:%11d", spsiz); ! 1138: printf( spsizf ? "*" : " " ); printf("%8d\n", rpsiz); ! 1139: ! 1140: printf("\nBlock Check Type: %d, Delay: %d\n",bctr,delay); ! 1141: if (ebqflg) printf("8th-Bit Prefix: '%c'\n",ebq); ! 1142: if (rptflg) printf("Repeat-Count Prefix: '%c'\n",rptq); ! 1143: ! 1144: printf("\nFile parameters:\n File Names: "); ! 1145: if (fncnv) printf("%-12s","converted"); else printf("%-12s","literal"); ! 1146: #ifdef DEBUG ! 1147: printf(" Debugging Log: "); ! 1148: if (deblog) printf("%s",debfil); else printf("none"); ! 1149: #endif ! 1150: printf("\n File Type: "); ! 1151: if (binary) printf("%-12s","binary"); else printf("%-12s","text"); ! 1152: printf(" Packet Log: "); ! 1153: if (pktlog) printf(pktfil); else printf("none"); ! 1154: printf("\n File Warning: "); ! 1155: if (warn) printf("%-12s","on"); else printf("%-12s","off"); ! 1156: printf(" Session Log: "); ! 1157: if (seslog) printf(sesfil); else printf("none"); ! 1158: printf("\n File Display: "); ! 1159: if (quiet) printf("%-12s","off"); else printf("%-12s","on"); ! 1160: #ifdef TLOG ! 1161: printf(" Transaction Log: "); ! 1162: if (tralog) printf(trafil); else printf("none"); ! 1163: #endif ! 1164: printf("\n\nIncomplete File Disposition: "); ! 1165: if (keep) printf("keep"); else printf("discard"); ! 1166: #ifdef KERMRC ! 1167: printf(", Init file: %s",KERMRC); ! 1168: #endif ! 1169: puts("\n"); ! 1170: } ! 1171: ! 1172: /* D O C O N E C T -- Do the connect command */ ! 1173: ! 1174: /* Note, we don't call this directly from dial, because we need to give */ ! 1175: /* the user a chance to change parameters (e.g. parity) after the */ ! 1176: /* connection is made. */ ! 1177: ! 1178: doconect() { ! 1179: int x; ! 1180: conres(); /* Put console back to normal */ ! 1181: x = conect(); /* Connect */ ! 1182: concb(escape); /* Put console into cbreak mode, */ ! 1183: return(x); /* for more command parsing. */ ! 1184: } ! 1185: ! 1186: ! 1187: /* D O L O G -- Do the log command */ ! 1188: ! 1189: dolog(x) int x; { ! 1190: int y; char *s; ! 1191: ! 1192: switch (x) { ! 1193: ! 1194: case LOGD: ! 1195: #ifdef DEBUG ! 1196: y = cmofi("Name of debugging log file","debug.log",&s); ! 1197: #else ! 1198: y = -2; s = ""; ! 1199: printf("%s","- Sorry, debug log not available\n"); ! 1200: #endif ! 1201: break; ! 1202: ! 1203: case LOGP: ! 1204: y = cmofi("Name of packet log file","packet.log",&s); ! 1205: break; ! 1206: ! 1207: case LOGS: ! 1208: y = cmofi("Name of session log file","session.log",&s); ! 1209: break; ! 1210: ! 1211: case LOGT: ! 1212: #ifdef TLOG ! 1213: y = cmofi("Name of transaction log file","transact.log",&s); ! 1214: #else ! 1215: y = -2; s = ""; ! 1216: printf("%s","- Sorry, transaction log not available\n"); ! 1217: #endif ! 1218: break; ! 1219: ! 1220: default: ! 1221: printf("\n?Unexpected log designator - %d\n",x); ! 1222: return(-2); ! 1223: } ! 1224: if (y < 0) return(y); ! 1225: ! 1226: strcpy(line,s); ! 1227: s = line; ! 1228: if ((y = cmcfm()) < 0) return(y); ! 1229: ! 1230: /* cont'd... */ ! 1231: ! 1232: /* ...dolog, cont'd */ ! 1233: ! 1234: ! 1235: switch (x) { ! 1236: ! 1237: case LOGD: ! 1238: return(deblog = debopn(s)); ! 1239: ! 1240: case LOGP: ! 1241: zclose(ZPFILE); ! 1242: y = zopeno(ZPFILE,s); ! 1243: if (y > 0) strcpy(pktfil,s); else *pktfil = '\0'; ! 1244: return(pktlog = y); ! 1245: ! 1246: case LOGS: ! 1247: zclose(ZSFILE); ! 1248: y = zopeno(ZSFILE,s); ! 1249: if (y > 0) strcpy(sesfil,s); else *sesfil = '\0'; ! 1250: return(seslog = y); ! 1251: ! 1252: case LOGT: ! 1253: zclose(ZTFILE); ! 1254: tralog = zopeno(ZTFILE,s); ! 1255: if (tralog > 0) { ! 1256: strcpy(trafil,s); ! 1257: tlog(F110,"Transaction Log:",versio,0l); ! 1258: tlog(F100,ckxsys,"",0); ! 1259: ztime(&s); ! 1260: tlog(F100,s,"",0l); ! 1261: } ! 1262: else *trafil = '\0'; ! 1263: return(tralog); ! 1264: ! 1265: default: ! 1266: return(-2); ! 1267: } ! 1268: } ! 1269: ! 1270: ! 1271: /* D E B O P N -- Open a debugging file */ ! 1272: ! 1273: debopn(s) char *s; { ! 1274: #ifdef DEBUG ! 1275: char *tp; ! 1276: zclose(ZDFILE); ! 1277: deblog = zopeno(ZDFILE,s); ! 1278: if (deblog > 0) { ! 1279: strcpy(debfil,s); ! 1280: debug(F110,"Debug Log ",versio,0); ! 1281: debug(F100,ckxsys,"",0); ! 1282: ztime(&tp); ! 1283: debug(F100,tp,"",0); ! 1284: } else *debfil = '\0'; ! 1285: return(deblog); ! 1286: #else ! 1287: return(0); ! 1288: #endif ! 1289: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.