diff options
| -rw-r--r-- | st.c | 38 | 
1 files changed, 20 insertions, 18 deletions
@@ -415,7 +415,7 @@ static int32_t tdefcolor(int *, int *, int);  static void tdeftran(char);  static inline int match(uint, uint);  static void ttynew(void); -static void ttyread(void); +static size_t ttyread(void);  static void ttyresize(void);  static void ttysend(char *, size_t);  static void ttywrite(const char *, size_t); @@ -1464,7 +1464,7 @@ ttynew(void)  	}  } -void +size_t  ttyread(void)  {  	static char buf[BUFSIZ]; @@ -1489,14 +1489,16 @@ ttyread(void)  	/* keep any uncomplete utf8 char for the next call */  	memmove(buf, ptr, buflen); + +	return ret;  }  void  ttywrite(const char *s, size_t n)  { -	fd_set wfd; -	struct timespec tv; +	fd_set wfd, rfd;  	ssize_t r; +	size_t lim = 256;  	/*  	 * Remember that we are using a pty, which might be a modem line. @@ -1506,38 +1508,34 @@ ttywrite(const char *s, size_t n)  	 */  	while (n > 0) {  		FD_ZERO(&wfd); +		FD_ZERO(&rfd);  		FD_SET(cmdfd, &wfd); -		tv.tv_sec = 0; -		tv.tv_nsec = 0; +		FD_SET(cmdfd, &rfd);  		/* Check if we can write. */ -		if (pselect(cmdfd+1, NULL, &wfd, NULL, &tv, NULL) < 0) { +		if (pselect(cmdfd+1, &rfd, &wfd, NULL, NULL, NULL) < 0) {  			if (errno == EINTR)  				continue;  			die("select failed: %s\n", strerror(errno));  		} -		if(!FD_ISSET(cmdfd, &wfd)) { -			/* No, then free some buffer space. */ -			ttyread(); -		} else { +		if (FD_ISSET(cmdfd, &rfd)) +			lim = ttyread(); +		if (FD_ISSET(cmdfd, &wfd)) {  			/*  			 * Only write 256 bytes at maximum. This seems to be a  			 * reasonable value for a serial line. Bigger values  			 * might clog the I/O.  			 */ -			r = write(cmdfd, s, (n < 256)? n : 256); -			if (r < 0) { -				die("write error on tty: %s\n", -						strerror(errno)); -			} +			if ((r = write(cmdfd, s, (n < 256)? n : 256)) < 0) +				goto write_error;  			if (r < n) {  				/*  				 * We weren't able to write out everything.  				 * This means the buffer is getting full  				 * again. Empty it.  				 */ -				if (n < 256) -					ttyread(); +				if (n < lim) +					lim = ttyread();  				n -= r;  				s += r;  			} else { @@ -1546,6 +1544,10 @@ ttywrite(const char *s, size_t n)  			}  		}  	} +	return; + +write_error: +	die("write error on tty: %s\n", strerror(errno));  }  void  | 
