vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | Refs

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