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 + + * 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 * 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);