|
|
1.1 root 1: /*
2: * kbdinstall.c
3: * 07/26/92
4: * Keyboard support installation, including virtual console questions.
5: *
6: * cc kbdinstall.c -lcurses [-lterm]
7: * Usage: kbdinstall [ -bu ]
8: * Options:
9: * -b invoked from build
10: * -u invoked from update install, don't patch running system
11: */
12:
13: #include <stdio.h>
14: #include <string.h>
15: #include <curses.h>
16: #include "build0.h"
17:
18: extern char *fgets();
19: extern char *malloc();
20:
21: #define VERSION "3.4" /* Version number. */
22: #define KBDDIR "/conf/kbd" /* Keyboard directory. */
23: #define KBDLIST "/conf/kbd/.list" /* List of keyboards. */
24: #define KBDFILE "/tmp/kbd" /* File of driver object name(s) */
25: #define KBDY 4 /* y-coordinate of keyboard list. */
26: #define NLINE 512 /* Line length. */
27: #define NKBDS (24-KBDY) /* Max number of keyboards */
28: #define USAGE "Usage: /etc/kbdinstall [-bu]\n"
29:
30: /* Keyboard list file entries. */
31: typedef struct kline {
32: int k_loadable; /* True: loadable tables supported */
33: char *k_driver; /* Name of keyboard driver object */
34: char *k_table; /* Keyboard table name */
35: char *k_desc; /* Keyboard description */
36: } KLINE;
37:
38: /* Forward */
39: char *copystr();
40: void display_line();
41: void display_rev();
42: void fatal();
43: void my_fatal(); /* handles window cleanup */
44: void format_error();
45: void nonfatal();
46: void my_nonfatal(); /* handles window cleanup */
47: void read_klist();
48:
49: /* Globals. */
50: int bflag; /* Invoked from build. */
51: char buf[NBUF]; /* Input buffer. */
52: KLINE klist[NKBDS]; /* Keyboard list. */
53: int nkbds; /* Number of keyboards. */
54: int initflag; /* Curses initialized. */
55: int uflag; /* Invoked from update. */
56: int virtual; /* Virtual consoles wanted */
57: int default_entry = -1; /* Which entry to default to */
58: int color_sessions; /* number of color sessions */
59: int mono_sessions; /* number of mono sessions */
60:
61: main(argc, argv) int argc; char *argv[];
62: {
63: register int n, c, i;
64: char *s;
65:
66: /* Process command line options. */
67: while (argc > 1 && argv[1][0] == '-') {
68: for (s = &argv[1][1]; *s != '\0'; s++) {
69: switch (*s) {
70: case 'b': ++bflag; break;
71: case 'u': ++uflag; break;
72: case 'V': nonfatal("V%s", VERSION); break;
73: default:
74: fprintf(stderr, USAGE);
75: exit(1);
76: }
77: }
78: --argc;
79: ++argv;
80: }
81:
82: if (bflag && uflag) {
83: fprintf(stderr, USAGE);
84: exit(1);
85: }
86:
87: /* Initialize screen and terminal modes. */
88: initscr();
89: initflag = 1;
90: noecho();
91: raw();
92: clear();
93:
94: #if _I386
95: if (bflag || uflag) {
96: /*
97: * If 386 and invoked from "build" or "install", output some
98: * info about virtual consoles. Prompt the user if he/she
99: * wants V.C. support and set variable "virtual" as needed.
100: */
101: mvaddstr(0, 0,
102: "This release of COHERENT supports multiple simultaneous sessions on the");
103: mvaddstr(1, 0,
104: "system console. This feature, known as virtual consoles, supports both");
105: mvaddstr(2, 0,
106: "monochrome and color video cards (text mode only) with multiple \"login\"");
107: mvaddstr(3, 0,
108: "sessions on each, depending upon your hardware configuration. If you have");
109: mvaddstr(4, 0,
110: "both color and monochrome adapters on your system, you can run multiple");
111: mvaddstr(5, 0,
112: "sessions on each of them at the same time.");
113: mvaddstr(6, 0,
114: "Virtual console support only works with systems which have at least one");
115: mvaddstr(7, 0,
116: "megabyte of usable system memory, and with keyboards which are 100% IBM AT");
117: mvaddstr(8, 0,
118: "hardware compatible. If you are using a low cost clone keyboard which is not");
119: mvaddstr(9, 0,
120: "100% hardware compatible (i.e., does not correctly support scan code set 3");
121: mvaddstr(10, 0,
122: "operation), you will not be able to use COHERENT's virtual console features,");
123: mvaddstr(11, 0,
124: "nor will you be able to use COHERENT's \"loadable\" keyboard driver.");
125: mvaddstr(13, 0,
126: "Do you wish to include support for virtual consoles? [y or n] ");
127: refresh();
128: echo();
129: for (;;) {
130: c = getch();
131: switch (c) {
132: case 'Y':
133: case 'y':
134: ++virtual;
135: break;
136: case 'N':
137: case 'n':
138: break;
139: default:
140: continue;
141: }
142: noecho();
143: refresh();
144: mvaddstr(14, 0, "Please hit <Enter> ...");
145: refresh();
146: while ((c = getch()) != '\r' && c != '\n')
147: ;
148: mvaddstr(14, 0, "One moment, please ....");
149: refresh();
150: break;
151: }
152: clear();
153: }
154: #endif
155:
156: /* Read the keyboard list file. */
157: read_klist();
158:
159: /* Display instructions at top of screen. */
160: mvaddstr(0, 0,
161: "Select the entry below which indentifies your keyboard type. Hit <Enter> to");
162: mvaddstr(1, 0,
163: "select the highlighted entry. Hit <space> to move to the next entry.");
164:
165: /* Display choices. */
166: for (n = 0; n < nkbds; n++)
167: display_line(n);
168:
169: /* Interactive input loop: display choice n highlighted. */
170: for (n = (default_entry >= 0) ? default_entry : 0; ; ) {
171: display_rev(n); /* display default choice in reverse */
172: refresh();
173: switch (c = getch()) {
174: case 'A': /* n.b.: ESC [ A is Up Arrow key */
175: if (--n < 0)
176: n = nkbds - 1;
177: continue;
178: case ' ': /* space/Down Arrow: try next choice */
179: case 'B': /* n.b.: ESC [ B is Down Arrow key */
180: if (++n >= nkbds)
181: n = 0;
182: continue;
183: case '\n':
184: case '\r': /* enter: take default value */
185: break;
186: default:
187: continue; /* ignore */
188: }
189: break; /* done, choice is in n */
190: }
191: endwin();
192:
193: /*
194: * Execute the keyboard table file only if invoked by the user
195: * (i.e., not Build nor Update).
196: */
197: if (!uflag && !bflag) {
198: if (klist[n].k_loadable) {
199: sprintf(buf, "%s/%s", KBDDIR, klist[n].k_table);
200: if (system(buf) != 0)
201: fatal("Loadable keyboard tables not supported by this kernel", buf);
202: } else {
203: fatal("Selected entry is not a loadable keyboard table");
204: }
205: exit(0);
206: }
207:
208: /*
209: * Build or Update:
210: * Store keyboard driver name in file specified by KBDFILE.
211: * If loadable keyboard table selected, store name of keyboard
212: * table into /tmp/drvld.all (386),
213: * or to /etc/drvld.all (286 update).
214: */
215:
216: /*
217: * COH 4.2 adds vt support with non-loadable tables. If such a keyboard is
218: * selected by the user, then the table field will be "nl". In this instance,
219: * we don't want to build a drvld entry. bob h 7/14/93
220: */
221: if (klist[n].k_loadable) {
222: sprintf(buf,"/bin/echo %s >%s",(virtual)?klist[n].k_driver : "nkb.a mm.a", KBDFILE);
223: if(strcmp(klist[n].k_table,"nl")){
224: sprintf(buf,"/bin/echo %s/%s >>%s/drvld.all",
225: KBDDIR, klist[n].k_table,
226: #if _I386
227: "/tmp");
228:
229: #else
230: (bflag) ? "/tmp" : "/etc");
231: #endif
232:
233: }
234: } else {
235: sprintf(buf, "/bin/echo %s mm.a >%s",
236: klist[n].k_driver, KBDFILE);
237: }
238: sys(buf, S_FATAL);
239:
240: printf( "Your keyboard selection will not take effect until after\n"
241: "your system %s has completed and the system has rebooted!\n\n",
242: bflag ? "installation" : "update");
243:
244: /*
245: * During installation, if V.C.'s are in use,
246: * don't provide the console device.
247: */
248: if (bflag && !virtual) {
249: sprintf(cmd, "/bin/echo \"1lPconsole\" >/tmp/ttys");
250: sys(cmd, S_FATAL);
251: }
252:
253: again:
254: mono_sessions = 0;
255: if (virtual && yes_no("\nDoes this system have a monochrome (i.e., MDA) video adapter")) {
256: mono_sessions = get_int(1, 4,
257: "How many active virtual console sessions would you like on your\n"
258: "monochrome video adapter card [1-4]?");
259: for (i = 0; i < mono_sessions; ++i) {
260: sprintf(cmd, "/bin/echo \"1lPmono%d\" >>%s/ttys",
261: #if _I386
262: i, "/tmp");
263: #else
264: i, (bflag) ? "/tmp" : "/etc");
265: #endif
266: sys(cmd, S_FATAL);
267: }
268: }
269:
270: color_sessions = 0;
271: if (virtual && yes_no("\nDoes this system have a color (i.e., CGA/EGA/VGA) video adapter")) {
272: color_sessions = get_int(1, 4,
273: "How many active virtual console sessions would you like on your\n"
274: "color video adapter card [1-4]?");
275: for (i = 0; i < color_sessions; ++i) {
276: sprintf(cmd, "/bin/echo \"1lPcolor%d\" >>%s/ttys",
277: #if _I386
278: i, "/tmp");
279: #else
280: i, (bflag) ? "/tmp" : "/etc");
281: #endif
282: sys(cmd, S_FATAL);
283: }
284: }
285:
286: if (virtual && (mono_sessions + color_sessions) == 0) {
287: printf("\nYou must select either a monochrome or a color video adapter!\n");
288: goto again;
289: }
290:
291: /*
292: * After linking new kernel, will patch it for number of mono
293: * and color sessions. Do the patch even if number of sessions
294: * for the given type is zero.
295: */
296: if (virtual) {
297: sprintf(cmd,
298: "echo /conf/patch /mnt/coherent VTMONO=%d:c VTVGA=%d:c >> %s\n",
299: mono_sessions, color_sessions, PATCHFILE);
300: sys(cmd, S_FATAL);
301: }
302:
303: /* Done. */
304: exit(0);
305: }
306:
307: /*
308: * Allocate a copy of a string and return a pointer to it.
309: */
310: char *
311: copystr(s) register char *s;
312: {
313: register char *cp;
314:
315: if ((cp = malloc(strlen(s) + 1)) == NULL)
316: my_fatal("no space for string \"%s\"");
317: strcpy(cp, s);
318: return cp;
319: }
320:
321: /*
322: * Display choice n.
323: */
324: void
325: display_line(n) register int n;
326: {
327: mvaddstr(KBDY+n, 12, klist[n].k_desc);
328: }
329:
330: /*
331: * Display choice n in reverse video.
332: */
333: void
334: display_rev(n) int n;
335: {
336: static int last = -1;
337:
338: if (last != -1)
339: display_line(last); /* redisplay last in normal */
340: standout();
341: display_line(n); /* display n in reverse */
342: standend();
343: last = n;
344: }
345:
346: /*
347: * Cry and die.
348: */
349: /* VARARGS */
350: void
351: my_fatal(s) char *s;
352: {
353: if (initflag)
354: endwin();
355: fprintf(stderr, "kbdinstall: %r\n", &s);
356: exit(1);
357: }
358:
359: /*
360: * Issue nonfatal informative message.
361: */
362: /* VARARGS */
363: void
364: my_nonfatal(s) char *s;
365: {
366: if (initflag)
367: endwin();
368: fprintf(stderr, "kbdinstall: %r\n", &s);
369: }
370:
371: /*
372: * Read a file containing keyboard file names and descriptions,
373: * build a keyboard list.
374: *
375: * Format of input is:
376: * # Comment line
377: * or
378: * Default <tab> Loadable <tab> Driver <tab> Table <tab> Descr.
379: */
380: void
381: read_klist()
382: {
383: register FILE *fp;
384: register unsigned char *s, *s1;
385:
386: if ((fp = fopen(KBDLIST, "r")) == NULL)
387: my_fatal("cannot open \"%s\"", KBDLIST);
388: while (fgets(buf, sizeof buf, fp) != NULL) {
389: if (buf[0] == '#')
390: continue; /* ignore comments */
391: if (nkbds == NKBDS) {
392: my_nonfatal("more than %d keyboard entries", NKBDS-1);
393: continue;
394: }
395:
396: /*
397: * Parse input lines and emit error messages if input bad.
398: */
399: if (buf[0] == 'Y' || buf[0] == 'y')
400: default_entry = nkbds;
401: if ((s = strchr(buf, '\t')) == NULL) {
402: format_error(buf);
403: continue;
404: }
405:
406: switch (*++s) {
407: case 'Y': case 'y':
408: klist[nkbds].k_loadable = TRUE;
409: break;
410: case 'N': case 'n':
411: if ((!bflag && !uflag) || virtual)
412: continue; /* ignore if interactive ... */
413: break; /* ... or if VC's desired */
414: default:
415: format_error(buf);
416: continue;
417: }
418: if ((s = strchr(++s, '\t')) == NULL) {
419: format_error(buf);
420: continue;
421: }
422: if ((s1 = strchr(++s, '\t')) == NULL) {
423: format_error(buf);
424: continue;
425: }
426: *s1++ = '\0';
427: klist[nkbds].k_driver = copystr(s); /* keyboard driver */
428: if ((s = strchr(s1, '\t')) == NULL) {
429: format_error(s1);
430: continue;
431: }
432: *s++ = '\0';
433: klist[nkbds].k_table = copystr(s1); /* keyboard table */
434: if ((s1 = strchr(s, '\n')) == NULL) {
435: my_nonfatal("no newline in \"%s\"", s);
436: continue;
437: }
438: *s1 = '\0';
439: klist[nkbds].k_desc = copystr(s); /* kbd description */
440:
441: nkbds++;
442: }
443: fclose(fp);
444: }
445:
446: /*
447: * Input error found: display an error message and continue.
448: */
449: void
450: format_error(line)
451: char *line;
452: {
453: my_nonfatal("Input format error found in \"%s\" -- ignored.", line);
454: }
455:
456: /* end of kbdinstall.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.