[newlib-cygwin] Cygwin: testsuite: test passing directory fd to child

Jeremy Drake via Cygwin-cvs <[email protected]>
Newsgroups gmane.os.cygwin.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=a4c2540d0facec45ece3e754851616ade85caeb8

commit a4c2540d0facec45ece3e754851616ade85caeb8
Author: Jeremy Drake <[email protected]>
Date:   Thu Jun 26 10:14:34 2025 -0700

    Cygwin: testsuite: test passing directory fd to child
    
    This is a legal (if non-obvious) thing to do, so test it.
    
    Signed-off-by: Jeremy Drake <[email protected]>

Diff:
---
 winsup/testsuite/winsup.api/posix_spawn/chdir.c | 12 ++++++++++++
 winsup/testsuite/winsup.api/posix_spawn/win32.c | 11 +++++++++++
 2 files changed, 23 insertions(+)

diff --git a/winsup/testsuite/winsup.api/posix_spawn/chdir.c b/winsup/testsuite/winsup.api/posix_spawn/chdir.c
index c6ccc45fb..0951d2d74 100644
--- a/winsup/testsuite/winsup.api/posix_spawn/chdir.c
+++ b/winsup/testsuite/winsup.api/posix_spawn/chdir.c
@@ -140,6 +140,18 @@ int main (int argc, char **argv)
   negError (waitpid (pid, &status, 0));
   exitStatus (status, 0);
   errCode (posix_spawn_file_actions_destroy (&fa));
+
+  /* test posix_spawn_file_actions_addfchdir + adddup2 of directory fd */
+  errCode (posix_spawn_file_actions_init (&fa));
+  errCode (posix_spawn_file_actions_adddup2 (&fa, fd, 0));
+  errCode (posix_spawn_file_actions_addfchdir_np (&fa, fd));
+  errCode (posix_spawn_file_actions_addopen (&fa, 1, "tmpfile2", O_WRONLY, 0644));
+  childargv[3] = buf;
+  errCode (posix_spawn (&pid, MYSELF, &fa, NULL, childargv, environ));
+  negError (waitpid (pid, &status, 0));
+  exitStatus (status, 0);
+  errCode (posix_spawn_file_actions_destroy (&fa));
+
   negError (close (fd));
 
   return 0;
diff --git a/winsup/testsuite/winsup.api/posix_spawn/win32.c b/winsup/testsuite/winsup.api/posix_spawn/win32.c
index cd2bedcd9..8998c4337 100644
--- a/winsup/testsuite/winsup.api/posix_spawn/win32.c
+++ b/winsup/testsuite/winsup.api/posix_spawn/win32.c
@@ -162,6 +162,17 @@ int main (void)
   errCode (posix_spawn_file_actions_destroy (&fa));
   free (childargv[2]);
 
+  /* test posix_spawn_file_actions_adddup2 of directory handle */
+  errCode (posix_spawn_file_actions_init (&fa));
+  errCode (posix_spawn_file_actions_adddup2 (&fa, cwdfd, 0));
+  childargv[1] = "0";
+  childargv[2] = cygwin_create_path (CCP_POSIX_TO_WIN_A|CCP_ABSOLUTE, tmpcwd);
+  errCode (posix_spawn (&pid, winchild, &fa, NULL, childargv, environ));
+  negError (waitpid (pid, &status, 0));
+  exitStatus (status, 0);
+  errCode (posix_spawn_file_actions_destroy (&fa));
+  free (childargv[2]);
+
   negError (close (cwdfd));
   negError (close (fd));
   negError (close (fdcloexec));
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.