|
|
1.1 root 1: /*
2: * install.c
3: * 6/7/91
4: * Install COHERENT disks on a system.
5: * This is the back end of the initial COHERENT installation procedure;
6: * the first part is in build.c.
7: * Without the -b option, it installs an update to an existing COH system.
8: * Uses common routines in build0.o: cc install.c build0.c
9: * Usage: install [ -bdv ] id device ndisks
10: * Options:
11: * -b Build: special processing for build, part 2.
12: * -d Debug, echo commands without executing
13: * -v Verbose
14: */
15:
16: #include <stdio.h>
17: #include "build0.h"
18:
19: #define VERSION "1.12"
20: #define USAGE "Usage: /etc/install [ -bdv ] id device ndisks\n"
21:
22: /* Forward. */
23: void config();
24: void done();
25: void install();
26: int newdisk();
27: void newusr();
28: void setbaud();
29:
30: /* Globals. */
31: int bflag; /* build flag */
32: char *device; /* special device name */
33: char *id; /* disk id */
34: int ndisks; /* number of disks */
35:
36: /*
37: * Baud rate table for serial port initialization.
38: * The index in the table gives the baud rate value from <sgtty.h>.
39: */
40: #define MAXBAUD 17
41: int baudrate[MAXBAUD+1] = {
42: 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2000,
43: 2400, 3600, 4800, 7200, 9600, 19200
44: };
45:
46: main(argc, argv) int argc; char *argv[];
47: {
48: register char *s;
49: register int i;
50:
51: argv0 = argv[0];
52: abortmsg = 1;
53: usagemsg = USAGE;
54: if (argc > 1 && argv[1][0] == '-') {
55: for (s = &argv[1][1]; *s; ++s) {
56: switch(*s) {
57: case 'b': ++bflag; break;
58: case 'd': ++dflag; break;
59: case 'v': ++vflag; break;
60: case 'V':
61: fprintf(stderr, "%s: V%s\n", argv0, VERSION);
62: break;
63: default: usage(); break;
64: }
65: }
66: --argc;
67: ++argv;
68: }
69: if (argc != 4)
70: usage();
71: id = argv[1];
72: device = argv[2];
73: ndisks = atoi(argv[3]);
74:
75: /* Add line to /etc/install.log. */
76: sprintf(cmd, "/bin/echo /etc/install: %s %s %s >>/etc/install.log",
77: argv[1], argv[2], argv[3]);
78: sys(cmd, S_NONFATAL);
79: sys("/bin/date >>/etc/install.log", S_NONFATAL);
80:
81: /* Remove old ids and postfile if present. */
82: if (bflag) /* Leave disk 1 marker on /. */
83: sprintf(cmd, "/bin/rm -f /%s.[023456789]* /conf/%s.post", id, id);
84: else
85: sprintf(cmd, "/bin/rm -f /%s.* /conf/%s.post", id, id);
86: sys(cmd, S_IGNORE);
87: if (bflag)
88: sys("/etc/mount.all", S_NONFATAL);
89: cls(0);
90:
91: #if 0
92: /* Execute prefile. Not required for the moment. */
93: sprintf(cmd, "/conf/%s.pre", id);
94: if (exists(cmd)) {
95: cls(0);
96: sys(cmd, S_NONFATAL);
97: }
98: #endif
99:
100: /*
101: * Install disks.
102: * Disk numbers are 2 to ndisks for build, 1 to ndisks otherwise.
103: */
104: for (i = ((bflag) ? 2 : 1); i <= ndisks; ++i)
105: install(i);
106: if (bflag) {
107: newusr();
108: config();
109: done();
110: }
111:
112: /* Delete ids and execute postfile if present. */
113: sprintf(cmd, "/bin/rm -f /%s.*", id);
114: sys(cmd, S_NONFATAL);
115: sprintf(cmd, "/conf/%s.post", id);
116: if (exists(cmd)) {
117: cls(0);
118: sys(cmd, S_NONFATAL);
119: }
120: sys("/bin/echo /etc/install: success >>/etc/install.log", S_NONFATAL);
121: sys("/bin/date >>/etc/install.log", S_NONFATAL);
122: sys("/bin/echo >>/etc/install.log", S_NONFATAL);
123: if (bflag)
124: sys("/etc/umount.all", S_NONFATAL);
125: cls(0);
126: printf("You have completed the installation procedure successfully.\n");
127: printf("Don't forget to remove the last diskette from the disk drive.\n");
128: sync();
129: exit(0);
130: }
131:
132: /*
133: * System-specific configuration.
134: */
135: void
136: config()
137: {
138: register int port, i, polled, parallel;
139: char device[6+1]; /* e.g. "com1pr" */
140: char rdevice[7+1];
141:
142: cls(1);
143: if (yes_no("Does your computer system have a modem")) {
144: printf(
145: "You must specify which asychronous serial line your modem will use.\n"
146: "See the article \"com\" in the COHERENT documentation for details.\n"
147: );
148: port = get_int(1, 4, "Enter 1 to 4 for COM1 through COM4:");
149: i = (port > 2) ? port - 2 : port; /* 1 or 2 */
150: printf(
151: "If your computer system uses both ports COM%d and COM%d,\n"
152: "one must be run in polled mode rather than interrupt-driven.\n",
153: i, i+2);
154: polled = yes_no("Do you want to run COM%d in polled mode", port);
155: sprintf(cmd, "/bin/ln -f /dev/com%d%sr /dev/modem",
156: port, (polled) ? "p" : "");
157: if (sys(cmd, S_NONFATAL) == 0)
158: printf("/dev/modem is now linked to /dev/com%d%sr.\n",
159: port, (polled) ? "p" : "");
160: printf("\n");
161: }
162: if (yes_no("Does your computer system have a printer")) {
163: printf(
164: "Your printer is connected to your computer system either through a\n"
165: "parallel port or through a serial port; most printers are connected\n"
166: "through parallel port LPT1.\n"
167: );
168: again:
169: parallel = yes_no("Is your printer connected through a parallel port");
170: if (parallel) {
171: port = get_int(1, 3, "Enter 1, 2 or 3 for port LPT1, LPT2 or LPT3:");
172: sprintf(device, "lpt%d", port);
173: } else {
174: port = get_int(1, 4, "Enter 1 to 4 for COM1 through COM4:");
175: i = (port > 2) ? port - 2 : port;
176: printf(
177: "If your computer system uses both ports COM%d and COM%d,\n"
178: "one must be run in polled mode rather than interrupt-driven.\n",
179: i, i+2);
180: polled = yes_no("Do you want to run COM%d in polled mode", port);
181: sprintf(device, "com%d%sl", port, polled);
182: printf("By default, COM%d runs at 9600 baud.\n", port);
183: if (yes_no("Does your device use a different baud rate"))
184: setbaud(port);
185: }
186: printf(
187: "Even if you know which port your printer uses under your existing operating\n"
188: "system, under COHERENT the port name may be different. For this reason,\n"
189: "we strongly recommend that you test your printer configuration.\n"
190: "If you test your printer configuration and see no output on your printer,\n"
191: "you can try a different configuration until you find the one which works.\n"
192: );
193: if (yes_no("Do you want to test whether your printer configuration is correct")) {
194: /* The command below is backgrounded in case it hangs. */
195: printf("Testing /dev/%s: process ", device);
196: fflush(stdout);
197: sprintf(cmd,
198: "/bin/echo -n 'This is printing on device /dev/%s.\r\n\014' >/dev/%s&",
199: device, device); /* 014 is formfeed */
200: sys(cmd, S_IGNORE);
201: if (!yes_no("\nDid output appear on your printer")) {
202: printf(
203: "Now try again, specifying a different port for your printer.\n"
204: );
205: goto again;
206: }
207: }
208: sprintf(cmd, "/bin/ln -f /dev/%s /dev/lp", device);
209: if (sys(cmd, S_NONFATAL) == 0)
210: printf("/dev/lp is now linked to /dev/%s.\n", device);
211: if (yes_no("Is your printer an HP LaserJet compatible laser printer")) {
212: sprintf(cmd, "/bin/ln -f /dev/%s /dev/hp", device);
213: if (sys(cmd, S_NONFATAL) == 0)
214: printf("/dev/hp is now linked to /dev/%s.\n", device);
215: sprintf(rdevice, "%s%s", (parallel) ? "r" : "", device);
216: sprintf(cmd, "/bin/ln -f /dev/%s /dev/rhp", rdevice);
217: if (sys(cmd, S_NONFATAL) == 0)
218: printf("/dev/rhp is now linked to /dev/%s.\n", rdevice);
219: }
220: printf("\n");
221: }
222: }
223:
224: /*
225: * Finish up.
226: */
227: void
228: done()
229: {
230: cls(1);
231:
232: /* Replace the install version of /etc/brc with the normal one. */
233: sys("/bin/rm /etc/brc", S_NONFATAL);
234: sys("/bin/ln -f /etc/brc.coh /etc/brc", S_NONFATAL);
235: }
236:
237: /*
238: * Install disk n.
239: */
240: void
241: install(n) int n;
242: {
243: register int i;
244:
245: again:
246: get_line("Insert a disk from the installation kit into the drive and hit <Enter>.",
247: n);
248: sprintf(cmd, "/etc/mount %s /mnt -r", device);
249: if (sys(cmd, S_NONFATAL))
250: goto again;
251: if ((i = newdisk()) == 0) {
252: sprintf(cmd, "/etc/umount %s", device);
253: sys(cmd, S_NONFATAL);
254: goto again;
255: }
256: printf("Copying disk %d. This will take a few minutes...\n", i);
257: sprintf(cmd, "/bin/cpdir -ad%s -smnt /mnt /", (vflag) ? "v" : "");
258: sys(cmd, S_FATAL);
259: sprintf(cmd, "/etc/umount %s", device);
260: sys(cmd, S_NONFATAL);
261: sprintf(cmd, "/bin/echo /etc/install: disk %d installed >>/etc/install.log",
262: i);
263: sys(cmd, S_NONFATAL);
264: }
265:
266: /*
267: * Check for an appropriate id on the disk on /mnt.
268: * Return 0 if not found, disk number otherwise.
269: */
270: int
271: newdisk()
272: {
273: register int i;
274: static int n;
275:
276: if (dflag)
277: return (n >= ndisks) ? 0 : ++n;
278: for (i = 1; i <= ndisks; i++) {
279: sprintf(buf, "/mnt/%s.%d", id, i);
280: if (!exists(buf))
281: continue; /* not disk i */
282: sprintf(buf, "/%s.%d", id, i);
283: if (exists(buf)) { /* exists on root */
284: printf(
285: "The disk you inserted is disk %d of the kit;\n"
286: "it has already been copied to the hard disk.\n"
287: "Please try again.\n",
288: i);
289: return 0; /* wrong disk */
290: }
291: return i; /* ok */
292: }
293: printf(
294: "The disk you inserted is not part of the kit.\n"
295: "Please try again.\n"
296: );
297: return 0; /* no id found */
298: }
299:
300: /*
301: * Install new users.
302: */
303: void
304: newusr()
305: {
306: static int flag = 0;
307: register int n, status, passwd;
308: register char *s;
309: char homeparent[80], user[80];
310:
311: cls(0);
312: printf(
313: "Your COHERENT system initially allows logins by users \"root\" (superuser)\n"
314: "and \"bin\" (system administrator). In addition, the password file contains\n"
315: "special entries for \"remacc\" (to control remote access, e.g. via modem),\n"
316: "\"daemon\" (the spooler), \"sys\" (to access system information), and\n"
317: "\"uucp\" (for communication with other COHERENT systems).\n"
318: "\n"
319: "If your system has multiple users or allows remote logins, you should assign\n"
320: "a password to each user.\n"
321: "\n"
322: );
323: passwd = yes_no("Do you want to assign passwords to users");
324: if (passwd) {
325: printf("You must enter each password twice.\n");
326: if (yes_no("Do you want to assign a password for user \"root\""))
327: sys("passwd root", S_NONFATAL);
328: if (yes_no("Do you want to assign a remote access password"))
329: sys("passwd remacc", S_NONFATAL);
330: if (yes_no("Do you want to assign a password for user \"bin\""))
331: sys("passwd bin", S_NONFATAL);
332: if (yes_no("Do you want to assign a password for user \"uucp\""))
333: sys("passwd uucp", S_NONFATAL);
334: }
335: printf(
336: "\nYou should create a login for each additional user of your system.\n"
337: );
338: for (n = 0; ;) {
339: if (!yes_no("Do you want to create another login"))
340: break;
341: if (++n == 1) {
342: printf(
343: "You must specify a login name, a full name and a shell for each user.\n"
344: "Joe Smith might have login name \"joe\" and full name \"Joseph H. Smith.\"\n"
345: "His home directory would be in \"/usr\" by default, namely \"/usr/joe\".\n"
346: "Do not type quotation marks around the names you enter.\n"
347: );
348: if (yes_no("Do you want home directories in \"/usr\""))
349: strcpy(homeparent, "/usr");
350: else {
351: again:
352: s = get_line("Where do you want home directories?");
353: if (*s != '/') {
354: printf(
355: "Please enter a name beginning with '/', such as \"/u\".\n"
356: );
357: goto again;
358: } else
359: strcpy(homeparent, s);
360: }
361: if ((status = is_dir(homeparent)) == -1) {
362: printf("%s is not a directory, try again.\n",
363: homeparent);
364: goto again;
365: } else if (status == 0) {
366: sprintf(cmd, "/bin/mkdir -r %s", homeparent);
367: if (sys(cmd, S_NONFATAL) != 0)
368: goto again;
369: }
370: }
371: s = get_line("Login name:");
372: strcpy(user, s);
373: sprintf(cmd, "/etc/newusr %s ", s);
374: s = get_line("Full name:");
375: sprintf(&cmd[strlen(cmd)], "\"%s\" %s", s, homeparent);
376: if (flag == 0) {
377: ++flag; /* print only first time through */
378: printf(
379: "COHERENT includes two different command line interpreters, or shells.\n"
380: "A command line interpreter is a program which reads and executes each\n"
381: "command which the user types. The available command line interpreters\n"
382: "are the Bourne shell (/bin/sh) and the Korn shell (/usr/bin/ksh).\n"
383: "Use the Bourne shell if you are not sure which shell to use.\n"
384: "After you have finished installing COHERENT, you can change the shell\n"
385: "for any user by editing the password file /etc/passwd.\n"
386: );
387: }
388: for (s = NULL; s == NULL; ) {
389: if (yes_no("Do you want to user %s to use the Bourne shell (/bin/sh)",
390: user))
391: s = "/bin/sh";
392: else if (yes_no("Do you want to user %s to use the Korn shell (/usr/bin/ksh)",
393: user))
394: s = "/usr/bin/ksh";
395: else
396: printf("You must specify either the Bourne or Korn shell.\n");
397: }
398: sprintf(&cmd[strlen(cmd)], " %s", s);
399: sys(cmd, S_NONFATAL);
400: if (passwd && yes_no("Do you want to assign a password for user \"%s\"", user)) {
401: sprintf(cmd, "passwd %s", user);
402: sys(cmd, S_NONFATAL);
403: }
404: }
405: printf("\n");
406: }
407:
408: /*
409: * Set a serial port baud rate.
410: * Patch the running COHERENT image and /coherent accordingly.
411: */
412: void
413: setbaud(port) int port;
414: {
415: register int i, baud;
416:
417: again:
418: printf(
419: "The COHERENT serial port driver supports the following baud rates:\n"
420: " 50, 75, 110, 134, 150, 200, 300, 600, 1200,\n"
421: " 1800, 2000, 2400, 3600, 4800, 7200, 9600, 19200\n"
422: "Enter the baud rate of your device (or 0 if your baud rate"
423: );
424: baud = get_int(0, 19200, "is not listed):");
425: if (baud == 0)
426: return;
427: for (i = 1; i <= MAXBAUD; i++)
428: if (baudrate[i] == baud)
429: break;
430: if (i > MAXBAUD) {
431: printf("COHERENT does not support baud rate %d.\n", baud);
432: goto again;
433: }
434:
435: /* Patch the running COHERENT for possible subsequent test. */
436: sprintf(cmd, "/conf/patch -k /coherent C%dBAUD_=%d", port, i);
437: sys(cmd, S_NONFATAL);
438:
439: /* Patch /coherent for specified baudrate. */
440: sprintf(cmd, "/conf/patch /coherent C%dBAUD_=%d", port, i);
441: sys(cmd, S_NONFATAL);
442: }
443:
444: /* end of install.c */
445:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.