aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2011-08-09 17:42:18 +0300
committerArnold D. Robbins <arnold@skeeve.com>2011-08-09 17:42:18 +0300
commit657395eeea809730a56bb65bcfc62028deb06f73 (patch)
tree87b9415b0780941862bc5fee3c2deb440c15399d
parent0b28764069fb268dd716251c71d310c0a321c600 (diff)
downloadegawk-657395eeea809730a56bb65bcfc62028deb06f73.tar.gz
egawk-657395eeea809730a56bb65bcfc62028deb06f73.tar.bz2
egawk-657395eeea809730a56bb65bcfc62028deb06f73.zip
Fix for ptys for coprocesses.
-rw-r--r--ChangeLog8
-rw-r--r--awk.h4
-rw-r--r--configh.in3
-rwxr-xr-xconfigure2
-rw-r--r--configure.ac2
-rw-r--r--io.c2
-rw-r--r--test/ChangeLog5
-rw-r--r--test/Makefile.am5
-rw-r--r--test/Makefile.in10
-rw-r--r--test/Maketests5
-rw-r--r--test/pty1.awk54
-rw-r--r--test/pty1.ok2
12 files changed, 98 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 9a97ad28..62fcfa31 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2011-08-09 Arnold D. Robbins <arnold@skeeve.com>
+
+ Fix pty issue reported by "T. X. G." <leopardie333@yahoo.com>
+
+ * configure.ac: Check for setsid.
+ * awk.h: If not HAVE_SETSID define it as an empty macro.
+ * io.c (two_way_open): Call setsid if using pty's.
+
2011-07-29 Eli Zaretskii <eliz@gnu.org>
* builtin.c (format_tree): Rename small -> small_flag,
diff --git a/awk.h b/awk.h
index 1421203a..f3d36654 100644
--- a/awk.h
+++ b/awk.h
@@ -171,6 +171,10 @@ typedef int off_t;
#define setlocale(locale, val) /* nothing */
#endif /* HAVE_SETLOCALE */
+#ifndef HAVE_SETSID
+#define setsid() /* nothing */
+#endif /* HAVE_SETSID */
+
#if HAVE_MEMCPY_ULONG
extern char *memcpy_ulong(char *dest, const char *src, unsigned long l);
#define memcpy memcpy_ulong
diff --git a/configh.in b/configh.in
index 306f3dfb..8b407305 100644
--- a/configh.in
+++ b/configh.in
@@ -169,6 +169,9 @@
/* Define to 1 if you have the `setlocale' function. */
#undef HAVE_SETLOCALE
+/* Define to 1 if you have the `setsid' function. */
+#undef HAVE_SETSID
+
/* Define to 1 if you have the `snprintf' function. */
#undef HAVE_SNPRINTF
diff --git a/configure b/configure
index 5f74ef4b..3760d8c6 100755
--- a/configure
+++ b/configure
@@ -9894,7 +9894,7 @@ esac
for ac_func in atexit btowc fmod getgrent getgroups grantpt \
isascii iswctype iswlower iswupper mbrlen \
memcmp memcpy memcpy_ulong memmove memset \
- memset_ulong mkstemp setenv setlocale snprintf strchr \
+ memset_ulong mkstemp setenv setlocale setsid snprintf strchr \
strerror strftime strncasecmp strcoll strtod strtoul \
system tmpfile towlower towupper tzset usleep wcrtomb \
wcscoll wcscoll wctype
diff --git a/configure.ac b/configure.ac
index 45ffe80a..28c286f4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -268,7 +268,7 @@ esac
AC_CHECK_FUNCS(atexit btowc fmod getgrent getgroups grantpt \
isascii iswctype iswlower iswupper mbrlen \
memcmp memcpy memcpy_ulong memmove memset \
- memset_ulong mkstemp setenv setlocale snprintf strchr \
+ memset_ulong mkstemp setenv setlocale setsid snprintf strchr \
strerror strftime strncasecmp strcoll strtod strtoul \
system tmpfile towlower towupper tzset usleep wcrtomb \
wcscoll wcscoll wctype)
diff --git a/io.c b/io.c
index 21301f40..c0626108 100644
--- a/io.c
+++ b/io.c
@@ -1740,6 +1740,8 @@ two_way_open(const char *str, struct redirect *rp)
switch (pid = fork ()) {
case 0:
/* Child process */
+ setsid();
+
if (close(master) == -1)
fatal(_("close of master pty failed (%s)"), strerror(errno));
if (close(1) == -1)
diff --git a/test/ChangeLog b/test/ChangeLog
index 3706630b..d6079e17 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,8 @@
+2011-08-09 Arnold D. Robbins <arnold@skeeve.com>
+
+ * Makefile.am (pty1): New test.
+ * pty1.awk, pty1.ok: New files.
+
2011-07-29 Arnold D. Robbins <arnold@skeeve.com>
* Makefile.am (next): Redirect output to output file!
diff --git a/test/Makefile.am b/test/Makefile.am
index a640c14f..f5cec9ce 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -576,6 +576,8 @@ EXTRA_DIST = \
prt1eval.ok \
prtoeval.awk \
prtoeval.ok \
+ pty1.awk \
+ pty1.ok \
rand.awk \
rand.ok \
range1.awk \
@@ -807,7 +809,8 @@ GAWK_EXT_TESTS = \
icasefs icasers igncdym igncfs ignrcas2 ignrcase indirectcall lint \
lintold lintwarn manyfiles match1 match2 match3 mbstr1 nastyparm \
next nondec nondec2 patsplit posix printfbad1 printfbad2 procinfs \
- profile1 profile2 profile3 rebuf regx8bit reint reint2 rsstart1 \
+ profile1 profile2 profile3 pty1 \
+ rebuf regx8bit reint reint2 rsstart1 \
rsstart2 rsstart3 rstest6 shadow sortfor sortu splitarg4 strftime \
strtonum switch2
diff --git a/test/Makefile.in b/test/Makefile.in
index 4410670e..e7e920f9 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -761,6 +761,8 @@ EXTRA_DIST = \
prt1eval.ok \
prtoeval.awk \
prtoeval.ok \
+ pty1.awk \
+ pty1.ok \
rand.awk \
rand.ok \
range1.awk \
@@ -992,7 +994,8 @@ GAWK_EXT_TESTS = \
icasefs icasers igncdym igncfs ignrcas2 ignrcase indirectcall lint \
lintold lintwarn manyfiles match1 match2 match3 mbstr1 nastyparm \
next nondec nondec2 patsplit posix printfbad1 printfbad2 procinfs \
- profile1 profile2 profile3 rebuf regx8bit reint reint2 rsstart1 \
+ profile1 profile2 profile3 pty1 \
+ rebuf regx8bit reint reint2 rsstart1 \
rsstart2 rsstart3 rstest6 shadow sortfor sortu splitarg4 strftime \
strtonum switch2
@@ -2818,6 +2821,11 @@ procinfs:
@AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+pty1:
+ @echo pty1
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
rebuf:
@echo rebuf
@AWKPATH=$(srcdir) $(AWK) -f $@.awk < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/Maketests b/test/Maketests
index 1de0dbca..0ea96731 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -1075,6 +1075,11 @@ procinfs:
@AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+pty1:
+ @echo pty1
+ @AWKPATH=$(srcdir) $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+
rebuf:
@echo rebuf
@AWKPATH=$(srcdir) $(AWK) -f $@.awk < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/pty1.awk b/test/pty1.awk
new file mode 100644
index 00000000..77178d61
--- /dev/null
+++ b/test/pty1.awk
@@ -0,0 +1,54 @@
+# Message-ID: <1312419482.36133.YahooMailNeo@web110416.mail.gq1.yahoo.com>
+# Date: Wed, 3 Aug 2011 17:58:02 -0700 (PDT)
+# From: "T. X. G." <leopardie333@yahoo.com>
+# To: "bug-gawk@gnu.org" <bug-gawk@gnu.org>
+# Subject: [bug-gawk] two bugs in gawk 4.0.0 with FPAT and pty
+#
+# $ gawk --version
+# GNU Awk 4.0.0
+# Copyright (C) 1989, 1991-2011 Free Software Foundation.
+#
+# # bug due to trying to make field splitting more efficient by not parse all fields
+# $ echo a,b,,c |gawk '{for(i=1;i<=4;++i)print i, $i}' FPAT='[^,]*'
+# 1 a
+# 2
+# 3 b
+# 4
+#
+# # work around
+# $ echo a,b,,c |gawk '{NF;for(i=1;i<=4;++i)print i, $i}' FPAT='[^,]*'
+# 1 a
+# 2 b
+# 3
+# 4 c
+#
+# This bug, as you commented in function fpat_parse_field, is subtle. The null matches of previous call should be remembered across calls. You could make the auto variable non_empty static, but then any calls to patsplit between references of fields will cause it to be wrong. I guess you can either forgo the field splitting optimization by always parse all field in the case of FPAT or make a separate function for splitting $0 only (or pass an extra arg to it?) I am sure you will find the best fix.
+#
+#
+# The next bug is with pty:
+#
+# $ gawk 'BEGIN{
+# c = "echo 123 > /dev/tty; read x < /dev/tty; echo \"x is $x\""
+# PROCINFO[c, "pty"] = 1
+# c |& getline;print
+# print "abc" |& c
+# c |& getline;print
+# }'
+# 123
+# ^C
+#
+# Adding a call to setsid() in the function two_way_open right after fork in the child process seems to fix it.
+#
+# One request for feature:
+# Currently the format for mktime is not configurable. Could you please make it configurable just like strftime through PROCINFO["mktime"]? In fact I have already done it myself. But I don't think you would like my style. It should be pretty simple for you to implement.
+#
+# Thank you, Arnold. Again as I have said before, I enjoy your writings and appreciate your contributions to the FSF.
+# W. G.
+#
+BEGIN {
+ c = "echo 123 > /dev/tty; read x < /dev/tty; echo \"x is $x\""
+ PROCINFO[c, "pty"] = 1
+ c |& getline; print
+ print "abc" |& c
+ c |& getline; print
+}
diff --git a/test/pty1.ok b/test/pty1.ok
new file mode 100644
index 00000000..f06833f5
--- /dev/null
+++ b/test/pty1.ok
@@ -0,0 +1,2 @@
+123
+x is abc