|
|
1.1 ! root 1: /* C K U U S 3 -- "User Interface" for Unix Kermit, part 3 */ ! 2: ! 3: /* ! 4: Author: Frank da Cruz (SY.FDC@CU20B), ! 5: Columbia University Center for Computing Activities, January 1985. ! 6: Copyright (C) 1985, Trustees of Columbia University in the City of New York. ! 7: Permission is granted to any individual or institution to use, copy, or ! 8: redistribute this software so long as it is not sold for profit, provided this ! 9: copyright notice is retained. ! 10: */ ! 11: ! 12: /* SET and REMOTE commands; screen, debug, interrupt, and logging functions */ ! 13: ! 14: /* Includes */ ! 15: ! 16: #include "ckcdeb.h" ! 17: #include <stdio.h> ! 18: #include <ctype.h> ! 19: #include "ckcker.h" ! 20: #include "ckucmd.h" ! 21: #include "ckuusr.h" ! 22: ! 23: /* Variables */ ! 24: ! 25: extern int size, spsiz, rpsiz, npad, timint, rtimo, speed, local, server, ! 26: image, flow, displa, binary, fncnv, delay, parity, deblog, escape, xargc, ! 27: turn, duplex, cxseen, czseen, nfils, ckxech, pktlog, seslog, tralog, stdouf, ! 28: turnch, chklen, bctr, bctu, dfloc, mdmtyp, keep, ! 29: rptflg, ebqflg, warn, quiet, cnflg, timef, spsizf, mypadn; ! 30: ! 31: extern long filcnt, tlci, tlco, ffc, tfc, fsize; ! 32: ! 33: extern char *versio, *protv, *ckxv, *ckzv, *fnsv, *connv, *dftty, *cmdv; ! 34: extern char *cmarg, *cmarg2, **xargv, **cmlist; ! 35: extern CHAR stchr, mystch, sstate, padch, mypadc, eol, seol, ctlq; ! 36: extern CHAR filnam[], ttname[]; ! 37: char *strcpy(); ! 38: ! 39: /* Declarations from cmd package */ ! 40: ! 41: extern char cmdbuf[]; /* Command buffer */ ! 42: ! 43: /* From main ckuser module... */ ! 44: ! 45: extern char line[100], *lp; /* Character buffer for anything */ ! 46: extern char debfil[50], /* Debugging log file name */ ! 47: pktfil[50], /* Packet log file name */ ! 48: sesfil[50], /* Session log file name */ ! 49: trafil[50]; /* Transaction log file name */ ! 50: ! 51: extern int tlevel; /* Take Command file level */ ! 52: extern FILE *tfile[]; /* Array of take command fd's */ ! 53: ! 54: ! 55: /* Keyword tables for SET commands */ ! 56: ! 57: ! 58: /* Block checks */ ! 59: ! 60: struct keytab blktab[] = { ! 61: "1", 1, 0, ! 62: "2", 2, 0, ! 63: "3", 3, 0 ! 64: }; ! 65: ! 66: /* Duplex keyword table */ ! 67: ! 68: struct keytab dpxtab[] = { ! 69: "full", 0, 0, ! 70: "half", 1, 0 ! 71: }; ! 72: ! 73: struct keytab filtab[] = { ! 74: "display", XYFILD, 0, ! 75: "names", XYFILN, 0, ! 76: "type", XYFILT, 0, ! 77: "warning", XYFILW, 0 ! 78: }; ! 79: int nfilp = (sizeof(filtab) / sizeof(struct keytab)); ! 80: ! 81: /* Send/Receive Parameters */ ! 82: ! 83: struct keytab srtab[] = { ! 84: "end-of-packet", XYEOL, 0, ! 85: "packet-length", XYLEN, 0, ! 86: "pad-character", XYPADC, 0, ! 87: "padding", XYNPAD, 0, ! 88: "start-of-packet", XYMARK, 0, ! 89: "timeout", XYTIMO, 0 ! 90: }; ! 91: int nsrtab = (sizeof(srtab) / sizeof(struct keytab)); ! 92: ! 93: /* Flow Control */ ! 94: ! 95: struct keytab flotab[] = { ! 96: "none", 0, 0, ! 97: "xon/xoff", 1, 0 ! 98: }; ! 99: int nflo = (sizeof(flotab) / sizeof(struct keytab)); ! 100: ! 101: /* Handshake characters */ ! 102: ! 103: struct keytab hshtab[] = { ! 104: "bell", 007, 0, ! 105: "cr", 015, 0, ! 106: "esc", 033, 0, ! 107: "lf", 012, 0, ! 108: "none", 999, 0, /* (can't use negative numbers) */ ! 109: "xoff", 023, 0, ! 110: "xon", 021, 0 ! 111: }; ! 112: int nhsh = (sizeof(hshtab) / sizeof(struct keytab)); ! 113: ! 114: struct keytab fntab[] = { /* File naming */ ! 115: "converted", 1, 0, ! 116: "literal", 0, 0 ! 117: }; ! 118: ! 119: struct keytab fttab[] = { /* File types */ ! 120: "binary", 1, 0, ! 121: "text", 0, 0 ! 122: }; ! 123: ! 124: extern struct keytab mdmtab[] ; /* Modem types (in module ckudia.c) */ ! 125: extern int nmdm; ! 126: ! 127: /* Parity keyword table */ ! 128: ! 129: struct keytab partab[] = { ! 130: "even", 'e', 0, ! 131: "mark", 'm', 0, ! 132: "none", 0, 0, ! 133: "odd", 'o', 0, ! 134: "space", 's', 0 ! 135: }; ! 136: int npar = (sizeof(partab) / sizeof(struct keytab)); ! 137: ! 138: ! 139: /* On/Off table */ ! 140: ! 141: struct keytab onoff[] = { ! 142: "off", 0, 0, ! 143: "on", 1, 0 ! 144: }; ! 145: ! 146: /* Incomplete File Disposition table */ ! 147: ! 148: struct keytab ifdtab[] = { ! 149: "discard", 0, 0, ! 150: "keep", 1, 0 ! 151: }; ! 152: ! 153: /* D O P R M -- Set a parameter. */ ! 154: /* ! 155: Returns: ! 156: -2: illegal input ! 157: -1: reparse needed ! 158: 0: success ! 159: */ ! 160: doprm(xx) int xx; { ! 161: int x, y, z; ! 162: char *s; ! 163: ! 164: switch (xx) { ! 165: ! 166: ! 167: case XYEOL: /* These have all been moved to set send/receive... */ ! 168: case XYLEN: /* Let the user know what to do. */ ! 169: case XYMARK: ! 170: case XYNPAD: ! 171: case XYPADC: ! 172: case XYTIMO: ! 173: printf("...Use 'set send' or 'set receive' instead.\n"); ! 174: printf("Type 'help set send' or 'help set receive' for more info.\n"); ! 175: return(0); ! 176: ! 177: case XYIFD: /* Incomplete file disposition */ ! 178: if ((y = cmkey(ifdtab,2,"","discard")) < 0) return(y); ! 179: if ((x = cmcfm()) < 0) return(x); ! 180: keep = y; ! 181: return(0); ! 182: ! 183: case XYLINE: ! 184: if ((x = cmtxt("Device name",dftty,&s)) < 0) return(x); ! 185: ttclos(); /* close old line, if any was open */ ! 186: ! 187: x = strcmp(s,dftty) ? -1 : dfloc; /* Maybe let ttopen figure it out... */ ! 188: if (ttopen(s,&x,mdmtyp) < 0 ) { /* Can we open the new line? */ ! 189: perror("Sorry, can't open line"); ! 190: return(-2); /* If not, give bad return */ ! 191: } ! 192: if (x > -1) local = x; /* Set local/remote status. */ ! 193: strcpy(ttname,s); /* OK, copy name into real place. */ ! 194: if (!local) speed = -1; /* If remote, say speed unknown. */ ! 195: debug(F111,"set line ",ttname,local); ! 196: return(0); ! 197: ! 198: case XYCHKT: ! 199: if ((y = cmkey(blktab,3,"","1")) < 0) return(y); ! 200: if ((x = cmcfm()) < 0) return(x); ! 201: bctr = y; ! 202: return(0); ! 203: ! 204: case XYDEBU: ! 205: return(seton(&deblog)); ! 206: ! 207: case XYDELA: ! 208: y = cmnum("Number of seconds before starting to send","5",10,&x); ! 209: debug(F101,"XYDELA: y","",y); ! 210: return(setnum(&delay,x,y)); ! 211: ! 212: case XYDUPL: ! 213: if ((y = cmkey(dpxtab,2,"","full")) < 0) return(y); ! 214: if ((x = cmcfm()) < 0) return(x); ! 215: duplex = y; ! 216: return(0); ! 217: ! 218: case XYESC: ! 219: y = cmnum("Decimal ASCII code for escape character","",10,&x); ! 220: return(setcc(&escape,x,y)); ! 221: ! 222: case XYFILE: ! 223: if ((y = cmkey(filtab,nfilp,"File parameter","")) < 0) return(y); ! 224: switch (y) { ! 225: int z; ! 226: case XYFILD: /* Display */ ! 227: y = seton(&z); ! 228: if (y < 0) return(y); ! 229: quiet = !z; ! 230: return(0); ! 231: ! 232: case XYFILN: /* Names */ ! 233: if ((x = cmkey(fntab,2,"how to handle filenames","converted")) < 0) ! 234: return(x); ! 235: if ((z = cmcfm()) < 0) return(z); ! 236: fncnv = x; ! 237: return(0); ! 238: ! 239: case XYFILT: /* Type */ ! 240: if ((x = cmkey(fttab,2,"type of file","text")) < 0) ! 241: return(x); ! 242: if ((z = cmcfm()) < 0) return(z); ! 243: binary = x; ! 244: return(0); ! 245: ! 246: case XYFILW: /* Warning/Write-Protect */ ! 247: return(seton(&warn)); ! 248: ! 249: default: ! 250: printf("?unexpected file parameter\n"); ! 251: return(-2); ! 252: } ! 253: ! 254: case XYFLOW: /* Flow control */ ! 255: if ((y = cmkey(flotab,nflo,"","xon/xoff")) < 0) return(y); ! 256: if ((x = cmcfm()) < 0) return(x); ! 257: flow = y; ! 258: return(0); ! 259: ! 260: case XYHAND: /* Handshake */ ! 261: if ((y = cmkey(hshtab,nhsh,"","none")) < 0) return(y); ! 262: if ((x = cmcfm()) < 0) return(x); ! 263: turn = (y > 0127) ? 0 : 1 ; ! 264: turnch = y; ! 265: return(0); ! 266: ! 267: case XYMODM: ! 268: if ((x=cmkey(mdmtab,nmdm,"type of modem, direct means none","direct")) < 0) ! 269: return(x); ! 270: if ((z = cmcfm()) < 0) return(z); ! 271: mdmtyp = x; ! 272: return(0); ! 273: ! 274: case XYPARI: /* Parity */ ! 275: if ((y = cmkey(partab,npar,"","none")) < 0) return(y); ! 276: if ((x = cmcfm()) < 0) return(x); ! 277: ! 278: /* If parity not none, then we also want 8th-bit prefixing */ ! 279: ! 280: if (parity = y) ebqflg = 1; else ebqflg = 0; ! 281: return(0); ! 282: ! 283: case XYPROM: ! 284: if ((x = cmtxt("Program's command prompt","C-Kermit>",&s)) < 0) return(x); ! 285: if (*s == '\42') { /* Quoted string? */ ! 286: x = strlen(s) - 1; /* Yes, strip quotes. */ ! 287: if (*(s+x) == '\42') /* This allows leading or trailing */ ! 288: *(s+x) = '\0'; /* blanks. */ ! 289: s++; ! 290: } ! 291: cmsetp(s); ! 292: return(0); ! 293: ! 294: ! 295: /* SET SEND/RECEIVE... */ ! 296: ! 297: case XYRECV: ! 298: case XYSEND: ! 299: if (xx == XYRECV) ! 300: strcpy(line,"Parameter for inbound packets"); ! 301: else ! 302: strcpy(line,"Parameter for outbound packets"); ! 303: ! 304: if ((y = cmkey(srtab,nsrtab,line,"")) < 0) return(y); ! 305: switch (y) { ! 306: ! 307: case XYEOL: ! 308: y = cmnum("Decimal ASCII code for packet terminator","0",10,&x); ! 309: if ((y = setcc(&z,x,y)) < 0) return(y); ! 310: if (xx == XYRECV) eol = z; else seol = z; ! 311: return(y); ! 312: ! 313: case XYLEN: ! 314: y = cmnum("Maximum number of characters in a packet","90",10,&x); ! 315: if ((y = setnum(&z,x,y)) < 0) return(y); ! 316: if (xx == XYRECV) { /* Receive... */ ! 317: rpsiz = z; /* Just set it. */ ! 318: } else { /* Send... */ ! 319: spsiz = z; /* Set it and flag that it was set */ ! 320: spsizf = 1; /* to allow overriding Send-Init. */ ! 321: } ! 322: return(y); ! 323: ! 324: case XYMARK: ! 325: y = cmnum("Decimal ASCII code for packet-start character","1",10,&x); ! 326: if ((y = setcc(&z,x,y)) < 0) return(y); ! 327: if (xx == XYRECV) stchr = z; else mystch = z; ! 328: return(y); ! 329: ! 330: case XYNPAD: /* Padding */ ! 331: y = cmnum("How many padding characters for inbound packets","0",10,&x); ! 332: if ((y = setnum(&z,x,y)) < 0) return(y); ! 333: if (xx == XYRECV) mypadn = z; else npad = z; ! 334: return(y); ! 335: ! 336: case XYPADC: /* Pad character */ ! 337: y = cmnum("Decimal ASCII code for inbound pad character","0",10,&x); ! 338: if ((y = setcc(&z,x,y)) < 0) return(y); ! 339: if (xx == XYRECV) mypadc = z; else padch = z; ! 340: return(y); ! 341: ! 342: case XYTIMO: ! 343: y = cmnum("Interpacket timeout interval","5",10,&x); ! 344: if ((y = setnum(&z,x,y)) < 0) return(y); ! 345: if (xx == XYRECV) { ! 346: timef = 1; ! 347: timint = z; ! 348: } else rtimo = z; ! 349: return(y); ! 350: ! 351: } ! 352: ! 353: case XYSPEE: ! 354: if (!local) { ! 355: printf("\nSpeed setting can only be done on an external line\n"); ! 356: printf("You must 'set line' before issuing this command\n"); ! 357: return(0); ! 358: } ! 359: lp = line; ! 360: sprintf(lp,"Baud rate for %s",ttname); ! 361: if ((y = cmnum(line,"",10,&x)) < 0) return(y); ! 362: if (y = (cmcfm()) < 0) return(y); ! 363: y = chkspd(x); ! 364: if (y < 0) ! 365: printf("?Unsupported line speed - %d\n",x); ! 366: else { ! 367: speed = y; ! 368: printf("%s: %d baud\n",ttname,speed); ! 369: } ! 370: return(0); ! 371: ! 372: default: ! 373: if ((x = cmcfm()) < 0) return(x); ! 374: printf("Not working yet - %s\n",cmdbuf); ! 375: return(0); ! 376: } ! 377: } ! 378: ! 379: /* C H K S P D -- Check if argument is a valid baud rate */ ! 380: ! 381: chkspd(x) int x; { ! 382: switch (x) { ! 383: case 0: ! 384: case 110: ! 385: case 150: ! 386: case 300: ! 387: case 600: ! 388: case 1200: ! 389: case 1800: ! 390: case 2400: ! 391: case 4800: ! 392: case 9600: ! 393: return(x); ! 394: default: ! 395: return(-1); ! 396: } ! 397: } ! 398: ! 399: /* S E T O N -- Parse on/off (default on), set parameter to result */ ! 400: ! 401: seton(prm) int *prm; { ! 402: int x, y; ! 403: if ((y = cmkey(onoff,2,"","on")) < 0) return(y); ! 404: if ((x = cmcfm()) < 0) return(x); ! 405: *prm = y; ! 406: return(0); ! 407: } ! 408: ! 409: /* S E T N U M -- Set parameter to result of cmnum() parse. */ ! 410: /* ! 411: Call with x - number from cnum parse, y - return code from cmnum ! 412: */ ! 413: setnum(prm,x,y) int x, y, *prm; { ! 414: debug(F101,"setnum","",y); ! 415: if (y < 0) return(y); ! 416: if (x > 94) { ! 417: printf("\n?Sorry, 94 is the maximum\n"); ! 418: return(-2); ! 419: } ! 420: if ((y = cmcfm()) < 0) return(y); ! 421: *prm = x; ! 422: return(0); ! 423: } ! 424: ! 425: /* S E T C C -- Set parameter to an ASCII control character value. */ ! 426: ! 427: setcc(prm,x,y) int x, y, *prm; { ! 428: if (y < 0) return(y); ! 429: if ((x > 037) && (x != 0177)) { ! 430: printf("\n?Not in ASCII control range - %d\n",x); ! 431: return(-2); ! 432: } ! 433: if ((y = cmcfm()) < 0) return(y); ! 434: *prm = x; ! 435: return(0); ! 436: } ! 437: ! 438: /* D O R M T -- Do a remote command */ ! 439: ! 440: dormt(xx) int xx; { ! 441: int x; ! 442: char *s, sbuf[50], *s2; ! 443: ! 444: if (xx < 0) return(xx); ! 445: switch (xx) { ! 446: ! 447: case XZCWD: /* CWD */ ! 448: if ((x = cmtxt("Remote directory name","",&s)) < 0) return(x); ! 449: debug(F111,"XZCWD: ",s,x); ! 450: *sbuf = NUL; ! 451: s2 = sbuf; ! 452: if (*s != NUL) { /* If directory name given, */ ! 453: /* get password on separate line. */ ! 454: if (tlevel > -1) { /* From take file... */ ! 455: ! 456: *line = NUL; ! 457: if (fgets(sbuf,50,tfile[tlevel]) == NULL) ! 458: ermsg("take file ends prematurely in 'remote cwd'"); ! 459: debug(F110," pswd from take file",s2,0); ! 460: ! 461: } else { /* From terminal... */ ! 462: ! 463: printf(" Password: "); /* get a password */ ! 464: while (((x = getchar()) != NL) && (x != CR)) { /* with no echo */ ! 465: if ((x &= 0177) == '?') { ! 466: printf("? Password of remote directory\n Password: "); ! 467: s2 = sbuf; ! 468: *sbuf = NUL; ! 469: } ! 470: else if (x == ESC) /* Mini command line editor... */ ! 471: putchar(BEL); ! 472: else if (x == BS || x == 0177) ! 473: s2--; ! 474: else if (x == 025) { ! 475: s2 = sbuf; ! 476: *sbuf = NUL; ! 477: } ! 478: else ! 479: *s2++ = x; ! 480: } ! 481: *s2 = NUL; ! 482: putchar('\n'); ! 483: } ! 484: s2 = sbuf; ! 485: } else s2 = ""; ! 486: debug(F110," password",s2,0); ! 487: sstate = setgen('C',s,s2,""); ! 488: return(0); ! 489: ! 490: case XZDEL: /* Delete */ ! 491: if ((x = cmtxt("Name of remote file(s) to delete","",&s)) < 0) return(x); ! 492: return(sstate = rfilop(s,'E')); ! 493: ! 494: case XZDIR: /* Directory */ ! 495: if ((x = cmtxt("Remote directory or file specification","",&s)) < 0) ! 496: return(x); ! 497: return(sstate = setgen('D',s,"","")); ! 498: ! 499: case XZHLP: /* Help */ ! 500: if (x = (cmcfm()) < 0) return(x); ! 501: sstate = setgen('H',"","",""); ! 502: return(0); ! 503: ! 504: case XZHOS: /* Host */ ! 505: if ((x = cmtxt("Command for remote system","",&cmarg)) < 0) return(x); ! 506: return(sstate = 'c'); ! 507: ! 508: case XZPRI: /* Print */ ! 509: if ((x = cmtxt("Remote file(s) to print on remote printer","",&s)) < 0) ! 510: return(x); ! 511: return(sstate = rfilop(s,'S')); ! 512: ! 513: case XZSPA: /* Space */ ! 514: if ((x = cmtxt("Confirm, or remote directory name","",&s)) < 0) return(x); ! 515: return(sstate = setgen('U',s,"","")); ! 516: ! 517: case XZTYP: /* Type */ ! 518: if ((x = cmtxt("Remote file specification","",&s)) < 0) return(x); ! 519: return(sstate = rfilop(s,'T')); ! 520: ! 521: case XZWHO: ! 522: if ((x = cmtxt("Remote user name, or carriage return","",&s)) < 0) ! 523: return(x); ! 524: return(sstate = setgen('W',s,"","")); ! 525: ! 526: default: ! 527: if (x = (cmcfm()) < 0) return(x); ! 528: printf("not working yet - %s\n",cmdbuf); ! 529: return(-2); ! 530: } ! 531: } ! 532: ! 533: ! 534: ! 535: /* R F I L O P -- Remote File Operation */ ! 536: ! 537: rfilop(s,t) char *s, t; { ! 538: if (*s == NUL) { ! 539: printf("?File specification required\n"); ! 540: return(-2); ! 541: } ! 542: debug(F111,"rfilop",s,t); ! 543: return(setgen(t,s,"","")); ! 544: } ! 545: ! 546: /* S C R E E N -- Screen display function */ ! 547: ! 548: /* screen(f,c,n,s) ! 549: f - argument descriptor ! 550: c - a character or small integer ! 551: n - a long integer ! 552: s - a string. ! 553: Fill in this routine with the appropriate display update for the system. ! 554: This version is for a dumb tty. ! 555: */ ! 556: screen(f,c,n,s) int f; long n; char c; char *s; { ! 557: static int p = 0; /* Screen position */ ! 558: int len; /* Length of string */ ! 559: char buf[80]; /* Output buffer */ ! 560: len = strlen(s); /* Length of string */ ! 561: if (!displa || quiet) return; /* No update if display flag off */ ! 562: ! 563: switch (f) { ! 564: ! 565: case SCR_FN: /* filename */ ! 566: conoll(""); conol(s); conoc(SP); p = len + 1; return; ! 567: ! 568: case SCR_AN: /* as-name */ ! 569: if (p + len > 75) { conoll(""); p = 0; } ! 570: conol("=> "); conol(s); if ((p += (len + 3)) > 78) { conoll(""); p = 0; } ! 571: return; ! 572: ! 573: case SCR_FS: /* file-size */ ! 574: sprintf(buf,", Size: %ld",n); conoll(buf); p = 0; return; ! 575: ! 576: case SCR_XD: /* x-packet data */ ! 577: conoll(""); conoll(s); p = 0; return; ! 578: ! 579: case SCR_ST: /* File status */ ! 580: switch (c) { ! 581: case ST_OK: /* Transferred OK */ ! 582: if ((p += 5) > 78) { conoll(""); p = 0; } ! 583: conoll(" [OK]"); p += 5; return; ! 584: ! 585: case ST_DISC: /* Discarded */ ! 586: if ((p += 12) > 78) { conoll(""); p = 0; } ! 587: conoll(" [discarded]"); p += 12; return; ! 588: ! 589: case ST_INT: /* Interrupted */ ! 590: if ((p += 14) > 78) { conoll(""); p = 0; } ! 591: conoll(" [interrupted]"); p += 14; return; ! 592: ! 593: case ST_SKIP: /* Skipped */ ! 594: conoll(""); ! 595: conol("Skipping "); conoll(s); p = 0; ! 596: return; ! 597: ! 598: default: ! 599: conoll("*** screen() called with bad status ***"); p = 0; return; ! 600: } ! 601: ! 602: case SCR_PN: /* Packet number */ ! 603: sprintf(buf,"%s: %ld",s,n); conol(buf); p += strlen(buf); return; ! 604: ! 605: case SCR_PT: /* Packet type or pseudotype */ ! 606: if (c == 'Y') return; /* Don't bother with ACKs */ ! 607: if (c == 'D') { /* Only show every 4th data packet */ ! 608: if (n % 4) return; ! 609: c = '.'; ! 610: } ! 611: if (p++ > 78) { /* If near right margin, */ ! 612: conoll(""); /* Start new line */ ! 613: p = 0; /* and reset counter. */ ! 614: } ! 615: conoc(c); /* Display the character. */ ! 616: return; ! 617: ! 618: case SCR_TC: /* transaction complete */ ! 619: conoc(BEL); return; ! 620: ! 621: case SCR_EM: /* Error message */ ! 622: conoll(""); conoc('?'); conoll(s); p = 0; return; /* +1 */ ! 623: ! 624: case SCR_WM: /* Warning message */ ! 625: conoll(""); conoll(s); p = 0; return; ! 626: ! 627: case SCR_TU: /* Undelimited text */ ! 628: if ((p += len) > 78) { conoll(""); p = len; } ! 629: conol(s); return; ! 630: ! 631: case SCR_TN: /* Text delimited at beginning */ ! 632: conoll(""); conol(s); p = len; return; ! 633: ! 634: case SCR_TZ: /* Text delimited at end */ ! 635: if ((p += len) > 78) { conoll(""); p = len; } ! 636: conoll(s); return; ! 637: ! 638: case SCR_QE: /* Quantity equals */ ! 639: sprintf(buf,"%s: %ld",s,n); ! 640: conoll(buf); p = 0; return; ! 641: ! 642: default: ! 643: conoll("*** screen() called with bad object ***"); p = 0; return; ! 644: } ! 645: } ! 646: ! 647: /* I N T M S G -- Issue message about terminal interrupts */ ! 648: ! 649: intmsg(n) long n; { ! 650: extern char *chstr(); ! 651: char buf[80]; ! 652: ! 653: if ((!displa) || (quiet)) return; ! 654: #ifdef UXIII ! 655: (void) conchk(); /* clear out pending escape-signals in ckxbsd.c */ ! 656: #endif ! 657: if (n == 1) { ! 658: #ifdef UXIII ! 659: /* we need to signal before kb input */ ! 660: sprintf(buf,"Type escape (%s) followed by:",chstr(escape)); ! 661: screen(SCR_TN,0,0l,buf); ! 662: #endif ! 663: screen(SCR_TN,0,0l,"CTRL-F to cancel file, CTRL-R to resend current packet"); ! 664: screen(SCR_TN,0,0l,"CTRL-B to cancel batch, CTRL-A for status report: "); ! 665: } ! 666: else screen(SCR_TU,0,0l," "); ! 667: } ! 668: ! 669: /* C H K I N T -- Check for console interrupts */ ! 670: ! 671: /*** should rework not to destroy typeahead ***/ ! 672: ! 673: chkint() { ! 674: int ch, cn; ! 675: ! 676: if ((!local) || (quiet)) return(0); /* Only do this if local & not quiet */ ! 677: cn = conchk(); /* Any input waiting? */ ! 678: debug(F101,"conchk","",cn); ! 679: ! 680: while (cn > 0) { /* Yes, read it. */ ! 681: cn--; ! 682: /* give read 5 seconds for interrupt character */ ! 683: if ((ch = coninc(5)) < 0) return(0); ! 684: switch (ch & 0177) { ! 685: case 0001: /* CTRL-A */ ! 686: screen(SCR_TN,0,0l,"^A Status report:"); ! 687: screen(SCR_TN,0,0l," file type: "); ! 688: if (binary) screen(SCR_TZ,0,0l,"binary"); ! 689: else screen(SCR_TZ,0,0l,"text"); ! 690: screen(SCR_QE,0,(long)filcnt," file number"); ! 691: screen(SCR_QE,0,(long)ffc, " characters "); ! 692: screen(SCR_QE,0,(long)bctu, " block check"); ! 693: screen(SCR_QE,0,(long)rptflg," compression"); ! 694: screen(SCR_QE,0,(long)ebqflg," 8th-bit prefixing"); ! 695: continue; ! 696: case 0002: /* CTRL-B */ ! 697: screen(SCR_TN,0,0l,"^B - Cancelling Batch "); ! 698: czseen = 1; ! 699: continue; ! 700: case 0006: /* CTRL-F */ ! 701: screen(SCR_TN,0,0l,"^F - Cancelling File "); ! 702: cxseen = 1; ! 703: continue; ! 704: case 0022: /* CTRL-R */ ! 705: screen(SCR_TN,0,0l,"^R - Resending "); ! 706: resend(); ! 707: return(1); ! 708: default: /* Anything else, just ignore */ ! 709: screen(SCR_TU,0,0l," [Ignored] "); ! 710: continue; ! 711: } ! 712: } ! 713: return(0); ! 714: } ! 715: ! 716: /* D E B U G -- Enter a record in the debugging log */ ! 717: ! 718: /* ! 719: Call with a format, two strings, and a number: ! 720: f - Format, a bit string in range 0-7. ! 721: If bit x is on, then argument number x is printed. ! 722: s1 - String, argument number 1. If selected, printed as is. ! 723: s2 - String, argument number 2. If selected, printed in brackets. ! 724: n - Int, argument 3. If selected, printed preceded by equals sign. ! 725: ! 726: f=0 is special: print s1,s2, and interpret n as a char. ! 727: */ ! 728: #ifdef DEBUG ! 729: debug(f,s1,s2,n) int f, n; char *s1, *s2; { ! 730: static char s[200]; ! 731: char *sp = s; ! 732: ! 733: if (!deblog) return; /* If no debug log, don't */ ! 734: switch (f) { ! 735: case F000: /* 0, print both strings, */ ! 736: sprintf(sp,"%s%s%c\n",s1,s2,n); /* and interpret n as a char */ ! 737: zsout(ZDFILE,s); ! 738: break; ! 739: case F001: /* 1, "=n" */ ! 740: sprintf(sp,"=%d\n",n); ! 741: zsout(ZDFILE,s); ! 742: break; ! 743: case F010: /* 2, "[s2]" */ ! 744: sprintf(sp,"[%s]\n",s2); ! 745: zsout(ZDFILE,""); ! 746: break; ! 747: case F011: /* 3, "[s2]=n" */ ! 748: sprintf(sp,"[%s]=%d\n",s2,n); ! 749: zsout(ZDFILE,s); ! 750: break; ! 751: case F100: /* 4, "s1" */ ! 752: zsoutl(ZDFILE,s1); ! 753: break; ! 754: case F101: /* 5, "s1=n" */ ! 755: sprintf(sp,"%s=%d\n",s1,n); ! 756: zsout(ZDFILE,s); ! 757: break; ! 758: case F110: /* 6, "s1[s2]" */ ! 759: sprintf(sp,"%s[%s]\n",s1,s2); ! 760: zsout(ZDFILE,s); ! 761: break; ! 762: case F111: /* 7, "s1[s2]=n" */ ! 763: sprintf(sp,"%s[%s]=%d\n",s1,s2,n); ! 764: zsout(ZDFILE,s); ! 765: break; ! 766: default: ! 767: sprintf(sp,"\n?Invalid format for debug() - %d\n",n); ! 768: zsout(ZDFILE,s); ! 769: } ! 770: } ! 771: #endif ! 772: ! 773: #ifdef TLOG ! 774: /* T L O G -- Log a record in the transaction file */ ! 775: /* ! 776: Call with a format and 3 arguments: two strings and a number: ! 777: f - Format, a bit string in range 0-7, bit x is on, arg #x is printed. ! 778: s1,s2 - String arguments 1 and 2. ! 779: n - Int, argument 3. ! 780: */ ! 781: tlog(f,s1,s2,n) int f; long n; char *s1, *s2; { ! 782: static char s[200]; ! 783: char *sp = s; int x; ! 784: ! 785: if (!tralog) return; /* If no transaction log, don't */ ! 786: switch (f) { ! 787: case F000: /* 0 (special) "s1 n s2" */ ! 788: sprintf(sp,"%s %ld %s\n",s1,n,s2); ! 789: zsout(ZTFILE,s); ! 790: break; ! 791: case F001: /* 1, " n" */ ! 792: sprintf(sp," %ld\n",n); ! 793: zsout(ZTFILE,s); ! 794: break; ! 795: case F010: /* 2, "[s2]" */ ! 796: x = strlen(s2); ! 797: if (s2[x] == '\n') s2[x] = '\0'; ! 798: sprintf(sp,"[%s]\n",s2); ! 799: zsout(ZTFILE,""); ! 800: break; ! 801: case F011: /* 3, "[s2] n" */ ! 802: x = strlen(s2); ! 803: if (s2[x] == '\n') s2[x] = '\0'; ! 804: sprintf(sp,"[%s] %ld\n",s2,n); ! 805: zsout(ZTFILE,s); ! 806: break; ! 807: case F100: /* 4, "s1" */ ! 808: zsoutl(ZTFILE,s1); ! 809: break; ! 810: case F101: /* 5, "s1: n" */ ! 811: sprintf(sp,"%s: %ld\n",s1,n); ! 812: zsout(ZTFILE,s); ! 813: break; ! 814: case F110: /* 6, "s1 s2" */ ! 815: x = strlen(s2); ! 816: if (s2[x] == '\n') s2[x] = '\0'; ! 817: sprintf(sp,"%s %s\n",s1,s2); ! 818: zsout(ZTFILE,s); ! 819: break; ! 820: case F111: /* 7, "s1 s2: n" */ ! 821: x = strlen(s2); ! 822: if (s2[x] == '\n') s2[x] = '\0'; ! 823: sprintf(sp,"%s %s: %ld\n",s1,s2,n); ! 824: zsout(ZTFILE,s); ! 825: break; ! 826: default: ! 827: sprintf(sp,"\n?Invalid format for tlog() - %ld\n",n); ! 828: zsout(ZTFILE,s); ! 829: } ! 830: } ! 831: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.