1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-11 00:51:05 +02:00

Better streaming behavior from `zpty -r', plus other cleanup.

This commit is contained in:
Bart Schaefer 2000-11-05 02:05:17 +00:00
parent da9b5bb81a
commit b4f76c13fd
2 changed files with 26 additions and 43 deletions

View file

@ -1,3 +1,9 @@
2000-11-04 Bart Schaefer <schaefer@zsh.org>
* 13116: Src/Modules/zpty.c: More informative error output; better
streaming behavior of `zpty -r'; prevent hang on `zpty -t' when
the command was started with `zpty -b'.
2000-11-02 Sven Wischnowsky <wischnow@zsh.org> 2000-11-02 Sven Wischnowsky <wischnow@zsh.org>
* users/3503: Doc/Zsh/mod_parameter.yo, Src/jobs.c, * users/3503: Doc/Zsh/mod_parameter.yo, Src/jobs.c,

View file

@ -275,12 +275,12 @@ newptycmd(char *nam, char *pname, char **args, int echo, int block)
return 1; return 1;
} }
if (get_pty(1, &master)) { 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; return 1;
} }
if ((pid = fork()) == -1) { if ((pid = fork()) == -1) {
zwarnnam(nam, "can't create pty command %s: %e", pname, errno);
close(master); close(master);
zwarnnam(nam, "couldn't create pty command: %s", pname, 0);
return 1; return 1;
} else if (!pid) { } else if (!pid) {
@ -438,7 +438,8 @@ checkptycmd(Ptycmd cmd)
{ {
if (cmd->read != -1) if (cmd->read != -1)
return; 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; cmd->fin = 1;
zclose(cmd->fd); zclose(cmd->fd);
} }
@ -447,7 +448,7 @@ checkptycmd(Ptycmd cmd)
static int static int
ptyread(char *nam, Ptycmd cmd, char **args) 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); char *buf = (char *) zhalloc((blen = 256) + 1);
Patprog prog = NULL; Patprog prog = NULL;
@ -465,7 +466,9 @@ ptyread(char *nam, Ptycmd cmd, char **args)
zwarnnam(nam, "bad pattern: %s", args[1], 0); zwarnnam(nam, "bad pattern: %s", args[1], 0);
return 1; return 1;
} }
} } else
fflush(stdout);
if (cmd->read != -1) { if (cmd->read != -1) {
buf[0] = (char) cmd->read; buf[0] = (char) cmd->read;
buf[1] = '\0'; buf[1] = '\0';
@ -479,30 +482,19 @@ ptyread(char *nam, Ptycmd cmd, char **args)
break; break;
} }
if ((ret = read(cmd->fd, buf + used, 1)) == 1) { if ((ret = read(cmd->fd, buf + used, 1)) == 1) {
seen = 1;
if (++used == blen) { if (++used == blen) {
buf = hrealloc(buf, blen, blen << 1); if (!*args) {
blen <<= 1; write(1, buf, used);
used = 0;
} else {
buf = hrealloc(buf, blen, blen << 1);
blen <<= 1;
}
} }
} }
buf[used] = '\0'; 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) if (!prog && ret <= 0)
break; break;
} while (!errflag && !breaks && !retflag && !contflag && } while (!errflag && !breaks && !retflag && !contflag &&
@ -511,11 +503,10 @@ ptyread(char *nam, Ptycmd cmd, char **args)
if (*args) if (*args)
setsparam(*args, ztrdup(metafy(buf, used, META_HREALLOC))); setsparam(*args, ztrdup(metafy(buf, used, META_HREALLOC)));
else { else
fflush(stdout);
write(1, buf, used); write(1, buf, used);
}
return !used; return !seen;
} }
static int static int
@ -524,21 +515,7 @@ ptywritestr(Ptycmd cmd, char *s, int len)
int written; int written;
for (; len; len -= written, s += written) { for (; len; len -= written, s += written) {
if ((written = write(cmd->fd, s, len)) < 0 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
)
return 1; return 1;
if (written < 0) { if (written < 0) {
checkptycmd(cmd); checkptycmd(cmd);