tty.c (1437B)
1 /* 2 * Terminal support (standard input/output). 3 */ 4 5 #include "u.h" 6 #include <termios.h> 7 #include <sys/termios.h> 8 #include "lib.h" 9 #include "mem.h" 10 #include "dat.h" 11 #include "fns.h" 12 #include "error.h" 13 14 static int ttyprint = 0; 15 static int ttyecho = 0; 16 static struct termios ttprevmode; 17 18 /* 19 * Normal prints and console output go to standard output. 20 */ 21 void 22 uartputs(char *buf, int n) 23 { 24 if(!ttyprint) 25 return; 26 write(1, buf, n); 27 } 28 29 void 30 restoretty(void) 31 { 32 if(ttyecho && tcsetattr(0, TCSANOW, &ttprevmode) < 0){ 33 ttyecho = 0; 34 panic("could not restore previous tty mode"); 35 } 36 } 37 38 void 39 bye(int sig) 40 { 41 restoretty(); 42 exit(0); 43 } 44 45 void 46 uartreader(void *v) 47 { 48 char buf[256]; 49 int n; 50 static struct termios ttmode; 51 52 /* 53 * Try to disable host echo, save 54 * current state to restore it at exit. 55 * If successful, remember to echo 56 * what gets typed ourselves. 57 */ 58 if(tcgetattr(0, &ttprevmode) < 0) 59 /* 60 * We do not panic here so that 61 * 9vx can be run without a tty 62 */ 63 goto Read; 64 if(tcgetattr(0, &ttmode) >= 0){ 65 ttmode.c_lflag &= ~(ECHO|ICANON); 66 if(tcsetattr(0, TCSANOW, &ttmode) >= 0) 67 ttyecho = 1; 68 } 69 signal(SIGINT, bye); 70 signal(SIGTERM, bye); 71 Read: 72 while((n = read(0, buf, sizeof buf)) > 0) 73 echo(buf, n); 74 } 75 76 void 77 uartinit(int usetty) 78 { 79 ttyprint = usetty; 80 kbdq = qopen(4*1024, 0, 0, 0); 81 if(usetty) 82 kproc("*tty*", uartreader, nil); 83 } 84 85 void 86 uartecho(char *buf, int n) 87 { 88 if(ttyecho) 89 write(1, buf, n); 90 } 91