From 01a94cf8662ffe333b0b75fc98aa44ada4320aeb Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Tue, 1 Feb 2005 16:43:29 +0000 Subject: [PATCH] * pipe.cc (fhandler_pipe::open): Allow re-opening of /proc//fd pipes of the current process. --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/pipe.cc | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 465b0716c..7a0cb6d00 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2005-02-01 Corinna Vinschen + + * pipe.cc (fhandler_pipe::open): Allow re-opening of /proc//fd + pipes of the current process. + 2005-02-01 Corinna Vinschen * fhandler.cc (fhandler_base::get_proc_fd_name): Don't generate diff --git a/winsup/cygwin/pipe.cc b/winsup/cygwin/pipe.cc index 988ee5731..6ce540695 100644 --- a/winsup/cygwin/pipe.cc +++ b/winsup/cygwin/pipe.cc @@ -38,6 +38,39 @@ fhandler_pipe::fhandler_pipe () int fhandler_pipe::open (int flags, mode_t mode) { + const char *path = get_name (); + debug_printf ("path: %s", path); + if (!strncmp (get_name (), "/proc/", 6)) + { + char *c; + HANDLE hdl; + int pid = strtol (path += 6, &c, 10); + if (!pid || !c || *c != '/') + goto out; + path = c; + if (strncmp (path, "/fd/pipe:[", 10)) + goto out; + path += 10; + hdl = (HANDLE) atoi (path); + if (pid == myself->pid) + { + cygheap_fdenum cfd; + while (cfd.next () >= 0) + { + if (cfd->get_handle () == hdl) + { + if (!cfd->dup (this)) + return 1; + return 0; + } + } + } + else + { + /* TODO: Open pipes of different process. Is that possible? */ + } + } +out: set_errno (ENXIO); return 0; }