ttywrite was assuming that if it could not write then it could
read, but this is not necessarily true, there are some situations
where you cannot read or write. The correct behaviour is to detect
if you can read or/and write.
static void tdeftran(char);
static inline int match(uint, uint);
static void ttynew(void);
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);
static void ttyresize(void);
static void ttysend(char *, size_t);
static void ttywrite(const char *, size_t);
ttyread(void)
{
static char buf[BUFSIZ];
ttyread(void)
{
static char buf[BUFSIZ];
/* keep any uncomplete utf8 char for the next call */
memmove(buf, ptr, buflen);
/* keep any uncomplete utf8 char for the next call */
memmove(buf, ptr, buflen);
}
void
ttywrite(const char *s, size_t n)
{
}
void
ttywrite(const char *s, size_t n)
{
- fd_set wfd;
- struct timespec tv;
/*
* Remember that we are using a pty, which might be a modem line.
/*
* Remember that we are using a pty, which might be a modem line.
*/
while (n > 0) {
FD_ZERO(&wfd);
*/
while (n > 0) {
FD_ZERO(&wfd);
- tv.tv_sec = 0;
- tv.tv_nsec = 0;
/* Check if we can write. */
/* 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 (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.
*/
/*
* 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 (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();
+ return;
+
+write_error:
+ die("write error on tty: %s\n", strerror(errno));