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 (fdc@columbia.edu, FDCCU@CUVMA.BITNET), 7: Columbia University Center for Computing Activities. 8: First released January 1985. 9: Copyright (C) 1985, 1992, Trustees of Columbia University in the City of New 10: York. Permission is granted to any individual or institution to use this 11: software as long as it is not sold for profit. This copyright notice must be 12: retained. This software may not be included in commercial products without 13: written permission of Columbia University. 14: */ 15: 16: /* 17: This file created from parts of ckuus3.c, which became to big for 18: Mark Williams Coherent compiler to handle. 19: */ 20: 21: /* 22: Definitions here supersede those from system include files. 23: */ 24: #include "ckcdeb.h" /* Debugging & compiler things */ 25: #include "ckcasc.h" /* ASCII character symbols */ 26: #include "ckcker.h" /* Kermit application definitions */ 27: #include "ckcxla.h" /* Character set translation */ 28: #include "ckcnet.h" /* Network symbols */ 29: #include "ckuusr.h" /* User interface symbols */ 30: 31: static int x, y = 0, z; 32: static char *s; 33: 34: static int mdmsav = -1; /* Save modem type around network */ 35: static int oldplex = -1; /* Duplex holder around network */ 36: 37: extern int success, nfilp, fmask, fncnv, frecl, nfttyp, binary, warn, msgflg; 38: extern int cmask, maxrps, wslotr, bigsbsiz, bigrbsiz, urpsiz, rpsiz, spsiz; 39: extern int spsizr, spsizf, maxsps, spmax, pflag, bctr, npad, timef, timint; 40: extern int pkttim, rtimo, local, nfils, displa, atcapr, nettype, escape; 41: extern int mdmtyp, duplex, dfloc, network, cdtimo, fncact, mypadn; 42: extern int tnlm, sosi, tlevel, lf_opts, backgrd, flow, fdispla; 43: extern int 44: atenci, atenco, atdati, atdato, atleni, atleno, atblki, atblko, 45: attypi, attypo, atsidi, atsido, atsysi, atsyso, atdisi, atdiso; 46: 47: extern long speed; 48: 49: extern CHAR sstate, eol, seol, stchr, mystch, mypadc, padch; 50: 51: extern char *cmarg, *cmarg2, *dftty; 52: 53: extern char tmpbuf[], *tp, *lp; /* Temporary buffer & pointers */ 54: #ifndef NOFRILLS 55: extern char optbuf[]; /* Buffer for MAIL or PRINT options */ 56: extern int rprintf; /* REMOTE PRINT flag */ 57: #endif /* NOFRILLS */ 58: extern char ttname[]; 59: 60: extern struct keytab onoff[], filtab[], fttab[], rltab[]; 61: extern int nrlt; 62: 63: #ifdef DCMDBUF 64: extern char *atxbuf; /* Atom buffer */ 65: extern char *cmdbuf; /* Command buffer */ 66: extern char *line; /* Character buffer for anything */ 67: #ifdef CK_CURSES 68: /* This needs cleaning up... */ 69: #ifdef UNIX 70: extern char *trmbuf; /* Termcap buffer */ 71: #endif /* UNIX */ 72: #ifdef OS2 73: extern char *trmbuf; /* Termcap buffer */ 74: #endif /* OS2 */ 75: #ifdef OSK 76: extern char *trmbuf; /* Termcap buffer */ 77: #endif /* OSK */ 78: #ifdef AMIGA 79: extern char *trmbuf; /* Termcap buffer */ 80: #endif /* AMIGA */ 81: #endif /* CK_CURSES */ 82: #else 83: extern char atxbuf[]; /* Atom buffer */ 84: extern char cmdbuf[]; /* Command buffer */ 85: extern char line[]; /* Character buffer for anything */ 86: #ifdef CK_CURSES 87: #ifdef UNIX 88: extern char trmbuf[]; /* Termcap buffer */ 89: #endif /* UNIX */ 90: #endif /* CK_CURSES */ 91: #endif /* DCMDBUF */ 92: 93: #ifndef NOCSETS 94: extern struct keytab fcstab[]; /* For 'set file character-set' */ 95: extern struct keytab ttcstab[]; 96: extern int nfilc, fcharset, ntermc, tcsr, tcsl; 97: #endif /* NOCSETS */ 98: 99: #ifndef NOSPL 100: extern int cmdlvl; /* Overall command level */ 101: #endif /* NOSPL */ 102: 103: #ifdef TNCODE 104: extern int tn_init; 105: #endif /* TNCODE */ 106: 107: #ifdef SUNX25 108: extern int revcall, closgr, cudata, nx25, npadx3; 109: extern char udata[MAXCUDATA]; 110: extern CHAR padparms[MAXPADPARMS+1]; 111: extern struct keytab x25tab[], padx3tab[]; 112: #endif /* SUNX25 */ 113: 114: #ifdef CK_CURSES 115: #ifndef VMS 116: _PROTOTYP(int tgetent,(char *, char *)); 117: #endif /* VMS */ 118: #endif /* CK_CURSES */ 119: 120: #ifndef NODIAL 121: extern int dialhng, dialtmo, dialksp, dialdpy, dialmnp, dialmhu; 122: extern int mdmspd; 123: extern char *dialini, *dialdir, *dialcmd, *dialnpr; 124: extern FILE * dialfd; 125: 126: 127: struct keytab dialtab[] = { 128: "dial-command", XYDDIA, 0, 129: "directory", XYDDIR, 0, 130: "display", XYDDPY, 0, 131: "hangup", XYDHUP, 0, 132: "init-string", XYDINI, 0, 133: "kermit-spoof", XYDKSP, 0, 134: "mnp-enable", XYDMNP, 0, 135: #ifdef MDMHUP 136: "modem-hangup", XYDMHU, 0, 137: #endif /* MDMHUP */ 138: "prefix", XYDNPR, 0, 139: "speed-matching", XYDSPD, 0, 140: "timeout", XYDTMO, 0 141: }; 142: int ndial = (sizeof(dialtab) / sizeof(struct keytab)); 143: #endif /* NODIAL */ 144: 145: #ifndef NOXMIT 146: /* set transmit */ 147: #define XMITF 0 148: #define XMITL 1 149: #define XMITP 2 150: #define XMITE 3 151: #define XMITX 4 152: #define XMITS 5 153: #define XMITW 6 154: 155: #ifndef NOXMIT 156: #define XMBUFL 50 157: extern int xmitf, xmitl, xmitp, xmitx, xmits, xmitw; 158: char xmitbuf[XMBUFL+1] = { NUL }; /* TRANSMIT eof string */ 159: #endif /* NOXMIT */ 160: 161: struct keytab xmitab[] = { 162: "echo", XMITX, 0, 163: "eof", XMITE, 0, 164: "fill", XMITF, 0, 165: "linefeed", XMITL, 0, 166: "locking-shift", XMITS, 0, 167: "pause", XMITW, 0, 168: "prompt", XMITP, 0 169: }; 170: int nxmit = (sizeof(xmitab) / sizeof(struct keytab)); 171: #endif /* NOXMIT */ 172: 173: /* For SET FILE COLLISION */ 174: /* Some of the following may be possible for some C-Kermit implementations */ 175: /* but not others. Those that are not possible for your implementation */ 176: /* should be ifdef'd out. */ 177: 178: struct keytab colxtab[] = { /* SET FILE COLLISION options */ 179: "append", XYFX_A, 0, /* append to old file */ 180: #ifdef COMMENT 181: "ask", XYFX_Q, 0, /* ask what to do (not implemented) */ 182: #endif 183: "backup", XYFX_B, 0, /* rename old file */ 184: "discard", XYFX_D, 0, /* don't accept new file */ 185: "no-supersede", XYFX_D, CM_INV, /* ditto (MSK compatibility) */ 186: "overwrite", XYFX_X, 0, /* overwrite the old file == file warning off */ 187: "rename", XYFX_R, 0, /* rename the incoming file == file warning on */ 188: "update", XYFX_U, 0, /* replace if newer */ 189: }; 190: int ncolx = (sizeof(colxtab) / sizeof(struct keytab)); 191: 192: static struct keytab rfiltab[] = { /* for REMOTE SET FILE */ 193: "collision", XYFILX, 0, 194: "record-length", XYFILR, 0, 195: "type", XYFILT, 0 196: }; 197: int nrfilp = (sizeof(rfiltab) / sizeof(struct keytab)); 198: 199: struct keytab fntab[] = { /* File naming */ 200: "converted", 1, 0, 201: "literal", 0, 0 202: }; 203: 204: /* Terminal parameters table */ 205: struct keytab trmtab[] = { 206: #ifdef OS2 207: "arrow-keys", XYTARR, 0, 208: #endif /* OS2 */ 209: "bytesize", XYTBYT, 0, 210: #ifndef NOCSETS 211: "character-set", XYTCS, 0, 212: #endif /* NOCSETS */ 213: #ifdef OS2 214: "color", XYTCOL, 0, 215: #endif /* OS2 */ 216: "cr-display", XYTCRD, 0, 217: #ifdef OS2 218: "cursor", XYTCUR, 0, 219: #endif /* OS2 */ 220: "echo", XYTEC, 0, 221: #ifdef OS2 222: "keypad-mode", XYTKPD, 0, 223: #endif /* OS2 */ 224: "locking-shift", XYTSO, 0, 225: "newline-mode", XYTNL, 0 226: #ifdef OS2 227: , "type", XYTTYP, 0, 228: "wrap", XYTWRP, 0 229: #endif /* OS2 */ 230: }; 231: int ntrm = (sizeof(trmtab) / sizeof(struct keytab)); 232: 233: struct keytab crdtab[] = { /* Carriage-return display */ 234: "crlf", 1, 0, 235: "normal", 0, 0 236: }; 237: extern int tt_crd; /* Carriage-return display variable */ 238: 239: #ifdef OS2 240: /* 241: OS/2 serial communication devices. 242: */ 243: struct keytab os2devtab[] = { 244: "1", 1, CM_INV, /* Invisible synonyms, like */ 245: "2", 2, CM_INV, /* "set port 1" */ 246: "3", 3, CM_INV, 247: "4", 4, CM_INV, 248: "5", 5, CM_INV, 249: "6", 6, CM_INV, 250: "7", 7, CM_INV, 251: "8", 8, CM_INV, 252: "com1", 1, 0, /* Real device names */ 253: "com2", 2, 0, 254: "com3", 3, 0, 255: "com4", 4, 0, 256: "com5", 5, 0, 257: "com6", 6, 0, 258: "com7", 7, 0, 259: "com8", 7, 0 260: }; 261: int nos2dev = (sizeof(os2devtab) / sizeof(struct keytab)); 262: 263: /* 264: Terminal parameters that can be set by SET commands. 265: Used by the ck?con.c terminal emulator code. 266: For now, only use for OS/2. Should add these for Macintosh. 267: */ 268: int tt_arrow = 1; /* Arrow key mode */ 269: int tt_keypad = 0; /* Keypad mode */ 270: int tt_wrap = 1; /* Autowrap */ 271: int tt_type = TT_VT102; /* Terminal type */ 272: int tt_cursor = 0; /* Cursor type */ 273: #endif /* OS2 */ 274: 275: #ifdef OS2 276: struct keytab akmtab[] = { /* Arrow key mode */ 277: "application", 1, 0, 278: "cursor", 0, 0 279: }; 280: struct keytab kpmtab[] = { /* Keypad mode */ 281: "application", 0, 0, 282: "numeric", 1, 0 283: }; 284: 285: struct keytab ttycoltab[] = { /* Items to be colored */ 286: "help", 4, 0, /* Help screen */ 287: "normal", 0, 0, /* Normal screen text */ 288: "reverse", 1, 0, /* Reverse video */ 289: "status", 3, 0, /* Status line */ 290: "underlined", 2, 0 /* Underlined text */ 291: }; 292: int ncolors = 5; 293: 294: struct keytab ttyclrtab[] = { /* Colors */ 295: "black", 0, 0, 296: "blue", 1, 0, 297: "brown", 6, 0, 298: "cyan", 3, 0, 299: "dgray", 8, 0, 300: "green", 2, 0, 301: "lblue", 9, 0, 302: "lcyan", 11, 0, 303: "lgray", 7, 0, 304: "lgreen", 10, 0, 305: "lmagenta", 13, 0, 306: "lred", 12, 0, 307: "magenta", 5, 0, 308: "red", 4, 0, 309: "white", 15, 0, 310: "yellow", 14, 0 311: }; 312: int nclrs = 16; 313: 314: struct keytab ttycurtab[] = { 315: "full", 2, 0, 316: "half", 1, 0, 317: "underline", 0, 0 318: }; 319: int ncursors = 3; 320: #endif /* OS2 */ 321: 322: #ifdef OS2 323: struct keytab ttyptab[] = { 324: #ifdef COMMENT 325: /* 326: Not supported yet... 327: The idea is to let the console driver handle the escape sequences. 328: */ 329: "none", TT_NONE, 0, 330: #endif /* COMMENT */ 331: #ifdef OS2PM 332: "tek4014", TT_TEK40, 0, 333: #endif /* OS2PM */ 334: "vt102", TT_VT102, 0, 335: "vt52", TT_VT52, 0 336: }; 337: int nttyp = 2; 338: #endif /* OS2 */ 339: 340: /* #ifdef VMS */ 341: struct keytab fbtab[] = { /* Binary record types for VMS */ 342: "fixed", XYFT_B, 0, /* Fixed is normal for binary */ 343: "undefined", XYFT_U, 0 /* Undefined if they ask for it */ 344: }; 345: int nfbtyp = (sizeof(fbtab) / sizeof(struct keytab)); 346: /* #endif */ 347: 348: #ifdef VMS 349: struct keytab lbltab[] = { /* Labeled File info */ 350: "acl", LBL_ACL, 0, 351: "backup-date", LBL_BCK, 0, 352: "name", LBL_NAM, 0, 353: "owner", LBL_OWN, 0, 354: "path", LBL_PTH, 0 355: }; 356: int nlblp = (sizeof(lbltab) / sizeof(struct keytab)); 357: #endif /* VMS */ 358: 359: struct keytab fdtab[] = { /* SET FILE DISPLAY options */ 360: #ifdef MAC /* Macintosh */ 361: "fullscreen", XYFD_R, 0, /* Full-screen but not curses */ 362: "none", XYFD_N, 0, 363: "off", XYFD_N, CM_INV, 364: "on", XYFD_R, CM_INV, 365: "quiet", XYFD_N, CM_INV 366: 367: #else /* Not Mac */ 368: "crt", XYFD_S, 0, /* CRT display */ 369: #ifdef CK_CURSES 370: #ifdef COMMENT 371: "curses", XYFD_C, CM_INV, /* Full-screen, curses */ 372: #endif /* COMMENT */ 373: "fullscreen", XYFD_C, 0, /* Full-screen, whatever the method */ 374: #endif /* CK_CURSES */ 375: "none", XYFD_N, 0, /* No display */ 376: "off", XYFD_N, CM_INV, /* Ditto */ 377: "on", XYFD_R, CM_INV, /* On = Serial */ 378: "quiet", XYFD_N, CM_INV, /* No display */ 379: "serial", XYFD_R, 0 /* Serial */ 380: #endif /* MAC */ 381: }; 382: int nfdtab = (sizeof(fdtab) / sizeof(struct keytab)); 383: 384: struct keytab rsrtab[] = { /* For REMOTE SET RECEIVE */ 385: "packet-length", XYLEN, 0, 386: "timeout", XYTIMO, 0 387: }; 388: int nrsrtab = (sizeof(rsrtab) / sizeof(struct keytab)); 389: 390: /* Send/Receive Parameters */ 391: 392: struct keytab srtab[] = { 393: "end-of-packet", XYEOL, 0, 394: "packet-length", XYLEN, 0, 395: "pad-character", XYPADC, 0, 396: "padding", XYNPAD, 0, 397: "start-of-packet", XYMARK, 0, 398: "timeout", XYTIMO, 0 399: }; 400: int nsrtab = (sizeof(srtab) / sizeof(struct keytab)); 401: 402: /* REMOTE SET */ 403: 404: struct keytab rmstab[] = { 405: "attributes", XYATTR, 0, 406: "block-check", XYCHKT, 0, 407: "file", XYFILE, 0, 408: "incomplete", XYIFD, 0, 409: "receive", XYRECV, 0, 410: "retry", XYRETR, 0, 411: "server", XYSERV, 0, 412: "transfer", XYXFER, 0, 413: "window", XYWIND, 0 414: }; 415: int nrms = (sizeof(rmstab) / sizeof(struct keytab)); 416: 417: struct keytab attrtab[] = { 418: "all", AT_XALL, 0, 419: #ifdef COMMENT 420: "blocksize", AT_BLKS, 0, /* not used */ 421: #endif /* COMMENT */ 422: "character-set", AT_ENCO, 0, 423: "date", AT_DATE, 0, 424: "disposition", AT_DISP, 0, 425: "encoding", AT_ENCO, CM_INV, 426: "length", AT_LENK, 0, 427: "off", AT_ALLN, 0, 428: "on", AT_ALLY, 0, 429: #ifdef COMMENT 430: "os-specific", AT_SYSP, 0, /* not used by UNIX or VMS */ 431: #endif /* COMMENT */ 432: "system-id", AT_SYSI, 0, 433: "type", AT_FTYP, 0, 434: }; 435: int natr = (sizeof(attrtab) / sizeof(struct keytab)); /* how many attributes */ 436: 437: #ifndef NOSPL 438: extern int indef, intime, incase, inecho, insilence; 439: struct keytab inptab [] = { /* SET INPUT parameters */ 440: "case", IN_CAS, 0, 441: "default-timeout", IN_DEF, CM_INV, 442: "echo", IN_ECH, 0, 443: "silence", IN_SIL, 0, 444: "timeout-action", IN_TIM, 0 445: }; 446: int ninp = (sizeof(inptab) / sizeof(struct keytab)); 447: 448: struct keytab intimt[] = { /* SET INPUT TIMEOUT parameters */ 449: "proceed", 0, 0, /* 0 = proceed */ 450: "quit", 1, 0 /* 1 = quit */ 451: }; 452: 453: struct keytab incast[] = { /* SET INPUT CASE parameters */ 454: "ignore", 0, 0, /* 0 = ignore */ 455: "observe", 1, 0 /* 1 = observe */ 456: }; 457: #endif /* NOSPL */ 458: 459: /* The following routines broken out of doprm() to give compilers a break. */ 460: 461: /* S E T O N -- Parse on/off (default on), set parameter to result */ 462: 463: int 464: seton(prm) int *prm; { 465: int x, y; 466: if ((y = cmkey(onoff,2,"","on",xxstring)) < 0) return(y); 467: if ((x = cmcfm()) < 0) return(x); 468: *prm = y; 469: return(1); 470: } 471: 472: /* S E T N U M -- Set parameter to result of cmnum() parse. */ 473: /* 474: Call with pointer to integer variable to be set, 475: x = number from cnum parse, y = return code from cmnum, 476: max = maximum value to accept, -1 if no maximum. 477: Returns -9 on failure, after printing a message, or 1 on success. 478: */ 479: int 480: setnum(prm,x,y,max) int x, y, *prm, max; { 481: extern int cmflgs; 482: debug(F101,"setnum","",y); 483: if (y == -3) { 484: printf("\n?Value required\n"); 485: return(-9); 486: } 487: if (y == -2) { 488: printf("%s?Not a number: %s\n",cmflgs == 1 ? "" : "\n", atxbuf); 489: return(-9); 490: } 491: if (y < 0) return(y); 492: if (max > -1 && x > max) { 493: printf("?Sorry, %d is the maximum\n",max); 494: return(-9); 495: } 496: if ((y = cmcfm()) < 0) return(y); 497: *prm = x; 498: return(1); 499: } 500: 501: /* S E T C C -- Set parameter to an ASCII control character value. */ 502: 503: int 504: setcc(prm,x,y) int x, y, *prm; { 505: if (y == -3) { 506: printf("\n?Value required\n"); 507: return(-3); 508: } 509: if (y < 0) return(y); 510: if ((x > 037) && (x != 0177)) { 511: printf("\n?Not in ASCII control range - %d\n",x); 512: return(-2); 513: } 514: if ((y = cmcfm()) < 0) return(y); 515: *prm = x; 516: return(1); 517: } 518: 519: #ifndef NODIAL 520: _PROTOTYP(static int dialstr,(char **, char *)); 521: /* 522: Parse a DIAL-related string, stripping enclosing braces, if any. 523: */ 524: static int 525: dialstr(p,msg) char **p; char *msg; { 526: int x; 527: if ((x = cmtxt(msg, "", &s, xxstring)) < 0) 528: return(x); 529: if (*s == '{') { /* Strip enclosing braces, if any */ 530: x = strlen(s); 531: if (s[x-1] == '}') { 532: s[x-1] = NUL; 533: s++; 534: } 535: } 536: if (*p) { /* Free any previous string. */ 537: free(*p); 538: *p = (char *) 0; 539: } 540: if ((x = strlen(s)) > 0) { 541: *p = malloc(x + 1); /* Allocate space for it */ 542: strcpy(*p,s); /* and make a safe copy. */ 543: } else *p = (char *) 0; 544: return(success = 1); 545: } 546: 547: int /* Set DIAL command options */ 548: setdial() { 549: if ((y = cmkey(dialtab,ndial,"","",xxstring)) < 0) return(y); 550: switch (y) { 551: case XYDHUP: /* DIAL HANGUP */ 552: return(success = seton(&dialhng)); 553: case XYDINI: /* DIAL INIT-STRING */ 554: return(dialstr(&dialini,"Modem dialer initialization string")); 555: case XYDNPR: /* DIAL NUMBER-PREFIX */ 556: return(dialstr(&dialnpr,"Modem dialer telephone number prefix")); 557: case XYDDIA: /* DIAL DIAL-COMMAND */ 558: x = cmtxt("Dialing command for modem,\n\ 559: include \"%s\" to stand for phone number,\n\ 560: for example, \"set dial dial-command ATDT%s\\13\"", 561: "", 562: &s, 563: xxstring); 564: if (x < 0 && x != -3) /* Handle parse errors */ 565: return(x); 566: y = x = strlen(s); /* Get length of text */ 567: if (x > 0 && *s == '{') { /* Strip enclosing braces, */ 568: if (s[x-1] == '}') { /* if any. */ 569: s[x-1] = NUL; 570: s++; 571: y -= 2; 572: } 573: } 574: if (y > 0) { /* If there is any text (left), */ 575: for (x = 0; x < y; x++) { /* make sure they included "%s" */ 576: if (s[x] != '%') continue; 577: if (s[x+1] == 's') break; 578: } 579: if (x == y) { 580: printf( 581: "?Dial-command must contain \"%cs\" for phone number.\n",'%'); 582: return(-9); 583: } 584: } 585: if (dialcmd) { /* Free any previous string. */ 586: free(dialcmd); 587: dialcmd = (char *) 0; 588: } 589: if (y > 0) { 590: dialcmd = malloc(y + 1); /* Allocate space for it */ 591: strcpy(dialcmd,s); /* and make a safe copy. */ 592: } 593: return(success = 1); 594: case XYDKSP: /* DIAL KERMIT-SPOOF */ 595: return(success = seton(&dialksp)); 596: case XYDTMO: /* DIAL TIMEOUT */ 597: y = cmnum("Seconds to wait for call completion","0",10,&x,xxstring); 598: return(success = setnum(&dialtmo,x,y,10000)); 599: case XYDDPY: /* DIAL DISPLAY */ 600: return(success = seton(&dialdpy)); 601: case XYDSPD: /* DIAL SPEED-MATCHING */ 602: /* used to be speed-changing */ 603: if ((y = seton(&mdmspd)) < 0) return(y); 604: #ifdef COMMENT 605: mdmspd = 1 - mdmspd; /* so here we reverse the meaning */ 606: #endif /* COMMENT */ 607: return(success = 1); 608: case XYDMNP: /* DIAL MNP-ENABLE */ 609: return(success = seton(&dialmnp)); 610: #ifdef MDMHUP 611: case XYDMHU: /* DIAL MODEM-HANGUP */ 612: return(success = seton(&dialmhu)); 613: #endif /* MDMHUP */ 614: case XYDDIR: /* DIAL DIRECTORY */ 615: if ((y = cmifi("Name of dialing directory file","",&s,&y, 616: xxstring)) < 0) { 617: if (y == -3) { 618: if (dialdir) free(dialdir); /* Free any previous storage */ 619: dialdir = NULL; 620: return(success = 1); 621: } else return(y); 622: } 623: if (y) { 624: printf("?Wildcards not allowed\n"); 625: return(-9); 626: } 627: strcpy(line,s); /* Make safe copy of dial string */ 628: if ((y = cmcfm()) < 0) return(y); /* Confirm the command */ 629: if (dialdir) free(dialdir); /* Free previous filename storage */ 630: if (dialfd) { /* Close previous file, if any */ 631: fclose(dialfd); 632: dialfd = NULL; 633: } 634: s = line; /* Point back to dial string */ 635: if (s == NULL || *s == NUL) { /* If no name given */ 636: dialdir = NULL; /* remove the name string */ 637: return(success = 1); 638: } else if ((dialdir = malloc(strlen(s)+1)) == NULL) { 639: return(success = 0); /* Can't malloc storage for name */ 640: } else { /* Have storage for name */ 641: strcpy(dialdir,s); /* Copy string into new storage */ 642: if ((dialfd = fopen(dialdir,"r")) == NULL) { /* Open the file */ 643: perror(dialdir); /* Can't, print message saying why */ 644: success = 0; /* We didn't succeed */ 645: return(-9); /* Fail, message already printed */ 646: } 647: return(success = 1); /* Everything is OK */ 648: } 649: 650: default: 651: printf("?Unexpected SET DIAL parameter\n"); 652: return(-2); 653: } 654: } 655: #endif /* NODIAL */ 656: 657: int 658: setfil(rmsflg) int rmsflg; { 659: if (rmsflg) { 660: if ((y = cmkey(rfiltab,nrfilp,"Remote file parameter","", 661: xxstring)) < 0) { 662: if (y == -3) { 663: printf("?Remote file parameter required\n"); 664: return(-9); 665: } else return(y); 666: } 667: } else { 668: if ((y = cmkey(filtab,nfilp,"File parameter","",xxstring)) < 0) 669: return(y); 670: } 671: switch (y) { 672: #ifdef COMMENT /* Not needed */ 673: case XYFILB: /* Blocksize */ 674: sprintf(tmpbuf,"%d",DBLKSIZ); 675: if ((y = cmnum("file block size",tmpbuf,10,&z,xxstring)) < 0) 676: return(y); 677: if ((x = cmcfm()) < 0) return(x); 678: if (rmsflg) { 679: sprintf(tmpbuf,"%d",z); 680: sstate = setgen('S', "311", tmpbuf, ""); 681: return((int) sstate); 682: } else { 683: fblksiz = z; 684: return(success = 1); 685: } 686: #endif /* COMMENT */ 687: 688: case XYFILS: /* Byte size */ 689: if ((y = cmnum("file byte size (7 or 8)","8",10,&z,xxstring)) < 0) 690: return(y); 691: if (z != 7 && z != 8) { 692: printf("\n?The choices are 7 and 8\n"); 693: return(0); 694: } 695: if ((y = cmcfm()) < 0) return(y); 696: if (z == 7) fmask = 0177; 697: else if (z == 8) fmask = 0377; 698: return(success = 1); 699: 700: #ifndef NOCSETS 701: case XYFILC: /* Character set */ 702: if ((x = cmkey(fcstab,nfilc,"local file code","ascii", xxstring)) < 0) 703: return(x); 704: if ((z = cmcfm()) < 0) return(z); 705: fcharset = x; 706: return(success = 1); 707: #endif /* NOCSETS */ 708: 709: case XYFILD: /* Display */ 710: if ((x = cmkey(fdtab,nfdtab,"file transfer display style","", 711: xxstring)) < 0) 712: return(x); 713: if ((z = cmcfm()) < 0) return(z); 714: #ifdef CK_CURSES 715: if (x == XYFD_C) { 716: #ifdef VMS 717: lp = line; 718: #else 719: lp = trmbuf; 720: #endif /* VMS */ 721: #ifndef MYCURSES 722: s = getenv("TERM"); 723: if (tgetent(lp,s) < 1) { 724: #ifdef VMS 725: printf("Sorry, terminal type not supported: %s\n",s); 726: #else 727: printf("Sorry, terminal type unknown: %s\n",s); 728: #endif /* VMS */ 729: return(success = 0); 730: } 731: #endif /* MYCURSES */ 732: line[0] = '\0'; 733: } 734: #endif /* CK_CURSES */ 735: fdispla = x; /* It's OK. */ 736: return(success = 1); 737: 738: case XYFILN: /* Names */ 739: if ((x = cmkey(fntab,2,"how to handle filenames","converted", 740: xxstring)) < 0) 741: return(x); 742: if ((z = cmcfm()) < 0) return(z); 743: fncnv = x; 744: return(success = 1); 745: 746: case XYFILR: /* Record length */ 747: sprintf(tmpbuf,"%d",DLRECL); 748: if ((y = cmnum("file record length",tmpbuf,10,&z,xxstring)) < 0) 749: return(y); 750: if ((x = cmcfm()) < 0) return(x); 751: if (rmsflg) { 752: sprintf(tmpbuf,"%d",z); 753: sstate = setgen('S', "312", tmpbuf, ""); 754: return((int) sstate); 755: } else { 756: frecl = z; 757: return(success = 1); 758: } 759: 760: #ifdef COMMENT 761: case XYFILO: /* Organization */ 762: if ((x = cmkey(forgtab,nforg,"file organization","sequential", 763: xxstring)) < 0) 764: return(x); 765: if ((y = cmcfm()) < 0) return(y); 766: if (rmsflg) { 767: sprintf(tmpbuf,"%d",x); 768: sstate = setgen('S', "314", tmpbuf, ""); 769: return((int) sstate); 770: } else { 771: forg = x; 772: return(success = 1); 773: } 774: #endif /* COMMENT */ 775: 776: #ifdef COMMENT /* Not needed */ 777: case XYFILF: /* Format */ 778: if ((x = cmkey(frectab,nfrec,"file record format","stream", 779: xxstring)) < 0) 780: return(x); 781: if ((y = cmcfm()) < 0) return(y); 782: if (rmsflg) { 783: sprintf(tmpbuf,"%d",x); 784: sstate = setgen('S', "313", tmpbuf, ""); 785: return((int) sstate); 786: } else { 787: frecfm = x; 788: return(success = 1); 789: } 790: #endif /* COMMENT */ 791: 792: #ifdef COMMENT 793: case XYFILP: /* Printer carriage control */ 794: if ((x = cmkey(fcctab,nfcc,"file carriage control","newline", 795: xxstring)) < 0) 796: return(x); 797: if ((y = cmcfm()) < 0) return(y); 798: if (rmsflg) { 799: sprintf(tmpbuf,"%d",x); 800: sstate = setgen('S', "315", tmpbuf, ""); 801: return((int) sstate); 802: } else { 803: fcctrl = x; 804: return(success = 1); 805: } 806: #endif /* COMMENT */ 807: 808: case XYFILT: /* Type */ 809: if ((x = cmkey(fttab,nfttyp,"type of file","text",xxstring)) < 0) 810: return(x); 811: #ifdef COMMENT 812: if ((y = cmnum("file byte size (7 or 8)","8",10,&z,xxstring)) < 0) 813: return(y); 814: if (z != 7 && z != 8) { 815: printf("\n?The choices are 7 and 8\n"); 816: return(0); 817: } 818: #endif /* COMMENT */ 819: 820: #ifdef VMS 821: /* Allow VMS users to choose record format for binary files */ 822: if ((x == XYFT_B) && (rmsflg == 0)) { 823: if ((x = cmkey(fbtab,nfbtyp,"VMS record format","fixed", 824: xxstring)) < 0) 825: return(x); 826: } 827: #endif /* VMS */ 828: if ((y = cmcfm()) < 0) return(y); 829: if (rmsflg) { 830: sstate = setgen('S', "300", x ? "1" : "0", ""); 831: return((int) sstate); 832: } else { 833: binary = x; 834: #ifdef COMMENT 835: if (z == 7) fmask = 0177; 836: else if (z == 8) fmask = 0377; 837: #endif /* COMMENT */ 838: return(success = 1); 839: } 840: 841: case XYFILX: /* Collision Action */ 842: if ((x = cmkey(colxtab,ncolx,"Filename collision action","backup", 843: xxstring)) < 0) 844: return(x); 845: if ((y = cmcfm()) < 0) return(y); 846: fncact = x; 847: if (rmsflg) { 848: sprintf(tmpbuf,"%d",fncact); 849: sstate = setgen('S', "302", tmpbuf, ""); 850: return((int) sstate); 851: } else { 852: if (fncact == XYFX_R) warn = 1; /* SET FILE WARNING implications */ 853: if (fncact == XYFX_X) warn = 0; /* ... */ 854: return(success = 1); 855: } 856: 857: case XYFILW: /* Warning/Write-Protect */ 858: seton(&warn); 859: if (warn) 860: fncact = XYFX_R; 861: else 862: fncact = XYFX_X; 863: return(success = 1); 864: 865: #ifdef VMS 866: case XYFILL: /* LABELED FILE parameters */ 867: if ((x = cmkey(lbltab,nlblp,"VMS labeled file feature","", 868: xxstring)) < 0) 869: return(x); 870: if ((success = seton(&y)) < 0) 871: return(success); 872: if (y) /* Set or reset the selected bit */ 873: lf_opts |= x; /* in the options bitmask. */ 874: else 875: lf_opts &= ~x; 876: return(success); 877: #endif /* VMS */ 878: 879: case XYFILI: /* INCOMPLETE */ 880: return(doprm(XYIFD,rmsflg)); 881: 882: default: 883: printf("?unexpected file parameter\n"); 884: return(-2); 885: } 886: } 887: 888: int 889: settrm() { 890: if ((y = cmkey(trmtab,ntrm,"","",xxstring)) < 0) return(y); 891: #ifdef MAC 892: printf("\n?Sorry, not implemented yet. Please use the Settings menu.\n"); 893: return(-9); 894: #else 895: switch (y) { 896: case XYTBYT: /* SET TERMINAL BYTESIZE */ 897: if ((y = cmnum("bytesize for terminal connection","8",10,&x, 898: xxstring)) < 0) 899: return(y); 900: if (x != 7 && x != 8) { 901: printf("\n?The choices are 7 and 8\n"); 902: return(success = 0); 903: } 904: if ((y = cmcfm()) < 0) return(y); 905: if (x == 7) cmask = 0177; 906: else if (x == 8) cmask = 0377; 907: return(success = 1); 908: 909: case XYTSO: /* SET TERMINAL LOCKING-SHIFT */ 910: return(success = seton(&sosi)); 911: 912: case XYTNL: /* SET TERMINAL NEWLINE-MODE */ 913: return(success = seton(&tnlm)); 914: 915: #ifdef OS2 916: case XYTCOL: /* SET TERMINAL COLOR */ 917: if ((x = cmkey(ttycoltab,ncolors,"","normal",xxstring)) < 0) { 918: return(x); 919: } else { 920: extern int colornormal, colorreverse, colorunderline, 921: colorstatus, colorhelp, scrninitialised; 922: int fg, bg; 923: if ((fg = cmkey(ttyclrtab,nclrs, 924: "foreground color","black",xxstring)) < 0) 925: return(fg); 926: if ((bg = cmkey(ttyclrtab,nclrs, 927: "background color","cyan",xxstring)) < 0) 928: return(bg); 929: if ((y = cmcfm()) < 0) 930: return(y); 931: switch (x) { 932: case 0: 933: colornormal = fg | bg << 4; 934: break; 935: case 1: 936: colorreverse = fg | bg << 4; 937: break; 938: case 2: 939: colorunderline = fg | bg << 4; 940: break; 941: case 3: 942: colorstatus = fg | bg << 4; 943: break; 944: case 4: 945: colorhelp = fg | bg << 4; 946: break; 947: default: 948: printf("%s - invalid\n",cmdbuf); 949: return(-9); 950: break; 951: } 952: scrninitialised = 0; 953: } 954: return(success = 1); 955: 956: case XYTCUR: /* SET TERMINAL CURSOR */ 957: if ((x = cmkey(ttycurtab,ncursors,"","underline",xxstring)) < 0) 958: return(x); 959: if ((y = cmcfm()) < 0) return(y); 960: tt_cursor = x; 961: return(success = 1); 962: 963: case XYTTYP: /* SET TERMINAL TYPE */ 964: if ((x = cmkey(ttyptab,nttyp,"","vt102",xxstring)) < 0) return(x); 965: if ((y = cmcfm()) < 0) return(y); 966: tt_type = x; 967: return(success = 1); 968: 969: case XYTARR: /* SET TERMINAL ARROW-KEYS */ 970: if ((x = cmkey(akmtab,2,"","",xxstring)) < 0) return(x); 971: if ((y = cmcfm()) < 0) return(y); 972: tt_arrow = x; /* 0 = application, 1 = cursor */ 973: return(success = 1); 974: 975: case XYTKPD: /* SET TERMINAL KEYPAD-MODE */ 976: if ((x = cmkey(kpmtab,2,"","",xxstring)) < 0) return(x); 977: if ((y = cmcfm()) < 0) return(y); 978: tt_keypad = x; /* 0 = application, 1 = numeric */ 979: return(success = 1); 980: 981: case XYTWRP: /* SET TERMINAL WRAP */ 982: seton(&tt_wrap); 983: return(success = 1); 984: #endif /* OS2 */ 985: 986: #ifndef NOCSETS 987: case XYTCS: /* SET TERMINAL CHARACTER-SET */ 988: /* set terminal character-set <remote> <local> */ 989: if ((x = cmkey(ttcstab,ntermc, 990: "remote terminal character-set","",xxstring)) < 0) 991: return(x); 992: if (x == FC_TRANSP) { /* TRANSPARENT? */ 993: if ((x = cmcfm()) < 0) return(x); /* Confirm the command */ 994: tcsr = tcsl = FC_USASCII; /* Make them both the same */ 995: return(success = 1); 996: } 997: 998: /* Not transparent, so get local set to translate it into */ 999: 1000: s = ""; /* Make current file char set */ 1001: for (y = 0; y <= nfilc; y++) /* be the default... */ 1002: if (fcstab[y].kwval == fcharset) { 1003: s = fcstab[y].kwd; 1004: break; 1005: } 1006: if ((y = cmkey(fcstab,nfilc, 1007: "local character-set",s,xxstring)) < 0) 1008: return(y); 1009: if ((z = cmcfm()) < 0) return(z); /* Confirm the command */ 1010: tcsr = x; /* Remote character set */ 1011: tcsl = y; /* Local character set */ 1012: return(success = 1); 1013: #endif /* NOCSETS */ 1014: 1015: case XYTEC: /* SET TERMINAL ECHO */ 1016: if ((x = cmkey(rltab,nrlt,"which side echos during CONNECT", 1017: "remote", xxstring)) < 0) return(x); 1018: if ((y = cmcfm()) < 0) return(y); 1019: duplex = x; 1020: return(success = 1); 1021: 1022: case XYTCRD: /* SET TERMINAL CR-DISPLAY */ 1023: if ((x = cmkey(crdtab,2,"", "normal", xxstring)) < 0) return(x); 1024: if ((y = cmcfm()) < 0) return(y); 1025: tt_crd = x; 1026: return(success = 1); 1027: 1028: default: /* Shouldn't get here. */ 1029: return(-2); 1030: } 1031: #endif /* MAC */ 1032: } 1033: 1034: int /* SET SEND/RECEIVE */ 1035: setsr(xx, rmsflg) int xx; int rmsflg; { 1036: if (xx == XYRECV) 1037: strcpy(line,"Parameter for inbound packets"); 1038: else 1039: strcpy(line,"Parameter for outbound packets"); 1040: 1041: if (rmsflg) { 1042: if ((y = cmkey(rsrtab,nrsrtab,line,"",xxstring)) < 0) { 1043: if (y == -3) { 1044: printf("?Remote receive parameter required\n"); 1045: return(-9); 1046: } else return(y); 1047: } 1048: } else { 1049: if ((y = cmkey(srtab,nsrtab,line,"",xxstring)) < 0) return(y); 1050: } 1051: switch (y) { 1052: 1053: case XYEOL: 1054: y = cmnum("Decimal ASCII code for packet terminator","13",10,&x, 1055: xxstring); 1056: if ((y = setcc(&z,x,y)) < 0) return(y); 1057: if (xx == XYRECV) eol = z; else seol = z; 1058: return(success = y); 1059: 1060: case XYLEN: 1061: y = cmnum("Maximum number of characters in a packet","90",10,&x, 1062: xxstring); 1063: if (xx == XYRECV) { /* Receive... */ 1064: if ((y = setnum(&z,x,y,maxrps)) < 0) 1065: return(y); 1066: if (z < 10) { 1067: printf("Sorry, 10 is the minimum\n"); 1068: return(-9); 1069: } 1070: if (rmsflg) { 1071: tp = tmpbuf; 1072: sprintf(tp,"%d",z); 1073: sstate = setgen('S', "401", tp, ""); 1074: return((int) sstate); 1075: } else { 1076: if (z > MAXRP) z = MAXRP; 1077: y = adjpkl(z,wslotr,bigrbsiz); 1078: if (y != z) { 1079: urpsiz = y; 1080: if ( 1081: #ifndef NOSPL 1082: cmdlvl == 0 1083: #else 1084: tlevel < 0 1085: #endif /* NOSPL */ 1086: ) 1087: if (msgflg) printf( 1088: " Adjusting receive packet-length to %d for %d window slots\n", 1089: y, wslotr); 1090: } 1091: urpsiz = y; 1092: rpsiz = (y > 94) ? 94 : y; 1093: } 1094: } else { /* Send... */ 1095: if ((y = setnum(&z,x,y,maxsps)) < 0) 1096: return(y); 1097: if (z < 10) { 1098: printf("Sorry, 10 is the minimum\n"); 1099: return(-9); 1100: } 1101: if (z > MAXSP) z = MAXSP; 1102: spsiz = z; /* Set it */ 1103: y = adjpkl(spsiz,wslotr,bigsbsiz); 1104: if (y != spsiz && 1105: #ifndef NOSPL 1106: cmdlvl == 0 1107: #else 1108: tlevel < 0 1109: #endif /* NOSPL */ 1110: ) 1111: if (msgflg) 1112: printf("Adjusting packet size to %d for %d window slots\n", 1113: y,wslotr); 1114: spsiz = spmax = spsizr = y; /* Set it and flag that it was set */ 1115: spsizf = 1; /* to allow overriding Send-Init. */ 1116: } 1117: if (pflag && 1118: #ifndef NOSPL 1119: cmdlvl == 0 1120: #else 1121: tlevel < 0 1122: #endif /* NOSPL */ 1123: ) { 1124: if (z > 94 && msgflg) { 1125: printf("Extended-length packets requested.\n"); 1126: if (bctr < 2 && z > 200) printf("\ 1127: Remember to SET BLOCK 2 or 3 for long packets.\n"); 1128: } 1129: if (speed <= 0L) speed = ttgspd(); 1130: #ifdef COMMENT 1131: /* 1132: Kermit does this now itself. 1133: */ 1134: if (speed <= 0L && z > 200 && msgflg) { 1135: printf("\ 1136: Make sure your timeout interval is long enough for %d-byte packets.\n",z); 1137: } 1138: #endif /* COMMENT */ 1139: } 1140: return(success = y); 1141: 1142: case XYMARK: 1143: y = cmnum("Code for packet-start character","1",10,&x,xxstring); 1144: #ifdef UNIX 1145: /* 1146: Printable start-of-packet works for UNIX and VMS only! 1147: */ 1148: if ((y = setnum(&z,x,y,126)) < 0) return(y); 1149: #else 1150: #ifdef VMS 1151: if ((y = setnum(&z,x,y,126)) < 0) return(y); 1152: #else 1153: if ((y = setcc(&z,x,y)) < 0) return(y); 1154: #endif /* VMS */ 1155: #endif /* UNIX */ 1156: if (xx == XYRECV) stchr = z; else mystch = z; 1157: return(success = y); 1158: 1159: 1160: case XYNPAD: /* PADDING */ 1161: y = cmnum("How many padding characters for inbound packets","0",10,&x, 1162: xxstring); 1163: if ((y = setnum(&z,x,y,94)) < 0) return(y); 1164: if (xx == XYRECV) mypadn = z; else npad = z; 1165: return(success = y); 1166: 1167: case XYPADC: /* PAD-CHARACTER */ 1168: y = cmnum("Decimal ASCII code for packet padding character","0",10,&x, 1169: xxstring); 1170: if ((y = setcc(&z,x,y)) < 0) return(y); 1171: if (xx == XYRECV) mypadc = z; else padch = z; 1172: return(success = y); 1173: 1174: case XYTIMO: /* TIMEOUT */ 1175: if (xx == XYRECV) { 1176: char buf[16]; /* Construct default */ 1177: sprintf(buf,"%d",URTIME); 1178: y = cmnum("Packet timeout interval",buf,10,&x,xxstring); 1179: if ((y = setnum(&z,x,y,94)) < 0) return(y); 1180: 1181: if (rmsflg) { /* REMOTE SET RECEIVE TIMEOUT */ 1182: tp = tmpbuf; /* Tell Kermit server what */ 1183: sprintf(tp,"%d",z); /* timeout to ask me to use. */ 1184: sstate = setgen('S', "402", tp, ""); 1185: return((int) sstate); 1186: } else { /* SET RECEIVE TIMEOUT */ 1187: pkttim = z; /* Value to put in my negotiation */ 1188: } /* packet for other Kermit to use */ 1189: 1190: } else { /* SET SEND TIMEOUT */ 1191: y = cmnum("Packet timeout interval","",10,&x,xxstring); 1192: if (y == -3) { /* They cancelled a previous */ 1193: x = DMYTIM; /* SET SEND command, so restore */ 1194: y = 0; /* the default */ 1195: timef = 0; /* and turn off the override flag */ 1196: } else { /* They gave a number */ 1197: timef = 1; /* so turn on the override flag */ 1198: } 1199: if ((y = setnum(&z,x,y,94)) < 0) 1200: return(y); 1201: timint = rtimo = z; /* Override value for me to use */ 1202: } 1203: return(success = 1); 1204: 1205: default: 1206: return(-2); 1207: } /* End of SET SEND/RECEIVE... */ 1208: } 1209: 1210: #ifndef NOXMIT 1211: int 1212: setxmit() { 1213: if ((y = cmkey(xmitab,nxmit,"","",xxstring)) < 0) return(y); 1214: switch (y) { 1215: case XMITE: /* EOF */ 1216: y = cmtxt("Characters to send at end of file,\n\ 1217: Use backslash codes for control characters","",&s,xxstring); 1218: if (y < 0) return(y); 1219: if ((int)strlen(s) > XMBUFL) { 1220: printf("?Too many characters, %d maximum\n",XMBUFL); 1221: return(-2); 1222: } 1223: strcpy(xmitbuf,s); 1224: return(success = 1); 1225: 1226: case XMITF: /* Fill */ 1227: y = cmnum("Numeric code for blank-line fill character","0",10,&x, 1228: xxstring); 1229: if ((y = setnum(&z,x,y,127)) < 0) return(y); 1230: xmitf = z; 1231: return(success = 1); 1232: case XMITL: /* Linefeed */ 1233: return(success = seton(&xmitl)); 1234: case XMITS: /* Locking-Shift */ 1235: return(success = seton(&xmits)); 1236: case XMITP: /* Prompt */ 1237: y = cmnum("Numeric code for host's prompt character, 0 for none", 1238: "10",10,&x,xxstring); 1239: if ((y = setnum(&z,x,y,127)) < 0) return(y); 1240: xmitp = z; 1241: return(success = 1); 1242: case XMITX: /* Echo */ 1243: return(success = seton(&xmitx)); 1244: case XMITW: /* Pause */ 1245: y = cmnum("Number of milliseconds to pause between binary characters\n\ 1246: or text lines during transmission","0",10,&x,xxstring); 1247: if ((y = setnum(&z,x,y,1000)) < 0) return(y); 1248: xmitw = z; 1249: return(success = 1); 1250: default: 1251: return(-2); 1252: } 1253: } 1254: #endif /* NOXMIT */ 1255: 1256: /* D O R M T -- Do a remote command */ 1257: 1258: #ifdef ATTSV 1259: #ifndef aegis 1260: #ifndef datageneral 1261: #define CK_NEED_SIG 1262: #endif /* datageneral */ 1263: #endif /* aegis */ 1264: #endif /* ATTSV */ 1265: 1266: VOID rmsg() { 1267: if (pflag) 1268: printf( 1269: #ifdef CK_NEEDSIG 1270: 1271: " Type your escape character, %s, followed by X or E to cancel.\n", 1272: dbchr(escape) 1273: #else 1274: " Press the X or E key to cancel.\n" 1275: #endif /* CK_NEEDSIG */ 1276: ); 1277: } 1278: 1279: int 1280: dormt(xx) int xx; { 1281: int x, y, retcode; 1282: char *s, sbuf[50], *s2; 1283: 1284: 1285: if (xx < 0) return(xx); 1286: 1287: if (xx == XZSET) { /* REMOTE SET */ 1288: if ((y = cmkey(rmstab,nrms,"","",xxstring)) < 0) { 1289: if (y == -3) { 1290: printf("?Parameter name required\n"); 1291: return(-9); 1292: } else return(y); 1293: } 1294: return(doprm(y,1)); 1295: } 1296: 1297: switch (xx) { /* Others... */ 1298: 1299: case XZCWD: /* CWD */ 1300: if ((x = cmtxt("Remote directory name","",&s,xxstring)) < 0) return(x); 1301: debug(F111,"XZCWD: ",s,x); 1302: *sbuf = NUL; 1303: s2 = sbuf; 1304: 1305: /* The following is commented out, because there is practically no */ 1306: /* computer in the world that requires a password for directory changing. */ 1307: /* (The DEC-20 was the only one, and they're mostly all gone.) */ 1308: #ifdef DIRPWDPR 1309: if (*s != NUL) { /* If directory name given, */ 1310: /* get password on separate line. */ 1311: if (tlevel > -1) { /* From take file... */ 1312: 1313: if (fgets(sbuf,50,tfile[tlevel]) == NULL) 1314: fatal("take file ends prematurely in 'remote cwd'"); 1315: debug(F110," pswd from take file",s2,0); 1316: for (x = (int)strlen(sbuf); 1317: x > 0 && (sbuf[x-1] == NL || sbuf[x-1] == CR); 1318: x--) 1319: sbuf[x-1] = '\0'; 1320: 1321: } else { /* From terminal... */ 1322: 1323: printf(" Password: "); /* get a password */ 1324: #ifdef OS2 1325: while (((x = isatty(0) ? coninc(0) : 1326: getchar()) != NL) && (x != CR)) { /* with no echo */ 1327: #else 1328: while (((x = getchar()) != NL) && (x != CR)) { /* with no echo */ 1329: #endif /* OS2 */ 1330: if ((x &= 0177) == '?') { 1331: printf("? Password of remote directory\n Password: "); 1332: s2 = sbuf; 1333: *sbuf = NUL; 1334: } 1335: else if (x == ESC) /* Mini command line editor... */ 1336: putchar(BEL); 1337: else if (x == BS || x == 0177) 1338: s2--; 1339: else if (x == 025) { /* Ctrl-U */ 1340: s2 = sbuf; 1341: *sbuf = NUL; 1342: } 1343: else 1344: *s2++ = x; 1345: } 1346: *s2 = NUL; 1347: putchar('\n'); 1348: } 1349: s2 = sbuf; 1350: } else s2 = ""; 1351: #endif /* DIRPWDPR */ 1352: 1353: debug(F110," password",s2,0); 1354: sstate = setgen('C',s,s2,""); 1355: retcode = 0; 1356: break; 1357: 1358: case XZDEL: /* Delete */ 1359: if ((x = cmtxt("Name of remote file(s) to delete","",&s,xxstring)) < 0) { 1360: if (x == -3) { 1361: printf("?Name of remote file(s) required\n"); 1362: return(-9); 1363: } else return(x); 1364: } 1365: if (local) ttflui(); /* If local, flush tty input buffer */ 1366: retcode = sstate = rfilop(s,'E'); 1367: break; 1368: 1369: case XZDIR: /* Directory */ 1370: if ((x = cmtxt("Remote directory or file specification","",&s, 1371: xxstring)) < 0) 1372: return(x); 1373: if (local) ttflui(); /* If local, flush tty input buffer */ 1374: rmsg(); 1375: retcode = sstate = setgen('D',s,"",""); 1376: break; 1377: 1378: case XZHLP: /* Help */ 1379: if ((x = cmcfm()) < 0) return(x); 1380: sstate = setgen('H',"","",""); 1381: retcode = 0; 1382: break; 1383: 1384: #ifndef NOPUSH 1385: case XZHOS: /* Host */ 1386: if ((x = cmtxt("Command for remote system","",&cmarg,xxstring)) < 0) 1387: return(x); 1388: if ((int)strlen(cmarg) < 1) { 1389: if (x == -3) { 1390: printf("?Remote host command required\n"); 1391: return(-9); 1392: } else return(x); 1393: } 1394: rmsg(); 1395: retcode = sstate = 'c'; 1396: break; 1397: #endif /* NOPUSH */ 1398: 1399: #ifndef NOFRILLS 1400: case XZKER: 1401: if ((x = cmtxt("Command for remote Kermit","",&cmarg,xxstring)) < 0) 1402: return(x); 1403: if ((int)strlen(cmarg) < 1) { 1404: if (x == -3) { 1405: printf("?Remote Kermit command required\n"); 1406: return(-9); 1407: } else return(x); 1408: } 1409: retcode = sstate = 'k'; 1410: rmsg(); 1411: break; 1412: 1413: case XZLGI: { /* Login */ 1414: char *p1, *p2, *p3; 1415: if ((x = cmfld("User ID","",&s,xxstring)) < 0) return(x); 1416: if ((p1 = malloc((int)strlen(s) + 1)) == NULL) { 1417: printf("Internal error: malloc\n"); 1418: return(-2); 1419: } else strcpy(p1,s); 1420: if ((x = cmfld("Password","",&s,xxstring)) < 0) return(x); 1421: if ((p2 = malloc((int)strlen(s) + 1)) == NULL) { 1422: printf("Internal error: malloc\n"); 1423: return(-2); 1424: } else strcpy(p2,s); 1425: if ((x = cmtxt("Account or carriage return","", 1426: &s,xxstring)) < 0 && x != -3) 1427: return(x); 1428: if ((p3 = malloc((int)strlen(s) + 1)) == NULL) { 1429: printf("Internal error: malloc\n"); 1430: return(-2); 1431: } else strcpy(p3,s); 1432: sstate = setgen('I',p1,p2,p3); 1433: if (p3) free(p3); 1434: if (p2) free(p2); 1435: if (p1) free(p1); 1436: retcode = 0; 1437: break; 1438: } 1439: 1440: case XZLGO: /* Logout */ 1441: if ((x = cmcfm()) < 0) return(x); 1442: sstate = setgen('I',"","",""); 1443: retcode = 0; 1444: break; 1445: 1446: case XZPRI: /* Print */ 1447: if (!atdiso || !atcapr) { /* Disposition attribute off? */ 1448: printf("?Disposition Attribute is Off\n"); 1449: return(-2); 1450: } 1451: cmarg = ""; 1452: cmarg2 = ""; 1453: if ((x = cmifi("Local file(s) to print on remote printer","",&s,&y, 1454: xxstring)) < 0) { 1455: if (x == -3) { 1456: printf("?Name of local file(s) required\n"); 1457: return(-9); 1458: } 1459: return(x); 1460: } 1461: strcpy(line,s); /* Make a safe copy of filename */ 1462: *optbuf = NUL; /* Wipe out any old options */ 1463: if ((x = cmtxt("Options for remote print command","",&s,xxstring)) < 0) 1464: return(x); 1465: strcpy(optbuf,s); /* Make a safe copy of options */ 1466: if ((int)strlen(optbuf) > 94) { /* Make sure this is legal */ 1467: printf("?Option string too long\n"); 1468: return(-9); 1469: } 1470: nfils = -1; /* Expand file list internally */ 1471: cmarg = line; /* Point to file list. */ 1472: rprintf = 1; /* REMOTE PRINT modifier for SEND */ 1473: sstate = 's'; /* Set start state to SEND */ 1474: if (local) displa = 1; 1475: retcode = 0; 1476: break; 1477: #endif /* NOFRILLS */ 1478: 1479: case XZSPA: /* Space */ 1480: if ((x = cmtxt("Confirm, or remote directory name","",&s,xxstring)) < 0) 1481: return(x); 1482: retcode = sstate = setgen('U',s,"",""); 1483: break; 1484: 1485: #ifndef NOFRILLS 1486: case XZTYP: /* Type */ 1487: if ((x = cmtxt("Remote file specification","",&s,xxstring)) < 0) 1488: return(x); 1489: if ((int)strlen(s) < 1) { 1490: printf("?Remote filename required\n"); 1491: return(-9); 1492: } 1493: rmsg(); 1494: retcode = sstate = rfilop(s,'T'); 1495: break; 1496: #endif /* NOFRILLS */ 1497: 1498: #ifndef NOFRILLS 1499: case XZWHO: 1500: if ((x = cmtxt("Remote user name, or carriage return","",&s,xxstring)) < 0) 1501: return(x); 1502: retcode = sstate = setgen('W',s,"",""); 1503: break; 1504: #endif /* NOFRILLS */ 1505: 1506: default: 1507: if ((x = cmcfm()) < 0) return(x); 1508: printf("?Not implemented - %s\n",cmdbuf); 1509: return(-2); 1510: } 1511: if (local) ttflui(); /* If local, flush tty input buffer */ 1512: return(retcode); 1513: } 1514: 1515: 1516: /* R F I L O P -- Remote File Operation */ 1517: 1518: CHAR 1519: #ifdef CK_ANSIC 1520: rfilop(char * s, char t) 1521: #else 1522: rfilop(s,t) char *s, t; 1523: #endif /* CK_ANSIC */ 1524: /* rfilop */ { 1525: if (*s == NUL) { 1526: printf("?File specification required\n"); 1527: return((CHAR) 0); 1528: } 1529: debug(F111,"rfilop",s,t); 1530: return(setgen(t,s,"","")); 1531: } 1532: 1533: #ifdef SUNX25 1534: int 1535: setx25() { 1536: if ((y = cmkey(x25tab,nx25,"X.25 call options","",xxstring)) < 0) 1537: return(y); 1538: switch (y) { 1539: case XYUDAT: 1540: if ((z = cmkey(onoff,2,"X.25 call user data","",xxstring)) 1541: < 0) return(z); 1542: if (z == 0) { 1543: if ((z = cmcfm()) < 0) return(z); 1544: cudata = 0; /* disable call user data */ 1545: return (success = 1); 1546: } 1547: if ((x = cmtxt("X.25 call user data string","",&s,xxstring)) < 0) 1548: return(x); 1549: if ((int)strlen(s) == 0) { 1550: return (-3); 1551: } else if ((int)strlen(s) > MAXCUDATA) { 1552: printf("?The length must be > 0 and <= %d\n",MAXCUDATA); 1553: return(-2); 1554: } 1555: if ((y = cmcfm()) < 0) return(y); 1556: strcpy(udata,s); 1557: cudata = 1; /* X.25 call user data specified */ 1558: return (success = 1); 1559: case XYCLOS: 1560: if ((z = cmkey(onoff,2,"X.25 closed user group call","",xxstring)) 1561: < 0) return(z); 1562: if (z == 0) { 1563: if ((z = cmcfm()) < 0) return(z); 1564: closgr = -1; /* disable closed user group */ 1565: return (success = 1); 1566: } 1567: if ((y = cmnum("0 <= cug index >= 99","",10,&x,xxstring)) < 0) 1568: return(y); 1569: if (x < 0 || x > 99) { 1570: printf("?The choices are 0 <= cug index >= 99\n"); 1571: return(-2); 1572: } 1573: if ((y = cmcfm()) < 0) return(y); 1574: closgr = x; /* closed user group selected */ 1575: return (success = 1); 1576: 1577: case XYREVC: 1578: if((z = cmkey(onoff,2,"X.25 reverse charge call","",xxstring)) < 0) 1579: return(z); 1580: if ((x = cmcfm()) < 0) return(x); 1581: revcall = z; 1582: return (success = 1); 1583: } 1584: } 1585: 1586: int 1587: setpadp() { 1588: if ((y = cmkey(padx3tab,npadx3,"PAD X.3 parameter name","",xxstring)) < 0) 1589: return(y); 1590: x = y; 1591: switch (x) { 1592: case PAD_BREAK_CHARACTER: 1593: if ((y = cmnum("PAD break character value","",10,&z,xxstring)) < 0) 1594: return(y); 1595: if ((y = cmcfm()) < 0) return(y); 1596: break; 1597: case PAD_ESCAPE: 1598: if ((y = cmnum("PAD escape","",10,&z,xxstring)) < 0) return(y); 1599: if (z != 0 && z != 1) { 1600: printf("?The choices are 0 or 1\n"); 1601: return(-2); 1602: } 1603: if ((y = cmcfm()) < 0) return(y); 1604: break; 1605: case PAD_ECHO: 1606: if ((y = cmnum("PAD echo","",10,&z,xxstring)) < 0) return(y); 1607: if (z != 0 && z != 1) { 1608: printf("?The choices are 0 or 1\n"); 1609: return(-2); 1610: } 1611: if ((y = cmcfm()) < 0) return(y); 1612: break; 1613: case PAD_DATA_FORWARD_CHAR: 1614: if ((y = cmnum("PAD data forward char","",10,&z,xxstring)) < 0) 1615: return(y); 1616: if (z != 0 && z != 2) { 1617: printf("?The choices are 0 or 2\n"); 1618: return(-2); 1619: } 1620: if ((y = cmcfm()) < 0) return(y); 1621: break; 1622: case PAD_DATA_FORWARD_TIMEOUT: 1623: if ((y = cmnum("PAD data forward timeout","",10,&z,xxstring)) < 0) 1624: return(y); 1625: if (z < 0 || z > 255) { 1626: printf("?The choices are 0 or 1 <= timeout <= 255\n"); 1627: return(-2); 1628: } 1629: if ((y = cmcfm()) < 0) return(y); 1630: break; 1631: case PAD_FLOW_CONTROL_BY_PAD: 1632: if ((y = cmnum("PAD pad flow control","",10,&z,xxstring)) < 0) 1633: return(y); 1634: if (z != 0 && z != 1) { 1635: printf("?The choices are 0 or 1\n"); 1636: return(-2); 1637: } 1638: if ((y = cmcfm()) < 0) return(y); 1639: break; 1640: case PAD_SUPPRESSION_OF_SIGNALS: 1641: if ((y = cmnum("PAD service","",10,&z,xxstring)) < 0) return(y); 1642: if (z != 0 && z != 1) { 1643: printf("?The choices are 0 or 1\n"); 1644: return(-2); 1645: } 1646: if ((y = cmcfm()) < 0) return(y); 1647: break; 1648: 1649: case PAD_BREAK_ACTION: 1650: if ((y = cmnum("PAD break action","",10,&z,xxstring)) < 0) return(y); 1651: if (z != 0 && z != 1 && z != 2 && z != 5 && z != 8 && z != 21) { 1652: printf("?The choices are 0, 1, 2, 5, 8 or 21\n"); 1653: return(-2); 1654: } 1655: if ((y = cmcfm()) < 0) return(y); 1656: break; 1657: 1658: case PAD_SUPPRESSION_OF_DATA: 1659: if ((y = cmnum("PAD data delivery","",10,&z,xxstring)) < 0) return(y); 1660: if (z != 0 && z != 1) { 1661: printf("?The choices are 0 or 1\n"); 1662: return(-2); 1663: } 1664: if ((y = cmcfm()) < 0) return(y); 1665: break; 1666: 1667: case PAD_PADDING_AFTER_CR: 1668: if ((y = cmnum("PAD crpad","",10,&z,xxstring)) < 0) return(y); 1669: if (z < 0 || z > 7) { 1670: printf("?The choices are 0 or 1 <= crpad <= 7\n"); 1671: return(-2); 1672: } 1673: if ((y = cmcfm()) < 0) return(y); 1674: break; 1675: 1676: case PAD_LINE_FOLDING: 1677: if ((y = cmnum("PAD linefold","",10,&z,xxstring)) < 0) return(y); 1678: if (z < 0 || z > 255) { 1679: printf("?The choices are 0 or 1 <= linefold <= 255\n"); 1680: return(-2); 1681: } 1682: if ((y = cmcfm()) < 0) return(y); 1683: break; 1684: 1685: case PAD_LINE_SPEED: 1686: if ((y = cmnum("PAD baudrate","",10,&z,xxstring)) < 0) return(y); 1687: if (z < 0 || z > 18) { 1688: printf("?The choices are 0 <= baudrate <= 18\n"); 1689: return(-2); 1690: } 1691: if ((y = cmcfm()) < 0) return(y); 1692: break; 1693: 1694: case PAD_FLOW_CONTROL_BY_USER: 1695: if ((y = cmnum("PAD terminal flow control","",10,&z,xxstring)) < 0) 1696: return(y); 1697: if (z != 0 && z != 1) { 1698: printf("?The choices are 0 or 1\n"); 1699: return(-2); 1700: } 1701: if ((y = cmcfm()) < 0) return(y); 1702: break; 1703: 1704: case PAD_LF_AFTER_CR: 1705: if ((y = cmnum("PAD crpad","",10,&z,xxstring)) < 0) return(y); 1706: if (z < 0 || z == 3 || z > 7) { 1707: printf("?The choices are 0, 1, 2, 4, 5, 6 or 7\n"); 1708: return(-2); 1709: } 1710: if ((y = cmcfm()) < 0) return(y); 1711: break; 1712: 1713: case PAD_PADDING_AFTER_LF: 1714: if ((y = cmnum("PAD lfpad","",10,&z,xxstring)) < 0) return(y); 1715: if (z < 0 || z > 7) { 1716: printf("?The choices are 0 or 1 <= lfpad <= 7\n"); 1717: return(-2); 1718: } 1719: if ((y = cmcfm()) < 0) return(y); 1720: break; 1721: 1722: case PAD_EDITING: 1723: if ((y = cmnum("PAD edit control","",10,&z,xxstring)) < 0) return(y); 1724: if (z != 0 && z != 1) { 1725: printf("?The choices are 0 or 1\n"); 1726: return(-2); 1727: } 1728: if ((y = cmcfm()) < 0) return(y); 1729: break; 1730: 1731: case PAD_CHAR_DELETE_CHAR: 1732: if ((y = cmnum("PAD char delete char","",10,&z,xxstring)) < 0) 1733: return(y); 1734: if (z < 0 || z > 127) { 1735: printf("?The choices are 0 or 1 <= chardelete <= 127\n"); 1736: return(-2); 1737: } 1738: if ((y = cmcfm()) < 0) return(y); 1739: break; 1740: 1741: case PAD_BUFFER_DELETE_CHAR: 1742: if ((y = cmnum("PAD buffer delete char","",10,&z,xxstring)) < 0) 1743: return(y); 1744: if (z < 0 || z > 127) { 1745: printf("?The choices are 0 or 1 <= bufferdelte <= 127\n"); 1746: return(-2); 1747: } 1748: if ((y = cmcfm()) < 0) return(y); 1749: break; 1750: 1751: case PAD_BUFFER_DISPLAY_CHAR: 1752: if ((y = cmnum("PAD display line char","",10,&z,xxstring)) < 0) 1753: return(y); 1754: if (z < 0 || z > 127) { 1755: printf("?The choices are 0 or 1 <= displayline <= 127\n"); 1756: return(-2); 1757: } 1758: if ((y = cmcfm()) < 0) return(y); 1759: break; 1760: } 1761: padparms[x] = z; 1762: return(success = 1); 1763: } 1764: #endif /* SUNX25 */ 1765: 1766: int 1767: setat(rmsflg) int rmsflg; { 1768: int xx; 1769: if ((y = cmkey(attrtab,natr,"File Attribute packets","",xxstring)) < 0) 1770: return(y); 1771: if (y == AT_XALL) { /* ATTRIBUTES ALL ON or ALL OFF */ 1772: if ((z = seton(&xx)) < 0) return(z); 1773: if (rmsflg) { 1774: printf("Sorry, command not available\n"); 1775: return(-9); 1776: } else { 1777: atenci = xx; /* Encoding in */ 1778: atenco = xx; /* Encoding out */ 1779: atdati = xx; /* Date in */ 1780: atdato = xx; /* Date out */ 1781: atdisi = xx; /* Disposition in/out */ 1782: atdiso = xx; 1783: atleni = xx; /* Length in/out (both kinds) */ 1784: atleno = xx; 1785: atblki = xx; /* Blocksize in/out */ 1786: atblko = xx; 1787: attypi = xx; /* File type in/out */ 1788: attypo = xx; 1789: atsidi = xx; /* System ID in/out */ 1790: atsido = xx; 1791: atsysi = xx; /* System-dependent params in/out */ 1792: atsyso = xx; 1793: } 1794: return(z); 1795: } else if (y == AT_ALLY || y == AT_ALLN) { /* ATTRIBUTES ON or OFF */ 1796: if ((x = cmcfm()) < 0) return(x); 1797: atcapr = (y == AT_ALLY) ? 1 : 0; 1798: if (rmsflg) { 1799: sstate = setgen('S', "132", atcapr ? "1" : "0", ""); 1800: return((int) sstate); 1801: } else return(success = 1); 1802: } 1803: /* Otherwise, it's an individual attribute that wants turning off/on */ 1804: 1805: if ((z = cmkey(onoff,2,"","",xxstring)) < 0) return(z); 1806: if ((x = cmcfm()) < 0) return(x); 1807: 1808: /* There are better ways to do this... */ 1809: /* The real problem is that we're not separating the in and out cases */ 1810: /* and so we have to arbitrarily pick the "in" case, i.e tell the remote */ 1811: /* server to ignore incoming attributes of the specified type, rather */ 1812: /* than telling it not to send them. The protocol does not (yet) define */ 1813: /* codes for "in-and-out-at-the-same-time". */ 1814: 1815: switch(y) { 1816: case AT_DISP: 1817: if (rmsflg) { 1818: sstate = setgen('S', "142", z ? "1" : "0", ""); 1819: return((int) sstate); 1820: } 1821: atdisi = atdiso = z; break; 1822: case AT_ENCO: 1823: if (rmsflg) { 1824: sstate = setgen('S', "141", z ? "1" : "0", ""); 1825: return((int) sstate); 1826: } 1827: atenci = atenco = z; break; 1828: case AT_DATE: 1829: if (rmsflg) { 1830: sstate = setgen('S', "135", z ? "1" : "0", ""); 1831: return((int) sstate); 1832: } 1833: atdati = atdato = z; break; 1834: case AT_LENB: 1835: case AT_LENK: 1836: if (rmsflg) { 1837: sstate = setgen('S', "133", z ? "1" : "0", ""); 1838: return((int) sstate); 1839: } 1840: atleni = atleno = z; break; 1841: case AT_BLKS: 1842: if (rmsflg) { 1843: sstate = setgen('S', "139", z ? "1" : "0", ""); 1844: return((int) sstate); 1845: } 1846: atblki = atblko = z; break; 1847: case AT_FTYP: 1848: if (rmsflg) { 1849: sstate = setgen('S', "134", z ? "1" : "0", ""); 1850: return((int) sstate); 1851: } 1852: attypi = attypo = z; break; 1853: case AT_SYSI: 1854: if (rmsflg) { 1855: sstate = setgen('S', "145", z ? "1" : "0", ""); 1856: return((int) sstate); 1857: } 1858: atsidi = atsido = z; break; 1859: case AT_SYSP: 1860: if (rmsflg) { 1861: sstate = setgen('S', "147", z ? "1" : "0", ""); 1862: return((int) sstate); 1863: } 1864: atsysi = atsyso = z; break; 1865: default: 1866: printf("?Not available\n"); 1867: return(-2); 1868: } 1869: return(1); 1870: } 1871: 1872: #ifndef NOSPL 1873: int 1874: setinp() { 1875: if ((y = cmkey(inptab,ninp,"","",xxstring)) < 0) return(y); 1876: switch (y) { 1877: case IN_DEF: /* SET INPUT DEFAULT-TIMEOUT */ 1878: z = cmnum("Positive number","",10,&x,xxstring); 1879: return(success = setnum(&indef,x,z,94)); 1880: case IN_TIM: /* SET INPUT TIMEOUT-ACTION */ 1881: if ((z = cmkey(intimt,2,"","",xxstring)) < 0) return(z); 1882: if ((x = cmcfm()) < 0) return(x); 1883: intime = z; 1884: return(success = 1); 1885: case IN_CAS: /* SET INPUT CASE */ 1886: if ((z = cmkey(incast,2,"","",xxstring)) < 0) return(z); 1887: if ((x = cmcfm()) < 0) return(x); 1888: incase = z; 1889: return(success = 1); 1890: case IN_ECH: /* SET INPUT ECHO */ 1891: return(success = seton(&inecho)); 1892: case IN_SIL: /* SET INPUT SILENCE */ 1893: z = cmnum("Positive number","",10,&x,xxstring); 1894: return(success = setnum(&insilence,x,z,-1)); 1895: } 1896: return(0); 1897: } 1898: #endif /* NOSPL */ 1899: 1900: /* 1901: setlin -- parse name of and then open a communication device. 1902: Call with: 1903: xx == XXLINE for a serial (tty) line, XXHOST for a network host, 1904: zz == 0 means if user doesn't give a device name, continue current 1905: active connection (if any); 1906: zz != 0 means if user doesn't give a device name, then close the 1907: current connection and restore the default communication device. 1908: */ 1909: int 1910: setlin(xx, zz) int xx, zz; { 1911: if (xx == XYHOST) { /* SET HOST <hostname> */ 1912: #ifndef NETCONN 1913: printf("?Network connections not supported\n"); 1914: return(-9); 1915: #else 1916: if ( 1917: (nettype != NET_DEC) && 1918: (nettype != NET_SX25) && 1919: (nettype != NET_TCPB)) { 1920: printf("?Network type not supported\n"); 1921: return(-9); 1922: } 1923: if (nettype != NET_TCPB) { /* Not a TCP/IP connection */ 1924: /* Just get a text string */ 1925: if ((x = cmtxt( zz ? 1926: "Network host name,\n or carriage return to close an open connection" : 1927: "Network host name,\n or carriage return to resume an open connection", 1928: "",&s,xxstring)) < 0) 1929: return(x); 1930: 1931: } else { /* TCP/IP connection... */ 1932: 1933: /* Parse for host and service separately. */ 1934: 1935: if ((x = cmfld( zz ? 1936: "IP host name or number,\n or carriage return to close an open connection" : 1937: "IP host name or number,\n or carriage return to resume an open connection", 1938: "",&s,xxstring)) < 0) { 1939: if (x != -3) /* Parse error */ 1940: return(x); /* return it */ 1941: else if (!zz) /* No hostname given */ 1942: return(1); /* and none required, */ 1943: } /* continue current connection. */ 1944: if (*s) { /* If they gave a host name... */ 1945: strcpy(line,s); /* make a copy */ 1946: /* Check for "host:service" */ 1947: for ( ; (*s != '\0') && (*s != ':'); s++) ; 1948: 1949: /* If no service given, let them type one now. */ 1950: 1951: if (!*s) { 1952: if ((x = cmfld( 1953: "TCP service name or number,\n or carriage return for telnet (23)", 1954: "23",&s,xxstring)) < 0 && x != -3) 1955: return(x); 1956: if (*s) { /* If they gave a service, */ 1957: strcat(line,":"); /* concatenate it to the hostname */ 1958: strcat(line,s); /* separated by a colon, because */ 1959: } /* this is how ttopen() wants it. */ 1960: } 1961: if ((x = cmcfm()) < 0) return(x); /* Confirm the command */ 1962: s = line; 1963: } 1964: } 1965: 1966: /* New connection wanted. */ 1967: 1968: ttflui(); /* Clear away buffered up junk */ 1969: ttclos(0); /* Close old connection, if any */ 1970: if (oldplex > -1) /* Restore duplex setting. */ 1971: duplex = oldplex; 1972: if (*s) { /* They gave a hostname */ 1973: x = 1; /* Network connection always local */ 1974: mdmsav = mdmtyp; /* Remember old modem type */ 1975: mdmtyp = -nettype; /* Special code for network */ 1976: if (nettype == NET_TCPB) { /* For TCP/IP telnet connections */ 1977: oldplex = duplex; /* Remember previous duplex */ 1978: duplex = 0; /* Set full duplex and let */ 1979: } /* negotiations change if necessary. */ 1980: } else { /* They just said "set host" */ 1981: if (network && msgflg) 1982: printf(" Closing connection\n"); 1983: s = dftty; /* So go back to normal */ 1984: x = dfloc; /* default tty, location, */ 1985: network = 0; /* No more network connection. */ 1986: duplex = oldplex; /* Restore old duplex setting. */ 1987: if (mdmtyp < 0) { /* Switching from net to async? */ 1988: if (mdmsav > -1) /* Restore modem type from last */ 1989: mdmtyp = mdmsav; /* SET MODEM command, if any. */ 1990: else 1991: mdmtyp = 0; 1992: } 1993: } 1994: #endif /* NETCONN */ 1995: } 1996: 1997: /* Serial tty device, possibly modem, connection... */ 1998: 1999: if (xx == XYLINE) { /* SET LINE */ 2000: #ifdef OS2 /* or SET PORT */ 2001: if ((x = cmkey(os2devtab,nos2dev,"serial communication device name", 2002: "com1", xxstring)) < 0) { 2003: debug(F101,"OS2 SET PORT x","",x); 2004: if (x != -9) return(x); 2005: s = atxbuf; /* Doesn't match keyword */ 2006: if (*s == '_') s++; /* Secret notation for file handle */ 2007: else return(-9); 2008: } else if (x >= 1 && x <= 8) { /* Regular COM port */ 2009: s = os2devtab[x+7].kwd; /* Use its real name */ 2010: } else s = atxbuf; /* Something else, believe it */ 2011: #else 2012: if ((x = cmtxt("Communication device name",dftty,&s,xxstring)) < 0) 2013: return(x); 2014: #endif /* OS2 */ 2015: 2016: if (local) ttflui(); /* Clear away buffered up junk */ 2017: ttclos(0); /* Close old line, if any was open */ 2018: if (*s) { /* They gave a device name */ 2019: x = -1; /* Let ttopen decide about it */ 2020: } else { /* They just said "set line" */ 2021: s = dftty; /* so go back to normal tty */ 2022: x = dfloc; /* and mode. */ 2023: } 2024: if (mdmtyp < 0) { /* Switching from net to async? */ 2025: if (mdmsav > -1) /* Restore modem type from last */ 2026: mdmtyp = mdmsav; /* SET MODEM command, if any. */ 2027: else 2028: mdmtyp = 0; 2029: mdmsav = -1; 2030: } 2031: if (oldplex > -1) { /* Restore previous duplex setting. */ 2032: duplex = oldplex; 2033: oldplex = -1; 2034: } 2035: network = 0; /* No more network. */ 2036: } 2037: #ifdef COMMENT 2038: /* 2039: The following is removed, not so much because it's a horrible hack, but 2040: because it only works if the SET FLOW command was given *before* the SET 2041: LINE command, whereas normally these commands can be given in any order. 2042: */ 2043: #ifdef NEXT 2044: /* 2045: This is a horrible hack, but it's nice for users. On the NeXT, you select 2046: RTS/CTS hardware flow control not by system calls, but by referring to the 2047: device with a different name. If the user has asked for RTS/CTS flow 2048: control on a NeXT, but used the non-RTS/CTS device name in the SET LINE 2049: command, we make the appropriate substitute here. I wonder how much bigger 2050: this section of code will grow as the years go by... 2051: */ 2052: if ((flow == FLO_RTSC) && /* RTS/CTS flow control selected */ 2053: strcmp(s,dftty)) { /* ...on external port? */ 2054: y = strlen(s); /* Yes, insert "f" as next-to-last */ 2055: if (s[y-2] != 'f') { /* character in device name if not */ 2056: strcpy(line,s); /* already there... */ 2057: line[y] = line[y-1]; /* So /dev/cua => /dev/cufa, etc. */ 2058: line[y-1] = 'f'; 2059: line[y+1] = '\0'; 2060: s = line; 2061: } 2062: } 2063: #endif /* NEXT */ 2064: #endif /* COMMENT */ 2065: 2066: if ((y = ttopen(s,&x,mdmtyp,cdtimo)) < 0 ) { /* Open the new line */ 2067: if (y == -2) { 2068: printf("?Timed out, no carrier.\n"); 2069: printf("Try SET CARRIER OFF and SET LINE again, or else\n"); 2070: printf("SET MODEM, SET LINE, and then DIAL.\n"); 2071: } else if (y == -3) { 2072: printf("Sorry, access to lock denied: %s\n",s); 2073: } else if (y == -4) { 2074: printf("Sorry, access to device denied: %s\n",s); 2075: } else if (y == -5) { 2076: #ifdef VMS 2077: printf("Sorry, device is in use or otherwise unavailable: %s\n",s); 2078: #else 2079: printf("Sorry, device is in use: %s\n",s); 2080: #endif /* VMS */ 2081: } else { /* Other error. */ 2082: #ifndef VMS 2083: if (errno) { 2084: tp = tmpbuf; 2085: sprintf(tp,"Sorry, can't open connection: %s",s); 2086: perror(tp); 2087: } else 2088: #endif /* VMS */ 2089: printf("Sorry, can't open connection: %s\n",s); 2090: } 2091: local = dfloc; /* Go back to normal */ 2092: #ifndef MAC 2093: strcpy(ttname,dftty); /* Restore default tty name */ 2094: #endif /* MAC */ 2095: speed = ttgspd(); 2096: network = 0; /* No network connection active */ 2097: return(success = 0); /* Return failure */ 2098: } 2099: if (x > -1) local = x; /* Opened ok, set local/remote. */ 2100: network = (mdmtyp < 0); /* Remember connection type. */ 2101: #ifdef TNCODE 2102: if (network) tn_init = 0; /* Say telnet not init'd yet. */ 2103: #endif /* TNCODE */ 2104: strcpy(ttname,s); /* Copy name into real place. */ 2105: speed = ttgspd(); /* Get the current speed. */ 2106: debug(F111,"set line ",ttname,local); 2107: #ifdef NETCONN 2108: #ifdef SUNX25 2109: if (nettype == NET_SX25) duplex = 1; /* Duplex half */ 2110: #endif /* SUNX25 */ 2111: #endif /* NETCONN */ 2112: return(success = 1); 2113: } 2114: #endif /* NOICP */