| 1 | # |
| 2 | /* |
| 3 | * getty -- adapt to terminal speed on dialup, and call login |
| 4 | */ |
| 5 | |
| 6 | #include <sgtty.h> |
| 7 | #include <signal.h> |
| 8 | #define ERASE '#' |
| 9 | #define KILL '@' |
| 10 | |
| 11 | struct sgttyb tmode; |
| 12 | |
| 13 | struct tab { |
| 14 | char tname; /* this table name */ |
| 15 | char nname; /* successor table name */ |
| 16 | int iflags; /* initial flags */ |
| 17 | int fflags; /* final flags */ |
| 18 | int ispeed; /* input speed */ |
| 19 | int ospeed; /* output speed */ |
| 20 | char *message; /* login message */ |
| 21 | } itab[] = { |
| 22 | |
| 23 | /* table '0'-1-2-3 300,1200,150,110 */ |
| 24 | |
| 25 | '0', 1, |
| 26 | ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1, |
| 27 | B300, B300, |
| 28 | "\n\r\033;\007login: ", |
| 29 | |
| 30 | 1, 2, |
| 31 | ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1, |
| 32 | B1200, B1200, |
| 33 | "\n\r\033;login: ", |
| 34 | |
| 35 | 2, 3, |
| 36 | ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1, |
| 37 | B150, B150, |
| 38 | "\n\r\033:\006\006\017login: ", |
| 39 | |
| 40 | 3, '0', |
| 41 | ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1, |
| 42 | B110, B110, |
| 43 | "\n\rlogin: ", |
| 44 | |
| 45 | /* table '-' -- Console TTY 110 */ |
| 46 | '-', '-', |
| 47 | ANYP+RAW+NL1+CR1, ANYP+ECHO+CRMOD+XTABS+LCASE+CR1, |
| 48 | B110, B110, |
| 49 | "\n\rlogin: ", |
| 50 | |
| 51 | /* table '1' -- 150 */ |
| 52 | '1', '1', |
| 53 | ANYP+RAW+NL1+CR1, EVENP+ECHO+FF1+CR2+TAB1+NL1, |
| 54 | B150, B150, |
| 55 | "\n\r\033:\006\006\017login: ", |
| 56 | |
| 57 | /* table '2' -- 9600 */ |
| 58 | '2', '2', |
| 59 | ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1, |
| 60 | B9600, B9600, |
| 61 | "\n\r\033;login: ", |
| 62 | |
| 63 | /* table '3'-'5' -- 1200,300 */ |
| 64 | '3', '5', |
| 65 | ANYP+RAW+NL1+CR1, ANYP+XTABS+ECHO+CRMOD+FF1, |
| 66 | B1200, B1200, |
| 67 | "\n\r\033;login: ", |
| 68 | |
| 69 | /* table '5'-'3' -- 300,1200 */ |
| 70 | '5', '3', |
| 71 | ANYP+RAW+NL1+CR1, ANYP+ECHO+CR1, |
| 72 | B300, B300, |
| 73 | "\n\r\033;\007login: ", |
| 74 | |
| 75 | /* table '4' -- Console Decwriter */ |
| 76 | '4', '4', |
| 77 | ANYP+RAW, ANYP+ECHO+CRMOD+XTABS, |
| 78 | B300, B300, |
| 79 | "\n\rlogin: ", |
| 80 | |
| 81 | /* table '6' -- 2400 */ |
| 82 | '6' , '6' , |
| 83 | ANYP+RAW , ANYP+ECHO+CRMOD , |
| 84 | B2400 , B2400 , |
| 85 | "\n\r\007login : ", |
| 86 | |
| 87 | /* table '7' - - 4800 */ |
| 88 | '7' , '7' , |
| 89 | ANYP+RAW , ANYP+ECHO+CRMOD , |
| 90 | B4800 , B4800 , |
| 91 | "\n\r\007login : " , |
| 92 | |
| 93 | /* table 'i' -- Interdata Console */ |
| 94 | 'i', 'i', |
| 95 | RAW+CRMOD, CRMOD+ECHO+LCASE, |
| 96 | 0, 0, |
| 97 | "\n\rlogin: ", |
| 98 | |
| 99 | /* table 'l' -- LSI Chess Terminal */ |
| 100 | 'l', 'l', |
| 101 | ANYP+RAW/*+HUPCL*/, ANYP+ECHO/*+HUPCL*/, |
| 102 | B300, B300, |
| 103 | "*", |
| 104 | }; |
| 105 | |
| 106 | #define NITAB sizeof itab/sizeof itab[0] |
| 107 | #define EOT 04 /* EOT char */ |
| 108 | |
| 109 | char name[16]; |
| 110 | int crmod; |
| 111 | int upper; |
| 112 | int lower; |
| 113 | |
| 114 | char partab[] = { |
| 115 | 0001,0201,0201,0001,0201,0001,0001,0201, |
| 116 | 0202,0004,0003,0205,0005,0206,0201,0001, |
| 117 | 0201,0001,0001,0201,0001,0201,0201,0001, |
| 118 | 0001,0201,0201,0001,0201,0001,0001,0201, |
| 119 | 0200,0000,0000,0200,0000,0200,0200,0000, |
| 120 | 0000,0200,0200,0000,0200,0000,0000,0200, |
| 121 | 0000,0200,0200,0000,0200,0000,0000,0200, |
| 122 | 0200,0000,0000,0200,0000,0200,0200,0000, |
| 123 | 0200,0000,0000,0200,0000,0200,0200,0000, |
| 124 | 0000,0200,0200,0000,0200,0000,0000,0200, |
| 125 | 0000,0200,0200,0000,0200,0000,0000,0200, |
| 126 | 0200,0000,0000,0200,0000,0200,0200,0000, |
| 127 | 0000,0200,0200,0000,0200,0000,0000,0200, |
| 128 | 0200,0000,0000,0200,0000,0200,0200,0000, |
| 129 | 0200,0000,0000,0200,0000,0200,0200,0000, |
| 130 | 0000,0200,0200,0000,0200,0000,0000,0201 |
| 131 | }; |
| 132 | |
| 133 | main(argc, argv) |
| 134 | char **argv; |
| 135 | { |
| 136 | register struct tab *tabp; |
| 137 | char tname; |
| 138 | |
| 139 | /* |
| 140 | signal(SIGINT, SIG_IGN); |
| 141 | signal(SIGQUIT, SIG_DFL); |
| 142 | */ |
| 143 | tname = '0'; |
| 144 | if (argc > 1) |
| 145 | tname = argv[1][0]; |
| 146 | for (;;) { |
| 147 | for(tabp = itab; tabp < &itab[NITAB]; tabp++) |
| 148 | if(tabp->tname == tname) |
| 149 | break; |
| 150 | if(tabp >= &itab[NITAB]) |
| 151 | tabp = itab; |
| 152 | tmode.sg_ispeed = tabp->ispeed; |
| 153 | tmode.sg_ospeed = tabp->ospeed; |
| 154 | tmode.sg_flags = tabp->iflags; |
| 155 | tmode.sg_ispeed = tabp->ispeed; |
| 156 | tmode.sg_ospeed = tabp->ospeed; |
| 157 | stty(0, &tmode); |
| 158 | puts(tabp->message); |
| 159 | if(getname()) { |
| 160 | tmode.sg_erase = ERASE; |
| 161 | tmode.sg_kill = KILL; |
| 162 | tmode.sg_flags = tabp->fflags; |
| 163 | if(crmod) |
| 164 | tmode.sg_flags |= CRMOD; |
| 165 | if(upper) |
| 166 | tmode.sg_flags |= LCASE; |
| 167 | if(lower) |
| 168 | tmode.sg_flags &= ~LCASE; |
| 169 | stty(0, &tmode); |
| 170 | putchr('\n'); |
| 171 | execl("/bin/login", "login", name, 0); |
| 172 | exit(1); |
| 173 | } |
| 174 | tname = tabp->nname; |
| 175 | } |
| 176 | } |
| 177 | |
| 178 | getname() |
| 179 | { |
| 180 | register char *np; |
| 181 | register c; |
| 182 | char cs; |
| 183 | |
| 184 | crmod = 0; |
| 185 | upper = 0; |
| 186 | lower = 0; |
| 187 | np = name; |
| 188 | for (;;) { |
| 189 | if (read(0, &cs, 1) <= 0) |
| 190 | exit(0); |
| 191 | if ((c = cs&0177) == 0) |
| 192 | return(0); |
| 193 | if (c==EOT) |
| 194 | exit(1); |
| 195 | if (c=='\r' || c=='\n' || np >= &name[16]) |
| 196 | break; |
| 197 | putchr(cs); |
| 198 | if (c>='a' && c <='z') |
| 199 | lower++; |
| 200 | else if (c>='A' && c<='Z') { |
| 201 | upper++; |
| 202 | c += 'a'-'A'; |
| 203 | } else if (c==ERASE) { |
| 204 | if (np > name) |
| 205 | np--; |
| 206 | continue; |
| 207 | } else if (c==KILL) { |
| 208 | putchr('\r'); |
| 209 | putchr('\n'); |
| 210 | np = name; |
| 211 | continue; |
| 212 | } else if(c == ' ') |
| 213 | c = '_'; |
| 214 | *np++ = c; |
| 215 | } |
| 216 | *np = 0; |
| 217 | if (c == '\r') |
| 218 | crmod++; |
| 219 | return(1); |
| 220 | } |
| 221 | |
| 222 | puts(as) |
| 223 | char *as; |
| 224 | { |
| 225 | register char *s; |
| 226 | |
| 227 | s = as; |
| 228 | while (*s) |
| 229 | putchr(*s++); |
| 230 | } |
| 231 | |
| 232 | putchr(cc) |
| 233 | { |
| 234 | char c; |
| 235 | c = cc; |
| 236 | c |= partab[c&0177] & 0200; |
| 237 | write(1, &c, 1); |
| 238 | } |