Annotation of coherent/b/etc/Build_401/install.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.