|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: static char sccsid[] = "@(#)subr.c 5.4 (Berkeley) 1/7/86";
9: #endif not lint
10:
11: /*
12: * Melbourne getty.
13: */
14: #include <sgtty.h>
15: #include "gettytab.h"
16:
17: extern struct sgttyb tmode;
18: extern struct tchars tc;
19: extern struct ltchars ltc;
20:
21: /*
22: * Get a table entry.
23: */
24: gettable(name, buf, area)
25: char *name, *buf, *area;
26: {
27: register struct gettystrs *sp;
28: register struct gettynums *np;
29: register struct gettyflags *fp;
30: register n;
31:
32: hopcount = 0; /* new lookup, start fresh */
33: if (getent(buf, name) != 1)
34: return;
35:
36: for (sp = gettystrs; sp->field; sp++)
37: sp->value = getstr(sp->field, &area);
38: for (np = gettynums; np->field; np++) {
39: n = getnum(np->field);
40: if (n == -1)
41: np->set = 0;
42: else {
43: np->set = 1;
44: np->value = n;
45: }
46: }
47: for (fp = gettyflags; fp->field; fp++) {
48: n = getflag(fp->field);
49: if (n == -1)
50: fp->set = 0;
51: else {
52: fp->set = 1;
53: fp->value = n ^ fp->invrt;
54: }
55: }
56: }
57:
58: gendefaults()
59: {
60: register struct gettystrs *sp;
61: register struct gettynums *np;
62: register struct gettyflags *fp;
63:
64: for (sp = gettystrs; sp->field; sp++)
65: if (sp->value)
66: sp->defalt = sp->value;
67: for (np = gettynums; np->field; np++)
68: if (np->set)
69: np->defalt = np->value;
70: for (fp = gettyflags; fp->field; fp++)
71: if (fp->set)
72: fp->defalt = fp->value;
73: else
74: fp->defalt = fp->invrt;
75: }
76:
77: setdefaults()
78: {
79: register struct gettystrs *sp;
80: register struct gettynums *np;
81: register struct gettyflags *fp;
82:
83: for (sp = gettystrs; sp->field; sp++)
84: if (!sp->value)
85: sp->value = sp->defalt;
86: for (np = gettynums; np->field; np++)
87: if (!np->set)
88: np->value = np->defalt;
89: for (fp = gettyflags; fp->field; fp++)
90: if (!fp->set)
91: fp->value = fp->defalt;
92: }
93:
94: static char **
95: charnames[] = {
96: &ER, &KL, &IN, &QU, &XN, &XF, &ET, &BK,
97: &SU, &DS, &RP, &FL, &WE, &LN, 0
98: };
99:
100: static char *
101: charvars[] = {
102: &tmode.sg_erase, &tmode.sg_kill, &tc.t_intrc,
103: &tc.t_quitc, &tc.t_startc, &tc.t_stopc,
104: &tc.t_eofc, &tc.t_brkc, <c.t_suspc,
105: <c.t_dsuspc, <c.t_rprntc, <c.t_flushc,
106: <c.t_werasc, <c.t_lnextc, 0
107: };
108:
109: setchars()
110: {
111: register int i;
112: register char *p;
113:
114: for (i = 0; charnames[i]; i++) {
115: p = *charnames[i];
116: if (p && *p)
117: *charvars[i] = *p;
118: else
119: *charvars[i] = '\377';
120: }
121: }
122:
123: long
124: setflags(n)
125: {
126: register long f;
127:
128: switch (n) {
129: case 0:
130: if (F0set)
131: return(F0);
132: break;
133: case 1:
134: if (F1set)
135: return(F1);
136: break;
137: default:
138: if (F2set)
139: return(F2);
140: break;
141: }
142:
143: f = 0;
144:
145: if (AP)
146: f |= ANYP;
147: else if (OP)
148: f |= ODDP;
149: else if (EP)
150: f |= EVENP;
151:
152: if (UC)
153: f |= LCASE;
154:
155: if (NL)
156: f |= CRMOD;
157:
158: f |= delaybits();
159:
160: if (n == 1) { /* read mode flags */
161: if (RW)
162: f |= RAW;
163: else
164: f |= CBREAK;
165: return (f);
166: }
167:
168: if (!HT)
169: f |= XTABS;
170:
171: if (n == 0)
172: return (f);
173:
174: if (CB)
175: f |= CRTBS;
176:
177: if (CE)
178: f |= CRTERA;
179:
180: if (CK)
181: f |= CRTKIL;
182:
183: if (PE)
184: f |= PRTERA;
185:
186: if (EC)
187: f |= ECHO;
188:
189: if (XC)
190: f |= CTLECH;
191:
192: if (DX)
193: f |= DECCTQ;
194:
195: return (f);
196: }
197:
198: struct delayval {
199: unsigned delay; /* delay in ms */
200: int bits;
201: };
202:
203: /*
204: * below are random guesses, I can't be bothered checking
205: */
206:
207: struct delayval crdelay[] = {
208: 1, CR1,
209: 2, CR2,
210: 3, CR3,
211: 83, CR1,
212: 166, CR2,
213: 0, CR3,
214: };
215:
216: struct delayval nldelay[] = {
217: 1, NL1, /* special, calculated */
218: 2, NL2,
219: 3, NL3,
220: 100, NL2,
221: 0, NL3,
222: };
223:
224: struct delayval bsdelay[] = {
225: 1, BS1,
226: 0, 0,
227: };
228:
229: struct delayval ffdelay[] = {
230: 1, FF1,
231: 1750, FF1,
232: 0, FF1,
233: };
234:
235: struct delayval tbdelay[] = {
236: 1, TAB1,
237: 2, TAB2,
238: 3, XTABS, /* this is expand tabs */
239: 100, TAB1,
240: 0, TAB2,
241: };
242:
243: delaybits()
244: {
245: register f;
246:
247: f = adelay(CD, crdelay);
248: f |= adelay(ND, nldelay);
249: f |= adelay(FD, ffdelay);
250: f |= adelay(TD, tbdelay);
251: f |= adelay(BD, bsdelay);
252: return (f);
253: }
254:
255: adelay(ms, dp)
256: register ms;
257: register struct delayval *dp;
258: {
259: if (ms == 0)
260: return (0);
261: while (dp->delay && ms > dp->delay)
262: dp++;
263: return (dp->bits);
264: }
265:
266: char editedhost[32];
267:
268: edithost(pat)
269: register char *pat;
270: {
271: register char *host = HN;
272: register char *res = editedhost;
273:
274: if (!pat)
275: pat = "";
276: while (*pat) {
277: switch (*pat) {
278:
279: case '#':
280: if (*host)
281: host++;
282: break;
283:
284: case '@':
285: if (*host)
286: *res++ = *host++;
287: break;
288:
289: default:
290: *res++ = *pat;
291: break;
292:
293: }
294: if (res == &editedhost[sizeof editedhost - 1]) {
295: *res = '\0';
296: return;
297: }
298: pat++;
299: }
300: if (*host)
301: strncpy(res, host, sizeof editedhost - (res - editedhost) - 1);
302: else
303: *res = '\0';
304: editedhost[sizeof editedhost - 1] = '\0';
305: }
306:
307: struct speedtab {
308: int speed;
309: int uxname;
310: } speedtab[] = {
311: 50, B50,
312: 75, B75,
313: 110, B110,
314: 134, B134,
315: 150, B150,
316: 200, B200,
317: 300, B300,
318: 600, B600,
319: 1200, B1200,
320: 1800, B1800,
321: 2400, B2400,
322: 4800, B4800,
323: 9600, B9600,
324: 19200, EXTA,
325: 19, EXTA, /* for people who say 19.2K */
326: 38400, EXTB,
327: 38, EXTB,
328: 7200, EXTB, /* alternative */
329: 0
330: };
331:
332: speed(val)
333: {
334: register struct speedtab *sp;
335:
336: if (val <= 15)
337: return (val);
338:
339: for (sp = speedtab; sp->speed; sp++)
340: if (sp->speed == val)
341: return (sp->uxname);
342:
343: return (B300); /* default in impossible cases */
344: }
345:
346: makeenv(env)
347: char *env[];
348: {
349: static char termbuf[128] = "TERM=";
350: register char *p, *q;
351: register char **ep;
352: char *index();
353:
354: ep = env;
355: if (TT && *TT) {
356: strcat(termbuf, TT);
357: *ep++ = termbuf;
358: }
359: if (p = EV) {
360: q = p;
361: while (q = index(q, ',')) {
362: *q++ = '\0';
363: *ep++ = p;
364: p = q;
365: }
366: if (*p)
367: *ep++ = p;
368: }
369: *ep = (char *)0;
370: }
371:
372: /*
373: * This speed select mechanism is written for the Develcon DATASWITCH.
374: * The Develcon sends a string of the form "B{speed}\n" at a predefined
375: * baud rate. This string indicates the user's actual speed.
376: * The routine below returns the terminal type mapped from derived speed.
377: */
378: struct portselect {
379: char *ps_baud;
380: char *ps_type;
381: } portspeeds[] = {
382: { "B110", "std.110" },
383: { "B134", "std.134" },
384: { "B150", "std.150" },
385: { "B300", "std.300" },
386: { "B600", "std.600" },
387: { "B1200", "std.1200" },
388: { "B2400", "std.2400" },
389: { "B4800", "std.4800" },
390: { "B9600", "std.9600" },
391: { "B19200", "std.19200" },
392: { 0 }
393: };
394:
395: char *
396: portselector()
397: {
398: char c, baud[20], *type = "default";
399: register struct portselect *ps;
400: int len;
401:
402: alarm(5*60);
403: for (len = 0; len < sizeof (baud) - 1; len++) {
404: if (read(0, &c, 1) <= 0)
405: break;
406: c &= 0177;
407: if (c == '\n' || c == '\r')
408: break;
409: if (c == 'B')
410: len = 0; /* in case of leading garbage */
411: baud[len] = c;
412: }
413: baud[len] = '\0';
414: for (ps = portspeeds; ps->ps_baud; ps++)
415: if (strcmp(ps->ps_baud, baud) == 0) {
416: type = ps->ps_type;
417: break;
418: }
419: sleep(2); /* wait for connection to complete */
420: return (type);
421: }
422:
423: /*
424: * This auto-baud speed select mechanism is written for the Micom 600
425: * portselector. Selection is done by looking at how the character '\r'
426: * is garbled at the different speeds.
427: */
428: #include <sys/time.h>
429:
430: char *
431: autobaud()
432: {
433: int rfds;
434: struct timeval timeout;
435: char c, *type = "9600-baud";
436: int null = 0;
437:
438: ioctl(0, TIOCFLUSH, &null);
439: rfds = 1 << 0;
440: timeout.tv_sec = 5;
441: timeout.tv_usec = 0;
442: if (select(32, &rfds, (int *)0, (int *)0, &timeout) <= 0)
443: return (type);
444: if (read(0, &c, sizeof(char)) != sizeof(char))
445: return (type);
446: timeout.tv_sec = 0;
447: timeout.tv_usec = 20;
448: (void) select(32, (int *)0, (int *)0, (int *)0, &timeout);
449: ioctl(0, TIOCFLUSH, &null);
450: switch (c & 0377) {
451:
452: case 0200: /* 300-baud */
453: type = "300-baud";
454: break;
455:
456: case 0346: /* 1200-baud */
457: type = "1200-baud";
458: break;
459:
460: case 015: /* 2400-baud */
461: case 0215:
462: type = "2400-baud";
463: break;
464:
465: default: /* 4800-baud */
466: type = "4800-baud";
467: break;
468:
469: case 0377: /* 9600-baud */
470: type = "9600-baud";
471: break;
472: }
473: return (type);
474: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.