diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-06-30 18:50:24 +0200 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-06-30 18:50:24 +0200 |
commit | ff6727e294f82cd573b18e0d5a479e6380a5fdf1 (patch) | |
tree | ee0e3deaa3216b091eb984eaa129c09d1e270639 /debian/patches/introspection0004-utils-implement-portinfo-query-process.patch | |
parent | 0f47a17f12504e975e4e7e20259baba4f9ffe55f (diff) |
add patch series
Diffstat (limited to 'debian/patches/introspection0004-utils-implement-portinfo-query-process.patch')
-rw-r--r-- | debian/patches/introspection0004-utils-implement-portinfo-query-process.patch | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/debian/patches/introspection0004-utils-implement-portinfo-query-process.patch b/debian/patches/introspection0004-utils-implement-portinfo-query-process.patch new file mode 100644 index 00000000..5267a527 --- /dev/null +++ b/debian/patches/introspection0004-utils-implement-portinfo-query-process.patch @@ -0,0 +1,168 @@ +From 67a9acc0576ab5db03e46f2d5f7abcc2deab487c Mon Sep 17 00:00:00 2001 +From: Justus Winter <4winter@informatik.uni-hamburg.de> +Date: Wed, 21 May 2014 17:38:46 +0200 +Subject: [PATCH hurd 4/8] utils: implement portinfo --query-process + +Implement portinfo --query-process (hopefully) as envisaged by a +comment in portinfo.c. We use the new Hurd server introspection +protocol to obtain information about the objects related to ports: + +% utils/portinfo --receive --query-process 5586 77 + 77: receive [bucket: diskfs_port_bucket, class: diskfs_protid_class, + node{inode: 48194, hard: 1, weak: 1}, + path: hello/hurd/developers_:)] + +* libshouldbeinlibc/Makefile (OBJS): Add hurd_portUser.o. +* libshouldbeinlibc/portinfo.c (show_portinfo_query): New function. +(print_port_info): Use show_portinfo_query if desired. +* libshouldbeinlibc/portinfo.h (PORTINFO_QUERY): New macro. +* utils/portinfo.c (argp_option): Drop #if 0. +(parse_opt): Handle --query-process. +--- + libshouldbeinlibc/Makefile | 2 +- + libshouldbeinlibc/portinfo.c | 69 ++++++++++++++++++++++++++++++++++++++++++++ + libshouldbeinlibc/portinfo.h | 1 + + utils/portinfo.c | 3 +- + 4 files changed, 72 insertions(+), 3 deletions(-) + +diff --git a/libshouldbeinlibc/Makefile b/libshouldbeinlibc/Makefile +index 633d60e..a41a879 100644 +--- a/libshouldbeinlibc/Makefile ++++ b/libshouldbeinlibc/Makefile +@@ -36,6 +36,6 @@ installhdrs = idvec.h timefmt.h maptime.h \ + + installhdrsubdir = . + +-OBJS = $(SRCS:.c=.o) ++OBJS = $(SRCS:.c=.o) hurd_portUser.o + + include ../Makeconf +diff --git a/libshouldbeinlibc/portinfo.c b/libshouldbeinlibc/portinfo.c +index e6305c6..f99b789 100644 +--- a/libshouldbeinlibc/portinfo.c ++++ b/libshouldbeinlibc/portinfo.c +@@ -17,10 +17,77 @@ + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + ++#include <assert.h> ++#include <error.h> ++#include <string.h> + #include <sys/types.h> + #include <sys/mman.h> + + #include "portinfo.h" ++#include "hurd_port_U.h" ++ ++static void ++show_portinfo_query (mach_port_t task, mach_port_t name, ++ unsigned show, FILE *stream) ++{ ++ error_t err; ++ static mach_port_t introspection_port; ++ static mach_port_t for_task; ++ ++ if (task != for_task) ++ { ++ mach_port_t *ports; ++ size_t ports_len; ++ ++ err = mach_ports_lookup (task, &ports, &ports_len); ++ if (! err) ++ { ++ size_t i; ++ if (MACH_PORT_VALID (introspection_port)) ++ mach_port_deallocate (mach_task_self (), introspection_port); ++ ++ for (i = 0; i < ports_len; i++) ++ if (i == HURD_PORT_REGISTER_INTROSPECTION) ++ introspection_port = ports[i]; ++ else ++ { ++ if (MACH_PORT_VALID (ports[i])) ++ mach_port_deallocate (mach_task_self (), ports[i]); ++ } ++ } ++ else ++ introspection_port = MACH_PORT_DEAD; ++ ++ for_task = task; ++ } ++ ++ if (! MACH_PORT_VALID (introspection_port)) ++ return; ++ ++ string_t info; /* XXX */ ++ err = hurd_port_debug_info (introspection_port, name, 100, info); ++ if (err) ++ { ++ if (err != EINVAL) ++ error (0, err, "hurd_port_debug_info"); ++ return; ++ } ++ ++ if (strlen (info) > 0) ++ fprintf (stream, " [%s", info); ++ ++ if (show & PORTINFO_DETAILS) ++ { ++ unsigned int hard, weak; ++ err = hurd_port_get_refcounts (introspection_port, name, 100, ++ &hard, &weak); ++ if (! err) ++ fprintf (stream, ", hard: %u, weak: %u", hard, weak); ++ } ++ ++ fprintf (stream, "]"); ++} ++ + + /* Prints info about NAME in TASK to STREAM, in a way described by the flags + in SHOW. If TYPE is non-zero, it should be what mach_port_type returns +@@ -83,6 +150,8 @@ print_port_info (mach_port_t name, mach_port_type_t type, task_t task, + status.mps_nsrequest ? ", ns-req" : ""); + } + } ++ if (show & PORTINFO_QUERY) ++ show_portinfo_query (task, name, show, stream); + } + if (type & MACH_PORT_TYPE_SEND) + { +diff --git a/libshouldbeinlibc/portinfo.h b/libshouldbeinlibc/portinfo.h +index 143c289..bd96eb8 100644 +--- a/libshouldbeinlibc/portinfo.h ++++ b/libshouldbeinlibc/portinfo.h +@@ -31,6 +31,7 @@ + #define PORTINFO_DETAILS 0x1 + #define PORTINFO_MEMBERS 0x4 + #define PORTINFO_HEX_NAMES 0x8 ++#define PORTINFO_QUERY 0x10 + + /* Prints info about NAME in TASK to STREAM, in a way described by the flags + in SHOW. If TYPE is non-zero, it should be what mach_port_type returns +diff --git a/utils/portinfo.c b/utils/portinfo.c +index 4c40352..27998db 100644 +--- a/utils/portinfo.c ++++ b/utils/portinfo.c +@@ -44,10 +44,8 @@ static const struct argp_option options[] = { + {"verbose", 'v', 0, 0, "Give more detailed information"}, + {"members", 'm', 0, 0, "Show members of port-sets"}, + {"hex-names", 'x', 0, 0, "Show port names in hexadecimal"}, +-#if 0 /* XXX implement this */ + {"query-process", 'q', 0, 0, "Query the process itself for the identity of" + " the ports in question -- requires the process be in a sane state"}, +-#endif + {"hold", '*', 0, OPTION_HIDDEN}, + + {0,0,0,0, "Selecting which names to show:", 2}, +@@ -249,6 +247,7 @@ main (int argc, char **argv) + case 'v': show |= PORTINFO_DETAILS; break; + case 'm': show |= PORTINFO_MEMBERS; break; + case 'x': show |= PORTINFO_HEX_NAMES; break; ++ case 'q': show |= PORTINFO_QUERY; break; + + case 'r': only |= MACH_PORT_TYPE_RECEIVE; break; + case 's': only |= MACH_PORT_TYPE_SEND; break; +-- +2.1.4 + |