Subject: bug#10466: closed (Re: bug#10466: MSYS problem with redirects)

From: [email-masked] (GNU bug Tracking System)
Date: Fri, 27 Jan 2012 16:09:03 +0000

Your bug report

#10466: MSYS problem with redirects

which was filed against the automake package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
10466: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=10466
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#10466: MSYS problem with redirects
From: Stefano Lattarini <[email-masked]>
To: Peter Rosin <[email-masked]>
Cc: [email-masked], [email-masked]
Date: Fri, 27 Jan 2012 17:08:02 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

On 01/27/2012 03:37 PM, Peter Rosin wrote:
>
> So, the patch is good. Thanks for fixing!
> 
Thanks for confirming.  I've pushed the patch, and I'm thus closing
this report.

Regards,
  Stefano

Subject: MSYS problem with redirects
From: Peter Rosin <[email-masked]>
To: [email-masked]
Date: Mon, 09 Jan 2012 12:29:42 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

Hi!

parallel-tests-fd-redirect.test fails on MSYS, and I think
the cause is that the write (9, ...) simply doesn't work for
MinGW programs (baz.exe and qux.test.exe).  It works for the
shell scripts (foo.sh and bar) since /bin/sh is an MSYS
program and thus is a lot more POSIXy.  But redirecting from
the MinGW world to the MSYS world in this maner is simply
not possible, I think.  I think that will only work for
fd 0,1 and 2 (but I'm not 100% sure).

Also, including unistd.h will not work for non-ANSI systems,
MinGW provides a half-baked unistd.h but MSVC does not.
MSVC has its write() in io.h, but it will probably suffer
from the same problem with a dysfunctional fd 9.

With this diff:

diff --git a/tests/parallel-tests-fd-redirect.test b/tests/parallel-tests-fd-red
index 73a134e..5728014 100755
--- a/tests/parallel-tests-fd-redirect.test
+++ b/tests/parallel-tests-fd-redirect.test
@@ -65,20 +65,26 @@ END
 chmod a+x foo.sh bar

 cat > baz.c <<'END'
+#include <stdio.h>
 #include <unistd.h>
 int main (void)
 {
-  write (9, " bazbazbaz\n", 11);
-  return 0;
+  ssize_t res = write (9, " bazbazbaz\n", 11);
+  if (res < 0)
+    perror("write failed");
+  return res != 11;
 }
 END

 cat > zardoz.c <<'END'
+#include <stdio.h>
 #include <unistd.h>
 int main (void)
 {
-  write (9, " quxquxqux\n", 11);
-  return 0;
+  ssize_t res = write (9, " quxquxqux\n", 11);
+  if (res < 0)
+    perror("write failed");
+  return res != 11;
 }
 END

the embedded test suite goes from 4 PASS to 2 PASS / 2 FAIL,
and this in the log files:

+ cat foo.log
+ cat bar.log
+ cat baz.log
write failed: Bad file descriptor
+ cat qux.log
write failed: Bad file descriptor

supporting the above beliefs.

Cheers,
Peter

For reference, the original parallel-tests-fd-redirect.log:

Running from installcheck: no
Using TAP: no
PATH = /home/peda/automake/tests:/c/Program Files (x86)/Microsoft F#/v4.0/:/c/Program Files (x86)/Microsoft Visual Studio 10.0/VSTSDB/Deploy:/c/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/:/c/Program Files (x86)/Microsoft Visual Studio 10.0/VC/BIN:/c/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/Tools/:/c/Windows/Microsoft.NET/Framework/v4.0.30319:/c/Windows/Microsoft.NET/Framework/v3.5:/c/Program Files (x86)/Microsoft Visual Studio 10.0/VC/VCPackages:/c/Program Files (x86)/HTML Help Workshop:/c/Program Files (x86)/Microsoft Visual Studio 10.0/Team Tools/Performance Tools:/c/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/bin/NETFX 4.0 Tools:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files/Common Files/Microsoft Shared/Windows Live:/c/Program Files (x86)/Common Files/Microsoft Shared/Windows Live:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/
++ pwd
/home/peda/automake/tests/parallel-tests-fd-redirect.dir
+ cat
+ cat
+ aclocal-1.11a -Werror
+ autoconf -B /no/such/dir
+ automake-1.11a --foreign -Werror -Wall -a
configure.in:2: installing `./test-driver'
+ cat
+ chmod a+x foo.sh
+ cat
+ chmod a+x foo.sh bar
+ cat
+ cat
+ ./configure
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.exe
checking for suffix of executables... .exe
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
+ st=0
+ grep '^bar\.log:.*bar' Makefile
bar.log: bar
+ grep '^baz\.log:.*baz\$(EXEEXT)' Makefile
baz.log: baz$(EXEEXT)
+ grep '^\.test\$(EXEEXT)\.log:' Makefile
.test$(EXEEXT).log:
+ /bin/grep -E '^(foo|qux)\.log:' Makefile
+ test 0 -eq 0
+ st=0
+ make check
+ cat stdout
make  baz.exe qux.test.exe
make[1]: Entering directory `/home/peda/automake/tests/parallel-tests-fd-redirect.dir'
gcc -DPACKAGE_NAME=\"parallel-tests-fd-redirect\" -DPACKAGE_TARNAME=\"parallel-tests-fd-redirect\" -DPACKAGE_VERSION=\"1.0\" -DPACKAGE_STRING=\"parallel-tests-fd-redirect\ 1.0\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"parallel-tests-fd-redirect\" -DVERSION=\"1.0\" -I.     -g -O2 -MT baz.o -MD -MP -MF .deps/baz.Tpo -c -o baz.o baz.c
mv -f .deps/baz.Tpo .deps/baz.Po
gcc  -g -O2   -o baz.exe baz.o  
gcc -DPACKAGE_NAME=\"parallel-tests-fd-redirect\" -DPACKAGE_TARNAME=\"parallel-tests-fd-redirect\" -DPACKAGE_VERSION=\"1.0\" -DPACKAGE_STRING=\"parallel-tests-fd-redirect\ 1.0\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"parallel-tests-fd-redirect\" -DVERSION=\"1.0\" -I.     -g -O2 -MT zardoz.o -MD -MP -MF .deps/zardoz.Tpo -c -o zardoz.o zardoz.c
mv -f .deps/zardoz.Tpo .deps/zardoz.Po
gcc  -g -O2   -o qux.test.exe zardoz.o  
make[1]: Leaving directory `/home/peda/automake/tests/parallel-tests-fd-redirect.dir'
make  check-TESTS check-local
make[1]: Entering directory `/home/peda/automake/tests/parallel-tests-fd-redirect.dir'
make[2]: Entering directory `/home/peda/automake/tests/parallel-tests-fd-redirect.dir'
 foofoofoo
PASS: foo.sh
 barbarbar
PASS: bar
PASS: baz.exe
PASS: qux.test.exe
============================================================================
Testsuite summary for parallel-tests-fd-redirect 1.0
============================================================================
# TOTAL: 4
# PASS:  4
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================
make[2]: Leaving directory `/home/peda/automake/tests/parallel-tests-fd-redirect.dir'
make[1]: Nothing to be done for `check-local'.
make[1]: Leaving directory `/home/peda/automake/tests/parallel-tests-fd-redirect.dir'
+ cat foo.log
+ cat bar.log
+ cat baz.log
+ cat qux.log
+ test 0 -eq 0
+ grep '^ foofoofoo$' stdout
 foofoofoo
+ grep '^ barbarbar$' stdout
 barbarbar
+ grep '^ bazbazbaz$' stdout
+ exit_status=1
+ set +e
+ cd /home/peda/automake/tests
+ test no = yes
+ case $am_explicit_skips in
+ test 1 -eq 0
+ keep_testdirs=yes
+ am_keeping_testdirs
+ case $keep_testdirs in
+ return 0
+ set +x
parallel-tests-fd-redirect: exit 1