Annotation of 43BSDReno/old/configttys/configttys.c, revision 1.1

1.1     ! root        1: 
        !             2: #ifndef        lint
        !             3: char sccsid[] = "@(#)configttys.c      4.4 (Berkeley) 6/19/83";
        !             4: #endif
        !             5: 
        !             6: /*
        !             7:  * configttys - configure "tty" ports
        !             8:  *
        !             9:  * David L. Wasley
        !            10:  * U.C.Berkeley
        !            11:  */
        !            12: 
        !            13: #include <stdio.h>
        !            14: #include <getty.h>
        !            15: #include <signal.h>
        !            16: 
        !            17: #define        exists(file)    (access(file, 0) == 0)
        !            18: 
        !            19: char   *etc_ttys       = "/etc/ttys";          /* active port speed table */
        !            20: char   *etc_ttytype    = "/etc/ttytype";       /* terminal type table */
        !            21: char   *etc_conf       = "/etc/ttyconf";       /* master config file */
        !            22: char   *lockfile       = "/etc/ttyconf.lock";  /* interlock file */
        !            23: 
        !            24: struct ttys {
        !            25:        char    ty_active;      /* active login port */
        !            26:        char    ty_speed;       /* speed table character */
        !            27:        char    ty_port[32];    /* port name */
        !            28: } ttys[256];
        !            29: 
        !            30: struct ttytype {
        !            31:        char    tp_term[64];    /* terminal type name */
        !            32:        char    tp_port[32];    /* port name */
        !            33: } ttytype[256];
        !            34: 
        !            35: char   conformat[]     = "%s\t%s\t%s\t%s\n";
        !            36: 
        !            37: int    error   = 0;
        !            38: int    renamed = 0;
        !            39: int    debug   = 0;                    /* debug mode */
        !            40: int    backup  = 0;                    /* create backup copies of old data */
        !            41: int    interactive = 1;                /* interactive mode */
        !            42: 
        !            43: char   *speedname();                   /* port speed code name */
        !            44: char   speedchar();                    /* getty table name */
        !            45: char   *termname();                    /* name of terminal on this port */
        !            46: char   *rindex();
        !            47: struct ttytype *type();                /* find ttytype for port */
        !            48: FILE   *fopen();
        !            49: 
        !            50: main (argc, argv)
        !            51:        int argc;
        !            52:        char **argv;
        !            53: {
        !            54:        int             lineno;
        !            55:        int             child;
        !            56:        int             status;
        !            57:        char            c;
        !            58:        struct ttys     *ty;
        !            59:        struct ttytype  *tp;
        !            60:        char            port[32];
        !            61:        char            active[16];
        !            62:        char            speed[32];
        !            63:        char            term[64];
        !            64:        FILE            *tyf, *tpf, *conf;
        !            65:        char            buf[1024];
        !            66:        char            ans[32];
        !            67: 
        !            68:        while (--argc > 0)
        !            69:        {
        !            70:                if (**++argv == '-') switch (*++*argv)
        !            71:                {
        !            72:                        case 'd':
        !            73:                                debug = 1;
        !            74:                                break;
        !            75: 
        !            76:                        case 'n':               /* non-interactive */
        !            77:                                interactive = 0;
        !            78:                                break;
        !            79: 
        !            80:                        case 'b':               /* backup old databases */
        !            81:                                backup = 1;
        !            82:                                break;
        !            83: 
        !            84:                        default:
        !            85:                                fprintf(stderr, "unknown option %c\n", **argv);
        !            86:                                exit(1);
        !            87:                }
        !            88:        }
        !            89: 
        !            90:        if (debug)
        !            91:        {
        !            92:                etc_ttys = rindex(etc_ttys, '/') + 1;
        !            93:                etc_ttytype = rindex(etc_ttytype, '/') + 1;
        !            94:                etc_conf = rindex(etc_conf, '/') + 1;
        !            95:                lockfile = rindex(lockfile, '/') + 1;
        !            96:        }
        !            97: 
        !            98:        /*
        !            99:         * create backup copies of the databases?
        !           100:         */
        !           101:        if (backup)
        !           102:        {
        !           103:                if (exists(etc_ttys))
        !           104:                {
        !           105:                        sprintf(buf, "/bin/cp %s %s.bak", etc_ttys, etc_ttys);
        !           106:                        system(buf);
        !           107:                }
        !           108:                if (exists(etc_ttys))
        !           109:                {
        !           110:                        sprintf(buf, "/bin/cp %s %s.bak", etc_ttytype, etc_ttytype);
        !           111:                        system(buf);
        !           112:                }
        !           113:                if (exists(etc_conf))
        !           114:                {
        !           115:                        sprintf(buf, "/bin/cp %s %s.bak", etc_conf, etc_conf);
        !           116:                        system(buf);
        !           117:                }
        !           118:        }
        !           119: 
        !           120:        /*
        !           121:         * create interlock file
        !           122:         */
        !           123:        getlockfile(lockfile);
        !           124: 
        !           125:        /*
        !           126:         * always read ttys file for comparison
        !           127:         * It is afterall what really counts!
        !           128:         */
        !           129:        if (readttys() != 0)
        !           130:                quit(1);
        !           131: 
        !           132:        /*
        !           133:         * read old ttytypes if necessary
        !           134:         */
        !           135:        if (! exists(etc_conf))
        !           136:        {
        !           137:                /*
        !           138:                 * open old ttytype file
        !           139:                 */
        !           140:                if ((tpf = fopen(etc_ttytype, "r")) == NULL)
        !           141:                {
        !           142:                        perror(etc_ttytype);
        !           143:                        quit(1);
        !           144:                }
        !           145: 
        !           146:                /*
        !           147:                 * read ttytype file
        !           148:                 */
        !           149:                lineno = 0;
        !           150:                tp = ttytype;
        !           151:                while (fgets(buf, sizeof buf, tpf))
        !           152:                {
        !           153:                        lineno++;
        !           154:                        if (sscanf(buf, "%s %s", tp->tp_term, tp->tp_port) == 2)
        !           155:                                tp++;
        !           156:                        else
        !           157:                        {
        !           158:                                error++;
        !           159:                                fprintf(stderr, "bad line %d in %s: %s",
        !           160:                                        lineno, etc_ttytype, buf);
        !           161:                        }
        !           162:                }
        !           163:                fclose(tpf);
        !           164:                tp->tp_term[0] = '\0';
        !           165: 
        !           166:                if (error > 0)
        !           167:                        quit(1);
        !           168: 
        !           169:                /*
        !           170:                 * create master config file
        !           171:                 */
        !           172:                if ((conf = fopen(etc_conf, "w")) == NULL)
        !           173:                {
        !           174:                        perror(etc_conf);
        !           175:                        quit(1);
        !           176:                }
        !           177: 
        !           178:                fprintf(conf, conformat, "port", "login", "speed\t", "terminal type");
        !           179:                fprintf(conf, conformat, "----", "-----", "-----\t", "-------------");
        !           180:                for (ty = ttys; ty->ty_active; ty++)
        !           181:                {
        !           182:                        fprintf(conf, conformat, ty->ty_port,
        !           183:                                ty->ty_active == '1'? "active":"-",
        !           184:                                speedname(ty->ty_speed),
        !           185:                                termname(ty->ty_port));
        !           186:                }
        !           187:                fclose(conf);
        !           188:        }
        !           189: 
        !           190:        /*
        !           191:         * open master config file
        !           192:         */
        !           193:        if ((conf = fopen(etc_conf, "r")) == NULL)
        !           194:        {
        !           195:                perror(etc_conf);
        !           196:                quit(1);
        !           197:        }
        !           198: 
        !           199:        if (interactive)
        !           200:                edit();
        !           201: 
        !           202:        /*
        !           203:         * read conf file
        !           204:         */
        !           205: re_read:
        !           206:        rewind(conf);
        !           207:        ty = ttys;
        !           208:        renamed = 0;
        !           209:        error = 0;
        !           210:        lineno = 0;
        !           211: 
        !           212:        while (fgets(buf, sizeof buf, conf))    /* skip heading */
        !           213:        {
        !           214:                lineno++;
        !           215:                if (buf[0] == '-')
        !           216:                        break;
        !           217:        }
        !           218: 
        !           219:        while (fgets(buf, sizeof buf, conf))
        !           220:        {
        !           221:                lineno++;
        !           222:                if (sscanf(buf, "%s %s %s %s", port, active, speed, term) < 4)
        !           223:                {
        !           224:                        fprintf(stderr, "line %d: field(s) missing: %s",
        !           225:                                lineno, buf);
        !           226:                        error++;
        !           227:                        break;
        !           228:                }
        !           229: 
        !           230:                if (strcmp(port, ty->ty_port) != 0)
        !           231:                {
        !           232:                        if (! ty->ty_active || renamed)
        !           233:                                strcpy(ty->ty_port, port);
        !           234:                        else
        !           235:                        {
        !           236:                                fprintf(stderr, "line %d: port name changed! %s -> %s\n",
        !           237:                                        lineno, ty->ty_port, port);
        !           238:                                fprintf(stderr, "Are you sure this is OK? ");
        !           239:                                gets(ans);
        !           240:                                if (ans[0] != 'y')
        !           241:                                {
        !           242:                                        edit();
        !           243:                                        goto re_read;
        !           244:                                }
        !           245:                                renamed++;
        !           246:                                strcpy(ty->ty_port, port);
        !           247:                        }
        !           248:                }
        !           249: 
        !           250:                if (strcmp(active, "active") == 0)
        !           251:                        ty->ty_active = '1';
        !           252:                else
        !           253:                        ty->ty_active = '0';
        !           254: 
        !           255:                if (c = speedchar(speed))
        !           256:                        ty->ty_speed = c;
        !           257:                else
        !           258:                {
        !           259:                        fprintf(stderr, "line %d: speed name not known: %s\n",
        !           260:                                lineno, speed);
        !           261:                        error++;
        !           262:                }
        !           263:                
        !           264:                if (tp = type(port))
        !           265:                        strcpy(tp->tp_term, term);
        !           266:                /* else ?? */
        !           267: 
        !           268:                ty++;
        !           269:        }
        !           270: 
        !           271:        if (ty == ttys)
        !           272:        {
        !           273:                fprintf(stderr, "%s empty??\n", etc_conf);
        !           274:                error++;
        !           275:        }
        !           276: 
        !           277:        if (error)
        !           278:        {
        !           279:                if (interactive)
        !           280:                {
        !           281:                        fprintf(stderr, "re-edit? ");
        !           282:                        gets(ans);
        !           283:                        if (ans[0] == 'y')
        !           284:                        {
        !           285:                                edit();
        !           286:                                goto re_read;
        !           287:                        }
        !           288:                }
        !           289:                fprintf(stderr, "Files not modified.\n");
        !           290:                quit(1);
        !           291:        }
        !           292: 
        !           293:        writettys();
        !           294:        quit(0);
        !           295: }
        !           296: 
        !           297: /*
        !           298:  * read ttys file
        !           299:  */
        !           300: readttys()
        !           301: {
        !           302:        FILE                    *tyf;
        !           303:        register struct ttys    *ty;
        !           304:        char                    buf[1024];
        !           305:        int                     lineno;
        !           306:        int                     error   = 0;
        !           307: 
        !           308:        if ((tyf = fopen(etc_ttys, "r")) == NULL)
        !           309:        {
        !           310:                if (exists(etc_conf))
        !           311:                        return (0);     /* hope user has it together! */
        !           312:                perror(etc_ttys);
        !           313:                quit(1);
        !           314:        }
        !           315: 
        !           316:        lineno = 0;
        !           317:        ty = ttys;
        !           318:        while (fgets(buf, sizeof buf, tyf))
        !           319:        {
        !           320:                lineno++;
        !           321:                if (sscanf(buf, "%c%c%s",
        !           322:                        &ty->ty_active, &ty->ty_speed, ty->ty_port) == 3)
        !           323:                        ty++;
        !           324:                else
        !           325:                {
        !           326:                        error++;
        !           327:                        fprintf(stderr, "bad line %d in %s: %s",
        !           328:                                lineno, etc_ttys, buf);
        !           329:                }
        !           330:        }
        !           331:        fclose(tyf);
        !           332:        ty->ty_active = '\0';
        !           333:        return(error);
        !           334: }
        !           335: 
        !           336: writettys()
        !           337: {
        !           338:        int     rtn = 0;
        !           339:        char    temp[1024];
        !           340:        FILE    *tyf, *tpf;
        !           341:        register struct ttys    *ty;
        !           342: 
        !           343:        sprintf(temp, "%s.tmp", etc_ttys);
        !           344:        if ((tyf = fopen(temp, "w")) == NULL)
        !           345:        {
        !           346:                perror(temp);
        !           347:                quit(1);
        !           348:        }
        !           349: 
        !           350:        for (ty = ttys; ty->ty_active; ty++)
        !           351:                fprintf(tyf, "%c%c%s\n",
        !           352:                        ty->ty_active, ty->ty_speed, ty->ty_port);
        !           353:        fclose(tyf);
        !           354: 
        !           355:        if (rename(temp, etc_ttys) != 0)
        !           356:        {
        !           357:                fprintf(stderr, "Can't rename %s\n", temp);
        !           358:                rtn = 1;
        !           359:        }
        !           360: 
        !           361:        sprintf(temp, "%s.tmp", etc_ttytype);
        !           362:        if ((tpf = fopen(temp, "w")) == NULL)
        !           363:        {
        !           364:                perror(temp);
        !           365:                quit(1);
        !           366:        }
        !           367: 
        !           368:        for (ty = ttys; ty->ty_active; ty++)    /* same ports! */
        !           369:                fprintf(tpf, "%s %s\n",
        !           370:                        type(ty->ty_port)->tp_term, ty->ty_port);
        !           371:        fclose(tpf);
        !           372: 
        !           373:        if (rename(temp, etc_ttytype) != 0)
        !           374:        {
        !           375:                fprintf(stderr, "Can't rename %s\n", temp);
        !           376:                rtn = 1;
        !           377:        }
        !           378: 
        !           379:        return (rtn);
        !           380: }
        !           381: 
        !           382: /*
        !           383:  * invoke editor
        !           384:  */
        !           385: edit()
        !           386: {
        !           387:        int     child;
        !           388:        int     status;
        !           389: 
        !           390:        if ((child = fork()) == 0)
        !           391:        {
        !           392:                execl("/usr/ucb/vi", "vi", etc_conf, 0);
        !           393:                execl("/bin/ed", "ed", etc_conf, 0);
        !           394:                exit(1);
        !           395:        }
        !           396: 
        !           397:        if (child < 0)
        !           398:        {
        !           399:                perror("can't fork editor");
        !           400:                quit(1);
        !           401:        }
        !           402: 
        !           403:        /*
        !           404:         * wait for editor
        !           405:         */
        !           406:        while (wait(&status) >= 0)
        !           407:                ;
        !           408: 
        !           409:        return (status);
        !           410: }
        !           411: 
        !           412: quit (n)
        !           413: int    n;
        !           414: {
        !           415:        unlink (lockfile);
        !           416:        if (n > 1)
        !           417:        {
        !           418:                signal (n, SIG_DFL);
        !           419:                kill (getpid(), n);
        !           420:        }
        !           421:        exit (n);
        !           422: }
        !           423: 
        !           424: getlockfile ()
        !           425: {
        !           426:        char    *p;
        !           427:        char    locktmp[64];
        !           428:        int     fd;
        !           429: 
        !           430:        strcpy(locktmp, lockfile);
        !           431:        if (p = rindex(locktmp, '/'))
        !           432:                p++;
        !           433:        else
        !           434:                p = locktmp;
        !           435:        strcpy(p, "confttysXXXXXX");
        !           436:        mktemp(locktmp);
        !           437: 
        !           438:        if ((fd = creat(locktmp, 0600)) < 0)
        !           439:        {
        !           440:                perror(locktmp);
        !           441:                exit(1);
        !           442:        }
        !           443: 
        !           444:        if (link(locktmp, lockfile) < 0)
        !           445:        {
        !           446:                perror(lockfile);
        !           447:                unlink(locktmp);
        !           448:                exit(1);
        !           449:        }
        !           450: 
        !           451:        signal(SIGINT,  quit);
        !           452:        signal(SIGQUIT, quit);
        !           453: 
        !           454:        unlink(locktmp);
        !           455:        return(0);
        !           456: }
        !           457: 
        !           458: struct speeds {
        !           459:        char    *sp_name;       /* human readable name */
        !           460:        char    sp_table;       /* getty table name */
        !           461: } speeds[] = {
        !           462:        { "dialup",     GT_DIALUP },    /* normal dialup rotation */
        !           463:        { "selector",   GT_SELECTOR },  /* port selector pseudo-table autobaud*/
        !           464:        { "b110",       GT_B110 },      /* 110 baud */
        !           465:        { "b134",       GT_B134 },      /* 134.5 baud selectric */
        !           466:        { "b150",       GT_B150 },      /* 150 baud */
        !           467:        { "b300",       GT_B300 },      /* 300 baud */
        !           468:        { "b600",       GT_B600 },      /* 600 baud */
        !           469:        { "b1200",      GT_B1200 },     /* 1200 baud */
        !           470:        { "b2400",      GT_B2400 },     /* 2400 baud */
        !           471:        { "b4800",      GT_B4800 },     /* 4800 baud */
        !           472:        { "b9600",      GT_B9600 },     /* 9600 baud */
        !           473:        { "dw2console", GT_DW2CONSOLE },/* Decwriter Console - 300 baud */
        !           474:        { "fastdialup", GT_FASTDIALUP },/* 1200-300 baud rotation for dialup */
        !           475:        { "fastdialup1",GT_FASTDIALUP1},/* 300-1200  "     "       "     "    */
        !           476:        { "crt",        GT_CRT_HCPY },  /* 9600-300 CRT + hardcopy rotation */
        !           477:        { "hardcopy",   GT_HCPY_CRT },  /* 300-9600  "      "        "      */
        !           478:        { "plugboard",  GT_PLUGBOARD }, /* 9600-300-1200 rotation */
        !           479:        { "plugboard1", GT_PLUGBOARD2 },/* 300-1200-9600 rotation */
        !           480:        { "plugboard2", GT_PLUGBOARD2 },/* 1200-9600-300 rotation */
        !           481:        { "interdata",  GT_INTERDATA }, /* Interdata Console */
        !           482:        { "chess",      GT_CHESS },     /* LSI Chess Terminal */
        !           483:        { "tty33",      GT_TTY33 },     /* 110 baud Model 33 TTY */
        !           484:        { "network",    GT_NETWORK },   /* network port */
        !           485:        { "", 0 }
        !           486: };
        !           487: 
        !           488: char *
        !           489: speedname (c)
        !           490:        char    c;
        !           491: {
        !           492:        struct speeds   *sp;
        !           493:        static char     sbuf[32];
        !           494: 
        !           495:        for (sp = speeds; sp->sp_table; sp++)
        !           496:                if (sp->sp_table == c)
        !           497:                        break;
        !           498: 
        !           499:        if (sp->sp_table)
        !           500:                strcpy(sbuf, sp->sp_name);
        !           501:        else
        !           502:                strcpy(sbuf, "-");
        !           503: 
        !           504:        if (strlen(sbuf) < 8)
        !           505:                strcat(sbuf, "\t");
        !           506: 
        !           507:        return (sbuf);
        !           508: }
        !           509: 
        !           510: char *
        !           511: termname (port)
        !           512:        char    *port;
        !           513: {
        !           514:        register struct ttytype *tp;
        !           515: 
        !           516:        for (tp = ttytype; tp->tp_term[0]; tp++)
        !           517:                if (strcmp(port, tp->tp_port) == 0)
        !           518:                        return (tp->tp_term);
        !           519: 
        !           520:        if (tp < &ttytype[(sizeof ttytype / sizeof (struct ttytype)) -1])
        !           521:        {
        !           522:                strcpy(tp->tp_port, port);
        !           523:                strcpy(tp->tp_term, "unknown");
        !           524:                (++tp)->tp_term[0] = '\0';
        !           525:        }
        !           526: 
        !           527:        return ("unknown");
        !           528: }
        !           529: 
        !           530: char
        !           531: speedchar (speed)
        !           532:        char    *speed;
        !           533: {
        !           534:        register struct speeds  *sp;
        !           535: 
        !           536:        for (sp = speeds; sp->sp_table; sp++)
        !           537:                if (strcmp(sp->sp_name, speed) == 0)
        !           538:                        return (sp->sp_table);
        !           539:        return ('\0');
        !           540: }
        !           541: 
        !           542: struct ttytype *
        !           543: type (port)
        !           544:        char    *port;
        !           545: {
        !           546:        register struct ttytype *tp;
        !           547: 
        !           548:        for (tp = ttytype; tp->tp_term[0]; tp++)
        !           549:                if (strcmp(tp->tp_port, port) == 0)
        !           550:                        return (tp);
        !           551: 
        !           552:        if (tp < &ttytype[(sizeof ttytype / sizeof (struct ttytype)) -1])
        !           553:        {
        !           554:                strcpy(tp->tp_port, port);
        !           555:                strcpy(tp->tp_term, "unknown");
        !           556:                return(tp);
        !           557:        }
        !           558: 
        !           559:        return((struct ttytype *)0);
        !           560: }

unix.superglobalmegacorp.com

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