From 4f27e288c55cd54a2759a59d06a52ed44dac494b Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 31 Jan 2005 10:28:55 +0000 Subject: * cygheap.h (class cygheap_fdenum): New class to enumerate used fhandlers. * dtable.h (class dtable): Add cygheap_fdenum as friend class. * fhandler.h (fhandler_base::get_proc_fd_name): New virtual method to return a name for /proc//fd. (fhandler_socket::get_proc_fd_name): Ditto. (fhandler_pipe::get_proc_fd_name): Ditto. (fhandler_virtual::opendir): Make virtual method. (fhandler_process::opendir): New method. * fhandler.cc (fhandler_base::get_proc_fd_name): New method. * fhandler_process.cc: Include ctype.h. (PROCESS_FD): Define. (process_listing): Add "fd". (fhandler_process::exists): Fix comment. Return 1 in case of "fd" directory. Handle files below "fd". (fhandler_process::fstat): Drop "self" handling. Set correct link count for directories. (fhandler_process::opendir): New method to handle "fd" directory. (fhandler_process::readdir): Add "fd" handling. (fhandler_process::open): Drop "self" handling. (fhandler_process::fill_filebuf): Ditto. Add "fd" handling. Fix "maps" output string. * fhandler_registry.cc (fhandler_registry::fstat): Set correct link count for directories. * fhandler_socket.cc (fhandler_socket::get_proc_fd_name): New method. * path.cc (symlink_info::set): Fix thinko. * pinfo.cc (_pinfo::commune_recv): Rename pathbuf to path throughout. Drop local path variable in PICOM_FIFO case. Fix debug output. Close handles as early as possible. Add PICOM_FDS and PICOM_FD handling. (_pinfo::commune_send): Add PICOM_FDS and PICOM_FD handling. (_pinfo::fd): New method. (_pinfo::fds): New method. * pinfo.h (enum picom): Add PICOM_FDS and PICOM_FD. (_pinfo::fd): Declare. (_pinfo::fds): Declare. * pipe.cc (fhandler_pipe::get_proc_fd_name): New method. --- winsup/cygwin/pinfo.cc | 133 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 121 insertions(+), 12 deletions(-) (limited to 'winsup/cygwin/pinfo.cc') diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index fa440aa..6df0f5e 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -380,7 +380,7 @@ extern char **__argv; void _pinfo::commune_recv () { - char pathbuf[CYG_MAX_PATH]; + char path[CYG_MAX_PATH + 1]; DWORD nr; DWORD code; HANDLE hp; @@ -460,33 +460,78 @@ _pinfo::commune_recv () } case PICOM_CWD: { - unsigned int n = strlen (cygheap->cwd.get (pathbuf, 1, 1, CYG_MAX_PATH)) + 1; CloseHandle (__fromthem); __fromthem = NULL; CloseHandle (hp); + unsigned int n = strlen (cygheap->cwd.get (path, 1, 1, + CYG_MAX_PATH)) + 1; if (!WriteFile (__tothem, &n, sizeof n, &nr, NULL)) - sigproc_printf ("WriteFile sizeof argv failed, %E"); - else if (!WriteFile (__tothem, pathbuf, n, &nr, NULL)) - sigproc_printf ("WriteFile sizeof argv failed, %E"); + sigproc_printf ("WriteFile sizeof cwd failed, %E"); + else if (!WriteFile (__tothem, path, n, &nr, NULL)) + sigproc_printf ("WriteFile cwd failed, %E"); break; } case PICOM_ROOT: { + CloseHandle (__fromthem); __fromthem = NULL; + CloseHandle (hp); unsigned int n; if (cygheap->root.exists ()) - n = strlen (strcpy (pathbuf, cygheap->root.posix_path ())) + 1; + n = strlen (strcpy (path, cygheap->root.posix_path ())) + 1; else - n = strlen (strcpy (pathbuf, "/")) + 1; + n = strlen (strcpy (path, "/")) + 1; + if (!WriteFile (__tothem, &n, sizeof n, &nr, NULL)) + sigproc_printf ("WriteFile sizeof root failed, %E"); + else if (!WriteFile (__tothem, path, n, &nr, NULL)) + sigproc_printf ("WriteFile root failed, %E"); + break; + } + case PICOM_FDS: + { CloseHandle (__fromthem); __fromthem = NULL; CloseHandle (hp); + unsigned int n = 0; + int fd; + cygheap_fdenum cfd; + while ((fd = cfd.next ()) >= 0) + n += sizeof (int); + cfd.rewind (); if (!WriteFile (__tothem, &n, sizeof n, &nr, NULL)) - sigproc_printf ("WriteFile sizeof argv failed, %E"); - else if (!WriteFile (__tothem, pathbuf, n, &nr, NULL)) - sigproc_printf ("WriteFile sizeof argv failed, %E"); - break; + sigproc_printf ("WriteFile sizeof fds failed, %E"); + else + while ((fd = cfd.next ()) >= 0) + if (!WriteFile (__tothem, &fd, sizeof fd, &nr, NULL)) + { + sigproc_printf ("WriteFile fd %d failed, %E", fd); + break; + } + break; + } + case PICOM_FD: + { + int fd; + if (!ReadFile (__fromthem, &fd, sizeof fd, &nr, NULL) + || nr != sizeof fd) + { + sigproc_printf ("ReadFile fd failed, %E"); + CloseHandle (hp); + goto out; + } + CloseHandle (__fromthem); __fromthem = NULL; + CloseHandle (hp); + unsigned int n; + cygheap_fdget cfd (fd); + if (cfd < 0) + n = strlen (strcpy (path, "")) + 1; + else + n = strlen (cfd->get_proc_fd_name (path)) + 1; + if (!WriteFile (__tothem, &n, sizeof n, &nr, NULL)) + sigproc_printf ("WriteFile sizeof fd failed, %E"); + else if (!WriteFile (__tothem, path, n, &nr, NULL)) + sigproc_printf ("WriteFile fd failed, %E"); + break; } case PICOM_FIFO: { - char path[CYG_MAX_PATH + 1]; unsigned len; if (!ReadFile (__fromthem, &len, sizeof len, &nr, NULL) || nr != sizeof len) @@ -614,9 +659,21 @@ _pinfo::commune_send (DWORD code, ...) size_t n; switch (code) { + case PICOM_FD: + { + int fd = va_arg (args, int); + if (!WriteFile (tothem, &fd, sizeof fd, &nr, NULL) + || nr != sizeof fd) + { + __seterrno (); + goto err; + } + } + /*FALLTHRU*/ case PICOM_CMDLINE: case PICOM_CWD: case PICOM_ROOT: + case PICOM_FDS: if (!ReadFile (fromthem, &n, sizeof n, &nr, NULL) || nr != sizeof n) { __seterrno (); @@ -684,6 +741,58 @@ out: } char * +_pinfo::fd (int fd, size_t &n) +{ + char *s; + if (!this || !pid) + return NULL; + if (pid != myself->pid) + { + commune_result cr = commune_send (PICOM_FD, fd); + s = cr.s; + n = cr.n; + } + else + { + cygheap_fdget cfd (fd); + if (cfd < 0) + s = strdup (""); + else + s = cfd->get_proc_fd_name ((char *) malloc (CYG_MAX_PATH + 1)); + n = strlen (s) + 1; + } + return s; +} + +char * +_pinfo::fds (size_t &n) +{ + char *s; + if (!this || !pid) + return NULL; + if (pid != myself->pid) + { + commune_result cr = commune_send (PICOM_FDS); + s = cr.s; + n = cr.n; + } + else + { + n = 0; + int fd; + cygheap_fdenum cfd; + while ((fd = cfd.next ()) >= 0) + n += sizeof (int); + cfd.rewind (); + s = (char *) malloc (n); + int *p = (int *) s; + while ((fd = cfd.next ()) >= 0 && (char *) p - s < (int) n) + *p++ = fd; + } + return s; +} + +char * _pinfo::root (size_t& n) { char *s; -- cgit v1.1