/* * set teletype modes */ #include #include struct { char *string; int speed; } speeds[] = { "0", B0, "50", B50, "75", B75, "110", B110, "134", B134, "134.5",B134, "150", B150, "200", B200, "300", B300, "600", B600, "1200", B1200, "1800", B1800, "2400", B2400, "4800", B4800, "9600", B9600, "exta", EXTA, "extb", EXTB, 0, }; struct { char *string; int set; int reset; } modes[] = { "even", EVENP, 0, "-even", 0, EVENP, "odd", ODDP, 0, "-odd", 0, ODDP, "raw", RAW, 0, "-raw", 0, RAW, "cooked", 0, RAW, "-nl", CRMOD, 0, "nl", 0, CRMOD, "echo", ECHO, 0, "-echo", 0, ECHO, "LCASE", LCASE, 0, "lcase", LCASE, 0, "-LCASE", 0, LCASE, "-lcase", 0, LCASE, "-tabs", XTABS, 0, "tabs", 0, XTABS, "cbreak", CBREAK, 0, "-cbreak", 0, CBREAK, "cr0", CR0, CR3, "cr1", CR1, CR3, "cr2", CR2, CR3, "cr3", CR3, CR3, "tab0", TAB0, XTABS, "tab1", TAB1, XTABS, "tab2", TAB2, XTABS, "nl0", NL0, NL3, "nl1", NL1, NL3, "nl2", NL2, NL3, "nl3", NL3, NL3, "ff0", FF0, FF1, "ff1", FF1, FF1, "bs0", BS0, BS1, "bs1", BS1, BS1, "33", CR1, ALLDELAY, "tty33", CR1, ALLDELAY, "37", FF1+CR2+TAB1+NL1, ALLDELAY, "tty37", FF1+CR2+TAB1+NL1, ALLDELAY, "05", NL2, ALLDELAY, "vt05", NL2, ALLDELAY, "tn", CR1, ALLDELAY, "tn300", CR1, ALLDELAY, "ti", CR2, ALLDELAY, "ti700", CR2, ALLDELAY, "tek", FF1, ALLDELAY, 0, }; char *arg; struct sgttyb mode; main(argc, argv) char *argv[]; { int i; gtty(1, &mode); if(argc == 1) { prmodes(); exit(0); } while(--argc > 0) { arg = *++argv; if (eq("ek")){ mode.sg_erase = '#'; mode.sg_kill = '@'; } if (eq("erase")) { if (**++argv == '^') mode.sg_erase = (*argv)[1] & 037; else mode.sg_erase = **argv; argc--; } if (eq("kill")) { if (**++argv == '^') mode.sg_kill = (*argv)[1] & 037; else mode.sg_kill = **argv; argc--; } if (eq("gspeed")) { mode.sg_ispeed = B300; mode.sg_ospeed = B9600; } if (eq("hup")) { ioctl(1, TIOCHPCL, NULL); } else for(i=0; speeds[i].string; i++) if(eq(speeds[i].string)) mode.sg_ispeed = mode.sg_ospeed = speeds[i].speed; for(i=0; modes[i].string; i++) if(eq(modes[i].string)) { mode.sg_flags &= ~modes[i].reset; mode.sg_flags |= modes[i].set; } if(arg) fprintf(stderr,"unknown mode: %s\n", arg); } stty(1,&mode); } eq(string) char *string; { int i; if(!arg) return(0); i = 0; loop: if(arg[i] != string[i]) return(0); if(arg[i++] != '\0') goto loop; arg = 0; return(1); } prmodes() { register m; if(mode.sg_ispeed != mode.sg_ospeed) { prspeed("input speed ", mode.sg_ispeed); prspeed("output speed ", mode.sg_ospeed); } else prspeed("speed ", mode.sg_ispeed); if (mode.sg_erase < ' ') fprintf(stderr, "erase = '^%c'; ", '@' + mode.sg_erase); else fprintf(stderr, "erase = '%c'; ", mode.sg_erase); if (mode.sg_kill < ' ') fprintf(stderr, "kill = '^%c'\n", '@' + mode.sg_kill); else fprintf(stderr, "kill = '%c'\n", mode.sg_kill); m = mode.sg_flags; if(m & EVENP) fprintf(stderr,"even "); if(m & ODDP) fprintf(stderr,"odd "); if(m & RAW) fprintf(stderr,"raw "); if(m & CRMOD) fprintf(stderr,"-nl "); if(m & ECHO) fprintf(stderr,"echo "); if(m & LCASE) fprintf(stderr,"lcase "); if((m & XTABS)==XTABS) fprintf(stderr,"-tabs "); if (m & CBREAK) fprintf(stderr,"cbreak "); delay((m&NLDELAY)/NL1, "nl"); if ((m&TBDELAY)!=XTABS) delay((m&TBDELAY)/TAB1, "tab"); delay((m&CRDELAY)/CR1, "cr"); delay((m&VTDELAY)/FF1, "ff"); delay((m&BSDELAY)/BS1, "bs"); fprintf(stderr,"\n"); } delay(m, s) char *s; { if(m) fprintf(stderr,"%s%d ", s, m); } int speed[] = { 0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,0,0 }; prspeed(c, s) char *c; { fprintf(stderr,"%s%d baud\n", c, speed[s]); }