diff options
Diffstat (limited to 'winsup/cygwin')
-rw-r--r-- | winsup/cygwin/ChangeLog | 5 | ||||
-rw-r--r-- | winsup/cygwin/pipe.cc | 33 |
2 files changed, 38 insertions, 0 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 465b0716c..7a0cb6d00 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,10 @@ 2005-02-01 Corinna Vinschen <corinna@vinschen.de> + * pipe.cc (fhandler_pipe::open): Allow re-opening of /proc/<pid>/fd + pipes of the current process. + +2005-02-01 Corinna Vinschen <corinna@vinschen.de> + * fhandler.cc (fhandler_base::get_proc_fd_name): Don't generate "device:" entry. * fhandler.h (fhandler_socket::open): New method. 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; } |