From fef1edbc9a4ca63fdb801f78086d442bce1da40f Mon Sep 17 00:00:00 2001
From: Christopher Faylor <me@cgf.cx>
Date: Thu, 17 Oct 2002 17:45:09 +0000
Subject: [PATCH] * dtable.cc (dtable::set_file_pointers_for_exec): New
 function. * dtable.h (dtable::set_file_pointers_for_exec): Declare new
 function. * spawn.cc (spawn_guts): Call dtable::set_file_pointers_for_exec to
 set pointers to EOF when execing non-cygwin applications.

---
 winsup/cygwin/ChangeLog |  7 +++++++
 winsup/cygwin/dtable.cc | 11 +++++++++++
 winsup/cygwin/dtable.h  |  1 +
 winsup/cygwin/spawn.cc  |  1 +
 4 files changed, 20 insertions(+)

diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 4c170f239..f51f0a448 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,10 @@
+2002-10-17  Christopher Faylor  <cgf@redhat.com>
+
+	* dtable.cc (dtable::set_file_pointers_for_exec): New function.
+	* dtable.h (dtable::set_file_pointers_for_exec): Declare new function.
+	* spawn.cc (spawn_guts): Call dtable::set_file_pointers_for_exec to set
+	pointers to EOF when execing non-cygwin applications.
+
 2002-10-17  Robert Collins  <rbtcollins@hotmail.com>
 
 	* thread.h (pthread_mutex::isGoodInitializerOrBadObject): Declare.
diff --git a/winsup/cygwin/dtable.cc b/winsup/cygwin/dtable.cc
index 6b5ee88e9..7bbfbbfb7 100644
--- a/winsup/cygwin/dtable.cc
+++ b/winsup/cygwin/dtable.cc
@@ -574,6 +574,17 @@ dtable::fixup_before_exec (DWORD target_proc_id)
   ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "fixup_before_exec");
 }
 
+void
+dtable::set_file_pointers_for_exec ()
+{
+  SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "set_file_pointers_for_exec");
+  fhandler_base *fh;
+  for (size_t i = 0; i < size; i++)
+    if ((fh = fds[i]) != NULL && fh->get_flags () & O_APPEND)
+      SetFilePointer (fh->get_handle (), 0, 0, FILE_END);
+  ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "fixup_before_exec");
+}
+
 void
 dtable::fixup_after_exec (HANDLE parent)
 {
diff --git a/winsup/cygwin/dtable.h b/winsup/cygwin/dtable.h
index c48181015..0223af71f 100644
--- a/winsup/cygwin/dtable.h
+++ b/winsup/cygwin/dtable.h
@@ -78,6 +78,7 @@ public:
   operator fhandler_base **() {return fds;}
   void stdio_init ();
   void get_debugger_info ();
+  void set_file_pointers_for_exec ();
 };
 
 void dtable_init (void);
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index 6bc76fba3..9c055c819 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -621,6 +621,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
 
   cygbench ("spawn-guts");
 
+  cygheap->fdtab.set_file_pointers_for_exec ();
   if (!cygheap->user.issetuid ())
     {
       PSECURITY_ATTRIBUTES sec_attribs = sec_user_nih (sa_buf);