Annotation of researchv8dc/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 <sys/utsname.h>
                      9: 
                     10: #define ERASE  '\b'
                     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:        "login: ",
                     40: 
                     41:        1, 2,
                     42:        ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1,
                     43:        B1200, B1200,
                     44:        "login: ",
                     45: 
                     46:        2, 3,
                     47:        ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1,
                     48:        B150, B150,
                     49:        "login: ",
                     50: 
                     51:        3, '0',
                     52:        ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1,
                     53:        B110, B110,
                     54:        "login: ",
                     55: 
                     56: /* table '2' -- 9600 */
                     57:        '2', '2',
                     58:        ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD,
                     59:        B9600, B9600,
                     60:        "login: ",
                     61: 
                     62: /* table '3'-'5' -- 1200,300 */
                     63:        '3', '5',
                     64:        ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1,
                     65:        B1200, B1200,
                     66:        "login: ",
                     67: 
                     68: /* table '5'-'3' -- 300,1200 */
                     69:        '5', '3',
                     70:        ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1,
                     71:        B300, B300,
                     72:        "login: ",
                     73: 
                     74: /* table '4' -- Console Decwriter */
                     75:        '4', '4',
                     76:        ANYP+CRMOD+CBREAK, ANYP+ECHO+CRMOD+XTABS,
                     77:        B300, B300,
                     78:        "login: ",
                     79: 
                     80: /* table '6' -- 2400  */
                     81:        '6', '6' ,
                     82:        ANYP+RAW , ANYP+ECHO+CRMOD ,
                     83:        B2400 , B2400 ,
                     84:        "login: ",
                     85:  
                     86: /* table '7' - - 4800 */
                     87:        '7' , '7' ,
                     88:        ANYP+RAW , ANYP+ECHO+CRMOD ,
                     89:        B4800 , B4800 ,
                     90:        "login: " ,
                     91: 
                     92: /* table '8'-'9' - - 9600 - 300 */
                     93:        '8', '9',
                     94:        ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD,
                     95:        B9600, B9600,
                     96:        "login: ",
                     97: 
                     98:        '9', '8',
                     99:        ANYP+RAW+NL1+CR2, ANYP+XTABS+ECHO+CRMOD+CR2,
                    100:        B300, B300,
                    101:        "login: ",
                    102: 
                    103: /* table 'j' -- 19200 */
                    104:        'j', 'j',
                    105:        ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD,
                    106:        EXTA, EXTA,
                    107:        "login: ",
                    108: };
                    109: 
                    110: 
                    111: #define        NITAB   sizeof itab/sizeof itab[0]
                    112: #define        EOT     04              /* EOT char */
                    113: 
                    114: char   name[16];
                    115: int    crmod;
                    116: int    upper;
                    117: int    lower;
                    118: 
                    119: char partab[] = {
                    120:        0001,0201,0201,0001,0201,0001,0001,0201,
                    121:        0202,0004,0003,0205,0005,0206,0201,0001,
                    122:        0201,0001,0001,0201,0001,0201,0201,0001,
                    123:        0001,0201,0201,0001,0201,0001,0001,0201,
                    124:        0200,0000,0000,0200,0000,0200,0200,0000,
                    125:        0000,0200,0200,0000,0200,0000,0000,0200,
                    126:        0000,0200,0200,0000,0200,0000,0000,0200,
                    127:        0200,0000,0000,0200,0000,0200,0200,0000,
                    128:        0200,0000,0000,0200,0000,0200,0200,0000,
                    129:        0000,0200,0200,0000,0200,0000,0000,0200,
                    130:        0000,0200,0200,0000,0200,0000,0000,0200,
                    131:        0200,0000,0000,0200,0000,0200,0200,0000,
                    132:        0000,0200,0200,0000,0200,0000,0000,0200,
                    133:        0200,0000,0000,0200,0000,0200,0200,0000,
                    134:        0200,0000,0000,0200,0000,0200,0200,0000,
                    135:        0000,0200,0200,0000,0200,0000,0000,0201
                    136: };
                    137: 
                    138: main(argc, argv)
                    139: char **argv;
                    140: {
                    141:        register struct tab *tabp;
                    142:        char tname;
                    143:        struct tchars tc;
                    144:        struct utsname myname;
                    145: 
                    146: /*
                    147:        signal(SIGINT, 1);
                    148:        signal(SIGQUIT, 0);
                    149: */
                    150:        tname = '0';
                    151:        if (argc > 1)
                    152:                tname = argv[1][0];
                    153: #ifdef JERQ
                    154:        if (tname == 'j') {
                    155:                execl("/etc/jetty", "jetty", 0);
                    156:                exit(1);
                    157:        }
                    158: #endif
                    159:        for (;;) {
                    160:                int ldisp = 0;
                    161:                for(tabp = itab; tabp < &itab[NITAB]; tabp++)
                    162:                        if(tabp->tname == tname)
                    163:                                break;
                    164:                if(tabp >= &itab[NITAB])
                    165:                        tabp = itab;
                    166:                tmode.sg_ispeed = tabp->ispeed;
                    167:                tmode.sg_ospeed = tabp->ospeed;
                    168:                tmode.sg_flags = tabp->iflags;
                    169:                tmode.sg_ispeed = tabp->ispeed;
                    170:                tmode.sg_ospeed = tabp->ospeed;
                    171:                stty(0, &tmode);
                    172:                tc.t_intrc = CINTR;
                    173:                tc.t_quitc = CQUIT;
                    174:                tc.t_stopc = CSTOP;
                    175:                tc.t_startc = CSTART;
                    176:                tc.t_brkc = CBRK;
                    177:                tc.t_eofc = CEOT;
                    178:                ioctl(0, TIOCSETC, &tc);
                    179:                ioctl(0, TIOCSETD, &ldisp);
                    180:                ioctl(0, TIOCNXCL, 0);
                    181:                if (tmode.sg_ospeed > B1200)
                    182:                        puts("\n\r");
                    183:                else
                    184:                        puts("\n\r\r\r\r\r");
                    185:                uname (&myname);
                    186:                puts(myname.nodename);
                    187:                puts("\n\r\r\r");
                    188:                puts(tabp->message);
                    189:                /*
                    190:                 * Wait a while, then flush input to get rid
                    191:                 * of noise from open lines
                    192:                 * (removed by rob)
                    193:                sleep(1);
                    194:                */
                    195:                stty(0, &tmode);
                    196:                if(getname()) {
                    197:                        if (upper == 0 && lower == 0)
                    198:                                continue;
                    199:                        tmode.sg_erase = ERASE;
                    200:                        tmode.sg_kill = KILL;
                    201:                        tmode.sg_flags = tabp->fflags;
                    202:                        if(crmod)
                    203:                                tmode.sg_flags |= CRMOD;
                    204:                        if(upper)
                    205:                                tmode.sg_flags |= LCASE;
                    206:                        if(lower)
                    207:                                tmode.sg_flags &= ~LCASE;
                    208:                        stty(0, &tmode);
                    209:                        putchr('\n');
                    210:                        execl("/etc/login", "login", name, 0);
                    211:                        exit(1);
                    212:                }
                    213:                tname = tabp->nname;
                    214:        }
                    215: }
                    216: 
                    217: getname()
                    218: {
                    219:        register char *np;
                    220:        register c;
                    221:        char cs;
                    222: 
                    223:        crmod = 0;
                    224:        upper = 0;
                    225:        lower = 0;
                    226:        np = name;
                    227:        for (;;) {
                    228:                if (read(0, &cs, 1) <= 0)
                    229:                        exit(0);
                    230:                if ((c = cs&0177) == 0)
                    231:                        return(0);
                    232:                if (c==EOT)
                    233:                        exit(1);
                    234:                if (c=='\r' || c=='\n' || np >= &name[16])
                    235:                        break;
                    236:                putchr(cs);
                    237:                if (c>='a' && c <='z')
                    238:                        lower++;
                    239:                else if (c>='A' && c<='Z') {
                    240:                        upper++;
                    241:                        c += 'a'-'A';
                    242:                } else if (c==ERASE) {
                    243:                        if (np > name)
                    244:                                np--;
                    245:                        continue;
                    246:                } else if (c==KILL) {
                    247:                        putchr('\r');
                    248:                        putchr('\n');
                    249:                        np = name;
                    250:                        continue;
                    251:                } else if(c == ' ')
                    252:                        c = '_';
                    253:                *np++ = c;
                    254:        }
                    255:        *np = 0;
                    256:        if (c == '\r')
                    257:                crmod++;
                    258:        return(1);
                    259: }
                    260: 
                    261: puts(as)
                    262: char *as;
                    263: {
                    264:        register char *s;
                    265: 
                    266:        s = as;
                    267:        while (*s)
                    268:                putchr(*s++);
                    269: }
                    270: 
                    271: putchr(cc)
                    272: {
                    273:        char c;
                    274:        c = cc;
                    275:        c |= partab[c&0177] & 0200;
                    276:        write(1, &c, 1);
                    277: }

unix.superglobalmegacorp.com

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