|
|
1.1 ! root 1: #ifndef NOICP ! 2: ! 3: /* C K U U S 7 -- "User Interface" for Unix Kermit, part 7 */ ! 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, copy, or ! 11: redistribute this software so long as it is not sold for profit, provided this ! 12: copyright notice is retained. ! 13: */ ! 14: ! 15: /* ! 16: This file created from parts of ckuus3.c, which became to big for ! 17: Mark Williams Coherent compiler to handle. ! 18: */ ! 19: ! 20: /* ! 21: Definitions here supersede those from system include files. ! 22: */ ! 23: #include "ckcdeb.h" /* Debugging & compiler things */ ! 24: #include "ckcasc.h" /* ASCII character symbols */ ! 25: #include "ckcker.h" /* Kermit application definitions */ ! 26: #include "ckcxla.h" /* Character set translation */ ! 27: #include "ckcnet.h" /* Network symbols */ ! 28: #include "ckuusr.h" /* User interface symbols */ ! 29: ! 30: static int x, y = 0, z; ! 31: static char *s; ! 32: ! 33: static int mdmsav = -1; /* Save modem type around network */ ! 34: static int oldplex = -1; /* Duplex holder around network */ ! 35: ! 36: extern int success, nfilp, fmask, quiet, fncnv, frecl, nfttyp, binary, warn; ! 37: extern int cmask, maxrps, wslotr, bigsbsiz, bigrbsiz, urpsiz, rpsiz, spsiz; ! 38: extern int spsizr, spsizf, maxsps, spmax, pflag, bctr, npad, timef, timint; ! 39: extern int pkttim, rtimo, local, nfils, displa, atcapr, nettype; ! 40: extern int mdmtyp, duplex, dfloc, network, cdtimo, fncact, mypadn; ! 41: extern int tnlm, sosi, tlevel, lf_opts, backgrd; ! 42: extern int ! 43: atenci, atenco, atdati, atdato, atleni, atleno, atblki, atblko, ! 44: attypi, attypo, atsidi, atsido, atsysi, atsyso, atdisi, atdiso; ! 45: ! 46: extern long speed; ! 47: ! 48: extern CHAR sstate, eol, seol, stchr, mystch, mypadc, padch; ! 49: ! 50: extern char *cmarg, *cmarg2, *dftty; ! 51: ! 52: extern char tmpbuf[], *tp, *lp; /* Temporary buffer & pointers */ ! 53: #ifndef NOFRILLS ! 54: extern char optbuf[]; /* Buffer for MAIL or PRINT options */ ! 55: extern int rprintf; /* REMOTE PRINT flag */ ! 56: #endif /* NOFRILLS */ ! 57: extern char ttname[]; ! 58: ! 59: extern struct keytab onoff[], filtab[], fttab[]; ! 60: ! 61: #ifdef DCMDBUF ! 62: extern char *cmdbuf; /* Command buffer */ ! 63: extern char *line; ! 64: #else ! 65: extern char cmdbuf[]; /* Command buffer */ ! 66: extern char line[]; /* Character buffer for anything */ ! 67: #endif /* DCMDBUF */ ! 68: ! 69: #ifndef NOCSETS ! 70: extern struct keytab fcstab[]; /* For 'set file character-set' */ ! 71: extern struct keytab ttcstab[]; ! 72: extern int nfilc, fcharset, ntermc, tcsr, tcsl; ! 73: #endif /* NOCSETS */ ! 74: ! 75: #ifndef NOSPL ! 76: extern int cmdlvl; /* Overall command level */ ! 77: #endif /* NOSPL */ ! 78: ! 79: #ifdef TNCODE ! 80: extern int tn_init; ! 81: #endif /* TNCODE */ ! 82: ! 83: #ifdef SUNX25 ! 84: extern int revcall, closgr, cudata, nx25, npadx3; ! 85: extern char udata[MAXCUDATA]; ! 86: extern CHAR padparms[MAXPADPARMS+1]; ! 87: extern struct keytab x25tab[], padx3tab[]; ! 88: #endif /* SUNX25 */ ! 89: ! 90: #ifndef NODIAL ! 91: extern int dialhng, dialtmo, dialksp, dialdpy, dialmnp; ! 92: extern int mdmspd; ! 93: extern char *dialini; ! 94: ! 95: struct keytab dialtab[] = { ! 96: "display", XYDDPY, 0, ! 97: "hangup", XYDHUP, 0, ! 98: "init-string", XYDINI, 0, ! 99: "kermit-spoof", XYDKSP, 0, ! 100: "mnp-enable", XYDMNP, 0, ! 101: "speed-matching", XYDSPD, 0, ! 102: "timeout", XYDTMO, 0 ! 103: }; ! 104: int ndial = (sizeof(dialtab) / sizeof(struct keytab)); ! 105: #endif /* NODIAL */ ! 106: ! 107: #ifndef NOXMIT ! 108: /* set transmit */ ! 109: #define XMITF 0 ! 110: #define XMITL 1 ! 111: #define XMITP 2 ! 112: #define XMITE 3 ! 113: #define XMITX 4 ! 114: #define XMITS 5 ! 115: #define XMITW 6 ! 116: ! 117: #ifndef NOXMIT ! 118: #define XMBUFL 50 ! 119: extern int xmitf, xmitl, xmitp, xmitx, xmits, xmitw; ! 120: char xmitbuf[XMBUFL+1] = { NUL }; /* TRANSMIT eof string */ ! 121: #endif /* NOXMIT */ ! 122: ! 123: struct keytab xmitab[] = { ! 124: "echo", XMITX, 0, ! 125: "eof", XMITE, 0, ! 126: "fill", XMITF, 0, ! 127: "linefeed", XMITL, 0, ! 128: "locking-shift", XMITS, 0, ! 129: "pause", XMITW, 0, ! 130: "prompt", XMITP, 0 ! 131: }; ! 132: int nxmit = (sizeof(xmitab) / sizeof(struct keytab)); ! 133: #endif /* NOXMIT */ ! 134: ! 135: /* For SET FILE COLLISION */ ! 136: /* Some of the following may be possible for some C-Kermit implementations */ ! 137: /* but not others. Those that are not possible for your implementation */ ! 138: /* should be ifdef'd out. */ ! 139: ! 140: struct keytab colxtab[] = { /* SET FILE COLLISION options */ ! 141: "append", XYFX_A, 0, /* append to old file */ ! 142: #ifdef COMMENT ! 143: "ask", XYFX_Q, 0, /* ask what to do (not implemented) */ ! 144: #endif ! 145: "backup", XYFX_B, 0, /* rename old file */ ! 146: "discard", XYFX_D, 0, /* don't accept new file */ ! 147: "no-supersede", XYFX_D, CM_INV, /* ditto (MSK compatibility) */ ! 148: "overwrite", XYFX_X, 0, /* overwrite the old file == file warning off */ ! 149: "rename", XYFX_R, 0, /* rename the incoming file == file warning on */ ! 150: "update", XYFX_U, 0, /* replace if newer */ ! 151: }; ! 152: int ncolx = (sizeof(colxtab) / sizeof(struct keytab)); ! 153: ! 154: static struct keytab rfiltab[] = { /* for REMOTE SET FILE */ ! 155: "collision", XYFILX, 0, ! 156: "record-length", XYFILR, 0, ! 157: "type", XYFILT, 0 ! 158: }; ! 159: int nrfilp = (sizeof(rfiltab) / sizeof(struct keytab)); ! 160: ! 161: struct keytab fntab[] = { /* File naming */ ! 162: "converted", 1, 0, ! 163: "literal", 0, 0 ! 164: }; ! 165: ! 166: /* Terminal parameters table */ ! 167: struct keytab trmtab[] = { ! 168: "bytesize", XYTBYT, 0, ! 169: #ifndef NOCSETS ! 170: #ifdef OS2 ! 171: "color", XYTCOL, 0, ! 172: #endif /* OS2 */ ! 173: "character-set", XYTCS, 0, ! 174: #endif /* NOCSETS */ ! 175: "locking-shift", XYTSO, 0, ! 176: "newline-mode", XYTNL, 0 ! 177: #ifdef OS2PM ! 178: ,"type", XYTTYP, 0 ! 179: #endif /* OS2PM */ ! 180: }; ! 181: int ntrm = (sizeof(trmtab) / sizeof(struct keytab)); ! 182: ! 183: #ifdef OS2 ! 184: struct keytab ttycoltab[] = { ! 185: "help", 4, 0, ! 186: "normal", 0, 0, ! 187: "reverse", 1, 0, ! 188: "status", 3, 0, ! 189: "underlined", 2, 0 ! 190: }; ! 191: ! 192: int ncolors = 5; ! 193: struct keytab ttyclrtab[] = { ! 194: "black", 0, 0, ! 195: "blue", 1, 0, ! 196: "brown", 6, 0, ! 197: "cyan", 3, 0, ! 198: "dgray", 8, 0, ! 199: "green", 2, 0, ! 200: "lblue", 9, 0, ! 201: "lcyan", 11, 0, ! 202: "lgray", 7, 0, ! 203: "lgreen", 10, 0, ! 204: "lmagenta", 13, 0, ! 205: "lred", 12, 0, ! 206: "magenta", 5, 0, ! 207: "red", 4, 0, ! 208: "white", 15, 0, ! 209: "yellow", 14, 0 ! 210: }; ! 211: int nclrs = 16; ! 212: #endif /* OS2 */ ! 213: ! 214: #ifdef OS2PM ! 215: struct keytab ttyptab[] = { ! 216: "tek4014", 2, 0, ! 217: "vt100", 1, 0 ! 218: }; ! 219: int nttyp = 2; ! 220: #endif /* OS2PM */ ! 221: ! 222: /* #ifdef VMS */ ! 223: struct keytab fbtab[] = { /* Binary record types for VMS */ ! 224: "fixed", XYFT_B, 0, /* Fixed is normal for binary */ ! 225: "undefined", XYFT_U, 0 /* Undefined if they ask for it */ ! 226: }; ! 227: int nfbtyp = (sizeof(fbtab) / sizeof(struct keytab)); ! 228: /* #endif */ ! 229: ! 230: #ifdef VMS ! 231: struct keytab lbltab[] = { /* Labeled File info */ ! 232: "acl", LBL_ACL, 0, ! 233: "backup-date", LBL_BCK, 0, ! 234: "name", LBL_NAM, 0, ! 235: "owner", LBL_OWN, 0, ! 236: "path", LBL_PTH, 0 ! 237: }; ! 238: int nlblp = (sizeof(lbltab) / sizeof(struct keytab)); ! 239: #endif /* VMS */ ! 240: ! 241: ! 242: struct keytab rsrtab[] = { /* For REMOTE SET RECEIVE */ ! 243: "packet-length", XYLEN, 0, ! 244: "timeout", XYTIMO, 0 ! 245: }; ! 246: int nrsrtab = (sizeof(rsrtab) / sizeof(struct keytab)); ! 247: ! 248: /* Send/Receive Parameters */ ! 249: ! 250: struct keytab srtab[] = { ! 251: "end-of-packet", XYEOL, 0, ! 252: "packet-length", XYLEN, 0, ! 253: "pad-character", XYPADC, 0, ! 254: "padding", XYNPAD, 0, ! 255: "start-of-packet", XYMARK, 0, ! 256: "timeout", XYTIMO, 0 ! 257: }; ! 258: int nsrtab = (sizeof(srtab) / sizeof(struct keytab)); ! 259: ! 260: /* REMOTE SET */ ! 261: ! 262: struct keytab rmstab[] = { ! 263: "attributes", XYATTR, 0, ! 264: "block-check", XYCHKT, 0, ! 265: "file", XYFILE, 0, ! 266: "incomplete", XYIFD, 0, ! 267: "receive", XYRECV, 0, ! 268: "retry", XYRETR, 0, ! 269: "server", XYSERV, 0, ! 270: "transfer", XYXFER, 0, ! 271: "window", XYWIND, 0 ! 272: }; ! 273: int nrms = (sizeof(rmstab) / sizeof(struct keytab)); ! 274: ! 275: struct keytab attrtab[] = { ! 276: "all", AT_XALL, 0, ! 277: #ifdef COMMENT ! 278: "blocksize", AT_BLKS, 0, /* not used by UNIX or VMS */ ! 279: #endif ! 280: "character-set", AT_ENCO, 0, ! 281: "date", AT_DATE, 0, ! 282: "disposition", AT_DISP, 0, ! 283: "encoding", AT_ENCO, CM_INV, ! 284: "length", AT_LENK, 0, ! 285: "off", AT_ALLN, 0, ! 286: "on", AT_ALLY, 0, ! 287: #ifdef COMMENT ! 288: "os-specific", AT_SYSP, 0, /* not used by UNIX or VMS */ ! 289: #endif ! 290: "system-id", AT_SYSI, 0, ! 291: "type", AT_FTYP, 0, ! 292: }; ! 293: int natr = (sizeof(attrtab) / sizeof(struct keytab)); /* how many attributes */ ! 294: ! 295: #ifndef NOSPL ! 296: extern int indef, intime, incase, inecho; ! 297: struct keytab inptab [] = { /* SET INPUT parameters */ ! 298: "case", IN_CAS, 0, ! 299: "default-timeout", IN_DEF, CM_INV, ! 300: "echo", IN_ECH, 0, ! 301: "timeout-action", IN_TIM, 0 ! 302: }; ! 303: int ninp = (sizeof(inptab) / sizeof(struct keytab)); ! 304: ! 305: struct keytab intimt[] = { /* SET INPUT TIMEOUT parameters */ ! 306: "proceed", 0, 0, /* 0 = proceed */ ! 307: "quit", 1, 0 /* 1 = quit */ ! 308: }; ! 309: ! 310: struct keytab incast[] = { /* SET INPUT CASE parameters */ ! 311: "ignore", 0, 0, /* 0 = ignore */ ! 312: "observe", 1, 0 /* 1 = observe */ ! 313: }; ! 314: #endif /* NOSPL */ ! 315: ! 316: /* The following routines broken out of doprm() to give compilers a break. */ ! 317: ! 318: /* S E T O N -- Parse on/off (default on), set parameter to result */ ! 319: ! 320: int ! 321: seton(prm) int *prm; { ! 322: int x, y; ! 323: if ((y = cmkey(onoff,2,"","on",xxstring)) < 0) return(y); ! 324: if ((x = cmcfm()) < 0) return(x); ! 325: *prm = y; ! 326: return(1); ! 327: } ! 328: ! 329: /* S E T N U M -- Set parameter to result of cmnum() parse. */ ! 330: /* ! 331: Call with x - number from cnum parse, y - return code from cmnum ! 332: */ ! 333: int ! 334: setnum(prm,x,y,max) int x, y, *prm, max; { ! 335: extern int cmflgs; extern char atxbuf[]; ! 336: debug(F101,"setnum","",y); ! 337: if (y == -3) { ! 338: printf("\n?Value required\n"); ! 339: return(-9); ! 340: } ! 341: if (y == -2) { ! 342: printf("%s?Not a number: %s\n",cmflgs == 1 ? "" : "\n", atxbuf); ! 343: return(-9); ! 344: } ! 345: if (y < 0) return(y); ! 346: if (x > max) { ! 347: printf("?Sorry, %d is the maximum\n",max); ! 348: return(-9); ! 349: } ! 350: if ((y = cmcfm()) < 0) return(y); ! 351: *prm = x; ! 352: return(1); ! 353: } ! 354: ! 355: /* S E T C C -- Set parameter to an ASCII control character value. */ ! 356: ! 357: int ! 358: setcc(prm,x,y) int x, y, *prm; { ! 359: if (y == -3) { ! 360: printf("\n?Value required\n"); ! 361: return(-3); ! 362: } ! 363: if (y < 0) return(y); ! 364: if ((x > 037) && (x != 0177)) { ! 365: printf("\n?Not in ASCII control range - %d\n",x); ! 366: return(-2); ! 367: } ! 368: if ((y = cmcfm()) < 0) return(y); ! 369: *prm = x; ! 370: return(1); ! 371: } ! 372: ! 373: #ifndef NODIAL ! 374: int /* Set DIAL command options */ ! 375: setdial() { ! 376: if ((y = cmkey(dialtab,ndial,"","",xxstring)) < 0) return(y); ! 377: switch (y) { ! 378: case XYDHUP: /* hangup */ ! 379: return(success = seton(&dialhng)); ! 380: case XYDINI: /* init-string */ ! 381: if ((x = cmtxt("Modem dialer initialization string", ! 382: "",&s,xxstring)) < 0) ! 383: return(x); ! 384: if (dialini) { /* Free any previous string. */ ! 385: free(dialini); ! 386: dialini = (char *) 0; ! 387: } ! 388: if ((x = (int)strlen(s)) > 0) { ! 389: dialini = malloc(x + 1); /* Allocate space for it */ ! 390: strcpy(dialini,s); /* and make a safe copy. */ ! 391: } ! 392: return(success = 1); ! 393: case XYDKSP: /* Kermit-spoof */ ! 394: return(success = seton(&dialksp)); ! 395: case XYDTMO: /* Timeout */ ! 396: y = cmnum("Seconds to wait for call completion","",10,&x,xxstring); ! 397: return(success = setnum(&dialtmo,x,y,10000)); ! 398: case XYDDPY: /* Display */ ! 399: return(success = seton(&dialdpy)); ! 400: case XYDSPD: /* speed-matching */ ! 401: /* used to be speed-changing */ ! 402: if ((y = seton(&mdmspd)) < 0) return(y); ! 403: mdmspd = 1 - mdmspd; /* so here we reverse the meaning */ ! 404: return(success = 1); ! 405: case XYDMNP: /* MNP enable */ ! 406: return(success = seton(&dialmnp)); ! 407: default: ! 408: printf("?unexpected dial parameter\n"); ! 409: return(-2); ! 410: } ! 411: } ! 412: #endif /* NODIAL */ ! 413: ! 414: int ! 415: setfil(rmsflg) int rmsflg; { ! 416: if (rmsflg) { ! 417: if ((y = cmkey(rfiltab,nrfilp,"Remote file parameter","", ! 418: xxstring)) < 0) { ! 419: if (y == -3) { ! 420: printf("?Remote file parameter required\n"); ! 421: return(-9); ! 422: } else return(y); ! 423: } ! 424: } else { ! 425: if ((y = cmkey(filtab,nfilp,"File parameter","",xxstring)) < 0) ! 426: return(y); ! 427: } ! 428: switch (y) { ! 429: #ifdef COMMENT /* Not needed */ ! 430: case XYFILB: /* Blocksize */ ! 431: sprintf(tmpbuf,"%d",DBLKSIZ); ! 432: if ((y = cmnum("file block size",tmpbuf,10,&z,xxstring)) < 0) ! 433: return(y); ! 434: if ((x = cmcfm()) < 0) return(x); ! 435: if (rmsflg) { ! 436: sprintf(tmpbuf,"%d",z); ! 437: sstate = setgen('S', "311", tmpbuf, ""); ! 438: return((int) sstate); ! 439: } else { ! 440: fblksiz = z; ! 441: return(success = 1); ! 442: } ! 443: #endif /* COMMENT */ ! 444: ! 445: case XYFILS: /* Byte size */ ! 446: if ((y = cmnum("file byte size (7 or 8)","8",10,&z,xxstring)) < 0) ! 447: return(y); ! 448: if (z != 7 && z != 8) { ! 449: printf("\n?The choices are 7 and 8\n"); ! 450: return(0); ! 451: } ! 452: if ((y = cmcfm()) < 0) return(y); ! 453: if (z == 7) fmask = 0177; ! 454: else if (z == 8) fmask = 0377; ! 455: return(success = 1); ! 456: ! 457: #ifndef NOCSETS ! 458: case XYFILC: /* Character set */ ! 459: if ((x = cmkey(fcstab,nfilc,"local file code","ascii", xxstring)) < 0) ! 460: return(x); ! 461: if ((z = cmcfm()) < 0) return(z); ! 462: fcharset = x; ! 463: return(success = 1); ! 464: #endif /* NOCSETS */ ! 465: ! 466: case XYFILD: /* Display */ ! 467: y = seton(&z); ! 468: if (y < 0) return(y); ! 469: quiet = !z; ! 470: return(success = 1); ! 471: ! 472: case XYFILN: /* Names */ ! 473: if ((x = cmkey(fntab,2,"how to handle filenames","converted", ! 474: xxstring)) < 0) ! 475: return(x); ! 476: if ((z = cmcfm()) < 0) return(z); ! 477: fncnv = x; ! 478: return(success = 1); ! 479: ! 480: case XYFILR: /* Record length */ ! 481: sprintf(tmpbuf,"%d",DLRECL); ! 482: if ((y = cmnum("file record length",tmpbuf,10,&z,xxstring)) < 0) ! 483: return(y); ! 484: if ((x = cmcfm()) < 0) return(x); ! 485: if (rmsflg) { ! 486: sprintf(tmpbuf,"%d",z); ! 487: sstate = setgen('S', "312", tmpbuf, ""); ! 488: return((int) sstate); ! 489: } else { ! 490: frecl = z; ! 491: return(success = 1); ! 492: } ! 493: ! 494: #ifdef COMMENT ! 495: case XYFILO: /* Organization */ ! 496: if ((x = cmkey(forgtab,nforg,"file organization","sequential", ! 497: xxstring)) < 0) ! 498: return(x); ! 499: if ((y = cmcfm()) < 0) return(y); ! 500: if (rmsflg) { ! 501: sprintf(tmpbuf,"%d",x); ! 502: sstate = setgen('S', "314", tmpbuf, ""); ! 503: return((int) sstate); ! 504: } else { ! 505: forg = x; ! 506: return(success = 1); ! 507: } ! 508: #endif /* COMMENT */ ! 509: ! 510: #ifdef COMMENT /* Not needed */ ! 511: case XYFILF: /* Format */ ! 512: if ((x = cmkey(frectab,nfrec,"file record format","stream", ! 513: xxstring)) < 0) ! 514: return(x); ! 515: if ((y = cmcfm()) < 0) return(y); ! 516: if (rmsflg) { ! 517: sprintf(tmpbuf,"%d",x); ! 518: sstate = setgen('S', "313", tmpbuf, ""); ! 519: return((int) sstate); ! 520: } else { ! 521: frecfm = x; ! 522: return(success = 1); ! 523: } ! 524: #endif /* COMMENT */ ! 525: ! 526: #ifdef COMMENT ! 527: case XYFILP: /* Printer carriage control */ ! 528: if ((x = cmkey(fcctab,nfcc,"file carriage control","newline", ! 529: xxstring)) < 0) ! 530: return(x); ! 531: if ((y = cmcfm()) < 0) return(y); ! 532: if (rmsflg) { ! 533: sprintf(tmpbuf,"%d",x); ! 534: sstate = setgen('S', "315", tmpbuf, ""); ! 535: return((int) sstate); ! 536: } else { ! 537: fcctrl = x; ! 538: return(success = 1); ! 539: } ! 540: #endif /* COMMENT */ ! 541: ! 542: case XYFILT: /* Type */ ! 543: if ((x = cmkey(fttab,nfttyp,"type of file","text",xxstring)) < 0) ! 544: return(x); ! 545: #ifdef COMMENT ! 546: if ((y = cmnum("file byte size (7 or 8)","8",10,&z,xxstring)) < 0) ! 547: return(y); ! 548: if (z != 7 && z != 8) { ! 549: printf("\n?The choices are 7 and 8\n"); ! 550: return(0); ! 551: } ! 552: #endif /* COMMENT */ ! 553: ! 554: #ifdef VMS ! 555: /* Allow VMS users to choose record format for binary files */ ! 556: if ((x == XYFT_B) && (rmsflg == 0)) { ! 557: if ((x = cmkey(fbtab,nfbtyp,"VMS record format","fixed", ! 558: xxstring)) < 0) ! 559: return(x); ! 560: } ! 561: #endif /* VMS */ ! 562: if ((y = cmcfm()) < 0) return(y); ! 563: if (rmsflg) { ! 564: sstate = setgen('S', "300", x ? "1" : "0", ""); ! 565: return((int) sstate); ! 566: } else { ! 567: binary = x; ! 568: #ifdef COMMENT ! 569: if (z == 7) fmask = 0177; ! 570: else if (z == 8) fmask = 0377; ! 571: #endif /* COMMENT */ ! 572: return(success = 1); ! 573: } ! 574: ! 575: case XYFILX: /* Collision Action */ ! 576: if ((x = cmkey(colxtab,ncolx,"Filename collision action","backup", ! 577: xxstring)) < 0) ! 578: return(x); ! 579: if ((y = cmcfm()) < 0) return(y); ! 580: fncact = x; ! 581: if (rmsflg) { ! 582: sprintf(tmpbuf,"%d",fncact); ! 583: sstate = setgen('S', "302", tmpbuf, ""); ! 584: return((int) sstate); ! 585: } else { ! 586: if (fncact == XYFX_R) warn = 1; /* SET FILE WARNING implications */ ! 587: if (fncact == XYFX_X) warn = 0; /* ... */ ! 588: return(success = 1); ! 589: } ! 590: ! 591: case XYFILW: /* Warning/Write-Protect */ ! 592: seton(&warn); ! 593: if (warn) ! 594: fncact = XYFX_R; ! 595: else ! 596: fncact = XYFX_X; ! 597: return(success = 1); ! 598: ! 599: #ifdef VMS ! 600: case XYFILL: /* LABELED FILE parameters */ ! 601: if ((x = cmkey(lbltab,nlblp,"VMS labeled file feature","", ! 602: xxstring)) < 0) ! 603: return(x); ! 604: if ((success = seton(&y)) < 0) ! 605: return(success); ! 606: if (y) /* Set or reset the selected bit */ ! 607: lf_opts |= x; /* in the options bitmask. */ ! 608: else ! 609: lf_opts &= ~x; ! 610: return(success); ! 611: #endif /* VMS */ ! 612: ! 613: default: ! 614: printf("?unexpected file parameter\n"); ! 615: return(-2); ! 616: } ! 617: } ! 618: ! 619: int ! 620: settrm() { ! 621: if ((y = cmkey(trmtab,ntrm,"","",xxstring)) < 0) return(y); ! 622: #ifdef MAC ! 623: printf("\n?Sorry, not implemented yet. Please use the Settings menu.\n"); ! 624: return(-9); ! 625: #else ! 626: switch (y) { ! 627: case XYTBYT: /* SET TERMINAL BYTESIZE */ ! 628: if ((y = cmnum("bytesize for terminal connection","8",10,&x, ! 629: xxstring)) < 0) ! 630: return(y); ! 631: if (x != 7 && x != 8) { ! 632: printf("\n?The choices are 7 and 8\n"); ! 633: return(success = 0); ! 634: } ! 635: if ((y = cmcfm()) < 0) return(y); ! 636: if (x == 7) cmask = 0177; ! 637: else if (x == 8) cmask = 0377; ! 638: return(success = 1); ! 639: ! 640: case XYTSO: /* SET TERMINAL SHIFT-IN/OUT */ ! 641: seton(&sosi); ! 642: return(success = 1); ! 643: ! 644: case XYTNL: ! 645: seton(&tnlm); /* SET TERMINAL NEWLINE-MODE */ ! 646: return(success = 1); ! 647: ! 648: #ifdef OS2 ! 649: case XYTCOL: /* SET TERMINAL COLOR */ ! 650: if ((x = cmkey(ttycoltab,ncolors,"","normal",xxstring)) < 0) { ! 651: return(x); ! 652: } else { ! 653: extern int colornormal, colorreverse, colorunderline, ! 654: colorstatus, colorhelp, scrninitialised; ! 655: int fg, bg; ! 656: if ((fg = cmkey(ttyclrtab,nclrs,"","lgray",xxstring)) < 0) ! 657: return(fg); ! 658: if ((bg = cmkey(ttyclrtab,nclrs,"","black",xxstring)) < 0) ! 659: return(bg); ! 660: if ((y = cmcfm()) < 0) ! 661: return(y); ! 662: switch (x) { ! 663: case 0: ! 664: colornormal = fg | bg << 4; ! 665: break; ! 666: case 1: ! 667: colorreverse = fg | bg << 4; ! 668: break; ! 669: case 2: ! 670: colorunderline = fg | bg << 4; ! 671: break; ! 672: case 3: ! 673: colorstatus = fg | bg << 4; ! 674: break; ! 675: case 4: ! 676: colorhelp = fg | bg << 4; ! 677: break; ! 678: default: ! 679: printf("%s - invalid\n",cmdbuf); ! 680: return(0); ! 681: break; ! 682: } ! 683: scrninitialised = 0; ! 684: } ! 685: return(success = 1); ! 686: #endif /* OS2 */ ! 687: ! 688: #ifdef OS2PM ! 689: case XYTTYP: /* SET TERMINAL TYPE */ ! 690: if ((x = cmkey(ttyptab,nttyp,"","vt100",xxstring)) < 0) return(x); ! 691: if ((y = cmcfm()) < 0) return(y); ! 692: if (x == 1) { ! 693: Term_mode = VT100; ! 694: return(success = 1); ! 695: } else if (x == 2) { ! 696: Term_mode = TEKTRONIX; ! 697: Tek_scrinit(0); /* Initialise Tektronix emulation */ ! 698: return(success = 1); ! 699: } else { ! 700: printf("%s - invalid\n",cmdbuf); ! 701: return(0); ! 702: } ! 703: #endif /* OS2 */ ! 704: ! 705: #ifndef NOCSETS ! 706: case XYTCS: /* SET TERMINAL CHARACTER-SET */ ! 707: /* set terminal character-set <remote> <local> */ ! 708: if ((x = cmkey(ttcstab,ntermc, ! 709: "remote terminal character-set","",xxstring)) < 0) ! 710: return(x); ! 711: if (x == FC_TRANSP) { /* TRANSPARENT? */ ! 712: if ((x = cmcfm()) < 0) return(x); /* Confirm the command */ ! 713: tcsr = tcsl = FC_USASCII; /* Make them both the same */ ! 714: return(success = 1); ! 715: } ! 716: ! 717: /* Not transparent, so get local set to translate it into */ ! 718: ! 719: s = ""; /* Make current file char set */ ! 720: for (y = 0; y <= nfilc; y++) /* be the default... */ ! 721: if (fcstab[y].kwval == fcharset) { ! 722: s = fcstab[y].kwd; ! 723: break; ! 724: } ! 725: if ((y = cmkey(fcstab,nfilc, ! 726: "local character-set",s,xxstring)) < 0) ! 727: return(y); ! 728: if ((z = cmcfm()) < 0) return(z); /* Confirm the command */ ! 729: tcsr = x; /* Remote character set */ ! 730: tcsl = y; /* Local character set */ ! 731: return(success = 1); ! 732: #endif /* NOCSETS */ ! 733: ! 734: default: /* Shouldn't get here. */ ! 735: return(-2); ! 736: } ! 737: #endif /* MAC */ ! 738: } ! 739: ! 740: int /* SET SEND/RECEIVE */ ! 741: setsr(xx, rmsflg) int xx; int rmsflg; { ! 742: if (xx == XYRECV) ! 743: strcpy(line,"Parameter for inbound packets"); ! 744: else ! 745: strcpy(line,"Parameter for outbound packets"); ! 746: ! 747: if (rmsflg) { ! 748: if ((y = cmkey(rsrtab,nrsrtab,line,"",xxstring)) < 0) { ! 749: if (y == -3) { ! 750: printf("?Remote receive parameter required\n"); ! 751: return(-9); ! 752: } else return(y); ! 753: } ! 754: } else { ! 755: if ((y = cmkey(srtab,nsrtab,line,"",xxstring)) < 0) return(y); ! 756: } ! 757: switch (y) { ! 758: ! 759: case XYEOL: ! 760: y = cmnum("Decimal ASCII code for packet terminator","13",10,&x, ! 761: xxstring); ! 762: if ((y = setcc(&z,x,y)) < 0) return(y); ! 763: if (xx == XYRECV) eol = z; else seol = z; ! 764: return(success = y); ! 765: ! 766: case XYLEN: ! 767: y = cmnum("Maximum number of characters in a packet","90",10,&x, ! 768: xxstring); ! 769: if (xx == XYRECV) { /* Receive... */ ! 770: if ((y = setnum(&z,x,y,maxrps)) < 0) ! 771: return(y); ! 772: if (rmsflg) { ! 773: tp = tmpbuf; ! 774: sprintf(tp,"%d",z); ! 775: sstate = setgen('S', "401", tp, ""); ! 776: return((int) sstate); ! 777: } else { ! 778: if (z > MAXRP) z = MAXRP; ! 779: y = adjpkl(z,wslotr,bigrbsiz); ! 780: if (y != z) { ! 781: urpsiz = y; ! 782: if ( ! 783: #ifndef NOSPL ! 784: cmdlvl == 0 ! 785: #else ! 786: tlevel < 0 ! 787: #endif /* NOSPL */ ! 788: ) ! 789: if (!quiet) printf( ! 790: "Adjusting packet size to %d for %d window slots\n", ! 791: y, wslotr); ! 792: } ! 793: urpsiz = y; ! 794: rpsiz = (y > 94) ? 94 : y; ! 795: } ! 796: } else { /* Send... */ ! 797: if ((y = setnum(&z,x,y,maxsps)) < 0) ! 798: return(y); ! 799: if (z > MAXSP) z = MAXSP; ! 800: spsiz = z; /* Set it */ ! 801: y = adjpkl(spsiz,wslotr,bigsbsiz); ! 802: if (y != spsiz && ! 803: #ifndef NOSPL ! 804: cmdlvl == 0 ! 805: #else ! 806: tlevel < 0 ! 807: #endif /* NOSPL */ ! 808: ) ! 809: if (!quiet) ! 810: printf("Adjusting packet size to %d for %d window slots\n", ! 811: y,wslotr); ! 812: spsiz = spmax = spsizr = y; /* Set it and flag that it was set */ ! 813: spsizf = 1; /* to allow overriding Send-Init. */ ! 814: } ! 815: if (pflag && ! 816: #ifndef NOSPL ! 817: cmdlvl == 0 ! 818: #else ! 819: tlevel < 0 ! 820: #endif /* NOSPL */ ! 821: ) { ! 822: if (z > 94 && !quiet) { ! 823: printf("Extended-length packets requested.\n"); ! 824: if (bctr < 2 && z > 200) printf("\ ! 825: Remember to SET BLOCK 2 or 3 for long packets.\n"); ! 826: } ! 827: if (speed <= 0L) speed = ttgspd(); ! 828: if (speed <= 0L && z > 200 && !quiet) { ! 829: printf("\ ! 830: Make sure your timeout interval is long enough for %d-byte packets.\n",z); ! 831: } ! 832: } ! 833: chktimo(); /* Check timeout */ ! 834: return(success = y); ! 835: ! 836: case XYMARK: ! 837: y = cmnum("Code for packet-start character","1",10,&x,xxstring); ! 838: if ((y = setnum(&z,x,y,126)) < 0) return(y); ! 839: if (xx == XYRECV) stchr = z; else mystch = z; ! 840: return(success = y); ! 841: ! 842: case XYNPAD: /* Padding */ ! 843: y = cmnum("How many padding characters for inbound packets","0",10,&x, ! 844: xxstring); ! 845: if ((y = setnum(&z,x,y,94)) < 0) return(y); ! 846: if (xx == XYRECV) mypadn = z; else npad = z; ! 847: return(success = y); ! 848: ! 849: case XYPADC: /* Pad character */ ! 850: y = cmnum("Decimal ASCII code for packet padding character","0",10,&x, ! 851: xxstring); ! 852: if ((y = setcc(&z,x,y)) < 0) return(y); ! 853: if (xx == XYRECV) mypadc = z; else padch = z; ! 854: return(success = y); ! 855: ! 856: case XYTIMO: ! 857: y = cmnum("Interpacket timeout interval","5",10,&x,xxstring); ! 858: if ((y = setnum(&z,x,y,94)) < 0) return(y); ! 859: if (xx == XYRECV) { ! 860: if (rmsflg) { ! 861: tp = tmpbuf; ! 862: sprintf(tp,"%d",z); ! 863: sstate = setgen('S', "402", tp, ""); ! 864: return((int) sstate); ! 865: } else { ! 866: timef = 1; ! 867: timint = pkttim = z; ! 868: } ! 869: } else rtimo = z; ! 870: chktimo(); ! 871: return(success = y); ! 872: ! 873: default: ! 874: return(-2); ! 875: } /* End of SET SEND/RECEIVE... */ ! 876: } ! 877: ! 878: #ifndef NOXMIT ! 879: int ! 880: setxmit() { ! 881: if ((y = cmkey(xmitab,nxmit,"","",xxstring)) < 0) return(y); ! 882: switch (y) { ! 883: case XMITE: /* EOF */ ! 884: y = cmtxt("Characters to send at end of file,\n\ ! 885: Use backslash codes for control characters","",&s,xxstring); ! 886: if (y < 0) return(y); ! 887: if ((int)strlen(s) > XMBUFL) { ! 888: printf("?Too many characters, %d maximum\n",XMBUFL); ! 889: return(-2); ! 890: } ! 891: strcpy(xmitbuf,s); ! 892: return(success = 1); ! 893: ! 894: case XMITF: /* Fill */ ! 895: y = cmnum("Numeric code for blank-line fill character","0",10,&x, ! 896: xxstring); ! 897: if ((y = setnum(&z,x,y,127)) < 0) return(y); ! 898: xmitf = z; ! 899: return(success = 1); ! 900: case XMITL: /* Linefeed */ ! 901: return(success = seton(&xmitl)); ! 902: case XMITS: /* Locking-Shift */ ! 903: return(success = seton(&xmits)); ! 904: case XMITP: /* Prompt */ ! 905: y = cmnum("Numeric code for host's prompt character, 0 for none", ! 906: "10",10,&x,xxstring); ! 907: if ((y = setnum(&z,x,y,127)) < 0) return(y); ! 908: xmitp = z; ! 909: return(success = 1); ! 910: case XMITX: /* Echo */ ! 911: return(success = seton(&xmitx)); ! 912: case XMITW: /* Pause */ ! 913: y = cmnum("Number of milliseconds to pause between binary characters\n\ ! 914: or text lines during transmission","0",10,&x,xxstring); ! 915: if ((y = setnum(&z,x,y,1000)) < 0) return(y); ! 916: xmitw = z; ! 917: return(success = 1); ! 918: default: ! 919: return(-2); ! 920: } ! 921: } ! 922: #endif /* NOXMIT */ ! 923: ! 924: /* D O R M T -- Do a remote command */ ! 925: ! 926: int ! 927: dormt(xx) int xx; { ! 928: int x, y, retcode; ! 929: char *s, sbuf[50], *s2; ! 930: ! 931: if (xx < 0) return(xx); ! 932: ! 933: if (xx == XZSET) { /* REMOTE SET */ ! 934: if ((y = cmkey(rmstab,nrms,"","",xxstring)) < 0) { ! 935: if (y == -3) { ! 936: printf("?Parameter name required\n"); ! 937: return(-9); ! 938: } else return(y); ! 939: } ! 940: return(doprm(y,1)); ! 941: } ! 942: ! 943: switch (xx) { /* Others... */ ! 944: ! 945: case XZCWD: /* CWD */ ! 946: if ((x = cmtxt("Remote directory name","",&s,xxstring)) < 0) return(x); ! 947: debug(F111,"XZCWD: ",s,x); ! 948: *sbuf = NUL; ! 949: s2 = sbuf; ! 950: ! 951: /* The following is commented out, because there is practically no */ ! 952: /* computer in the world that requires a password for directory changing. */ ! 953: /* (The DEC-20 was the only one, and they're mostly all gone.) */ ! 954: #ifdef DIRPWDPR ! 955: if (*s != NUL) { /* If directory name given, */ ! 956: /* get password on separate line. */ ! 957: if (tlevel > -1) { /* From take file... */ ! 958: ! 959: if (fgets(sbuf,50,tfile[tlevel]) == NULL) ! 960: fatal("take file ends prematurely in 'remote cwd'"); ! 961: debug(F110," pswd from take file",s2,0); ! 962: for (x = (int)strlen(sbuf); ! 963: x > 0 && (sbuf[x-1] == NL || sbuf[x-1] == CR); ! 964: x--) ! 965: sbuf[x-1] = '\0'; ! 966: ! 967: } else { /* From terminal... */ ! 968: ! 969: printf(" Password: "); /* get a password */ ! 970: #ifdef OS2 ! 971: while (((x = isatty(0) ? coninc(0) : ! 972: getchar()) != NL) && (x != CR)) { /* with no echo */ ! 973: #else ! 974: while (((x = getchar()) != NL) && (x != CR)) { /* with no echo */ ! 975: #endif /* OS2 */ ! 976: if ((x &= 0177) == '?') { ! 977: printf("? Password of remote directory\n Password: "); ! 978: s2 = sbuf; ! 979: *sbuf = NUL; ! 980: } ! 981: else if (x == ESC) /* Mini command line editor... */ ! 982: putchar(BEL); ! 983: else if (x == BS || x == 0177) ! 984: s2--; ! 985: else if (x == 025) { /* Ctrl-U */ ! 986: s2 = sbuf; ! 987: *sbuf = NUL; ! 988: } ! 989: else ! 990: *s2++ = x; ! 991: } ! 992: *s2 = NUL; ! 993: putchar('\n'); ! 994: } ! 995: s2 = sbuf; ! 996: } else s2 = ""; ! 997: #endif /* DIRPWDPR */ ! 998: ! 999: debug(F110," password",s2,0); ! 1000: sstate = setgen('C',s,s2,""); ! 1001: retcode = 0; ! 1002: break; ! 1003: ! 1004: case XZDEL: /* Delete */ ! 1005: if ((x = cmtxt("Name of remote file(s) to delete","",&s,xxstring)) < 0) { ! 1006: if (x == -3) { ! 1007: printf("?Name of remote file(s) required\n"); ! 1008: return(-9); ! 1009: } else return(x); ! 1010: } ! 1011: if (local) ttflui(); /* If local, flush tty input buffer */ ! 1012: retcode = sstate = rfilop(s,'E'); ! 1013: break; ! 1014: ! 1015: case XZDIR: /* Directory */ ! 1016: if ((x = cmtxt("Remote directory or file specification","",&s, ! 1017: xxstring)) < 0) ! 1018: return(x); ! 1019: if (local) ttflui(); /* If local, flush tty input buffer */ ! 1020: retcode = sstate = setgen('D',s,"",""); ! 1021: break; ! 1022: ! 1023: case XZHLP: /* Help */ ! 1024: if ((x = cmcfm()) < 0) return(x); ! 1025: sstate = setgen('H',"","",""); ! 1026: retcode = 0; ! 1027: break; ! 1028: ! 1029: #ifndef NOPUSH ! 1030: case XZHOS: /* Host */ ! 1031: if ((x = cmtxt("Command for remote system","",&cmarg,xxstring)) < 0) ! 1032: return(x); ! 1033: if ((int)strlen(cmarg) < 1) { ! 1034: if (x == -3) { ! 1035: printf("?Remote host command required\n"); ! 1036: return(-9); ! 1037: } else return(x); ! 1038: } ! 1039: retcode = sstate = 'c'; ! 1040: break; ! 1041: #endif /* NOPUSH */ ! 1042: ! 1043: #ifndef NOFRILLS ! 1044: case XZKER: ! 1045: if ((x = cmtxt("Command for remote Kermit","",&cmarg,xxstring)) < 0) ! 1046: return(x); ! 1047: if ((int)strlen(cmarg) < 1) { ! 1048: if (x == -3) { ! 1049: printf("?Remote Kermit command required\n"); ! 1050: return(-9); ! 1051: } else return(x); ! 1052: } ! 1053: retcode = sstate = 'k'; ! 1054: break; ! 1055: ! 1056: case XZLGI: { /* Login */ ! 1057: char *p1, *p2, *p3; ! 1058: if ((x = cmfld("User ID","",&s,xxstring)) < 0) return(x); ! 1059: if ((p1 = malloc((int)strlen(s) + 1)) == NULL) { ! 1060: printf("Internal error: malloc\n"); ! 1061: return(-2); ! 1062: } else strcpy(p1,s); ! 1063: if ((x = cmfld("Password","",&s,xxstring)) < 0) return(x); ! 1064: if ((p2 = malloc((int)strlen(s) + 1)) == NULL) { ! 1065: printf("Internal error: malloc\n"); ! 1066: return(-2); ! 1067: } else strcpy(p2,s); ! 1068: if ((x = cmtxt("Account","",&s,xxstring)) < 0 && x != -3) ! 1069: return(x); ! 1070: if ((p3 = malloc((int)strlen(s) + 1)) == NULL) { ! 1071: printf("Internal error: malloc\n"); ! 1072: return(-2); ! 1073: } else strcpy(p3,s); ! 1074: sstate = setgen('I',p1,p2,p3); ! 1075: if (p3) free(p3); ! 1076: if (p2) free(p2); ! 1077: if (p1) free(p1); ! 1078: retcode = 0; ! 1079: break; ! 1080: } ! 1081: ! 1082: case XZLGO: /* Logout */ ! 1083: if ((x = cmcfm()) < 0) return(x); ! 1084: sstate = setgen('I',"","",""); ! 1085: retcode = 0; ! 1086: break; ! 1087: ! 1088: case XZPRI: /* Print */ ! 1089: if (!atdiso || !atcapr) { /* Disposition attribute off? */ ! 1090: printf("?Disposition Attribute is Off\n"); ! 1091: return(-2); ! 1092: } ! 1093: cmarg = ""; ! 1094: cmarg2 = ""; ! 1095: if ((x = cmifi("Local file(s) to print on remote printer","",&s,&y, ! 1096: xxstring)) < 0) { ! 1097: if (x == -3) { ! 1098: printf("?Name of local file(s) required\n"); ! 1099: return(-9); ! 1100: } ! 1101: return(x); ! 1102: } ! 1103: strcpy(line,s); /* Make a safe copy of filename */ ! 1104: *optbuf = NUL; /* Wipe out any old options */ ! 1105: if ((x = cmtxt("Options for remote print command","",&s,xxstring)) < 0) ! 1106: return(x); ! 1107: strcpy(optbuf,s); /* Make a safe copy of options */ ! 1108: if ((int)strlen(optbuf) > 94) { /* Make sure this is legal */ ! 1109: printf("?Option string too long\n"); ! 1110: return(-9); ! 1111: } ! 1112: nfils = -1; /* Expand file list internally */ ! 1113: cmarg = line; /* Point to file list. */ ! 1114: rprintf = 1; /* REMOTE PRINT modifier for SEND */ ! 1115: sstate = 's'; /* Set start state to SEND */ ! 1116: if (local) displa = 1; ! 1117: retcode = 0; ! 1118: break; ! 1119: #endif /* NOFRILLS */ ! 1120: ! 1121: case XZSPA: /* Space */ ! 1122: if ((x = cmtxt("Confirm, or remote directory name","",&s,xxstring)) < 0) ! 1123: return(x); ! 1124: retcode = sstate = setgen('U',s,"",""); ! 1125: break; ! 1126: ! 1127: #ifndef NOFRILLS ! 1128: case XZTYP: /* Type */ ! 1129: if ((x = cmtxt("Remote file specification","",&s,xxstring)) < 0) ! 1130: return(x); ! 1131: if ((int)strlen(s) < 1) { ! 1132: printf("?Remote filename required\n"); ! 1133: return(-9); ! 1134: } ! 1135: retcode = sstate = rfilop(s,'T'); ! 1136: break; ! 1137: #endif /* NOFRILLS */ ! 1138: ! 1139: #ifndef NOFRILLS ! 1140: case XZWHO: ! 1141: if ((x = cmtxt("Remote user name, or carriage return","",&s,xxstring)) < 0) ! 1142: return(x); ! 1143: retcode = sstate = setgen('W',s,"",""); ! 1144: break; ! 1145: #endif /* NOFRILLS */ ! 1146: ! 1147: default: ! 1148: if ((x = cmcfm()) < 0) return(x); ! 1149: printf("not working yet - %s\n",cmdbuf); ! 1150: return(-2); ! 1151: } ! 1152: if (local) ttflui(); /* If local, flush tty input buffer */ ! 1153: return(retcode); ! 1154: } ! 1155: ! 1156: ! 1157: /* R F I L O P -- Remote File Operation */ ! 1158: ! 1159: CHAR ! 1160: #ifdef CK_ANSIC ! 1161: rfilop(char * s, char t) ! 1162: #else ! 1163: rfilop(s,t) char *s, t; ! 1164: #endif /* CK_ANSIC */ ! 1165: /* rfilop */ { ! 1166: if (*s == NUL) { ! 1167: printf("?File specification required\n"); ! 1168: return(-2); ! 1169: } ! 1170: debug(F111,"rfilop",s,t); ! 1171: return(setgen(t,s,"","")); ! 1172: } ! 1173: ! 1174: #ifdef SUNX25 ! 1175: int ! 1176: setx25() { ! 1177: if ((y = cmkey(x25tab,nx25,"X.25 call options","",xxstring)) < 0) ! 1178: return(y); ! 1179: switch (y) { ! 1180: case XYUDAT: ! 1181: if ((z = cmkey(onoff,2,"X.25 call user data","",xxstring)) ! 1182: < 0) return(z); ! 1183: if (z == 0) { ! 1184: if ((z = cmcfm()) < 0) return(z); ! 1185: cudata = 0; /* disable call user data */ ! 1186: return (success = 1); ! 1187: } ! 1188: if ((x = cmtxt("X.25 call user data string","",&s,xxstring)) < 0) ! 1189: return(x); ! 1190: if ((int)strlen(s) == 0) { ! 1191: return (-3); ! 1192: } else if ((int)strlen(s) > MAXCUDATA) { ! 1193: printf("?The length must be > 0 and <= %d\n",MAXCUDATA); ! 1194: return(-2); ! 1195: } ! 1196: if ((y = cmcfm()) < 0) return(y); ! 1197: strcpy(udata,s); ! 1198: cudata = 1; /* X.25 call user data specified */ ! 1199: return (success = 1); ! 1200: case XYCLOS: ! 1201: if ((z = cmkey(onoff,2,"X.25 closed user group call","",xxstring)) ! 1202: < 0) return(z); ! 1203: if (z == 0) { ! 1204: if ((z = cmcfm()) < 0) return(z); ! 1205: closgr = -1; /* disable closed user group */ ! 1206: return (success = 1); ! 1207: } ! 1208: if ((y = cmnum("0 <= cug index >= 99","",10,&x,xxstring)) < 0) ! 1209: return(y); ! 1210: if (x < 0 || x > 99) { ! 1211: printf("?The choices are 0 <= cug index >= 99\n"); ! 1212: return(-2); ! 1213: } ! 1214: if ((y = cmcfm()) < 0) return(y); ! 1215: closgr = x; /* closed user group selected */ ! 1216: return (success = 1); ! 1217: ! 1218: case XYREVC: ! 1219: if((z = cmkey(onoff,2,"X.25 reverse charge call","",xxstring)) < 0) ! 1220: return(z); ! 1221: if ((x = cmcfm()) < 0) return(x); ! 1222: revcall = z; ! 1223: return (success = 1); ! 1224: } ! 1225: } ! 1226: ! 1227: int ! 1228: setpadp() { ! 1229: if ((y = cmkey(padx3tab,npadx3,"PAD X.3 parameter name","",xxstring)) < 0) ! 1230: return(y); ! 1231: x = y; ! 1232: switch (x) { ! 1233: case PAD_BREAK_CHARACTER: ! 1234: if ((y = cmnum("PAD break character value","",10,&z,xxstring)) < 0) ! 1235: return(y); ! 1236: if ((y = cmcfm()) < 0) return(y); ! 1237: break; ! 1238: case PAD_ESCAPE: ! 1239: if ((y = cmnum("PAD escape","",10,&z,xxstring)) < 0) return(y); ! 1240: if (z != 0 && z != 1) { ! 1241: printf("?The choices are 0 or 1\n"); ! 1242: return(-2); ! 1243: } ! 1244: if ((y = cmcfm()) < 0) return(y); ! 1245: break; ! 1246: case PAD_ECHO: ! 1247: if ((y = cmnum("PAD echo","",10,&z,xxstring)) return(y); ! 1248: if (z != 0 && z != 1) { ! 1249: printf("?The choices are 0 or 1\n"); ! 1250: return(-2); ! 1251: } ! 1252: if ((y = cmcfm()) < 0) return(y); ! 1253: break; ! 1254: case PAD_DATA_FORWARD_CHAR: ! 1255: if ((y = cmnum("PAD data forward char","",10,&z,xxstring)) return(y); ! 1256: if (z != 0 && z != 2) { ! 1257: printf("?The choices are 0 or 2\n"); ! 1258: return(-2); ! 1259: } ! 1260: if ((y = cmcfm()) < 0) return(y); ! 1261: break; ! 1262: case PAD_DATA_FORWARD_TIMEOUT: ! 1263: if ((y = cmnum("PAD data forward timeout","",10,&z,xxstring)) ! 1264: return(y); ! 1265: if (z < 0 || z > 255) { ! 1266: printf("?The choices are 0 or 1 <= timeout <= 255\n"); ! 1267: return(-2); ! 1268: } ! 1269: if ((y = cmcfm()) < 0) return(y); ! 1270: break; ! 1271: case PAD_FLOW_CONTROL_BY_PAD: ! 1272: if ((y = cmnum("PAD pad flow control","",10,&z,xxstring)) return(y); ! 1273: if (z != 0 && z != 1) { ! 1274: printf("?The choices are 0 or 1\n"); ! 1275: return(-2); ! 1276: } ! 1277: if ((y = cmcfm()) < 0) return(y); ! 1278: break; ! 1279: case PAD_SUPPRESSION_OF_SIGNALS: ! 1280: if ((y = cmnum("PAD service","",10,&z,xxstring)) return(y); ! 1281: if (z != 0 && z != 1) { ! 1282: printf("?The choices are 0 or 1\n"); ! 1283: return(-2); ! 1284: } ! 1285: if ((y = cmcfm()) < 0) return(y); ! 1286: break; ! 1287: ! 1288: case PAD_BREAK_ACTION: ! 1289: if ((y = cmnum("PAD break action","",10,&z,xxstring)) return(y); ! 1290: if (z != 0 && z != 1 && z != 2 && z != 5 && z != 8 && z != 21) { ! 1291: printf("?The choices are 0, 1, 2, 5, 8 or 21\n"); ! 1292: return(-2); ! 1293: } ! 1294: if ((y = cmcfm()) < 0) return(y); ! 1295: break; ! 1296: ! 1297: case PAD_SUPPRESSION_OF_DATA: ! 1298: if ((y = cmnum("PAD data delivery","",10,&z,xxstring)) return(y); ! 1299: if (z != 0 && z != 1) { ! 1300: printf("?The choices are 0 or 1\n"); ! 1301: return(-2); ! 1302: } ! 1303: if ((y = cmcfm()) < 0) return(y); ! 1304: break; ! 1305: ! 1306: case PAD_PADDING_AFTER_CR: ! 1307: if ((y = cmnum("PAD crpad","",10,&z,xxstring)) return(y); ! 1308: if (z < 0 || z > 7) { ! 1309: printf("?The choices are 0 or 1 <= crpad <= 7\n"); ! 1310: return(-2); ! 1311: } ! 1312: if ((y = cmcfm()) < 0) return(y); ! 1313: break; ! 1314: ! 1315: case PAD_LINE_FOLDING: ! 1316: if ((y = cmnum("PAD linefold","",10,&z,xxstring)) return(y); ! 1317: if (z < 0 || z > 255) { ! 1318: printf("?The choices are 0 or 1 <= linefold <= 255\n"); ! 1319: return(-2); ! 1320: } ! 1321: if ((y = cmcfm()) < 0) return(y); ! 1322: break; ! 1323: ! 1324: case PAD_LINE_SPEED: ! 1325: if ((y = cmnum("PAD baudrate","",10,&z,xxstring)) return(y); ! 1326: if (z < 0 || z > 18) { ! 1327: printf("?The choices are 0 <= baudrate <= 18\n"); ! 1328: return(-2); ! 1329: } ! 1330: if ((y = cmcfm()) < 0) return(y); ! 1331: break; ! 1332: ! 1333: case PAD_FLOW_CONTROL_BY_USER: ! 1334: if ((y = cmnum("PAD terminal flow control","",10,&z,xxstring)) ! 1335: return(y); ! 1336: if (z != 0 && z != 1) { ! 1337: printf("?The choices are 0 or 1\n"); ! 1338: return(-2); ! 1339: } ! 1340: if ((y = cmcfm()) < 0) return(y); ! 1341: break; ! 1342: ! 1343: case PAD_LF_AFTER_CR: ! 1344: if ((y = cmnum("PAD linefeed insert","",10,&z,xxstring)) < 0) ! 1345: return(y); ! 1346: if (z < 0 || z == 3 || z > 7) { ! 1347: printf("?The choices are 0, 1, 2, 4, 5, 6 or 7\n"); ! 1348: return(-2); ! 1349: } ! 1350: if ((y = cmcfm()) < 0) return(y); ! 1351: break; ! 1352: ! 1353: case PAD_PADDING_AFTER_LF: ! 1354: if ((y = cmnum("PAD lfpad","",10,&z,xxstring)) return(y); ! 1355: if (z < 0 || z > 7) { ! 1356: printf("?The choices are 0 or 1 <= lfpad <= 7\n"); ! 1357: return(-2); ! 1358: } ! 1359: if ((y = cmcfm()) < 0) return(y); ! 1360: break; ! 1361: ! 1362: case PAD_EDITING: ! 1363: if ((y = cmnum("PAD edit control","",10,&z,xxstring)) return(y); ! 1364: if (z != 0 && z != 1) { ! 1365: printf("?The choices are 0 or 1\n"); ! 1366: return(-2); ! 1367: } ! 1368: if ((y = cmcfm()) < 0) return(y); ! 1369: break; ! 1370: ! 1371: case PAD_CHAR_DELETE_CHAR: ! 1372: if ((y = cmnum("PAD char delete char","",10,&z,xxstring)) return(y); ! 1373: if (z < 0 || z > 127) { ! 1374: printf("?The choices are 0 or 1 <= chardelete <= 127\n"); ! 1375: return(-2); ! 1376: } ! 1377: if ((y = cmcfm()) < 0) return(y); ! 1378: break; ! 1379: ! 1380: case PAD_BUFFER_DELETE_CHAR: ! 1381: if ((y = cmnum("PAD buffer delete char","",10,&z,xxstring)) return(y); ! 1382: if (z < 0 || z > 127) { ! 1383: printf("?The choices are 0 or 1 <= bufferdelte <= 127\n"); ! 1384: return(-2); ! 1385: } ! 1386: if ((y = cmcfm()) < 0) return(y); ! 1387: break; ! 1388: ! 1389: case PAD_BUFFER_DISPLAY_CHAR: ! 1390: if ((y = cmnum("PAD display line char","",10,&z,xxstring)) return(y); ! 1391: if (z < 0 || z > 127) { ! 1392: printf("?The choices are 0 or 1 <= displayline <= 127\n"); ! 1393: return(-2); ! 1394: } ! 1395: if ((y = cmcfm()) < 0) return(y); ! 1396: break; ! 1397: } ! 1398: padparms[x] = z; ! 1399: return(success = 1); ! 1400: } ! 1401: #endif /* SUNX25 */ ! 1402: ! 1403: int ! 1404: setat(rmsflg) int rmsflg; { ! 1405: if ((y = cmkey(attrtab,natr,"File Attribute packets","",xxstring)) < 0) ! 1406: return(y); ! 1407: if (y == AT_XALL) { ! 1408: if ((z = seton(&atcapr)) < 0) return(z); ! 1409: if (rmsflg) { ! 1410: sstate = setgen('S', "132", atcapr ? "1" : "0", ""); ! 1411: return((int) sstate); ! 1412: } else { ! 1413: atenci = atcapr; /* Encoding in */ ! 1414: atenco = atcapr; /* Encoding out */ ! 1415: atdati = atcapr; /* Date in */ ! 1416: atdato = atcapr; /* Date out */ ! 1417: atdisi = atcapr; /* Disposition in/out */ ! 1418: atdiso = atcapr; ! 1419: atleni = atcapr; /* Length in/out (both kinds) */ ! 1420: atleno = atcapr; ! 1421: atblki = atcapr; /* Blocksize in/out */ ! 1422: atblko = atcapr; ! 1423: attypi = atcapr; /* File type in/out */ ! 1424: attypo = atcapr; ! 1425: atsidi = atcapr; /* System ID in/out */ ! 1426: atsido = atcapr; ! 1427: atsysi = atcapr; /* System-dependent params in/out */ ! 1428: atsyso = atcapr; ! 1429: } ! 1430: return(z); ! 1431: } else if (y == AT_ALLY || y == AT_ALLN) { /* All On or All Off */ ! 1432: if ((x = cmcfm()) < 0) return(x); ! 1433: atcapr = (y == AT_ALLY) ? 1 : 0; ! 1434: if (rmsflg) { ! 1435: sstate = setgen('S', "132", atcapr ? "1" : "0", ""); ! 1436: return((int) sstate); ! 1437: } else return(success = 1); ! 1438: } ! 1439: /* Otherwise, it's an individual attribute that wants turning off/on */ ! 1440: ! 1441: if ((z = cmkey(onoff,2,"","",xxstring)) < 0) return(z); ! 1442: if ((x = cmcfm()) < 0) return(x); ! 1443: ! 1444: /* There are better ways to do this... */ ! 1445: /* The real problem is that we're not separating the in and out cases */ ! 1446: /* and so we have to arbitrarily pick the "in" case, i.e tell the remote */ ! 1447: /* server to ignore incoming attributes of the specified type, rather */ ! 1448: /* than telling it not to send them. The protocol does not (yet) define */ ! 1449: /* codes for "in-and-out-at-the-same-time". */ ! 1450: ! 1451: switch(y) { ! 1452: case AT_DISP: ! 1453: if (rmsflg) { ! 1454: sstate = setgen('S', "142", z ? "1" : "0", ""); ! 1455: return((int) sstate); ! 1456: } ! 1457: atdisi = atdiso = z; break; ! 1458: case AT_ENCO: ! 1459: if (rmsflg) { ! 1460: sstate = setgen('S', "141", z ? "1" : "0", ""); ! 1461: return((int) sstate); ! 1462: } ! 1463: atenci = atenco = z; break; ! 1464: case AT_DATE: ! 1465: if (rmsflg) { ! 1466: sstate = setgen('S', "135", z ? "1" : "0", ""); ! 1467: return((int) sstate); ! 1468: } ! 1469: atdati = atdato = z; break; ! 1470: case AT_LENB: ! 1471: case AT_LENK: ! 1472: if (rmsflg) { ! 1473: sstate = setgen('S', "133", z ? "1" : "0", ""); ! 1474: return((int) sstate); ! 1475: } ! 1476: atleni = atleno = z; break; ! 1477: case AT_BLKS: ! 1478: if (rmsflg) { ! 1479: sstate = setgen('S', "139", z ? "1" : "0", ""); ! 1480: return((int) sstate); ! 1481: } ! 1482: atblki = atblki = z; break; ! 1483: case AT_FTYP: ! 1484: if (rmsflg) { ! 1485: sstate = setgen('S', "134", z ? "1" : "0", ""); ! 1486: return((int) sstate); ! 1487: } ! 1488: attypi = attypo = z; break; ! 1489: case AT_SYSI: ! 1490: if (rmsflg) { ! 1491: sstate = setgen('S', "145", z ? "1" : "0", ""); ! 1492: return((int) sstate); ! 1493: } ! 1494: atsidi = atsido = z; break; ! 1495: case AT_SYSP: ! 1496: if (rmsflg) { ! 1497: sstate = setgen('S', "147", z ? "1" : "0", ""); ! 1498: return((int) sstate); ! 1499: } ! 1500: atsysi = atsyso = z; break; ! 1501: default: ! 1502: printf("?Not available\n"); ! 1503: return(-2); ! 1504: } ! 1505: return(1); ! 1506: } ! 1507: ! 1508: #ifndef NOSPL ! 1509: int ! 1510: setinp() { ! 1511: if ((y = cmkey(inptab,ninp,"","",xxstring)) < 0) return(y); ! 1512: switch (y) { ! 1513: case IN_DEF: /* SET INPUT DEFAULT-TIMEOUT */ ! 1514: z = cmnum("Positive number","",10,&x,xxstring); ! 1515: return(success = setnum(&indef,x,z,94)); ! 1516: case IN_TIM: /* SET INPUT TIMEOUT-ACTION */ ! 1517: if ((z = cmkey(intimt,2,"","",xxstring)) < 0) return(z); ! 1518: if ((x = cmcfm()) < 0) return(x); ! 1519: intime = z; ! 1520: return(success = 1); ! 1521: case IN_CAS: /* SET INPUT CASE */ ! 1522: if ((z = cmkey(incast,2,"","",xxstring)) < 0) return(z); ! 1523: if ((x = cmcfm()) < 0) return(x); ! 1524: incase = z; ! 1525: return(success = 1); ! 1526: case IN_ECH: /* SET INPUT ECHO */ ! 1527: return(success = seton(&inecho)); ! 1528: } ! 1529: return(0); ! 1530: } ! 1531: #endif /* NOSPL */ ! 1532: ! 1533: /* ! 1534: setlin -- parse name of and then open a communication device. ! 1535: Call with: ! 1536: xx == XXLINE for a serial (tty) line, XXHOST for a network host, ! 1537: zz == 0 means if user doesn't give a device name, continue current ! 1538: active connection (if any); ! 1539: zz != 0 means if user doesn't give a device name, then close the ! 1540: current connection and restore the default communication device. ! 1541: */ ! 1542: int ! 1543: setlin(xx, zz) int xx, zz; { ! 1544: if (xx == XYHOST) { /* SET HOST <hostname> */ ! 1545: #ifndef NETCONN ! 1546: printf("?Network connections not supported\n"); ! 1547: return(-9); ! 1548: #else ! 1549: if ( ! 1550: (nettype != NET_SX25) && ! 1551: (nettype != NET_TCPB)) { ! 1552: printf("?Network type not supported\n"); ! 1553: return(-9); ! 1554: } ! 1555: if (nettype != NET_TCPB) { /* Not a TCP/IP connection */ ! 1556: /* Just get a text string */ ! 1557: if ((x = cmtxt( zz ? ! 1558: "Network host name,\n or carriage return to close an open connection" : ! 1559: "Network host name,\n or carriage return to resume an open connection", ! 1560: "",&s,xxstring)) < 0) ! 1561: return(x); ! 1562: ! 1563: } else { /* TCP/IP connection... */ ! 1564: ! 1565: /* Parse for host and service separately. */ ! 1566: ! 1567: if ((x = cmfld( zz ? ! 1568: "IP host name or number,\n or carriage return to close an open connection" : ! 1569: "IP host name or number,\n or carriage return to resume an open connection", ! 1570: "",&s,xxstring)) < 0) { ! 1571: if (x != -3) /* Parse error */ ! 1572: return(x); /* return it */ ! 1573: else if (!zz) /* No hostname given */ ! 1574: return(1); /* and none required, */ ! 1575: } /* continue current connection. */ ! 1576: if (*s) { /* If they gave a host name... */ ! 1577: strcpy(line,s); /* make a copy */ ! 1578: /* Check for "host:service" */ ! 1579: for ( ; (*s != '\0') && (*s != ':'); *s++) ; ! 1580: ! 1581: /* If no service given, let them type one now. */ ! 1582: ! 1583: if (!*s) { ! 1584: if ((x = cmfld( ! 1585: "TCP service name or number,\n or carriage return for telnet", ! 1586: "23",&s,xxstring)) < 0 && x != -3) ! 1587: return(x); ! 1588: if (*s) { /* If they gave a service, */ ! 1589: strcat(line,":"); /* concatenate it to the hostname */ ! 1590: strcat(line,s); /* separated by a colon, because */ ! 1591: } /* this is how ttopen() wants it. */ ! 1592: } ! 1593: if ((x = cmcfm()) < 0) return(x); /* Confirm the command */ ! 1594: s = line; ! 1595: } ! 1596: } ! 1597: ! 1598: /* New connection wanted. */ ! 1599: ! 1600: ttflui(); /* Clear away buffered up junk */ ! 1601: ttclos(0); /* Close old connection, if any */ ! 1602: if (oldplex > -1) /* Restore duplex setting. */ ! 1603: duplex = oldplex; ! 1604: if (*s) { /* They gave a hostname */ ! 1605: x = 1; /* Network connection always local */ ! 1606: mdmsav = mdmtyp; /* Remember old modem type */ ! 1607: mdmtyp = -nettype; /* Special code for network */ ! 1608: if (nettype == NET_TCPB) { /* For TCP/IP telnet connections */ ! 1609: oldplex = duplex; /* Remember previous duplex */ ! 1610: duplex = 0; /* Set full duplex and let */ ! 1611: } /* negotiations change if necessary. */ ! 1612: } else { /* They just said "set host" */ ! 1613: if (network && !quiet && !backgrd) ! 1614: printf("Closing connection\n"); ! 1615: s = dftty; /* So go back to normal */ ! 1616: x = dfloc; /* default tty, location, */ ! 1617: network = 0; /* No more network connection. */ ! 1618: duplex = oldplex; /* Restore old duplex setting. */ ! 1619: if (mdmtyp < 0) { /* Switching from net to async? */ ! 1620: if (mdmsav > -1) /* Restore modem type from last */ ! 1621: mdmtyp = mdmsav; /* SET MODEM command, if any. */ ! 1622: else ! 1623: mdmtyp = 0; ! 1624: } ! 1625: } ! 1626: #endif /* NETCONN */ ! 1627: } ! 1628: ! 1629: /* Serial tty device, possibly modem, connection... */ ! 1630: ! 1631: if (xx == XYLINE) { /* SET LINE */ ! 1632: if ((x = cmtxt("Communication device name",dftty,&s,xxstring)) < 0) ! 1633: return(x); ! 1634: if (local) ttflui(); /* Clear away buffered up junk */ ! 1635: ttclos(0); /* Close old line, if any was open */ ! 1636: if (*s) { /* They gave a device name */ ! 1637: x = -1; /* Let ttopen decide about it */ ! 1638: } else { /* They just said "set line" */ ! 1639: s = dftty; /* so go back to normal tty */ ! 1640: x = dfloc; /* and mode. */ ! 1641: } ! 1642: if (mdmtyp < 0) { /* Switching from net to async? */ ! 1643: if (mdmsav > -1) /* Restore modem type from last */ ! 1644: mdmtyp = mdmsav; /* SET MODEM command, if any. */ ! 1645: else ! 1646: mdmtyp = 0; ! 1647: } ! 1648: if (oldplex > -1) /* Restore previous duplex setting. */ ! 1649: duplex = oldplex; ! 1650: network = 0; /* No more network. */ ! 1651: } ! 1652: if ((y = ttopen(s,&x,mdmtyp,cdtimo)) < 0 ) { /* Open the new line */ ! 1653: printf("%s: ", s); /* Error */ ! 1654: if (y == -2) { ! 1655: printf("?Timed out, no carrier.\n"); ! 1656: printf("Try SET CARRIER OFF and SET LINE again, or else\n"); ! 1657: printf("SET MODEM, SET LINE, and then DIAL.\n"); ! 1658: } else if (y == -3) { ! 1659: printf("Sorry, access to lock denied\n"); ! 1660: } else if (y == -4) { ! 1661: printf("Sorry, access to device denied\n"); ! 1662: } else if (y == -5) { ! 1663: printf("Sorry, device is in use\n"); ! 1664: } else { /* Other error. */ ! 1665: #ifndef VMS ! 1666: if (errno) ! 1667: perror("Sorry, can't open connection"); ! 1668: else ! 1669: #endif /* VMS */ ! 1670: printf("Sorry, can't open connection\n"); ! 1671: } ! 1672: local = dfloc; /* Go back to normal */ ! 1673: #ifndef MAC ! 1674: strcpy(ttname,dftty); /* Restore default tty name */ ! 1675: #endif /* MAC */ ! 1676: speed = ttgspd(); ! 1677: network = 0; /* No network connection active */ ! 1678: return(success = 0); /* Return failure */ ! 1679: } ! 1680: if (x > -1) local = x; /* Opened ok, set local/remote. */ ! 1681: network = (mdmtyp < 0); /* Remember connection type. */ ! 1682: #ifdef TNCODE ! 1683: if (network) tn_init = 0; /* Say telnet not init'd yet. */ ! 1684: #endif /* TNCODE */ ! 1685: strcpy(ttname,s); /* Copy name into real place. */ ! 1686: speed = ttgspd(); /* Get the current speed. */ ! 1687: debug(F111,"set line ",ttname,local); ! 1688: #ifdef NETCONN ! 1689: #ifdef SUNX25 ! 1690: if (nettype == NET_SX25) duplex = 1; /* Duplex half */ ! 1691: #endif /* SUNX25 */ ! 1692: #endif /* NETCONN */ ! 1693: return(success = 1); ! 1694: } ! 1695: #endif /* NOICP */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.