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:
parent
da9b5bb81a
commit
b4f76c13fd
2 changed files with 26 additions and 43 deletions
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue