From b0a0441902f848da4284e107c29e43e222252959 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 26 Aug 2013 21:01:17 +0100 Subject: 31672: Add test that was failing and fix zpty set-up race --- ChangeLog | 5 +++++ Src/Modules/zpty.c | 30 ++++++++++++++++++++++++++++-- Test/V08zpty.ztst | 10 +++++++++- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 08b8abdc4..8f594b45b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-08-26 Peter Stephenson + + * 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 * 31665: Src/Modules/zpty.c, Test/V08zpty.ztst, Test/.distfiles: diff --git a/Src/Modules/zpty.c b/Src/Modules/zpty.c index 382119483..fca0cc172 100644 --- a/Src/Modules/zpty.c +++ b/Src/Modules/zpty.c @@ -293,8 +293,8 @@ static int newptycmd(char *nam, char *pname, char **args, int echo, int nblock) { Ptycmd p; - int master, slave, pid, oineval = ineval; - char *oscriptname = scriptname; + int master, slave, pid, oineval = ineval, ret; + char *oscriptname = scriptname, syncch; Eprog prog; /* code borrowed from bin_eval() */ @@ -398,6 +398,20 @@ newptycmd(char *nam, char *pname, char **args, int echo, int nblock) setsparam("TTY", ztrdup(ttystrname)); 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"); stopmsg = 2; mypid = 0; /* trick to ensure we _exit() */ @@ -433,6 +447,18 @@ newptycmd(char *nam, char *pname, char **args, int echo, int nblock) scriptname = oscriptname; 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; } diff --git a/Test/V08zpty.ztst b/Test/V08zpty.ztst index d9d24c5e8..5b08fc281 100644 --- a/Test/V08zpty.ztst +++ b/Test/V08zpty.ztst @@ -11,10 +11,18 @@ %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 print a line of text | zpty -w cat 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 +0:zpty with a process that does not set up the terminal: write via stdin >a line of text -- cgit 1.4.1