1: /* 2: * set teletype modes 3: */ 4: 5: #include <stdio.h> 6: #include <sgtty.h> 7: 8: struct 9: { 10: char *string; 11: int speed; 12: } speeds[] = { 13: "0", B0, 14: "50", B50, 15: "75", B75, 16: "110", B110, 17: "134", B134, 18: "134.5",B134, 19: "150", B150, 20: "200", B200, 21: "300", B300, 22: "600", B600, 23: "1200", B1200, 24: "1800", B1800, 25: "2400", B2400, 26: "4800", B4800, 27: "9600", B9600, 28: "exta", EXTA, 29: "extb", EXTB, 30: 0, 31: }; 32: struct 33: { 34: char *string; 35: int set; 36: int reset; 37: } modes[] = { 38: "even", 39: EVENP, 0, 40: 41: "-even", 42: 0, EVENP, 43: 44: "odd", 45: ODDP, 0, 46: 47: "-odd", 48: 0, ODDP, 49: 50: "raw", 51: RAW, 0, 52: 53: "-raw", 54: 0, RAW, 55: 56: "cooked", 57: 0, RAW, 58: 59: "-nl", 60: CRMOD, 0, 61: 62: "nl", 63: 0, CRMOD, 64: 65: "echo", 66: ECHO, 0, 67: 68: "-echo", 69: 0, ECHO, 70: 71: "LCASE", 72: LCASE, 0, 73: 74: "lcase", 75: LCASE, 0, 76: 77: "-LCASE", 78: 0, LCASE, 79: 80: "-lcase", 81: 0, LCASE, 82: 83: "-tabs", 84: XTABS, 0, 85: 86: "tabs", 87: 0, XTABS, 88: 89: 90: "cbreak", 91: CBREAK, 0, 92: 93: "-cbreak", 94: 0, CBREAK, 95: 96: "cr0", 97: CR0, CR3, 98: 99: "cr1", 100: CR1, CR3, 101: 102: "cr2", 103: CR2, CR3, 104: 105: "cr3", 106: CR3, CR3, 107: 108: "tab0", 109: TAB0, XTABS, 110: 111: "tab1", 112: TAB1, XTABS, 113: 114: "tab2", 115: TAB2, XTABS, 116: 117: "nl0", 118: NL0, NL3, 119: 120: "nl1", 121: NL1, NL3, 122: 123: "nl2", 124: NL2, NL3, 125: 126: "nl3", 127: NL3, NL3, 128: 129: "ff0", 130: FF0, FF1, 131: 132: "ff1", 133: FF1, FF1, 134: 135: "bs0", 136: BS0, BS1, 137: 138: "bs1", 139: BS1, BS1, 140: 141: "33", 142: CR1, ALLDELAY, 143: 144: "tty33", 145: CR1, ALLDELAY, 146: 147: "37", 148: FF1+CR2+TAB1+NL1, ALLDELAY, 149: 150: "tty37", 151: FF1+CR2+TAB1+NL1, ALLDELAY, 152: 153: "05", 154: NL2, ALLDELAY, 155: 156: "vt05", 157: NL2, ALLDELAY, 158: 159: "tn", 160: CR1, ALLDELAY, 161: 162: "tn300", 163: CR1, ALLDELAY, 164: 165: "ti", 166: CR2, ALLDELAY, 167: 168: "ti700", 169: CR2, ALLDELAY, 170: 171: "tek", 172: FF1, ALLDELAY, 173: 174: 0, 175: }; 176: 177: char *arg; 178: struct sgttyb mode; 179: 180: main(argc, argv) 181: char *argv[]; 182: { 183: int i; 184: 185: gtty(1, &mode); 186: if(argc == 1) { 187: prmodes(); 188: exit(0); 189: } 190: while(--argc > 0) { 191: 192: arg = *++argv; 193: if (eq("ek")){ 194: mode.sg_erase = '#'; 195: mode.sg_kill = '@'; 196: } 197: if (eq("erase")) { 198: if (**++argv == '^') 199: mode.sg_erase = (*argv)[1] & 037; 200: else 201: mode.sg_erase = **argv; 202: argc--; 203: } 204: if (eq("kill")) { 205: if (**++argv == '^') 206: mode.sg_kill = (*argv)[1] & 037; 207: else 208: mode.sg_kill = **argv; 209: argc--; 210: } 211: if (eq("gspeed")) { 212: mode.sg_ispeed = B300; 213: mode.sg_ospeed = B9600; 214: } 215: if (eq("hup")) { 216: ioctl(1, TIOCHPCL, NULL); 217: } else 218: for(i=0; speeds[i].string; i++) 219: if(eq(speeds[i].string)) 220: mode.sg_ispeed = mode.sg_ospeed = speeds[i].speed; 221: for(i=0; modes[i].string; i++) 222: if(eq(modes[i].string)) { 223: mode.sg_flags &= ~modes[i].reset; 224: mode.sg_flags |= modes[i].set; 225: } 226: if(arg) 227: fprintf(stderr,"unknown mode: %s\n", arg); 228: } 229: stty(1,&mode); 230: } 231: 232: eq(string) 233: char *string; 234: { 235: int i; 236: 237: if(!arg) 238: return(0); 239: i = 0; 240: loop: 241: if(arg[i] != string[i]) 242: return(0); 243: if(arg[i++] != '\0') 244: goto loop; 245: arg = 0; 246: return(1); 247: } 248: 249: prmodes() 250: { 251: register m; 252: 253: if(mode.sg_ispeed != mode.sg_ospeed) { 254: prspeed("input speed ", mode.sg_ispeed); 255: prspeed("output speed ", mode.sg_ospeed); 256: } else 257: prspeed("speed ", mode.sg_ispeed); 258: if (mode.sg_erase < ' ') 259: fprintf(stderr, "erase = '^%c'; ", '@' + mode.sg_erase); 260: else 261: fprintf(stderr, "erase = '%c'; ", mode.sg_erase); 262: if (mode.sg_kill < ' ') 263: fprintf(stderr, "kill = '^%c'\n", '@' + mode.sg_kill); 264: else 265: fprintf(stderr, "kill = '%c'\n", mode.sg_kill); 266: m = mode.sg_flags; 267: if(m & EVENP) fprintf(stderr,"even "); 268: if(m & ODDP) fprintf(stderr,"odd "); 269: if(m & RAW) fprintf(stderr,"raw "); 270: if(m & CRMOD) fprintf(stderr,"-nl "); 271: if(m & ECHO) fprintf(stderr,"echo "); 272: if(m & LCASE) fprintf(stderr,"lcase "); 273: if((m & XTABS)==XTABS) fprintf(stderr,"-tabs "); 274: if (m & CBREAK) fprintf(stderr,"cbreak "); 275: delay((m&NLDELAY)/NL1, "nl"); 276: if ((m&TBDELAY)!=XTABS) 277: delay((m&TBDELAY)/TAB1, "tab"); 278: delay((m&CRDELAY)/CR1, "cr"); 279: delay((m&VTDELAY)/FF1, "ff"); 280: delay((m&BSDELAY)/BS1, "bs"); 281: fprintf(stderr,"\n"); 282: } 283: 284: delay(m, s) 285: char *s; 286: { 287: 288: if(m) 289: fprintf(stderr,"%s%d ", s, m); 290: } 291: 292: int speed[] = { 293: 0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,0,0 294: }; 295: 296: prspeed(c, s) 297: char *c; 298: { 299: 300: fprintf(stderr,"%s%d baud\n", c, speed[s]); 301: }