summaryrefslogtreecommitdiff
path: root/Src/Modules/zpty.c
diff options
context:
space:
mode:
authorBart Schaefer <barts@users.sourceforge.net>2000-11-05 02:05:17 +0000
committerBart Schaefer <barts@users.sourceforge.net>2000-11-05 02:05:17 +0000
commitb4f76c13fd8e878cd221404ebb066937b5f7281f (patch)
treeb720efa199680fc177aece48577b4767d59c85fd /Src/Modules/zpty.c
parentda9b5bb81a87fdbab6c74c75c904e9c4bd44f252 (diff)
downloadzsh-b4f76c13fd8e878cd221404ebb066937b5f7281f.tar.gz
zsh-b4f76c13fd8e878cd221404ebb066937b5f7281f.zip
Better streaming behavior from `zpty -r', plus other cleanup.
Diffstat (limited to 'Src/Modules/zpty.c')
-rw-r--r--Src/Modules/zpty.c63
1 files changed, 20 insertions, 43 deletions
diff --git a/Src/Modules/zpty.c b/Src/Modules/zpty.c
index 18f838ed4..b854fe8e3 100644
--- a/Src/Modules/zpty.c
+++ b/Src/Modules/zpty.c
@@ -275,12 +275,12 @@ newptycmd(char *nam, char *pname, char **args, int echo, int block)
return 1;
}
if (get_pty(1, &master)) {
- zwarnnam(nam, "can't open pseudo terminal", NULL, 0);
+ zwarnnam(nam, "can't open pseudo terminal: %e", NULL, errno);
return 1;
}
if ((pid = fork()) == -1) {
+ zwarnnam(nam, "can't create pty command %s: %e", pname, errno);
close(master);
- zwarnnam(nam, "couldn't create pty command: %s", pname, 0);
return 1;
} else if (!pid) {
@@ -438,7 +438,8 @@ checkptycmd(Ptycmd cmd)
{
if (cmd->read != -1)
return;
- if (!read_poll(cmd->fd, &cmd->read, 1) && kill(cmd->pid, 0) < 0) {
+ if (!read_poll(cmd->fd, &cmd->read, !cmd->block) &&
+ kill(cmd->pid, 0) < 0) {
cmd->fin = 1;
zclose(cmd->fd);
}
@@ -447,7 +448,7 @@ checkptycmd(Ptycmd cmd)
static int
ptyread(char *nam, Ptycmd cmd, char **args)
{
- int blen = 256, used = 0, ret = 1;
+ int blen = 256, used = 0, seen = 0, ret = 1;
char *buf = (char *) zhalloc((blen = 256) + 1);
Patprog prog = NULL;
@@ -465,7 +466,9 @@ ptyread(char *nam, Ptycmd cmd, char **args)
zwarnnam(nam, "bad pattern: %s", args[1], 0);
return 1;
}
- }
+ } else
+ fflush(stdout);
+
if (cmd->read != -1) {
buf[0] = (char) cmd->read;
buf[1] = '\0';
@@ -479,30 +482,19 @@ ptyread(char *nam, Ptycmd cmd, char **args)
break;
}
if ((ret = read(cmd->fd, buf + used, 1)) == 1) {
+ seen = 1;
if (++used == blen) {
- buf = hrealloc(buf, blen, blen << 1);
- blen <<= 1;
+ if (!*args) {
+ write(1, buf, used);
+ used = 0;
+ } else {
+ buf = hrealloc(buf, blen, blen << 1);
+ blen <<= 1;
+ }
}
}
buf[used] = '\0';
-#if 0
- /* This once used the following test, to make sure to return
- * non-zero if there are no characters to read. That looks
- * like a thinko now, because it disables non-blocking ptys. */
-
- if (ret < 0 && (cmd->block
-#ifdef EWOULDBLOCK
- || errno != EWOULDBLOCK
-#else
-#ifdef EAGAIN
- || errno != EAGAIN
-#endif
-#endif
- ))
- break;
-#endif
-
if (!prog && ret <= 0)
break;
} while (!errflag && !breaks && !retflag && !contflag &&
@@ -511,11 +503,10 @@ ptyread(char *nam, Ptycmd cmd, char **args)
if (*args)
setsparam(*args, ztrdup(metafy(buf, used, META_HREALLOC)));
- else {
- fflush(stdout);
+ else
write(1, buf, used);
- }
- return !used;
+
+ return !seen;
}
static int
@@ -524,21 +515,7 @@ ptywritestr(Ptycmd cmd, char *s, int len)
int written;
for (; len; len -= written, s += written) {
- if ((written = write(cmd->fd, s, len)) < 0
-#if 0
- /* Same as above. */
- &&
- (cmd->block
-#ifdef EWOULDBLOCK
- || errno != EWOULDBLOCK
-#else
-#ifdef EAGAIN
- || errno != EAGAIN
-#endif
-#endif
- )
-#endif
- )
+ if ((written = write(cmd->fd, s, len)) < 0)
return 1;
if (written < 0) {
checkptycmd(cmd);