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
---
Src/Modules/zpty.c | 30 ++++++++++++++++++++++++++++--
1 file changed, 28 insertions(+), 2 deletions(-)
(limited to 'Src/Modules/zpty.c')
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;
}
--
cgit 1.4.1