home *** CD-ROM | disk | FTP | other *** search
- #
- /*
- * getty -- adapt to terminal speed on dialup, and call login
- */
-
- /*
- * tty flags
- */
- #define HUPCL 01
- #define XTABS 02
- #define LCASE 04
- #define ECHO 010
- #define CRMOD 020
- #define RAW 040
- #define ODDP 0100
- #define EVENP 0200
- #define ANYP 0300
-
- /*
- * Delay algorithms
- */
- #define CR1 010000
- #define CR2 020000
- #define CR3 030000
- #define NL1 000400
- #define NL2 001000
- #define NL3 001400
- #define TAB1 002000
- #define TAB2 004000
- #define TAB3 006000
- #define FF1 040000
-
- #define ERASE '#'
- #define KILL '@'
-
- /*
- * speeds
- */
- #define B110 3
- #define B150 5
- #define B300 7
- #define B9600 13
-
- #define SIGINT 2
- #define SIGQIT 3
-
- struct sgtty {
- char sgispd, sgospd;
- char sgerase, sgkill;
- int sgflag;
- } tmode;
-
- struct tab {
- int tname; /* this table name */
- int nname; /* successor table name */
- int iflags; /* initial flags */
- int fflags; /* final flags */
- int ispeed; /* input speed */
- int ospeed; /* output speed */
- char *message; /* login message */
- } itab[] {
-
- /* table '0'-1-2 300,150,110 */
-
- '0', 1,
- ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1,
- B300, B300,
- "\n\r\033;\007login: ",
-
- 1, 2,
- ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1,
- B150, B150,
- "\n\r\033:\006\006\017login: ",
-
- 2, '0',
- ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1,
- B110, B110,
- "\n\rlogin: ",
-
- /* table '-' -- Console TTY 110 */
- '-', '-',
- ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1,
- B110, B110,
- "\n\rlogin: ",
-
- /* table '1' -- 150 */
- '1', '1',
- ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1,
- B150, B150,
- "\n\r\033:\006\006\017login: ",
-
- /* table '2' -- 9600 */
- '2', '2',
- ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1,
- B9600, B9600,
- "\n\r\033;login: ",
- };
-
- #define NITAB sizeof itab/sizeof itab[0]
-
- char name[16];
- int crmod;
- int upper;
- int lower;
-
- main(argc, argv)
- char **argv;
- {
- register struct tab *tabp;
- register tname;
-
- /*
- signal(SIGINT, 1);
- signal(SIGQIT, 0);
- */
- tname = '0';
- if (argc > 1)
- tname = *argv[1];
- for (;;) {
- for(tabp = itab; tabp < &itab[NITAB]; tabp++)
- if(tabp->tname == tname)
- break;
- if(tabp >= &itab[NITAB])
- tabp = itab;
- tmode.sgispd = tabp->ispeed;
- tmode.sgospd = tabp->ospeed;
- tmode.sgflag = tabp->iflags;
- tmode.sgispd = tabp->ispeed;
- tmode.sgospd = tabp->ospeed;
- stty(0, &tmode);
- puts(tabp->message);
- stty(0, &tmode);
- if(getname()) {
- tmode.sgerase = ERASE;
- tmode.sgkill = KILL;
- tmode.sgflag = tabp->fflags;
- if(crmod)
- tmode.sgflag =| CRMOD;
- if(upper)
- tmode.sgflag =| LCASE;
- if(lower)
- tmode.sgflag =& ~LCASE;
- stty(0, &tmode);
- execl("/bin/login", "login", name, 0);
- exit(1);
- }
- tname = tabp->nname;
- }
- }
-
- getname()
- {
- register char *np;
- register c;
- static cs;
-
- crmod = 0;
- upper = 0;
- lower = 0;
- np = name;
- do {
- if (read(0, &cs, 1) <= 0)
- exit(0);
- if ((c = cs&0177) == 0)
- return(0);
- write(1, &cs, 1);
- if (c>='a' && c <='z')
- lower++;
- else if (c>='A' && c<='Z') {
- upper++;
- c =+ 'a'-'A';
- } else if (c==ERASE) {
- if (np > name)
- np--;
- continue;
- } else if (c==KILL) {
- np = name;
- continue;
- }
- *np++ = c;
- } while (c!='\n' && c!='\r' && np <= &name[16]);
- *--np = 0;
- if (c == '\r') {
- write(1, "\n", 1);
- crmod++;
- } else
- write(1, "\r", 1);
- return(1);
- }
-
- puts(as)
- char *as;
- {
- register char *s;
-
- s = as;
- while (*s)
- write(1, s++, 1);
- }
-