Annotation of 3BSD/cmd/getty.vm.c, revision 1.1.1.1

1.1       root        1: #
                      2: /*
                      3:  * getty -- adapt to terminal speed on dialup, and call login
                      4:  */
                      5: 
                      6: #include <sccs.h>
                      7: 
                      8:        SCCSID(%W%)
                      9: 
                     10: #include <sgtty.h>
                     11: #include <signal.h>
                     12: #include <ident.h>
                     13: 
                     14: #define ERASE  '#'
                     15: #define KILL   '@'
                     16: 
                     17: #define        CEOT    004
                     18: #define        CKILL   '@'
                     19: #define        CQUIT   034             /* FS, cntl shift L */
                     20: #define        CINTR   0177            /* DEL */
                     21: #define        CSTOP   023             /* Stop output: ctl-s */
                     22: #define        CSTART  021             /* Start output: ctl-q */
                     23: #define        CBRK    0377
                     24: 
                     25: 
                     26: struct sgttyb tmode;
                     27: 
                     28: struct tab {
                     29:        char    tname;          /* this table name */
                     30:        char    nname;          /* successor table name */
                     31:        int     iflags;         /* initial flags */
                     32:        int     fflags;         /* final flags */
                     33:        int     ispeed;         /* input speed */
                     34:        int     ospeed;         /* output speed */
                     35:        char    *message;       /* login message */
                     36: } itab[] = {
                     37: 
                     38: /* table '0'-1-2-3 300,1200,150,110 */
                     39: 
                     40:        '0', 1,
                     41:        ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+CR2,
                     42:        B300, B300,
                     43:        "\n\rlogin: ",
                     44: 
                     45:        1, 2,
                     46:        ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1,
                     47:        B1200, B1200,
                     48:        "\n\rlogin: ",
                     49: 
                     50:        2, 3,
                     51:        ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1,
                     52:        B150, B150,
                     53:        "\n\rlogin: ",
                     54: 
                     55:        3, '0',
                     56:        ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1,
                     57:        B110, B110,
                     58:        "\n\rlogin: ",
                     59: 
                     60: /* table '-' -- Console TTY 110 */
                     61:        '-', '-',
                     62:        ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1,
                     63:        B110, B110,
                     64:        "\n\rlogin: ",
                     65: 
                     66: /* table '1' -- 150 */
                     67:        '1', '1',
                     68:        ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1,
                     69:        B150, B150,
                     70:        "\n\r\033:\006\006\017login: ",
                     71: 
                     72: /* table '2' -- 9600 */
                     73:        '2', '2',
                     74:        ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD,
                     75:        B9600, B9600,
                     76:        "\n\rlogin: ",
                     77: 
                     78: /* table '3'-'5' -- 1200,300 */
                     79:        '3', '5',
                     80:        ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1,
                     81:        B1200, B1200,
                     82:        "\n\rlogin: ",
                     83: 
                     84: /* table '5'-'3' -- 300,1200 */
                     85:        '5', '3',
                     86:        ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1,
                     87:        B300, B300,
                     88:        "\n\rlogin: ",
                     89: 
                     90: /* table '4' -- Console Decwriter */
                     91:        '4', '4',
                     92:        ANYP+RAW, ANYP+ECHO+CRMOD+XTABS,
                     93:        B300, B300,
                     94:        "\n\rlogin: ",
                     95: 
                     96: /* table '6' -- 2400  */
                     97:        '6', '6' ,
                     98:        ANYP+RAW , ANYP+ECHO+CRMOD ,
                     99:        B2400 , B2400 ,
                    100:        "\n\rlogin: ",
                    101:  
                    102: /* table '7' - - 4800 */
                    103:        '7' , '7' ,
                    104:        ANYP+RAW , ANYP+ECHO+CRMOD ,
                    105:        B4800 , B4800 ,
                    106:        "\n\rlogin: " ,
                    107: 
                    108: /* table '8'-'9' - - 9600 - 300 */
                    109:        '8', '9',
                    110:        ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD,
                    111:        B9600, B9600,
                    112:        "\n\rlogin: ",
                    113: 
                    114:        '9', '8',
                    115:        ANYP+RAW+NL1+CR2, ANYP+XTABS+ECHO+CRMOD+CR2,
                    116:        B300, B300,
                    117:        "\n\rlogin: ",
                    118: 
                    119: /* table 'i' -- Interdata Console */
                    120:        'i', 'i',
                    121:        RAW+CRMOD, CRMOD+ECHO+LCASE,
                    122:        0, 0,
                    123:        "\n\rlogin: ",
                    124: 
                    125: /* table 'l' -- LSI Chess Terminal */
                    126:        'l', 'l',
                    127:        ANYP+RAW/*+HUPCL*/, ANYP+ECHO/*+HUPCL*/,
                    128:        B300, B300,
                    129:        "*",
                    130: };
                    131: 
                    132: #define        NITAB   sizeof itab/sizeof itab[0]
                    133: #define        EOT     04              /* EOT char */
                    134: 
                    135: char   name[16];
                    136: int    crmod;
                    137: int    upper;
                    138: int    lower;
                    139: 
                    140: char partab[] = {
                    141:        0001,0201,0201,0001,0201,0001,0001,0201,
                    142:        0202,0004,0003,0205,0005,0206,0201,0001,
                    143:        0201,0001,0001,0201,0001,0201,0201,0001,
                    144:        0001,0201,0201,0001,0201,0001,0001,0201,
                    145:        0200,0000,0000,0200,0000,0200,0200,0000,
                    146:        0000,0200,0200,0000,0200,0000,0000,0200,
                    147:        0000,0200,0200,0000,0200,0000,0000,0200,
                    148:        0200,0000,0000,0200,0000,0200,0200,0000,
                    149:        0200,0000,0000,0200,0000,0200,0200,0000,
                    150:        0000,0200,0200,0000,0200,0000,0000,0200,
                    151:        0000,0200,0200,0000,0200,0000,0000,0200,
                    152:        0200,0000,0000,0200,0000,0200,0200,0000,
                    153:        0000,0200,0200,0000,0200,0000,0000,0200,
                    154:        0200,0000,0000,0200,0000,0200,0200,0000,
                    155:        0200,0000,0000,0200,0000,0200,0200,0000,
                    156:        0000,0200,0200,0000,0200,0000,0000,0201
                    157: };
                    158: 
                    159: main(argc, argv)
                    160: char **argv;
                    161: {
                    162:        register struct tab *tabp;
                    163:        char tname;
                    164:        struct tchars tc;
                    165: 
                    166: /*
                    167:        signal(SIGINT, 1);
                    168:        signal(SIGQUIT, 0);
                    169: */
                    170:        tname = '0';
                    171:        if (argc > 1)
                    172:                tname = argv[1][0];
                    173:        for (;;) {
                    174:                for(tabp = itab; tabp < &itab[NITAB]; tabp++)
                    175:                        if(tabp->tname == tname)
                    176:                                break;
                    177:                if(tabp >= &itab[NITAB])
                    178:                        tabp = itab;
                    179:                tmode.sg_ispeed = tabp->ispeed;
                    180:                tmode.sg_ospeed = tabp->ospeed;
                    181:                tmode.sg_flags = tabp->iflags;
                    182:                tmode.sg_ispeed = tabp->ispeed;
                    183:                tmode.sg_ospeed = tabp->ospeed;
                    184:                stty(0, &tmode);
                    185:                tc.t_intrc = CINTR;
                    186:                tc.t_quitc = CQUIT;
                    187:                tc.t_stopc = CSTOP;
                    188:                tc.t_startc = CSTART;
                    189:                tc.t_brkc = CBRK;
                    190:                tc.t_eofc = CEOT;
                    191:                ioctl(0, TIOCSETC, &tc);
                    192:                if (tmode.sg_ospeed > B1200)
                    193:                        puts("\n\r\n\r");
                    194:                else
                    195:                        puts("\n\r\r\r\r\r\n\r\r\r\r\r");
                    196:                puts("Virtual ");
                    197:                puts(myname);
                    198:                puts("\n\r\r\r\r");
                    199:                puts(tabp->message);
                    200:                /*
                    201:                 * Wait a while, then flush input to get rid
                    202:                 * of noise from open lines
                    203:                 */
                    204:                sleep(1);
                    205:                stty(0, &tmode);
                    206:                if(getname()) {
                    207:                        if (upper == 0 && lower == 0)
                    208:                                continue;
                    209:                        tmode.sg_erase = ERASE;
                    210:                        tmode.sg_kill = KILL;
                    211:                        tmode.sg_flags = tabp->fflags;
                    212:                        if(crmod)
                    213:                                tmode.sg_flags |= CRMOD;
                    214:                        if(upper)
                    215:                                tmode.sg_flags |= LCASE;
                    216:                        if(lower)
                    217:                                tmode.sg_flags &= ~LCASE;
                    218:                        stty(0, &tmode);
                    219:                        putchr('\n');
                    220:                        execl("/bin/login", "login", name, 0);
                    221:                        exit(1);
                    222:                }
                    223:                tname = tabp->nname;
                    224:        }
                    225: }
                    226: 
                    227: getname()
                    228: {
                    229:        register char *np;
                    230:        register c;
                    231:        char cs;
                    232: 
                    233:        crmod = 0;
                    234:        upper = 0;
                    235:        lower = 0;
                    236:        np = name;
                    237:        for (;;) {
                    238:                if (read(0, &cs, 1) <= 0)
                    239:                        exit(0);
                    240:                if ((c = cs&0177) == 0)
                    241:                        return(0);
                    242:                if (c==EOT)
                    243:                        exit(1);
                    244:                if (c=='\r' || c=='\n' || np >= &name[16])
                    245:                        break;
                    246:                putchr(cs);
                    247:                if (c>='a' && c <='z')
                    248:                        lower++;
                    249:                else if (c>='A' && c<='Z') {
                    250:                        upper++;
                    251:                        c += 'a'-'A';
                    252:                } else if (c==ERASE) {
                    253:                        if (np > name)
                    254:                                np--;
                    255:                        continue;
                    256:                } else if (c==KILL) {
                    257:                        putchr('\r');
                    258:                        putchr('\n');
                    259:                        np = name;
                    260:                        continue;
                    261:                } else if(c == ' ')
                    262:                        c = '_';
                    263:                *np++ = c;
                    264:        }
                    265:        *np = 0;
                    266:        if (c == '\r')
                    267:                crmod++;
                    268:        return(1);
                    269: }
                    270: 
                    271: puts(as)
                    272: char *as;
                    273: {
                    274:        register char *s;
                    275: 
                    276:        s = as;
                    277:        while (*s)
                    278:                putchr(*s++);
                    279: }
                    280: 
                    281: putchr(cc)
                    282: {
                    283:        char c;
                    284:        c = cc;
                    285:        c |= partab[c&0177] & 0200;
                    286:        write(1, &c, 1);
                    287: }

unix.superglobalmegacorp.com

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