From 8e37f503496ad3592bbb53ad55abdf0a0b6d91c5 Mon Sep 17 00:00:00 2001 From: schmidt Date: Thu, 19 Mar 2009 01:00:54 +0000 Subject: ChangeLogTag:Wed --- ACE/ChangeLog | 9 +++++++++ ACE/THANKS | 1 + ACE/ace/OS_NS_unistd.h | 3 +++ ACE/ace/OS_NS_unistd.inl | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+) diff --git a/ACE/ChangeLog b/ACE/ChangeLog index d579d80fa3f..c64f2f0c540 100644 --- a/ACE/ChangeLog +++ b/ACE/ChangeLog @@ -1,3 +1,12 @@ +Wed Mar 18 14:48:23 UTC 2009 Douglas C. Schmidt + + * ace/OS_NS_unistd.{h,inl}: Added a new ACE_OS::dup() method with + one more parameter as process id of target process + [ACE_OS:dup(ACE_HANDLE handle, int pid)], so that handle + duplicated by dup() can be used in target process. Thanks to + kashif khan for + contributing this. + Wed Mar 18 14:28:22 UTC 2009 Johnny Willemsen * protocols/ace/RMCast/Acknowledge.cpp: diff --git a/ACE/THANKS b/ACE/THANKS index 08a50af3ca7..bcb3586152e 100644 --- a/ACE/THANKS +++ b/ACE/THANKS @@ -2279,6 +2279,7 @@ Ron van Hoof Joe Lihn Jani Hakala Marcus Monaghan +Kashif Khan I would particularly like to thank Paul Stephenson, who worked with me at Ericsson in the early 1990's. Paul devised the recursive Makefile diff --git a/ACE/ace/OS_NS_unistd.h b/ACE/ace/OS_NS_unistd.h index b44188cb45a..aaa36f2d827 100644 --- a/ACE/ace/OS_NS_unistd.h +++ b/ACE/ace/OS_NS_unistd.h @@ -98,6 +98,9 @@ namespace ACE_OS ACE_NAMESPACE_INLINE_FUNCTION ACE_HANDLE dup (ACE_HANDLE handle); + ACE_NAMESPACE_INLINE_FUNCTION + ACE_HANDLE dup (ACE_HANDLE handle, int pid); + ACE_NAMESPACE_INLINE_FUNCTION int dup2 (ACE_HANDLE oldfd, ACE_HANDLE newfd); diff --git a/ACE/ace/OS_NS_unistd.inl b/ACE/ace/OS_NS_unistd.inl index 6605948c4fa..a5584f0b9a3 100644 --- a/ACE/ace/OS_NS_unistd.inl +++ b/ACE/ace/OS_NS_unistd.inl @@ -216,6 +216,40 @@ ACE_OS::dup (ACE_HANDLE handle) #endif /* ACE_LACKS_DUP */ } +ACE_INLINE ACE_HANDLE +ACE_OS:dup(ACE_HANDLE handle, int pid) +{ + ACE_OS_TRACE("ACE_OS::dup"); +#define(ACE_WIN32)&&!defined(ACE_HAS_WINCE) + ACE_HADLE new_fd; + ACE_HANDLE hTargetProcess = ::OpenProcess (PROCESS_DUP_HANDLE, + FALSE, + pid); + if(::DuplicateHandle(::GetCurrentProcess (), + handle, + hTargetProcess, + &new_fd, + 0, + TRUE, + DUPLICATE_SAME_ACCESS)) + { + ::CloseHandle (hTargetProcess); + return new_fd; + } + else + ACE_FAIL_RETURN (ACE_INVALID_HANDLE); + /*NOTREACHED*/ +#elif defined(ACE_LACKS_DUP) + ACE_UNUSED_ARGS(handle); + ACE_NOTSUP_RETURN(-1); +#elif defined(ACE_HAS_WINCE) + ACE_UNUSED_ARG(handle) + ACE_NOTSUP_RETURN(0); +#else + ACE_OSCALL_RETURN(::dup(handle), ACE_HANDLE, ACE_INVALID_HANDLE); +#endif /*ACE_WIN32 && !ACE_HAS_WINCE*/ +} + ACE_INLINE int ACE_OS::dup2 (ACE_HANDLE oldhandle, ACE_HANDLE newhandle) { -- cgit v1.2.1