Annotation of cci/usr/src/etc/getty/main.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)main.c     4.5 (Berkeley) 83/08/01";
                      3: #endif
                      4: 
                      5: /*
                      6:  * getty -- adapt to terminal speed on dialup, and call login
                      7:  *
                      8:  * Melbourne getty, June 83, kre.
                      9:  */
                     10: 
                     11: #include <sgtty.h>
                     12: #include <signal.h>
                     13: #include <ctype.h>
                     14: #include <setjmp.h>
                     15: #include "gettytab.h"
                     16: 
                     17: struct sgttyb tmode = {
                     18:        0, 0, CERASE, CKILL, 0, 0
                     19: };
                     20: struct tchars tc = {
                     21:        CINTR, CQUIT, CSTART,
                     22:        CSTOP, CEOF, CBRK,
                     23: };
                     24: struct ltchars ltc = {
                     25:        CSUSP, CDSUSP, CRPRNT,
                     26:        CFLUSH, CWERASE, CLNEXT
                     27: };
                     28: 
                     29: int    crmod;
                     30: int    upper;
                     31: int    lower;
                     32: int    digit;
                     33: 
                     34: char   hostname[32];
                     35: char   name[16];
                     36: char   *portselector();
                     37: 
                     38: #define        OBUFSIZ         128
                     39: #define        TABBUFSIZ       512
                     40: 
                     41: char   defent[TABBUFSIZ];
                     42: char   defstrs[TABBUFSIZ];
                     43: char   tabent[TABBUFSIZ];
                     44: char   tabstrs[TABBUFSIZ];
                     45: 
                     46: char   *env[128];
                     47: 
                     48: char partab[] = {
                     49:        0001,0201,0201,0001,0201,0001,0001,0201,
                     50:        0202,0004,0003,0205,0005,0206,0201,0001,
                     51:        0201,0001,0001,0201,0001,0201,0201,0001,
                     52:        0001,0201,0201,0001,0201,0001,0001,0201,
                     53:        0200,0000,0000,0200,0000,0200,0200,0000,
                     54:        0000,0200,0200,0000,0200,0000,0000,0200,
                     55:        0000,0200,0200,0000,0200,0000,0000,0200,
                     56:        0200,0000,0000,0200,0000,0200,0200,0000,
                     57:        0200,0000,0000,0200,0000,0200,0200,0000,
                     58:        0000,0200,0200,0000,0200,0000,0000,0200,
                     59:        0000,0200,0200,0000,0200,0000,0000,0200,
                     60:        0200,0000,0000,0200,0000,0200,0200,0000,
                     61:        0000,0200,0200,0000,0200,0000,0000,0200,
                     62:        0200,0000,0000,0200,0000,0200,0200,0000,
                     63:        0200,0000,0000,0200,0000,0200,0200,0000,
                     64:        0000,0200,0200,0000,0200,0000,0000,0201
                     65: };
                     66: 
                     67: #define        ERASE   tmode.sg_erase
                     68: #define        KILL    tmode.sg_kill
                     69: #define        EOT     tc.t_eofc
                     70: 
                     71: jmp_buf timeout;
                     72: 
                     73: dingdong()
                     74: {
                     75: 
                     76:        alarm(0);
                     77:        signal(SIGALRM, SIG_DFL);
                     78:        longjmp(timeout, 1);
                     79: }
                     80: 
                     81: jmp_buf        intrupt;
                     82: 
                     83: interrupt()
                     84: {
                     85: 
                     86:        signal(SIGINT, interrupt);
                     87:        longjmp(intrupt, 1);
                     88: }
                     89: 
                     90: main(argc, argv)
                     91:        char *argv[];
                     92: {
                     93:        char *tname;
                     94:        long allflags;
                     95: 
                     96:        signal(SIGINT, SIG_IGN);
                     97: /*
                     98:        signal(SIGQUIT, SIG_DFL);
                     99: */
                    100:        gethostname(hostname, sizeof(hostname));
                    101:        if (hostname[0] == '\0')
                    102:                strcpy(hostname, "32BV_Unix");
                    103:        gettable("default", defent, defstrs);
                    104:        gendefaults();
                    105:        tname = "default";
                    106:        if (argc > 1)
                    107:                tname = argv[1];
                    108:        for (;;) {
                    109:                int ldisp = OTTYDISC;
                    110: 
                    111:                gettable(tname, tabent, tabstrs);
                    112:                if (OPset || EPset || APset)
                    113:                        APset++, OPset++, EPset++;
                    114:                setdefaults();
                    115:                ioctl(0, TIOCFLUSH, 0);         /* clear out the crap */
                    116:                if (IS)
                    117:                        tmode.sg_ispeed = speed(IS);
                    118:                else if (SP)
                    119:                        tmode.sg_ispeed = speed(SP);
                    120:                if (OS)
                    121:                        tmode.sg_ospeed = speed(OS);
                    122:                else if (SP)
                    123:                        tmode.sg_ospeed = speed(SP);
                    124:                if (SB)
                    125:                        tmode.sg_stopbits = stopbits(SB);
                    126:                tmode.sg_flags = setflags(0);
                    127:                ioctl(0, TIOCSETP, &tmode);
                    128:                setchars();
                    129:                ioctl(0, TIOCSETC, &tc);
                    130:                ioctl(0, TIOCSETD, &ldisp);
                    131:                if (HC)
                    132:                        ioctl(0, TIOCHPCL, 0);
                    133:                if (PS) {
                    134:                        tname = portselector();
                    135:                        continue;
                    136:                }
                    137:                if (CL && *CL)
                    138:                        putpad(CL);
                    139:                edithost(HE);
                    140:                if (IM && *IM)
                    141:                        putf(IM);
                    142:                if (setjmp(timeout)) {
                    143:                        tmode.sg_ispeed = tmode.sg_ospeed = 0;
                    144:                        ioctl(0, TIOCSETP, &tmode);
                    145:                        exit(1);
                    146:                }
                    147:                if (TO) {
                    148:                        signal(SIGALRM, dingdong);
                    149:                        alarm(TO);
                    150:                }
                    151:                if (getname()) {
                    152:                        alarm(0);
                    153:                        signal(SIGALRM, SIG_DFL);
                    154:                        if (!(upper || lower || digit))
                    155:                                continue;
                    156:                        allflags = setflags(2);
                    157:                        tmode.sg_flags = allflags & 0xffff;
                    158:                        allflags >>= 16;
                    159:                        if (crmod || NL)
                    160:                                tmode.sg_flags |= CRMOD;
                    161:                        if (upper || UC)
                    162:                                tmode.sg_flags |= LCASE;
                    163:                        if (lower || LC)
                    164:                                tmode.sg_flags &= ~LCASE;
                    165:                        ioctl(0, TIOCSETP, &tmode);
                    166:                        ioctl(0, TIOCSLTC, &ltc);
                    167:                        ioctl(0, TIOCLSET, &allflags);
                    168:                        putchr('\n');
                    169:                        oflush();
                    170:                        makeenv(env);
                    171:                        signal(SIGINT, SIG_DFL);
                    172:                        execle(LO, "login", name, (char *)0, env);
                    173:                        exit(1);
                    174:                }
                    175:                alarm(0);
                    176:                signal(SIGALRM, SIG_DFL);
                    177:                signal(SIGINT, SIG_IGN);
                    178:                if (NX && *NX)
                    179:                        tname = NX;
                    180:        }
                    181: }
                    182: 
                    183: getname()
                    184: {
                    185:        register char *np;
                    186:        register c;
                    187:        char cs;
                    188: 
                    189:        /*
                    190:         * Interrupt may happen if we use CBREAK mode
                    191:         */
                    192:        if (setjmp(intrupt)) {
                    193:                signal(SIGINT, SIG_IGN);
                    194:                return (0);
                    195:        }
                    196:        signal(SIGINT, interrupt);
                    197:        tmode.sg_flags = setflags(0);
                    198:        ioctl(0, TIOCSETP, &tmode);
                    199:        tmode.sg_flags = setflags(1);
                    200:        prompt();
                    201:        if (PF > 0) {
                    202:                oflush();
                    203:                sleep(PF);
                    204:                PF = 0;
                    205:        }
                    206:        ioctl(0, TIOCSETP, &tmode);
                    207:        crmod = 0;
                    208:        upper = 0;
                    209:        lower = 0;
                    210:        digit = 0;
                    211:        np = name;
                    212:        for (;;) {
                    213:                oflush();
                    214:                if (read(0, &cs, 1) <= 0)
                    215:                        exit(0);
                    216:                if ((c = cs&0177) == 0)
                    217:                        return (0);
                    218:                if (c == EOT)
                    219:                        exit(1);
                    220:                if (c == '\r' || c == '\n' || np >= &name[16])
                    221:                        break;
                    222: 
                    223:                if (c >= 'a' && c <= 'z')
                    224:                        lower++;
                    225:                else if (c >= 'A' && c <= 'Z') {
                    226:                        upper++;
                    227:                } else if (c == ERASE || c == '#' || c == '\b') {
                    228:                        if (np > name) {
                    229:                                np--;
                    230:                                if (tmode.sg_ospeed >= B1200)
                    231:                                        puts("\b \b");
                    232:                                else
                    233:                                        putchr(cs);
                    234:                        }
                    235:                        continue;
                    236:                } else if (c == KILL || c == '@') {
                    237:                        putchr(cs);
                    238:                        putchr('\r');
                    239:                        if (tmode.sg_ospeed < B1200)
                    240:                                putchr('\n');
                    241:                        /* this is the way they do it down under ... */
                    242:                        else if (np > name)
                    243:                                puts("                                     \r");
                    244:                        prompt();
                    245:                        np = name;
                    246:                        continue;
                    247:                } else if (c == ' ')
                    248:                        c = '_';
                    249:                else if (c >= '0' && c <= '9')
                    250:                        digit++;
                    251:                if (IG && (c < ' ' || c > 0176))
                    252:                        continue;
                    253:                *np++ = c;
                    254:                putchr(cs);
                    255:        }
                    256:        signal(SIGINT, SIG_IGN);
                    257:        *np = 0;
                    258:        if (c == '\r')
                    259:                crmod++;
                    260:        if (upper && !lower && !LC || UC)
                    261:                for (np = name; *np; np++)
                    262:                        if (isupper(*np))
                    263:                                *np = tolower(*np);
                    264:        return (1);
                    265: }
                    266: 
                    267: static
                    268: short  tmspc10[] = {
                    269:        0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5, 15
                    270: };
                    271: 
                    272: putpad(s)
                    273:        register char *s;
                    274: {
                    275:        register pad = 0;
                    276:        register mspc10;
                    277: 
                    278:        if (isdigit(*s)) {
                    279:                while (isdigit(*s)) {
                    280:                        pad *= 10;
                    281:                        pad += *s++ - '0';
                    282:                }
                    283:                pad *= 10;
                    284:                if (*s == '.' && isdigit(s[1])) {
                    285:                        pad += s[1] - '0';
                    286:                        s += 2;
                    287:                }
                    288:        }
                    289: 
                    290:        puts(s);
                    291:        /*
                    292:         * If no delay needed, or output speed is
                    293:         * not comprehensible, then don't try to delay.
                    294:         */
                    295:        if (pad == 0)
                    296:                return;
                    297:        if (tmode.sg_ospeed <= 0 ||
                    298:            tmode.sg_ospeed >= (sizeof tmspc10 / sizeof tmspc10[0]))
                    299:                return;
                    300: 
                    301:        /*
                    302:         * Round up by a half a character frame,
                    303:         * and then do the delay.
                    304:         * Too bad there are no user program accessible programmed delays.
                    305:         * Transmitting pad characters slows many
                    306:         * terminals down and also loads the system.
                    307:         */
                    308:        mspc10 = tmspc10[tmode.sg_ospeed];
                    309:        pad += mspc10 / 2;
                    310:        for (pad /= mspc10; pad > 0; pad--)
                    311:                putchr(*PC);
                    312: }
                    313: 
                    314: puts(s)
                    315:        register char *s;
                    316: {
                    317: 
                    318:        while (*s)
                    319:                putchr(*s++);
                    320: }
                    321: 
                    322: char   outbuf[OBUFSIZ];
                    323: int    obufcnt = 0;
                    324: 
                    325: putchr(cc)
                    326: {
                    327:        char c;
                    328: 
                    329:        c = cc;
                    330:        c |= partab[c&0177] & 0200;
                    331:        if (OP)
                    332:                c ^= 0200;
                    333:        if (!UB) {
                    334:                outbuf[obufcnt++] = c;
                    335:                if (obufcnt >= OBUFSIZ)
                    336:                        oflush();
                    337:        } else
                    338:                write(1, &c, 1);
                    339: }
                    340: 
                    341: oflush()
                    342: {
                    343:        if (obufcnt)
                    344:                write(1, outbuf, obufcnt);
                    345:        obufcnt = 0;
                    346: }
                    347: 
                    348: prompt()
                    349: {
                    350: 
                    351:        putf(LM);
                    352:        if (CO)
                    353:                putchr('\n');
                    354: }
                    355: 
                    356: putf(cp)
                    357:        register char *cp;
                    358: {
                    359:        extern char editedhost[];
                    360: 
                    361:        while (*cp) {
                    362:                if (*cp != '%') {
                    363:                        putchr(*cp++);
                    364:                        continue;
                    365:                }
                    366:                switch (*++cp) {
                    367: 
                    368:                case 'h':
                    369:                        puts(editedhost);
                    370:                        break;
                    371: 
                    372:                case '%':
                    373:                        putchr('%');
                    374:                        break;
                    375:                }
                    376:                cp++;
                    377:        }
                    378: }

unix.superglobalmegacorp.com

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