|
|
1.1 root 1: #ifndef NOICP
2:
3: /* C K U U S 3 -- "User Interface" for Unix Kermit, part 3 */
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: /* SET command (but much material has been split off into ckuus7.c). */
17:
18: /*
19: Kermit-specific includes.
20: Definitions here supersede those from system include files.
21: */
22: #include "ckcdeb.h" /* Debugging & compiler things */
23: #include "ckcasc.h" /* ASCII character symbols */
24: #include "ckcker.h" /* Kermit application definitions */
25: #include "ckcxla.h" /* Character set translation */
26: #include "ckcnet.h" /* Network symbols */
27: #include "ckuusr.h" /* User interface symbols */
28:
29: /* Variables */
30:
31: extern int size, spsiz, spmax, urpsiz, srvtim,
32: local, server, success,
33: flow, binary, delay, parity, escape, what, srvdis,
34: turn, duplex, backgrd,
35: turnch, bctr, mdmtyp, keep, maxtry, unkcs, network,
36: ebqflg, quiet, swcapr, nettype,
37: wslotr, lscapr, lscapu,
38: carrier, debses,
39: cdtimo, nlangs, bgset, pflag, msgflg, dblchar,
40: cmdmsk, spsizr, wildxpand, suspend,
41: techo, terror;
42:
43: extern char *ccntab[];
44:
45: #ifndef NOSCRIPT
46: extern int secho; /* Whether SCRIPT cmd should echo */
47: #endif /* NOSCRIPT */
48:
49: #ifndef NOSPL
50: #ifdef DCMDBUF
51: extern int *count;
52: #else
53: extern int count[];
54: #endif /* DCMDBUF */
55: extern int mecho, merror; /* Macro echo, error */
56: extern int incase; /* INPUT case */
57: #endif /* NOSPL */
58:
59: extern int bigsbsiz, bigrbsiz; /* Packet buffers */
60:
61: extern long speed; /* Terminal speed */
62:
63: extern CHAR sstate; /* Protocol start state */
64: extern char ttname[]; /* Communication device name */
65: #ifndef MAC
66: #ifndef NOSETKEY
67: extern KEY *keymap; /* Character map for SET KEY (1:1) */
68: extern MACRO *macrotab; /* Macro map for SET KEY (1:string) */
69: #ifdef OS2
70: int wideresult; /* for SET KEY, wide OS/2 scan codes */
71: #endif /* OS2 */
72: #endif /* NOSETKEY */
73: #endif /* MAC */
74:
75: #ifndef NOCSETS
76: /* system-independent character sets, defined in ckcxla.[ch] */
77: extern struct csinfo tcsinfo[];
78: extern struct langinfo langs[];
79:
80: /* Other character-set related variables */
81: extern int tcharset, tslevel, language;
82: #endif /* NOCSETS */
83:
84: /* Declarations from cmd package */
85:
86: #ifdef DCMDBUF
87: extern char *cmdbuf; /* Command buffer */
88: extern char *line;
89: #else
90: extern char cmdbuf[]; /* Command buffer */
91: extern char line[]; /* Character buffer for anything */
92: #endif /* DCMDBUF */
93:
94: /* From main ckuser module... */
95:
96: extern char tmpbuf[], *tp, *lp; /* Temporary buffer */
97:
98: extern int tlevel; /* Take Command file level */
99:
100: #ifndef NOSPL
101: extern int cmdlvl; /* Overall command level */
102: #endif /* NOSPL */
103:
104: #ifdef UNIX
105: extern int sessft; /* Session-log file type */
106: #endif /* UNIX */
107:
108:
109: #ifdef VMS
110: int vms_msgs = 1; /* SET MESSAGES */
111: #endif /* VMS */
112:
113: /* Keyword tables for SET commands */
114:
115: struct keytab chktab[] = {
116: "1", 1, 0,
117: "2", 2, 0,
118: "3", 3, 0,
119: "blank-free-2", 4, 0
120: };
121:
122: /* For SET MODEM */
123:
124: struct keytab autotab[] = {
125: "changes-speed", 1, 0,
126: "matches-speed", 0, 0
127: };
128:
129: /* For SET CARRIER */
130:
131: struct keytab crrtab[] = {
132: "auto", CAR_AUT, 0,
133: "off", CAR_OFF, 0,
134: "on", CAR_ON, 0
135: };
136: int ncrr = 3;
137:
138: /* For SET DEBUG */
139:
140: struct keytab dbgtab[] = {
141: "off", 0, 0,
142: "on", 1, 0,
143: "session", 2, 0
144: };
145: int ndbg = 3;
146:
147: /* Transmission speeds */
148:
149: /* Note, the values are encoded in cps rather than bps because 19200 and */
150: /* 38400 are too big for some ints. All but 75bps are multiples of ten. */
151: /* Result of lookup in this table must be multiplied by 10 to get actual */
152: /* speed in bps. If this number is 70, it must be changed to 75. */
153: /* If it is 888, this means 75/1200 split speed. 134.5 (IBM 2741) is not */
154: /* supported, and split speed is not possible in AT&T UNIX. */
155:
156: /* The values are generic, rather than specific to UNIX. We can't use */
157: /* B75, B1200, B9600, etc, because non-UNIX versions of C-Kermit will not */
158: /* necessarily have these symbols defined. */
159:
160: /* Like all other keytabs, this one must be in "alphabetical" order, */
161: /* rather than numeric order. */
162:
163: struct keytab spdtab[] = {
164: "0", 0, CM_INV,
165: "110", 11, 0,
166: #ifdef OS2
167: #ifdef __32BIT__
168: "115200",11520, 0,
169: #endif /* __32BIT__ */
170: #endif /* OS2 */
171: "1200", 120, 0,
172: #ifdef OS2
173: "14400", 1440, 0,
174: #endif /* OS2 */
175: "150", 15, 0,
176: "19200", 1920, 0,
177: "200", 20, 0,
178: "2400", 240, 0,
179: "300", 30, 0,
180: "3600", 360, 0,
181: "38400", 3840, 0,
182: "4800", 480, 0,
183: "50", 5, 0,
184: #ifdef OS2
185: "57600", 5760, 0,
186: #endif /* OS2 */
187: "600", 60, 0,
188: #ifdef OS2
189: "7200", 720, 0,
190: #endif /* OS2 */
191: "75", 7, 0,
192: #ifdef ANYBSD
193: "75/1200",888, 0, /* Special code "888" for split speed */
194: #endif /* ANYBSD */
195: #ifdef OS2
196: #ifdef __32BIT__
197: "76800", 7680, 0,
198: #endif /* __32BIT__ */
199: #endif /* OS2 */
200: "9600", 960, 0
201: };
202: int nspd = (sizeof(spdtab) / sizeof(struct keytab)); /* how many speeds */
203:
204: #ifndef NOCSETS
205: extern struct keytab lngtab[]; /* Languages for SET LANGUAGE */
206: extern int nlng;
207: #endif /* NOCSETS */
208:
209: /* Duplex keyword table */
210:
211: struct keytab dpxtab[] = {
212: "full", 0, 0,
213: "half", 1, 0
214: };
215:
216: /* SET FILE parameters */
217:
218: struct keytab filtab[] = {
219: "bytesize", XYFILS, 0,
220: #ifndef NOCSETS
221: "character-set", XYFILC, 0,
222: #endif /* NOCSETS */
223: "collision", XYFILX, 0,
224: "display", XYFILD, 0,
225: "incomplete", XYFILI, 0,
226: #ifdef VMS
227: "label", XYFILL, 0,
228: #endif /* VMS */
229: "names", XYFILN, 0,
230: #ifdef VMS
231: "record-length", XYFILR, 0,
232: #endif /* VMS */
233: "type", XYFILT, 0,
234: "warning", XYFILW, CM_INV
235: };
236: int nfilp = (sizeof(filtab) / sizeof(struct keytab));
237:
238: /* Flow Control */
239:
240: struct keytab flotab[] = { /* SET FLOW-CONTROL keyword table */
241: #ifdef CK_DTRCD
242: "dtr/cd", FLO_DTRC, 0,
243: #endif /* CK_DTRCD */
244: #ifdef CK_DTRCTS
245: "dtr/cts",FLO_DTRT, 0,
246: #endif /* CK_DTRCTS */
247: "keep", FLO_KEEP, 0,
248: "none", FLO_NONE, 0,
249: #ifdef CK_RTSCTS
250: "rts/cts", FLO_RTSC, 0,
251: #endif /* CK_RTSCTS */
252: "xon/xoff", FLO_XONX, 0
253: };
254: int nflo = (sizeof(flotab) / sizeof(struct keytab));
255:
256: /* Handshake characters */
257:
258: struct keytab hshtab[] = {
259: "bell", 007, 0,
260: "code", 998, 0,
261: "cr", 015, 0,
262: "esc", 033, 0,
263: "lf", 012, 0,
264: "none", 999, 0, /* (can't use negative numbers) */
265: "xoff", 023, 0,
266: "xon", 021, 0
267: };
268: int nhsh = (sizeof(hshtab) / sizeof(struct keytab));
269:
270: struct keytab fttab[] = { /* File types */
271: #ifdef VMS
272: "b", XYFT_B, CM_INV|CM_ABR,
273: #endif /* VMS */
274: "binary", XYFT_B, 0,
275: #ifdef VMS
276: "block", XYFT_I, CM_INV,
277: "image", XYFT_I, 0,
278: "labeled", XYFT_L, 0,
279: #endif /* VMS */
280: "text", XYFT_T, 0
281: };
282: int nfttyp = (sizeof(fttab) / sizeof(struct keytab));
283:
284: #ifndef NODIAL
285: extern struct keytab mdmtab[] ; /* Modem types (in module ckudia.c) */
286: extern int nmdm; /* Number of them */
287: #ifndef MINIDIAL
288: extern int tbmodel; /* Telebit model ID */
289: #endif /* MINIDIAL */
290: #endif /* NODIAL */
291:
292: #ifdef UNIX
293: struct keytab wildtab[] = { /* SET WILDCARD-EXPANSION */
294: "kermit", 0, 0,
295: "shell", 1, 0
296: };
297: #endif /* UNIX */
298:
299: #ifdef NETCONN
300: extern struct keytab netcmd[];
301: extern int nnets;
302: #endif /* NETCONN */
303:
304: #ifdef SUNX25
305: struct keytab x25tab[] = {
306: "call-user-data", XYUDAT, 0,
307: "closed-user-group", XYCLOS, 0,
308: "reverse-charge", XYREVC, 0
309: };
310: int nx25 = (sizeof(x25tab) / sizeof(struct keytab));
311:
312: struct keytab padx3tab[] = {
313: "break-action", PAD_BREAK_ACTION, 0,
314: "break-character", PAD_BREAK_CHARACTER, 0,
315: "character-delete", PAD_CHAR_DELETE_CHAR, 0,
316: "cr-padding", PAD_PADDING_AFTER_CR, 0,
317: "discard-output", PAD_SUPPRESSION_OF_DATA, 0,
318: "echo", PAD_ECHO, 0,
319: "editing", PAD_EDITING, 0,
320: "escape", PAD_ESCAPE, 0,
321: "forward", PAD_DATA_FORWARD_CHAR, 0,
322: "lf-padding", PAD_PADDING_AFTER_LF, 0,
323: "lf-insert", PAD_LF_AFTER_CR, 0,
324: "line-delete", PAD_BUFFER_DELETE_CHAR, 0,
325: "line-display", PAD_BUFFER_DISPLAY_CHAR, 0,
326: "line-fold", PAD_LINE_FOLDING, 0,
327: "pad-flow-control", PAD_FLOW_CONTROL_BY_PAD, 0,
328: "service-signals", PAD_SUPPRESSION_OF_SIGNALS, 0,
329: "timeout", PAD_DATA_FORWARD_TIMEOUT, 0,
330: /* Speed is read-only */
331: "transmission-rate", PAD_LINE_SPEED, 0,
332: "user-flow-control", PAD_FLOW_CONTROL_BY_USER, 0
333: };
334: int npadx3 = (sizeof(padx3tab) / sizeof(struct keytab));
335: #endif /* SUNX25 */
336:
337: /* Parity keyword table */
338:
339: struct keytab partab[] = {
340: "even", 'e', 0,
341: "mark", 'm', 0,
342: "none", 0 , 0,
343: "odd", 'o', 0,
344: "space", 's', 0
345: };
346: int npar = (sizeof(partab) / sizeof(struct keytab));
347:
348: /* On/Off table */
349:
350: struct keytab onoff[] = {
351: "off", 0, 0,
352: "on", 1, 0
353: };
354:
355: struct keytab rltab[] = {
356: "local", 1, 0,
357: "off", 0, CM_INV,
358: "on", 1, CM_INV,
359: "remote", 0, 0
360: };
361: int nrlt = (sizeof(rltab) / sizeof(struct keytab));
362:
363: /* Incomplete File Disposition table */
364: static
365: struct keytab ifdtab[] = {
366: "discard", 0, 0,
367: "keep", 1, 0
368: };
369:
370: /* SET TAKE parameters table */
371: static
372: struct keytab taktab[] = {
373: "echo", 0, 0,
374: "error", 1, 0,
375: "off", 2, CM_INV, /* For compatibility */
376: "on", 3, CM_INV /* with MS-DOS Kermit... */
377: };
378:
379: /* SET MACRO parameters table */
380: static
381: struct keytab smactab[] = {
382: "echo", 0, 0,
383: "error", 1, 0
384: };
385:
386: #ifndef NOSCRIPT
387: static
388: struct keytab scrtab[] = {
389: "echo", 0, 0
390: };
391: #endif /* NOSCRIPT */
392:
393: /* Bytesize table */
394: struct keytab byttab[] = {
395: "bytesize", 0, 0
396: };
397: int nbytt = 1;
398:
399: #ifndef NOSERVER
400: /* Server parameters table */
401: struct keytab srvtab[] = {
402: "display", XYSERD, 0,
403: "timeout", XYSERT, 0
404: };
405: #endif /* NOSERVER */
406:
407: /* SET TRANSFER/XFER table */
408:
409: struct keytab tstab[] = {
410: #ifndef NOCSETS
411: "character-set", 1, 0,
412: #endif /* NOCSETS */
413: "locking-shift", 2, 0
414: };
415: int nts = (sizeof(tstab) / sizeof(struct keytab));
416:
417: #ifndef NOCSETS
418: /* SET TRANSFER CHARACTER-SET table */
419:
420: extern struct keytab tcstab[];
421: extern int ntcs;
422: #endif /* NOCSETS */
423:
424: /* SET TRANSFER LOCKING-SHIFT table */
425: struct keytab lstab[] = {
426: "forced", 2, 0,
427: "off", 0, 0,
428: "on", 1, 0
429: };
430: int nls = (sizeof(lstab) / sizeof(struct keytab));
431:
432: /* SET TELNET table */
433: #ifdef TNCODE
434: extern int tn_duplex, tn_nlm;
435: extern char *tn_term;
436: struct keytab tntab[] = {
437: "echo", CK_TN_EC, 0,
438: "newline-mode", CK_TN_NL, 0,
439: "terminal-type", CK_TN_TT, 0
440: };
441: int ntn = (sizeof(tntab) / sizeof(struct keytab));
442: #endif /* TNCODE */
443:
444: struct keytab ftrtab[] = { /* Feature table */
445: #ifndef NOCSETS /* 0 = we have it, 1 = we don't */
446: "character-sets", 0, 0,
447: #else
448: "character-sets", 1, 0,
449: #endif /* NOCSETS */
450: #ifndef NOCYRIL
451: "cyrillic", 0, 0,
452: #else
453: "cyrillic", 1, 0,
454: #endif /* NOCYRIL */
455:
456: #ifndef NODEBUG
457: "debug", 0, 0,
458: #else
459: "debug", 1, 0,
460: #endif /* NODEBUG */
461:
462: #ifndef NODIAL
463: "dial", 0, 0,
464: #else
465: "dial", 1, 0,
466: #endif /* NODIAL */
467:
468: #ifdef DYNAMIC
469: "dynamic-memory", 0, 0,
470: #else
471: "dynamic-memory", 1, 0,
472: #endif /* DYNAMIC */
473:
474: #ifdef CK_CURSES
475: "fullscreen-display", 0, 0,
476: #else
477: "fullscreen-display", 1, 0,
478: #endif /* CK_CURSES */
479: #ifndef NOHELP
480: "help", 0, 0,
481: #else
482: "help", 1, 0,
483: #endif /* NOHELP */
484: #ifndef NOSPL
485: "if-command", 0, 0,
486: #else
487: "if-command", 1, 0,
488: #endif /* NOSPL */
489: #ifndef NOJC
490: #ifdef UNIX
491: "job-control", 0, 0,
492: #else
493: "job-control", 1, 0,
494: #endif /* UNIX */
495: #else
496: "job-control", 1, 0,
497: #endif /* NOJC */
498: #ifdef KANJI
499: "kanji", 0, 0,
500: #else
501: "kanji", 1, 0,
502: #endif /* KANJI */
503: #ifndef NOCSETS
504: "latin1", 0, 0,
505: #else
506: "latin1", 1, 0,
507: #endif /* NOCSETS */
508: #ifdef LATIN2
509: "latin2", 0, 0,
510: #else
511: "latin2", 1, 0,
512: #endif /* LATIN2 */
513: #ifdef NETCONN
514: "network", 0, 0,
515: #else
516: "network", 1, 0,
517: #endif /* NETCONN */
518: #ifndef NOPUSH
519: "push", 0, 0,
520: #else
521: "push", 1, 0,
522: #endif /* PUSH */
523: #ifndef NOSCRIPT
524: "script-command", 0, 0,
525: #else
526: "script-command", 1, 0,
527: #endif /* NOSCRIPT */
528: #ifndef NOSERVER
529: "server-mode", 0, 0,
530: #else
531: "server-mode", 1, 0,
532: #endif /* NOSERVER */
533: #ifndef NOSHOW
534: "show-command", 0, 0,
535: #else
536: "show-command", 1, 0,
537: #endif /* NOSHOW */
538: #ifndef NOXMIT
539: "transmit", 0, 0,
540: #else
541: "transmit", 1, 0
542: #endif /* NOXMIT */
543: };
544: int nftr = (sizeof(ftrtab) / sizeof(struct keytab));
545:
546: int /* CHECK command */
547: dochk() {
548: int x, y;
549: if ((y = cmkey(ftrtab,nftr,"","",xxstring)) < 0) return(y);
550: if ((x = cmcfm()) < 0) return(x);
551: if (msgflg) /* If at top level... */
552: printf(" %svailable\n", y ? "Not a" : "A"); /* Print a message */
553: else if (y && !backgrd) /* Or if not available and in */
554: printf(" CHECK: feature not available\n"); /* command file or macro */
555: return(success = 1 - y);
556: }
557:
558: #ifndef MAC
559: #ifndef NOSETKEY
560: int
561: set_key() { /* SET KEY */
562: int y;
563: int kc; /* Key code */
564: char *bind; /* Key binding */
565:
566: if ((y = cmnum("numeric key code","",10,&kc,xxstring)) < 0)
567: return(y);
568: if (kc < 0 || kc >= KMSIZE) {
569: printf("?key code must be between 0 and %d\n", KMSIZE - 1);
570: return(-9);
571: }
572: #ifdef OS2
573: wideresult = -1;
574: #endif /* OS2 */
575: if ((y = cmtxt("key definition","",&bind,xxstring)) < 0)
576: return(y);
577: if (macrotab[kc]) { /* Possibly free old macro from key */
578: free(macrotab[kc]);
579: macrotab[kc] = NULL;
580: }
581: switch (strlen(bind)) { /* Action depends on length */
582: #ifdef OS2
583: case 0: /* Reset to default binding */
584: keymap[kc] = wideresult == -1 ? kc : 0; /* or bind to NUL */
585: break;
586: case 1: /* Single character */
587: keymap[kc] = wideresult == -1 ? (CHAR) *bind : wideresult;
588: break;
589: #else /* Not OS/2 */
590: case 0: /* Reset to default binding */
591: keymap[kc] = kc;
592: break;
593: case 1: /* Single character */
594: keymap[kc] = (CHAR) *bind;
595: break;
596: #endif /* OS2 */
597:
598: default: /* Character string */
599: keymap[kc] = kc;
600: macrotab[kc] = (MACRO) malloc(strlen(bind)+1);
601: if (macrotab[kc])
602: strcpy((char *) macrotab[kc], bind);
603: break;
604: }
605: return(1);
606: }
607: #endif /* NOSETKEY */
608: #endif /* MAC */
609:
610: /* D O P R M -- Set a parameter. */
611: /*
612: Returns:
613: -2: illegal input
614: -1: reparse needed
615: 0: success
616: */
617: int
618: doprm(xx,rmsflg) int xx, rmsflg; {
619: int i, x, y = 0, z;
620: long zz;
621: char *s;
622:
623: switch (xx) {
624:
625: #ifdef SUNX25 /* SET X25 ... */
626: case XYX25:
627: return(setx25());
628:
629: case XYPAD: /* SET PAD ... */
630: return(setpadp());
631: #endif /* SUNX25 */
632:
633: case XYEOL: /* These have all been moved to set send/receive... */
634: case XYLEN: /* Let the user know what to do. */
635: case XYMARK:
636: case XYNPAD:
637: case XYPADC:
638: case XYTIMO:
639: printf("...Use SET SEND or SET RECEIVE instead.\n");
640: printf("Type HELP SET SEND or HELP SET RECEIVE for more info.\n");
641: return(success = 0);
642:
643: case XYATTR: /* File Attribute packets */
644: return(setat(rmsflg));
645:
646: case XYIFD: /* Incomplete file disposition */
647: if ((y = cmkey(ifdtab,2,"","discard",xxstring)) < 0) return(y);
648: if ((x = cmcfm()) < 0) return(x);
649: if (rmsflg) {
650: sstate = setgen('S', "310", y ? "1" : "0", "");
651: return((int) sstate);
652: } else {
653: keep = y;
654: return(success = 1);
655: }
656:
657: #ifndef NOSPL
658: case XYINPU: /* SET INPUT */
659: return(setinp());
660: #endif /* NOSPL */
661:
662: #ifdef NETCONN
663: case XYNET: /* SET NETWORK */
664: if ((z = cmkey(netcmd,nnets,"","tcp/ip",xxstring)) < 0)
665: return(z);
666: if ((x = cmcfm()) < 0) return(x);
667: nettype = z;
668: if (
669: (nettype != NET_DEC) &&
670: (nettype != NET_SX25) &&
671: (nettype != NET_TCPB)) {
672: printf("?Network type not supported\n");
673: return(success = 0);
674: } else {
675: return(success = 1);
676: }
677: #endif /* NETCONN */
678:
679: case XYHOST: /* SET HOST or SET LINE */
680: case XYLINE:
681: return(setlin(xx,1));
682:
683: #ifndef MAC
684: #ifndef NOSETKEY
685: case XYKEY: /* SET KEY */
686: return(set_key());
687: #endif /* NOSETKEY */
688: #endif /* MAC */
689:
690: #ifndef NOCSETS
691: case XYLANG: /* Language */
692: if ((y = cmkey(lngtab,nlng,"","none",xxstring)) < 0) /* language code */
693: return(y);
694: if ((x = cmcfm()) < 0) return(x); /* And confirmation of command */
695:
696: /* Look up language and get associated character sets */
697: for (i = 0; (i < nlangs) && (langs[i].id != y); i++) ;
698: if (i >= nlangs) {
699: printf("?internal error, sorry\n");
700: return(success = 0);
701: }
702: language = i; /* All good, set the language, */
703: return(success = 1);
704: #endif /* NOCSETS */
705:
706: #ifndef MAC
707: case XYBACK: /* BACKGROUND */
708: if ((z = cmkey(onoff,2,"","",xxstring)) < 0) return(z);
709: if ((y = cmcfm()) < 0) return(y);
710: bgset = z;
711: success = 1;
712: bgchk();
713: return(success);
714: #endif /* MAC */
715:
716: case XYQUIE: /* QUIET */
717: return(success = seton(&quiet));
718:
719: case XYBUF: { /* BUFFERS */
720: #ifdef DYNAMIC
721: int sb, rb;
722: if ((y = cmnum("send buffer size","",10,&sb,xxstring)) < 0) {
723: if (y == -3) printf("?two numbers required\n");
724: return(y);
725: }
726: if (sb < 80) {
727: printf("?too small");
728: return(-2);
729: }
730: if ((y = cmnum("receive buffer size","",10,&rb,xxstring)) < 0) {
731: if (y == -3) printf("?receive buffer size required\n");
732: return(y);
733: }
734: if (rb < 80) {
735: printf("?too small");
736: return(-2);
737: }
738: if ((y = cmcfm()) < 0) return(y);
739: if ((y = inibufs(sb,rb)) < 0) return(y);
740: y = adjpkl(urpsiz,wslotr,bigrbsiz); /* Maybe adjust packet sizes */
741: if (y != urpsiz) urpsiz = y;
742: y = adjpkl(spsiz,wslotr,bigsbsiz);
743: if (y != spsiz) spsiz = spmax = spsizr = y;
744: return(success = 1);
745: #else
746: printf("?Sorry, not available\n");
747: return(success = 0);
748: #endif /* DYNAMIC */
749: }
750:
751: case XYCHKT: /* BLOCK-CHECK */
752: if ((x = cmkey(chktab,4,"","1",xxstring)) < 0) return(x);
753: if ((y = cmcfm()) < 0) return(y);
754: bctr = x; /* Set locally too, even if REMOTE SET */
755: if (rmsflg) {
756: if (x == 4) {
757: tmpbuf[0] = 'B';
758: tmpbuf[1] = '\0';
759: } else sprintf(tmpbuf,"%d",x);
760: sstate = setgen('S', "400", tmpbuf, "");
761: return((int) sstate);
762: } else {
763: return(success = 1);
764: }
765:
766: #ifndef MAC
767: /*
768: The Mac has no carrier...
769: */
770: case XYCARR: /* CARRIER */
771: if ((y = cmkey(crrtab,ncrr,"","auto",xxstring)) < 0) return(y);
772: if (y == CAR_ON) {
773: x = cmnum("Carrier wait timeout, seconds","0",10,&z,xxstring);
774: if (x < 0) return(z);
775: }
776: if ((x = cmcfm()) < 0) return(x);
777: carrier = ttscarr(y);
778: cdtimo = z;
779: return(success = 1);
780: #endif /* MAC */
781:
782: #ifdef TNCODE
783: case XYTEL: /* TELNET */
784: if ((z = cmkey(tntab,ntn,"parameter for TELNET negotiations", "",
785: xxstring)) < 0) return(z);
786: switch (z) {
787: case CK_TN_EC: /* ECHO */
788: if ((x = cmkey(rltab,nrlt,
789: "initial TELNET echoing state","local",xxstring)) < 0)
790: return(x);
791: if ((y = cmcfm()) < 0) return(y);
792: tn_duplex = x;
793: return(success = 1);
794:
795: case CK_TN_TT: /* TERMINAL TYPE */
796: if ((y = cmtxt("terminal type for TELNET connections","",
797: &s,xxstring)) < 0)
798: return(y);
799: if (tn_term) free(tn_term); /* Free any previous storage */
800: if (s == NULL || *s == NUL) { /* If none given */
801: tn_term = NULL; /* remove the override string */
802: return(success = 1);
803: } else if (tn_term = malloc(strlen(s)+1)) { /* Make storage for new */
804: strcpy(tn_term,s); /* Copy string into new storage */
805: return(success = 1);
806: } else return(success = 0);
807:
808: case CK_TN_NL: /* NEWLINE-MODE */
809: return(success = seton(&tn_nlm));
810:
811: default:
812: return(-2);
813: }
814: #endif /* TNCODE */
815:
816: default:
817: break;
818: }
819:
820: switch (xx) {
821: #ifndef NOSPL
822: case XYCOUN: /* SET COUNT */
823: x = cmnum("Positive number","0",10,&z,xxstring);
824: if (x < 0) return(x);
825: if ((x = cmcfm()) < 0) return(x);
826: if (z < 0) {
827: printf("?A positive number, please\n");
828: return(0);
829: }
830: debug(F101,"XYCOUN: z","",z);
831: return(success = setnum(&count[cmdlvl],z,0,10000));
832: #endif /* NOSPL */
833:
834: #ifndef NOSPL
835: case XYCASE:
836: return(success = seton(&incase));
837: #endif /* NOSPL */
838:
839: case XYCMD: /* COMMAND ... */
840: if ((y = cmkey(byttab,nbytt,"","bytesize",xxstring)) < 0) return(y);
841: if ((y = cmnum("bytesize for command characters, 7 or 8","7",10,&x,
842: xxstring)) < 0)
843: return(y);
844: if (x != 7 && x != 8) {
845: printf("\n?The choices are 7 and 8\n");
846: return(success = 0);
847: }
848: if ((y = cmcfm()) < 0) return(y);
849: if (x == 7) cmdmsk = 0177;
850: else if (x == 8) cmdmsk = 0377;
851: return(success = 1);
852:
853: case XYDFLT: /* SET DEFAULT = CD */
854: return(success = docd());
855:
856: case XYDEBU: /* SET DEBUG { on, off, session } */
857: if ((y = cmkey(dbgtab,ndbg,"","",xxstring)) < 0) return(y);
858: if ((x = cmcfm()) < 0) return(x);
859: switch (y) {
860: case 0: /* 0 = all debugging off. */
861: debses = 0;
862: #ifdef DEBUG
863: if (deblog) doclslog(LOGD);
864: #endif /* DEBUG */
865: return(success = 1);
866:
867: case 1: /* 1 = log debugging to debug.log */
868: #ifdef DEBUG
869: deblog = debopn("debug.log", 0);
870: return(success = deblog ? 1 : 0);
871: #else
872: printf("?Sorry, debug log feature not enabled\n");
873: return(success = 0);
874: #endif /* DEBUG */
875:
876: case 2: /* 2 = session. */
877: return(success = debses = 1);
878: }
879:
880: case XYDELA: /* SET DELAY */
881: y = cmnum("Number of seconds before starting to send","5",10,&x,xxstring);
882: if (x < 0) x = 0;
883: return(success = setnum(&delay,x,y,999));
884:
885: default:
886: break;
887: }
888:
889: switch (xx) {
890:
891: #ifndef NODIAL
892: case XYDIAL: /* SET DIAL */
893: return(setdial());
894: #endif /* NODIAL */
895:
896: #ifdef COMMENT /* Unused at present */
897: case XYDOUB:
898: if ((x = cmfld("Character to double","none",&s,xxstring)) < 0) {
899: if (x == -3) {
900: dblchar = -1;
901: if (msgflg) printf("Doubling Off\n");
902: return(success = 1);
903: } else return(x);
904: }
905: strcpy(line,s);
906: lp = line;
907: if ((x = cmcfm()) < 0) return(x);
908: if (!xxstrcmp(lp,"none",4)) {
909: dblchar = -1;
910: if (msgflg) printf("Doubling Off\n");
911: return(success = 1);
912: }
913: if ((int)strlen(lp) != 1) return(-2);
914: dblchar = *lp & 0xFF;
915: if (msgflg) printf("Doubled: %d\n",dblchar);
916: return(success = 1);
917: #endif /* COMMENT */
918:
919: case XYDUPL: /* SET DUPLEX */
920: if ((y = cmkey(dpxtab,2,"","full",xxstring)) < 0) return(y);
921: if ((x = cmcfm()) < 0) return(x);
922: duplex = y;
923: return(success = 1);
924:
925: case XYLCLE: /* LOCAL-ECHO (= DUPLEX) */
926: return(success = seton(&duplex));
927:
928: case XYESC: /* SET ESCAPE */
929: sprintf(tmpbuf,"%d",DFESC);
930: y = cmnum("Decimal ASCII code for CONNECT-mode escape character",
931: tmpbuf, 10,&x,xxstring);
932: success = setcc(&escape,x,y);
933: #ifdef COMMENT
934: /* This is what SHOW ESCAPE is for. */
935: if (success && msgflg)
936: printf(" CONNECT-mode escape character: %d (Ctrl-%c, %s)\n",
937: escape,ctl(escape),(escape == 127 ? "DEL" : ccntab[escape]));
938: #endif /* COMMENT */
939: return(success);
940:
941: default:
942: break;
943: }
944:
945: switch (xx) {
946: case XYFILE: /* SET FILE */
947: return(setfil(rmsflg));
948:
949: case XYFLOW: /* FLOW-CONTROL */
950: /*
951: Note: flotab[] keyword table (defined above) only includes the legal
952: flow-control options for each implementation, controlled by symbols
953: defined in ckcdeb.h.
954: */
955: if ((y = cmkey(flotab,nflo,"","xon/xoff",xxstring)) < 0) return(y);
956: if ((x = cmcfm()) < 0) return(x);
957: flow = y;
958: debug(F101,"set flow","",flow);
959: return(success = 1);
960:
961: case XYHAND: /* HANDSHAKE */
962: if ((y = cmkey(hshtab,nhsh,"","none",xxstring)) < 0) return(y);
963: if (y == 998) {
964: if ((x = cmnum("ASCII value","",10,&y,xxstring)) < 0)
965: return(x);
966: if ((y < 1) || ((y > 31) && (y != 127))) {
967: printf("?Character must be in ASCII control range\n");
968: return(-9);
969: }
970: }
971: if ((x = cmcfm()) < 0) return(x);
972: turn = (y > 0127) ? 0 : 1 ;
973: turnch = y;
974: return(success = 1);
975:
976: #ifndef NOSPL
977: case XYMACR: /* SET MACRO */
978: if ((y = cmkey(smactab,2,"","",xxstring)) < 0) return(y);
979: switch (y) {
980: case 0: return(success = seton(&mecho));
981: case 1: return(success = seton(&merror));
982: default: return(-2);
983: }
984: #endif /* NOSPL */
985:
986: #ifndef NODIAL
987: case XYMODM: /* SET MODEM */
988: if ((x = cmkey(mdmtab,nmdm,"type of modem","none", xxstring)) < 0)
989: return(x);
990: if ((z = cmcfm()) < 0) return(z);
991: mdmtyp = x;
992: #ifndef MINIDIAL
993: tbmodel = 0; /* If it's a Telebit, we don't know the model yet */
994: #endif /* MINIDIAL */
995: return(success = 1);
996: #endif /* NODIAL */
997:
998: case XYMSGS:
999: #ifdef VMS
1000: if ((z = cmkey(onoff,2,"","",xxstring)) < 0) return(z);
1001: if ((y = cmcfm()) < 0) return(y);
1002: vms_msgs = z;
1003: printf("Sorry, SET MESSAGES not implemented yet\n");
1004: return(success = 0);
1005: #endif /* VMS */
1006: default:
1007: break;
1008: }
1009:
1010: switch (xx) {
1011:
1012: case XYPARI: /* PARITY */
1013: if ((y = cmkey(partab,npar,"","none",xxstring)) < 0) return(y);
1014: if ((x = cmcfm()) < 0) return(x);
1015:
1016: /* If parity not none, then we also want 8th-bit prefixing */
1017:
1018: if (parity = y) ebqflg = 1; else ebqflg = 0;
1019: return(success = 1);
1020:
1021: #ifndef NOFRILLS
1022: case XYPROM: /* SET PROMPT */
1023: /*
1024: Note: xxstring not invoked here. Instead, it is invoked every time the
1025: prompt is issued. This allows the prompt string to contain variables
1026: that can change, like \v(dir), \v(time), etc.
1027: */
1028: #ifdef MAC
1029: if ((x = cmtxt("Program's command prompt","Mac-Kermit>",&s,NULL)) < 0)
1030: #else
1031: if ((x = cmtxt("Program's command prompt","C-Kermit>",&s,NULL)) < 0)
1032: #endif /* MAC */
1033: return(x);
1034: if (*s == '{') { /* Remove enclosing braces, if any */
1035: x = (int)strlen(s);
1036: if (s[x-1] == '}') {
1037: s[x-1] = NUL;
1038: s++;
1039: }
1040: }
1041: #ifdef COMMENT
1042: /*
1043: Let's not do this any more -- we don't do it anywhere else.
1044: */
1045: else if (*s == '"') { /* For compatibility with pre-5A */
1046: x = (int)strlen(s);
1047: if (s[x-1] == '"') {
1048: s[x-1] = NUL;
1049: s++;
1050: }
1051: }
1052: #endif /* COMMENT */
1053: cmsetp(s); /* Set the prompt */
1054: return(success = 1);
1055: #endif /* NOFRILLS */
1056:
1057: case XYRETR: /* RETRY: per-packet retry limit */
1058: y = cmnum("Maximum retries per packet","10",10,&x,xxstring);
1059: if (x < 0) x = 0;
1060: if ((x = setnum(&maxtry,x,y,999)) < 0) return(x);
1061: if (maxtry <= wslotr) {
1062: printf("?Retry limit must be greater than window size\n");
1063: return(success = 0);
1064: }
1065: sprintf(tmpbuf,"%d",maxtry);
1066: if (rmsflg) {
1067: sstate = setgen('S', "403", tmpbuf, "");
1068: return((int) sstate);
1069: } else return(success = x);
1070:
1071: #ifndef NOSERVER
1072: case XYSERV: /* SET SERVER items */
1073: if ((y = cmkey(srvtab,2,"","",xxstring)) < 0) return(y);
1074: switch (y) {
1075: case XYSERT:
1076: tp = tmpbuf;
1077: sprintf(tp,"%d",DSRVTIM);
1078: if ((y = cmnum("interval for server NAKs, 0 = none",tp,10,&x,
1079: xxstring)) < 0)
1080: return(y);
1081: if (x < 0) {
1082: printf("\n?Specify a positive number, or 0 for no server NAKs\n");
1083: return(0);
1084: }
1085: if ((y = cmcfm()) < 0) return(y);
1086: sprintf(tp,"%d",x);
1087: if (rmsflg) {
1088: sstate = setgen('S', "404", tp, "");
1089: return((int) sstate);
1090: } else {
1091: srvtim = x; /* Set the server timeout variable */
1092: return(success = 1);
1093: }
1094: case XYSERD: /* SERVER DISPLAY */
1095: return(success = seton(&srvdis)); /* ON or OFF... */
1096: default:
1097: return(-2);
1098: }
1099: #endif /* NOSERVER */
1100:
1101: #ifdef UNIX
1102: #ifndef NOJC
1103: case XYSUSP: /* SET SUSPEND */
1104: seton(&suspend); /* on or off... */
1105: return(success = 1);
1106: #endif /* NOJC */
1107: #endif /* UNIX */
1108:
1109: case XYTAKE: /* SET TAKE */
1110: if ((y = cmkey(taktab,4,"","",xxstring)) < 0) return(y);
1111: switch (y) {
1112: case 0: return(success = seton(&techo));
1113: case 1: return(success = seton(&terror));
1114: case 2: techo = 0; return(success = 1); /* For compatibility with */
1115: case 3: techo = 1; return(success = 1); /* MS-DOS Kermit */
1116: default: return(-2);
1117: }
1118:
1119: #ifndef NOSCRIPT
1120: case XYSCRI: /* SET SCRIPT */
1121: if ((y = cmkey(scrtab,1,"","echo",xxstring)) < 0) return(y);
1122: switch (y) {
1123: case 0: return(success = seton(&secho));
1124: default: return(-2);
1125: }
1126: #endif /* NOSCRIPT */
1127:
1128: default:
1129: break;
1130: }
1131:
1132: switch (xx) {
1133: case XYTERM: /* SET TERMINAL */
1134: return(settrm());
1135:
1136: default:
1137: break;
1138: }
1139:
1140: switch (xx) {
1141:
1142: /* SET SEND/RECEIVE protocol parameters. */
1143:
1144: case XYRECV:
1145: case XYSEND:
1146: return(setsr(xx,rmsflg));
1147:
1148: #ifdef UNIX
1149: case XYSESS: /* SESSION-LOG */
1150: if ((x = cmkey(fttab,2,"type of file","text",xxstring)) < 0)
1151: return(x);
1152: if ((y = cmcfm()) < 0) return(y);
1153: sessft = x;
1154: return(success = 1);
1155: #endif /* UNIX */
1156:
1157: case XYSPEE: /* SET SPEED */
1158: if (network) {
1159: printf("\n?Speed cannot be set for network connections\n");
1160: return(success = 0);
1161: }
1162: lp = line;
1163: sprintf(lp,"Transmission rate for %s in bits per second",ttname);
1164:
1165: if ((x = cmkey(spdtab,nspd,line,"",xxstring)) < 0) {
1166: if (x == -3) printf("?value required\n");
1167: return(x);
1168: }
1169: if ((y = cmcfm()) < 0) return(y);
1170: if (!local) {
1171: printf("?Sorry, you must SET LINE first\n");
1172: return(success = 0);
1173: }
1174: zz = (long) x * 10L;
1175: if (zz == 70) zz = 75; /* (see spdtab[] def) */
1176: if (ttsspd(x) < 0) { /* Call ttsspd with cps, not bps! */
1177: printf("?Unsupported line speed - %ld\n",zz);
1178: return(success = 0);
1179: } else {
1180: speed = zz;
1181: if (pflag &&
1182: #ifndef NOSPL
1183: cmdlvl == 0
1184: #else
1185: tlevel < 0
1186: #endif /* NOSPL */
1187: ) {
1188: if (speed == 8880)
1189: printf("%s, 75/1200 bps\n",ttname);
1190: else
1191: printf("%s, %ld bps\n",ttname,speed);
1192: }
1193: return(success = 1);
1194: }
1195:
1196: case XYXFER: /* SET TRANSFER */
1197: if ((y = cmkey(tstab,nts,"","character-set",xxstring)) < 0) return(y);
1198: #ifndef NOCSETS
1199: if (y == 1) { /* character-set */
1200: if ((y = cmkey(tcstab,ntcs,"","transparent",xxstring)) < 0) return(y);
1201: if ((x = cmcfm()) < 0) return(x);
1202: if (rmsflg) {
1203: sstate = setgen('S', "405", tcsinfo[y].designator, "");
1204: return((int) sstate);
1205: } else {
1206: tslevel = (y == TC_TRANSP) ? 0 : 1; /* transfer syntax level */
1207: tcharset = y; /* transfer character set */
1208: return(success = 1);
1209: }
1210: } else
1211: #endif /* NOCSETS */
1212: if (y == 2) { /* LOCKING-SHIFT options */
1213: if ((y = cmkey(lstab,nls,"","on",xxstring)) < 0)
1214: return(y);
1215: if ((x = cmcfm()) < 0) return(x);
1216: lscapr = (y == 1) ? 1 : 0; /* ON: requested = 1 */
1217: lscapu = (y == 2) ? 2 : 0; /* FORCED: used = 1 */
1218: return(success = 1);
1219: } else return(-2);
1220:
1221: #ifndef NOXMIT
1222: case XYXMIT: /* SET TRANSMIT */
1223: return(setxmit());
1224: #endif /* NOXMIT */
1225:
1226: #ifndef NOCSETS
1227: case XYUNCS: /* UNKNOWN-CHARACTER-SET */
1228: if ((y = cmkey(ifdtab,2,"","discard",xxstring)) < 0) return(y);
1229: if ((x = cmcfm()) < 0) return(x);
1230: unkcs = y;
1231: return(success = 1);
1232: #endif /* NOCSETS */
1233:
1234: #ifdef UNIX
1235: case XYWILD: /* WILDCARD-EXPANSION */
1236: if ((y = cmkey(wildtab,2,"who expands wildcards","kermit",xxstring)) < 0)
1237: return(y);
1238: if ((x = cmcfm()) < 0) return(x);
1239: wildxpand = y;
1240: return(success = 1);
1241: #endif /* UNIX */
1242:
1243: case XYWIND: /* WINDOW-SLOTS */
1244: y = cmnum("Number of sliding-window slots, 1 to 31","1",10,&x,xxstring);
1245: y = setnum(&z,x,y,31);
1246: if (y < 0) return(y);
1247: if (z < 1) z = 1;
1248: #ifdef COMMENT
1249: /* This is unreasonable */
1250: if (maxtry < z) {
1251: printf("?Window slots must be less than retry limit\n");
1252: return(success = 0);
1253: }
1254: #endif /* COMMENT */
1255: if (rmsflg) { /* Set remote window size */
1256: tp = tmpbuf;
1257: sprintf(tp,"%d",z);
1258: sstate = setgen('S', "406", tp, "");
1259: return((int) sstate);
1260: }
1261: wslotr = z; /* Set local window size */
1262: swcapr = (wslotr > 1) ? 1 : 0; /* Set window bit in capas word? */
1263: if (wslotr > 1) { /* Window size > 1? */
1264: y = adjpkl(urpsiz,wslotr,bigrbsiz); /* Maybe adjust packet size */
1265: if (y != urpsiz) { /* Did it change? */
1266: urpsiz = y;
1267: if (msgflg)
1268: printf(
1269: " Adjusting receive packet-length to %d for %d window slots\n",
1270: urpsiz, wslotr);
1271: }
1272: }
1273: return(success = 1);
1274:
1275: default:
1276: if ((x = cmcfm()) < 0) return(x);
1277: printf("Not working yet - %s\n",cmdbuf);
1278: return(success = 0);
1279: }
1280: }
1281: #endif /* NOICP */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.