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