Annotation of 40BSD/cmd/getty.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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