Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH] use /dev/fd on Cygwin for process substitution



Tests C04 and D03 fail on Cygwin:

./C04funcdef.ztst:
@@ -1,2 +1 @@
-process expanded
 expanded to file
Test ./C04funcdef.ztst failed: output differs from expected as shown above for:
  () (cat $1 $2) <(print process expanded) =(print expanded to file)
Was testing: Process substitution with anonymous functions

./D03procsubst.ztst:
@@ -1,2 +0,0 @@
-First
-Zweite
Test ./D03procsubst.ztst failed: output differs from expected as shown above for:
  copycat <(print First) <(print Zweite)
Was testing: FDs remain open for external commands called from functions

As can be seen, both are related with the process substitution.
On Cygwin, FIFO (not /dev/fd) is used for the process substitution
because PATH_DEV_FD is unset in configure.ac, line 2062:

[if test "$host_os" = cygwin; then
dnl In current (2008/12/01) versions of Cygwin these are present but don't
dnl seem to work smoothly for process substitution; no great surprise
dnl since getting processes to work at all on Cygwin is a big challenge.
dnl We'll rely on FIFOs, since they do what we need.
zsh_cv_sys_path_dev_fd=no

If I remove this part (as in the patch below) the two tests succeed.
So I *guess* /dev/fd is now working as expected on Cygwin.
(maybe there are some race conditions for FIFO)

In the patch I also removed the cygwin-specific section for FIFO
since on recent Cygwin configure can correctly detect FIFO without it
(although FIFO is not used if PATH_DEV_FD is set).



diff --git a/configure.ac b/configure.ac
index 8fd4d452f..c8885cac5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2059,17 +2059,9 @@ dnl be good enough.
 AH_TEMPLATE([PATH_DEV_FD],
 [Define to the path of the /dev/fd filesystem.])
 AC_CACHE_CHECK(for /dev/fd filesystem, zsh_cv_sys_path_dev_fd,
-[if test "$host_os" = cygwin; then
-dnl In current (2008/12/01) versions of Cygwin these are present but don't
-dnl seem to work smoothly for process substitution; no great surprise
-dnl since getting processes to work at all on Cygwin is a big challenge.
-dnl We'll rely on FIFOs, since they do what we need.
-zsh_cv_sys_path_dev_fd=no
-else
 [for zsh_cv_sys_path_dev_fd in /proc/self/fd /dev/fd no; do
    test x`echo ok|(exec 3<&0; cat $zsh_cv_sys_path_dev_fd/3 2>/dev/null;)` = xok && break
- done]
-fi])
+ done])
 if test x$zsh_cv_sys_path_dev_fd != xno; then
   AC_DEFINE_UNQUOTED(PATH_DEV_FD, "$zsh_cv_sys_path_dev_fd")
 fi
@@ -2260,14 +2252,9 @@ dnl -----------
 dnl named FIFOs
 dnl -----------
 dnl
-dnl Named FIFOs work well enough on recent versions of Cygwin
-dnl to provide what we want.  Simply enable them.
 AC_CACHE_CHECK(if named FIFOs work,
 zsh_cv_sys_fifo,
-[if test "$host_os" = cygwin; then
-zsh_cv_sys_fifo=yes
-else
-AC_RUN_IFELSE([AC_LANG_SOURCE([[
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #include <fcntl.h>
 #include <signal.h>
 main()
@@ -2295,7 +2282,7 @@ main()
     exit(ret);
 }
 ]])],[zsh_cv_sys_fifo=yes],[zsh_cv_sys_fifo=no],[zsh_cv_sys_fifo=yes])
-fi])
+])
 AH_TEMPLATE([HAVE_FIFOS],
 [Define to 1 if system has working FIFOs.])
 if test x$zsh_cv_sys_fifo = xyes; then





Messages sorted by: Reverse Date, Date, Thread, Author