1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-17 15:01:40 +02:00

31672: Add test that was failing and fix zpty set-up race

This commit is contained in:
Peter Stephenson 2013-08-26 21:01:17 +01:00
parent f61804c4b4
commit b0a0441902
3 changed files with 42 additions and 3 deletions

View file

@ -1,3 +1,8 @@
2013-08-26 Peter Stephenson <p.w.stephenson@ntlworld.com>
* 31672: Src/Modules/zpty.c, Test/V08zpty.ztst: add test that
was failing and fix race when setting up pty.
2013-08-25 Peter Stephenson <p.w.stephenson@ntlworld.com> 2013-08-25 Peter Stephenson <p.w.stephenson@ntlworld.com>
* 31665: Src/Modules/zpty.c, Test/V08zpty.ztst, Test/.distfiles: * 31665: Src/Modules/zpty.c, Test/V08zpty.ztst, Test/.distfiles:

View file

@ -293,8 +293,8 @@ static int
newptycmd(char *nam, char *pname, char **args, int echo, int nblock) newptycmd(char *nam, char *pname, char **args, int echo, int nblock)
{ {
Ptycmd p; Ptycmd p;
int master, slave, pid, oineval = ineval; int master, slave, pid, oineval = ineval, ret;
char *oscriptname = scriptname; char *oscriptname = scriptname, syncch;
Eprog prog; Eprog prog;
/* code borrowed from bin_eval() */ /* code borrowed from bin_eval() */
@ -398,6 +398,20 @@ newptycmd(char *nam, char *pname, char **args, int echo, int nblock)
setsparam("TTY", ztrdup(ttystrname)); setsparam("TTY", ztrdup(ttystrname));
opts[INTERACTIVE] = 0; opts[INTERACTIVE] = 0;
syncch = 0;
do {
ret = write(1, &syncch, 1);
} while (ret != 1 && (
#ifdef EWOULDBLOCK
errno == EWOULDBLOCK ||
#else
#ifdef EAGAIN
errno == EAGAIN ||
#endif
#endif
errno == EINTR));
execode(prog, 1, 0, "zpty"); execode(prog, 1, 0, "zpty");
stopmsg = 2; stopmsg = 2;
mypid = 0; /* trick to ensure we _exit() */ mypid = 0; /* trick to ensure we _exit() */
@ -433,6 +447,18 @@ newptycmd(char *nam, char *pname, char **args, int echo, int nblock)
scriptname = oscriptname; scriptname = oscriptname;
ineval = oineval; ineval = oineval;
do {
ret = read(master, &syncch, 1);
} while (ret != 1 && (
#ifdef EWOULDBLOCK
errno == EWOULDBLOCK ||
#else
#ifdef EAGAIN
errno == EAGAIN ||
#endif
#endif
errno == EINTR));
return 0; return 0;
} }

View file

@ -11,10 +11,18 @@
%test %test
zpty cat cat
zpty -w cat a line of text
var=
zpty -r cat var && print -r -- ${var%%$'\r\n'}
zpty -d cat
0:zpty with a process that does not set up the terminal: internal write
>a line of text
zpty cat cat zpty cat cat
print a line of text | zpty -w cat print a line of text | zpty -w cat
var= var=
zpty -r cat var && print -r -- ${var%%$'\r\n'} zpty -r cat var && print -r -- ${var%%$'\r\n'}
zpty -d cat zpty -d cat
0:zpty with a process that does not set up the terminal 0:zpty with a process that does not set up the terminal: write via stdin
>a line of text >a line of text