|
@@ -415,7 +415,7 @@ static int32_t tdefcolor(int *, int *, int);
|
|
static void tdeftran(char);
|
|
static void tdeftran(char);
|
|
static inline int match(uint, uint);
|
|
static inline int match(uint, uint);
|
|
static void ttynew(void);
|
|
static void ttynew(void);
|
|
-static void ttyread(void);
|
|
|
|
|
|
+static size_t ttyread(void);
|
|
static void ttyresize(void);
|
|
static void ttyresize(void);
|
|
static void ttysend(char *, size_t);
|
|
static void ttysend(char *, size_t);
|
|
static void ttywrite(const char *, size_t);
|
|
static void ttywrite(const char *, size_t);
|
|
@@ -1464,7 +1464,7 @@ ttynew(void)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-void
|
|
|
|
|
|
+size_t
|
|
ttyread(void)
|
|
ttyread(void)
|
|
{
|
|
{
|
|
static char buf[BUFSIZ];
|
|
static char buf[BUFSIZ];
|
|
@@ -1489,14 +1489,16 @@ ttyread(void)
|
|
|
|
|
|
/* keep any uncomplete utf8 char for the next call */
|
|
/* keep any uncomplete utf8 char for the next call */
|
|
memmove(buf, ptr, buflen);
|
|
memmove(buf, ptr, buflen);
|
|
|
|
+
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
void
|
|
ttywrite(const char *s, size_t n)
|
|
ttywrite(const char *s, size_t n)
|
|
{
|
|
{
|
|
- fd_set wfd;
|
|
|
|
- struct timespec tv;
|
|
|
|
|
|
+ fd_set wfd, rfd;
|
|
ssize_t r;
|
|
ssize_t r;
|
|
|
|
+ size_t lim = 256;
|
|
|
|
|
|
/*
|
|
/*
|
|
* 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.
|
|
@@ -1506,38 +1508,34 @@ ttywrite(const char *s, size_t n)
|
|
*/
|
|
*/
|
|
while (n > 0) {
|
|
while (n > 0) {
|
|
FD_ZERO(&wfd);
|
|
FD_ZERO(&wfd);
|
|
|
|
+ FD_ZERO(&rfd);
|
|
FD_SET(cmdfd, &wfd);
|
|
FD_SET(cmdfd, &wfd);
|
|
- tv.tv_sec = 0;
|
|
|
|
- tv.tv_nsec = 0;
|
|
|
|
|
|
+ FD_SET(cmdfd, &rfd);
|
|
|
|
|
|
/* 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)
|
|
if (errno == EINTR)
|
|
continue;
|
|
continue;
|
|
die("select failed: %s\n", strerror(errno));
|
|
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
|
|
* Only write 256 bytes at maximum. This seems to be a
|
|
* reasonable value for a serial line. Bigger values
|
|
* reasonable value for a serial line. Bigger values
|
|
* might clog the I/O.
|
|
* 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) {
|
|
if (r < n) {
|
|
/*
|
|
/*
|
|
* We weren't able to write out everything.
|
|
* We weren't able to write out everything.
|
|
* This means the buffer is getting full
|
|
* This means the buffer is getting full
|
|
* again. Empty it.
|
|
* again. Empty it.
|
|
*/
|
|
*/
|
|
- if (n < 256)
|
|
|
|
- ttyread();
|
|
|
|
|
|
+ if (n < lim)
|
|
|
|
+ lim = ttyread();
|
|
n -= r;
|
|
n -= r;
|
|
s += r;
|
|
s += r;
|
|
} else {
|
|
} 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
|
|
void
|