summaryrefslogtreecommitdiff
path: root/debian
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2015-06-30 23:33:56 +0200
committerJustus Winter <4winter@informatik.uni-hamburg.de>2015-06-30 23:33:56 +0200
commita0398c648c1ff8c94edd85b3a8fdd3e0dd3fb58d (patch)
tree02801dc40c25cbf9943a4859412d30e58ba339da /debian
parentf62f64afe138faa72ce19beaa71fe9d2c18694a7 (diff)
drop merged patches
Diffstat (limited to 'debian')
-rw-r--r--debian/patches/rpcscan0001-utils-split-off-the-message-id-parsing.patch631
-rw-r--r--debian/patches/rpcscan0002-utils-rpcscan-new-utility.patch457
-rw-r--r--debian/patches/series2
3 files changed, 0 insertions, 1090 deletions
diff --git a/debian/patches/rpcscan0001-utils-split-off-the-message-id-parsing.patch b/debian/patches/rpcscan0001-utils-split-off-the-message-id-parsing.patch
deleted file mode 100644
index 128c212e..00000000
--- a/debian/patches/rpcscan0001-utils-split-off-the-message-id-parsing.patch
+++ /dev/null
@@ -1,631 +0,0 @@
-From 74fb5209f06edcf0b52bdf44ba805cb5f6cd41c8 Mon Sep 17 00:00:00 2001
-From: Justus Winter <4winter@informatik.uni-hamburg.de>
-Date: Sun, 31 May 2015 00:26:40 +0200
-Subject: [PATCH hurd 1/2] utils: split-off the message id parsing
-
-* utils/rpctrace.c: Move all the code handling the message id files...
-* utils/msgids.c: ... to a new file.
-* utils/msgids.h: And add the relevand declarations.
-* utils/Makefile (SRCS): Add the new file.
----
- utils/Makefile | 8 +-
- utils/msgids.c | 252 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
- utils/msgids.h | 33 ++++++++
- utils/rpctrace.c | 202 ++------------------------------------------
- 4 files changed, 298 insertions(+), 197 deletions(-)
- create mode 100644 utils/msgids.c
- create mode 100644 utils/msgids.h
-
-diff --git a/utils/Makefile b/utils/Makefile
-index 1117be1..9ad2a40 100644
---- a/utils/Makefile
-+++ b/utils/Makefile
-@@ -31,7 +31,7 @@ SRCS = shd.c ps.c settrans.c syncfs.c showtrans.c addauth.c rmauth.c \
- parse.c frobauth.c frobauth-mod.c setauth.c pids.c nonsugid.c \
- unsu.c ftpcp.c ftpdir.c storeread.c storecat.c msgport.c \
- rpctrace.c mount.c gcore.c fakeauth.c fakeroot.sh remap.sh \
-- nullauth.c match-options.c
-+ nullauth.c match-options.c msgids.c
-
- OBJS = $(filter-out %.sh,$(SRCS:.c=.o))
- HURDLIBS = ps ihash store fshelp ports ftpconn shouldbeinlibc
-@@ -67,8 +67,10 @@ ps w ids settrans syncfs showtrans fsysopts storeinfo login vmstat portinfo \
-
- $(filter-out $(special-targets), $(targets)): %: %.o
-
--rpctrace: ../libports/libports.a ../libihash/libihash.a
--rpctrace-CPPFLAGS = -DDATADIR=\"${datadir}\"
-+rpctrace: ../libports/libports.a
-+rpctrace: msgids.o \
-+ ../libihash/libihash.a
-+msgids-CPPFLAGS = -DDATADIR=\"${datadir}\"
-
- fakeauth: authServer.o auth_requestUser.o interruptServer.o \
- ../libports/libports.a ../libihash/libihash.a \
-diff --git a/utils/msgids.c b/utils/msgids.c
-new file mode 100644
-index 0000000..4bc08de
---- /dev/null
-+++ b/utils/msgids.c
-@@ -0,0 +1,252 @@
-+/* Translate message ids to symbolic names.
-+
-+ Copyright (C) 1998-2015 Free Software Foundation, Inc.
-+
-+ This file is part of the GNU Hurd.
-+
-+ The GNU Hurd is free software; you can redistribute it and/or
-+ modify it under the terms of the GNU General Public License as
-+ published by the Free Software Foundation; either version 2, or (at
-+ your option) any later version.
-+
-+ The GNU Hurd is distributed in the hope that it will be useful, but
-+ WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>. */
-+
-+#include <argp.h>
-+#include <argz.h>
-+#include <dirent.h>
-+#include <errno.h>
-+#include <error.h>
-+#include <fnmatch.h>
-+#include <hurd/ihash.h>
-+#include <mach.h>
-+#include <stdbool.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+
-+#include "msgids.h"
-+
-+static void
-+msgid_ihash_cleanup (void *element, void *arg)
-+{
-+ struct msgid_info *info = element;
-+ free (info->name);
-+ free (info->subsystem);
-+ free (info);
-+}
-+
-+static struct hurd_ihash msgid_ihash
-+ = HURD_IHASH_INITIALIZER (HURD_IHASH_NO_LOCP);
-+
-+/* Parse a file of RPC names and message IDs as output by mig's -list
-+ option: "subsystem base-id routine n request-id reply-id". Put each
-+ request-id value into `msgid_ihash' with the routine name as its value. */
-+static error_t
-+parse_msgid_list (const char *filename)
-+{
-+ FILE *fp;
-+ char *buffer = NULL;
-+ size_t bufsize = 0;
-+ unsigned int lineno = 0;
-+ char *name, *subsystem;
-+ unsigned int msgid;
-+ error_t err;
-+
-+ fp = fopen (filename, "r");
-+ if (fp == NULL)
-+ return errno;
-+
-+ while (getline (&buffer, &bufsize, fp) > 0)
-+ {
-+ ++lineno;
-+ if (buffer[0] == '#' || buffer[0] == '\0')
-+ continue;
-+ if (sscanf (buffer, "%ms %*u %ms %*u %u %*u\n",
-+ &subsystem, &name, &msgid) != 3)
-+ error (0, 0, "%s:%u: invalid format in RPC list file",
-+ filename, lineno);
-+ else
-+ {
-+ struct msgid_info *info = malloc (sizeof *info);
-+ if (info == 0)
-+ error (1, errno, "malloc");
-+ info->name = name;
-+ info->subsystem = subsystem;
-+ err = hurd_ihash_add (&msgid_ihash, msgid, info);
-+ if (err)
-+ return err;
-+ }
-+ }
-+
-+ free (buffer);
-+ fclose (fp);
-+ return 0;
-+}
-+
-+/* Look for a name describing MSGID. We check the table directly, and
-+ also check if this looks like the ID of a reply message whose request
-+ ID is already in the table. */
-+const struct msgid_info *
-+msgid_info (mach_msg_id_t msgid)
-+{
-+ const struct msgid_info *info = hurd_ihash_find (&msgid_ihash, msgid);
-+ if (info == 0 && (msgid / 100) % 2 == 1)
-+ {
-+ /* This message ID is not in the table, and its number makes it
-+ what should be an RPC reply message ID. So look up the message
-+ ID of the corresponding RPC request and synthesize a name from
-+ that. Then stash that name in the table so the next time the
-+ lookup will match directly. */
-+ info = hurd_ihash_find (&msgid_ihash, msgid - 100);
-+ if (info != 0)
-+ {
-+ struct msgid_info *reply_info = malloc (sizeof *info);
-+ if (reply_info != 0)
-+ {
-+ reply_info->subsystem = strdup (info->subsystem);
-+ reply_info->name = 0;
-+ asprintf (&reply_info->name, "%s-reply", info->name);
-+ hurd_ihash_add (&msgid_ihash, msgid, reply_info);
-+ info = reply_info;
-+ }
-+ else
-+ info = 0;
-+ }
-+ }
-+ return info;
-+}
-+
-+static int
-+msgids_file_p (const struct dirent *eps)
-+{
-+ return fnmatch ("*.msgids", eps->d_name, 0) != FNM_NOMATCH;
-+}
-+
-+static void
-+scan_msgids_dir (char **argz, size_t *argz_len, char *dir, bool append)
-+{
-+ struct dirent **eps;
-+ int n;
-+
-+ n = scandir (dir, &eps, msgids_file_p, NULL);
-+ if (n >= 0)
-+ {
-+ for (int cnt = 0; cnt < n; ++cnt)
-+ {
-+ char *msgids_file;
-+
-+ if (asprintf (&msgids_file, "%s/%s", dir, eps[cnt]->d_name) < 0)
-+ error (1, errno, "asprintf");
-+
-+ if (append == TRUE)
-+ {
-+ if (argz_add (argz, argz_len, msgids_file) != 0)
-+ error (1, errno, "argz_add");
-+ }
-+ else
-+ {
-+ if (argz_insert (argz, argz_len, *argz, msgids_file) != 0)
-+ error (1, errno, "argz_insert");
-+ }
-+ free (msgids_file);
-+ }
-+ }
-+
-+ /* If the directory couldn't be scanned for whatever reason, just ignore
-+ it. */
-+}
-+
-+/* Argument parsing. */
-+
-+static char *msgids_files_argz = NULL;
-+static size_t msgids_files_argz_len = 0;
-+static bool nostdinc = FALSE;
-+
-+#define STD_MSGIDS_DIR DATADIR "/msgids/"
-+#define OPT_NOSTDINC -1
-+
-+static const struct argp_option options[] =
-+{
-+ {"nostdinc", OPT_NOSTDINC, 0, 0,
-+ "Do not search inside the standard system directory, `" STD_MSGIDS_DIR
-+ "', for `.msgids' files.", 0},
-+ {"rpc-list", 'i', "FILE", 0,
-+ "Read FILE for assocations of message ID numbers to names.", 0},
-+ {0, 'I', "DIR", 0,
-+ "Add the directory DIR to the list of directories to be searched for files "
-+ "containing message ID numbers.", 0},
-+ {0}
-+};
-+
-+/* Parse our options... */
-+static error_t parse_opt (int key, char *arg, struct argp_state *state)
-+{
-+ switch (key)
-+ {
-+ case ARGP_KEY_INIT:
-+ hurd_ihash_set_cleanup (&msgid_ihash, msgid_ihash_cleanup, 0);
-+ break;
-+
-+ case OPT_NOSTDINC:
-+ nostdinc = TRUE;
-+ break;
-+
-+ case 'i':
-+ if (argz_add (&msgids_files_argz, &msgids_files_argz_len,
-+ arg) != 0)
-+ error (1, errno, "argz_add");
-+ break;
-+
-+ case 'I':
-+ scan_msgids_dir (&msgids_files_argz, &msgids_files_argz_len,
-+ arg, TRUE);
-+ break;
-+
-+ case ARGP_KEY_NO_ARGS:
-+ return 0;
-+
-+ case ARGP_KEY_ARG:
-+ return EINVAL;
-+
-+ case ARGP_KEY_END:
-+ /* Insert the files from STD_MSGIDS_DIR at the beginning of the
-+ list, so that their content can be overridden by subsequently
-+ parsed files. */
-+ if (nostdinc == FALSE)
-+ scan_msgids_dir (&msgids_files_argz, &msgids_files_argz_len,
-+ STD_MSGIDS_DIR, FALSE);
-+
-+ if (msgids_files_argz != NULL)
-+ {
-+ error_t err = 0;
-+ char *msgids_file = NULL;
-+
-+ while (! err
-+ && (msgids_file = argz_next (msgids_files_argz,
-+ msgids_files_argz_len,
-+ msgids_file)))
-+ err = parse_msgid_list (msgids_file);
-+
-+ free (msgids_files_argz);
-+ if (err)
-+ argp_failure (state, 1, err, "%s", msgids_file);
-+ }
-+ break;
-+
-+ default:
-+ return ARGP_ERR_UNKNOWN;
-+ }
-+ return 0;
-+}
-+
-+const struct argp msgid_argp = {
-+ .options = options,
-+ .parser = parse_opt,
-+ .doc = "msgid doc",
-+};
-diff --git a/utils/msgids.h b/utils/msgids.h
-new file mode 100644
-index 0000000..6bd2372
---- /dev/null
-+++ b/utils/msgids.h
-@@ -0,0 +1,33 @@
-+/* Translate message ids to symbolic names.
-+
-+ Copyright (C) 1998-2015 Free Software Foundation, Inc.
-+
-+ This file is part of the GNU Hurd.
-+
-+ The GNU Hurd is free software; you can redistribute it and/or
-+ modify it under the terms of the GNU General Public License as
-+ published by the Free Software Foundation; either version 2, or (at
-+ your option) any later version.
-+
-+ The GNU Hurd is distributed in the hope that it will be useful, but
-+ WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>. */
-+
-+#ifndef _HURD_MSGIDS_H_
-+#define _HURD_MSGIDS_H_
-+
-+/* We map message ids to procedure and subsystem names. */
-+struct msgid_info
-+{
-+ char *name;
-+ char *subsystem;
-+};
-+
-+const struct msgid_info *msgid_info (mach_msg_id_t msgid);
-+const struct argp msgid_argp;
-+
-+#endif /* _HURD_MSGIDS_H_ */
-diff --git a/utils/rpctrace.c b/utils/rpctrace.c
-index 48daa07..d53b510 100644
---- a/utils/rpctrace.c
-+++ b/utils/rpctrace.c
-@@ -26,9 +26,7 @@
- #include <mach/message.h>
- #include <assert.h>
- #include <fcntl.h>
--#include <fnmatch.h>
- #include <sys/stat.h>
--#include <dirent.h>
- #include <unistd.h>
- #include <argp.h>
- #include <error.h>
-@@ -41,24 +39,15 @@
- #include <argz.h>
- #include <envz.h>
-
--const char *argp_program_version = STANDARD_HURD_VERSION (rpctrace);
-+#include "msgids.h"
-
--#define STD_MSGIDS_DIR DATADIR "/msgids/"
-+const char *argp_program_version = STANDARD_HURD_VERSION (rpctrace);
-
- static unsigned strsize = 80;
-
--#define OPT_NOSTDINC -1
- static const struct argp_option options[] =
- {
- {"output", 'o', "FILE", 0, "Send trace output to FILE instead of stderr."},
-- {"nostdinc", OPT_NOSTDINC, 0, 0,
-- "Do not search inside the standard system directory, `" STD_MSGIDS_DIR
-- "', for `.msgids' files."},
-- {"rpc-list", 'i', "FILE", 0,
-- "Read FILE for assocations of message ID numbers to names."},
-- {0, 'I', "DIR", 0,
-- "Add the directory DIR to the list of directories to be searched for files "
-- "containing message ID numbers."},
- {0, 's', "SIZE", 0, "Specify the maximum string size to print (the default is 80)."},
- {0, 'E', "var[=value]", 0,
- "Set/change (var=value) or remove (var) an environment variable among the "
-@@ -71,23 +60,6 @@ static const struct argp_option options[] =
- static const char args_doc[] = "COMMAND [ARG...]";
- static const char doc[] = "Trace Mach Remote Procedure Calls.";
-
--/* The msgid_ihash table maps msgh_id values to names. */
--
--struct msgid_info
--{
-- char *name;
-- char *subsystem;
--};
--
--static void
--msgid_ihash_cleanup (void *element, void *arg)
--{
-- struct msgid_info *info = element;
-- free (info->name);
-- free (info->subsystem);
-- free (info);
--}
--
- /* This structure stores the information of the traced task. */
- struct task_info
- {
-@@ -95,9 +67,6 @@ struct task_info
- boolean_t threads_wrapped; /* All threads of the task has been wrapped? */
- };
-
--static struct hurd_ihash msgid_ihash
-- = HURD_IHASH_INITIALIZER (HURD_IHASH_NO_LOCP);
--
- static struct hurd_ihash task_ihash
- = HURD_IHASH_INITIALIZER (HURD_IHASH_NO_LOCP);
-
-@@ -126,86 +95,6 @@ remove_task (task_t task)
- hurd_ihash_remove (&task_ihash, task);
- }
-
--/* Parse a file of RPC names and message IDs as output by mig's -list
-- option: "subsystem base-id routine n request-id reply-id". Put each
-- request-id value into `msgid_ihash' with the routine name as its value. */
--static void
--parse_msgid_list (const char *filename)
--{
-- FILE *fp;
-- char *buffer = NULL;
-- size_t bufsize = 0;
-- unsigned int lineno = 0;
-- char *name, *subsystem;
-- unsigned int msgid;
-- error_t err;
--
-- fp = fopen (filename, "r");
-- if (fp == 0)
-- {
-- error (2, errno, "%s", filename);
-- return;
-- }
--
-- while (getline (&buffer, &bufsize, fp) > 0)
-- {
-- ++lineno;
-- if (buffer[0] == '#' || buffer[0] == '\0')
-- continue;
-- if (sscanf (buffer, "%ms %*u %ms %*u %u %*u\n",
-- &subsystem, &name, &msgid) != 3)
-- error (0, 0, "%s:%u: invalid format in RPC list file",
-- filename, lineno);
-- else
-- {
-- struct msgid_info *info = malloc (sizeof *info);
-- if (info == 0)
-- error (1, errno, "malloc");
-- info->name = name;
-- info->subsystem = subsystem;
-- err = hurd_ihash_add (&msgid_ihash, msgid, info);
-- if (err)
-- error (1, err, "hurd_ihash_add");
-- }
-- }
--
-- free (buffer);
-- fclose (fp);
--}
--
--/* Look for a name describing MSGID. We check the table directly, and
-- also check if this looks like the ID of a reply message whose request
-- ID is already in the table. */
--static const struct msgid_info *
--msgid_info (mach_msg_id_t msgid)
--{
-- const struct msgid_info *info = hurd_ihash_find (&msgid_ihash, msgid);
-- if (info == 0 && (msgid / 100) % 2 == 1)
-- {
-- /* This message ID is not in the table, and its number makes it
-- what should be an RPC reply message ID. So look up the message
-- ID of the corresponding RPC request and synthesize a name from
-- that. Then stash that name in the table so the next time the
-- lookup will match directly. */
-- info = hurd_ihash_find (&msgid_ihash, msgid - 100);
-- if (info != 0)
-- {
-- struct msgid_info *reply_info = malloc (sizeof *info);
-- if (reply_info != 0)
-- {
-- reply_info->subsystem = strdup (info->subsystem);
-- reply_info->name = 0;
-- asprintf (&reply_info->name, "%s-reply", info->name);
-- hurd_ihash_add (&msgid_ihash, msgid, reply_info);
-- info = reply_info;
-- }
-- else
-- info = 0;
-- }
-- }
-- return info;
--}
--
- static const char *
- msgid_name (mach_msg_id_t msgid)
- {
-@@ -1781,55 +1670,9 @@ traced_spawn (char **argv, char **envp)
- return pid;
- }
-
--
--static void
--scan_msgids_dir (char **argz, size_t *argz_len, char *dir, bool append)
--{
-- struct dirent **eps;
-- int n;
--
-- int
-- msgids_file_p (const struct dirent *eps)
-- {
-- if (fnmatch ("*.msgids", eps->d_name, 0) != FNM_NOMATCH)
-- return 1;
-- return 0;
-- }
--
-- n = scandir (dir, &eps, msgids_file_p, NULL);
-- if (n >= 0)
-- {
-- for (int cnt = 0; cnt < n; ++cnt)
-- {
-- char *msgids_file;
--
-- if (asprintf (&msgids_file, "%s/%s", dir, eps[cnt]->d_name) < 0)
-- error (1, errno, "asprintf");
--
-- if (append == TRUE)
-- {
-- if (argz_add (argz, argz_len, msgids_file) != 0)
-- error (1, errno, "argz_add");
-- }
-- else
-- {
-- if (argz_insert (argz, argz_len, *argz, msgids_file) != 0)
-- error (1, errno, "argz_insert");
-- }
-- free (msgids_file);
-- }
-- }
--
-- /* If the directory couldn't be scanned for whatever reason, just ignore
-- it. */
--}
--
- int
- main (int argc, char **argv, char **envp)
- {
-- char *msgids_files_argz = NULL;
-- size_t msgids_files_argz_len = 0;
-- bool nostdinc = FALSE;
- const char *outfile = 0;
- char **cmd_argv = 0;
- pthread_t thread;
-@@ -1847,21 +1690,6 @@ main (int argc, char **argv, char **envp)
- outfile = arg;
- break;
-
-- case OPT_NOSTDINC:
-- nostdinc = TRUE;
-- break;
--
-- case 'i':
-- if (argz_add (&msgids_files_argz, &msgids_files_argz_len,
-- arg) != 0)
-- error (1, errno, "argz_add");
-- break;
--
-- case 'I':
-- scan_msgids_dir (&msgids_files_argz, &msgids_files_argz_len,
-- arg, TRUE);
-- break;
--
- case 's':
- strsize = atoi (arg);
- break;
-@@ -1908,7 +1736,12 @@ main (int argc, char **argv, char **envp)
- }
- return 0;
- }
-- const struct argp argp = { options, parse_opt, args_doc, doc };
-+ const struct argp_child children[] =
-+ {
-+ { .argp=&msgid_argp, },
-+ { 0 }
-+ };
-+ const struct argp argp = { options, parse_opt, args_doc, doc, &children };
-
- /* Parse our arguments. */
- argp_parse (&argp, argc, argv, ARGP_IN_ORDER, 0, 0);
-@@ -1917,23 +1750,6 @@ main (int argc, char **argv, char **envp)
- &unknown_task);
- assert_perror (err);
-
-- /* Insert the files from STD_MSGIDS_DIR at the beginning of the list, so that
-- their content can be overridden by subsequently parsed files. */
-- if (nostdinc == FALSE)
-- scan_msgids_dir (&msgids_files_argz, &msgids_files_argz_len,
-- STD_MSGIDS_DIR, FALSE);
--
-- if (msgids_files_argz != NULL)
-- {
-- char *msgids_file = NULL;
--
-- while ((msgids_file = argz_next (msgids_files_argz,
-- msgids_files_argz_len, msgids_file)))
-- parse_msgid_list (msgids_file);
--
-- free (msgids_files_argz);
-- }
--
- if (outfile)
- {
- ostream = fopen (outfile, "w");
-@@ -1951,8 +1767,6 @@ main (int argc, char **argv, char **envp)
- sizeof (*notify_pi), &notify_pi);
- assert_perror (err);
-
-- hurd_ihash_set_cleanup (&msgid_ihash, msgid_ihash_cleanup, 0);
--
- /* Spawn a single thread that will receive intercepted messages, print
- them, and interpose on the ports they carry. The access to the
- `traced_info' and ihash data structures is all single-threaded,
---
-2.1.4
-
diff --git a/debian/patches/rpcscan0002-utils-rpcscan-new-utility.patch b/debian/patches/rpcscan0002-utils-rpcscan-new-utility.patch
deleted file mode 100644
index 5ea67a3d..00000000
--- a/debian/patches/rpcscan0002-utils-rpcscan-new-utility.patch
+++ /dev/null
@@ -1,457 +0,0 @@
-From 566a246f2c2881f1598d376032f9f73427790feb Mon Sep 17 00:00:00 2001
-From: Justus Winter <4winter@informatik.uni-hamburg.de>
-Date: Fri, 29 May 2015 16:37:00 +0200
-Subject: [PATCH hurd 2/2] utils/rpcscan: new utility
-
-* utils/rpcscan.c: New file.
-* utils/Makefile: Add `rpcscan'.
----
- utils/Makefile | 6 +-
- utils/rpcscan.c | 404 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 407 insertions(+), 3 deletions(-)
- create mode 100644 utils/rpcscan.c
-
-diff --git a/utils/Makefile b/utils/Makefile
-index 9ad2a40..955789b 100644
---- a/utils/Makefile
-+++ b/utils/Makefile
-@@ -22,7 +22,7 @@ targets = shd ps settrans showtrans syncfs fsysopts \
- storeinfo login w uptime ids loginpr sush vmstat portinfo \
- devprobe vminfo addauth rmauth unsu setauth ftpcp ftpdir storecat \
- storeread msgport rpctrace mount gcore fakeauth fakeroot remap \
-- umount nullauth
-+ umount nullauth rpcscan
-
- special-targets = loginpr sush uptime fakeroot remap
- SRCS = shd.c ps.c settrans.c syncfs.c showtrans.c addauth.c rmauth.c \
-@@ -31,7 +31,7 @@ SRCS = shd.c ps.c settrans.c syncfs.c showtrans.c addauth.c rmauth.c \
- parse.c frobauth.c frobauth-mod.c setauth.c pids.c nonsugid.c \
- unsu.c ftpcp.c ftpdir.c storeread.c storecat.c msgport.c \
- rpctrace.c mount.c gcore.c fakeauth.c fakeroot.sh remap.sh \
-- nullauth.c match-options.c msgids.c
-+ nullauth.c match-options.c msgids.c rpcscan.c
-
- OBJS = $(filter-out %.sh,$(SRCS:.c=.o))
- HURDLIBS = ps ihash store fshelp ports ftpconn shouldbeinlibc
-@@ -68,7 +68,7 @@ ps w ids settrans syncfs showtrans fsysopts storeinfo login vmstat portinfo \
- $(filter-out $(special-targets), $(targets)): %: %.o
-
- rpctrace: ../libports/libports.a
--rpctrace: msgids.o \
-+rpctrace rpcscan: msgids.o \
- ../libihash/libihash.a
- msgids-CPPFLAGS = -DDATADIR=\"${datadir}\"
-
-diff --git a/utils/rpcscan.c b/utils/rpcscan.c
-new file mode 100644
-index 0000000..e32c016
---- /dev/null
-+++ b/utils/rpcscan.c
-@@ -0,0 +1,404 @@
-+/* An RPC scanner for the Hurd.
-+
-+ Copyright (C) 2015 Free Software Foundation, Inc.
-+
-+ This file is part of the GNU Hurd.
-+
-+ The GNU Hurd is free software; you can redistribute it and/or
-+ modify it under the terms of the GNU General Public License as
-+ published by the Free Software Foundation; either version 2, or (at
-+ your option) any later version.
-+
-+ The GNU Hurd is distributed in the hope that it will be useful, but
-+ WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>. */
-+
-+#include <mach.h>
-+#include <hurd.h>
-+#include <hurd/ihash.h>
-+#include <mach/message.h>
-+#include <unistd.h>
-+#include <argp.h>
-+#include <error.h>
-+#include <string.h>
-+#include <version.h>
-+#include <sys/wait.h>
-+#include <inttypes.h>
-+#include <stdbool.h>
-+#include <stddef.h>
-+#include <argz.h>
-+
-+#include "msgids.h"
-+
-+/* Send messages with arbitrary message ids. */
-+struct Request {
-+ mach_msg_header_t Head;
-+} RequestTemplate;
-+
-+struct Reply {
-+ mach_msg_header_t Head;
-+ mach_msg_type_t RetCodeType;
-+ kern_return_t RetCode;
-+ char Body[4096];
-+};
-+
-+union {
-+ struct Request Request;
-+ struct Reply Reply;
-+} Message;
-+
-+error_t
-+setup (mach_port_t request, mach_msg_type_name_t requestType)
-+{
-+ RequestTemplate.Head.msgh_remote_port = request;
-+ if (! MACH_PORT_VALID (RequestTemplate.Head.msgh_local_port))
-+ RequestTemplate.Head.msgh_local_port = mach_reply_port ();
-+ RequestTemplate.Head.msgh_bits =
-+ MACH_MSGH_BITS (requestType, MACH_MSG_TYPE_MAKE_SEND_ONCE);
-+ return 0;
-+}
-+
-+error_t
-+send (mach_msg_id_t msgid)
-+{
-+ error_t err;
-+ Message.Request = RequestTemplate;
-+ Message.Request.Head.msgh_id = msgid;
-+ err = mach_msg (&Message.Request.Head,
-+ MACH_SEND_MSG|MACH_RCV_MSG|MACH_MSG_OPTION_NONE,
-+ sizeof Message.Request,
-+ sizeof Message.Reply,
-+ Message.Request.Head.msgh_local_port,
-+ MACH_MSG_TIMEOUT_NONE,
-+ MACH_PORT_NULL);
-+ if (err)
-+ return err;
-+
-+ // xxx typecheck
-+ return Message.Reply.RetCode;
-+}
-+
-+typedef error_t (*setup_function_t) ();
-+setup_function_t setup_target;
-+void *setup_argument;
-+
-+error_t
-+setup_task_target (void)
-+{
-+ error_t err;
-+ static task_t task;
-+ static mach_msg_type_name_t taskType = MACH_MSG_TYPE_COPY_SEND;
-+
-+ if (MACH_PORT_VALID (task))
-+ {
-+ task_terminate (task);
-+ mach_port_deallocate (mach_task_self (), task);
-+ }
-+
-+ err = task_create (mach_task_self (), 0, &task);
-+ if (err)
-+ return err;
-+
-+ return setup (task, taskType);
-+}
-+
-+error_t
-+setup_thread_target (void)
-+{
-+ error_t err;
-+ static task_t task;
-+ static thread_t thread;
-+
-+ if (MACH_PORT_VALID (thread))
-+ {
-+ thread_terminate (thread);
-+ mach_port_deallocate (mach_task_self (), thread);
-+ }
-+
-+ if (MACH_PORT_VALID (task))
-+ {
-+ task_terminate (task);
-+ mach_port_deallocate (mach_task_self (), task);
-+ }
-+
-+ err = task_create (mach_task_self (), 0, &task);
-+ if (err)
-+ return err;
-+
-+ err = thread_create (task, &thread);
-+ if (err)
-+ return err;
-+
-+ return setup (thread, MACH_MSG_TYPE_COPY_SEND);
-+}
-+
-+error_t
-+setup_proc_target (void)
-+{
-+ error_t err;
-+ static task_t task;
-+ static process_t proc, target;
-+ static mach_msg_type_name_t targetType = MACH_MSG_TYPE_COPY_SEND;
-+
-+ if (! MACH_PORT_VALID (proc))
-+ proc = getproc ();
-+ if (MACH_PORT_VALID (task))
-+ mach_port_deallocate (mach_task_self (), task);
-+ if (MACH_PORT_VALID (target))
-+ mach_port_deallocate (mach_task_self (), target);
-+
-+ err = task_create (mach_task_self (), 0, &task);
-+ if (err)
-+ return err;
-+
-+ err = proc_task2proc (proc, task, &target);
-+ if (err)
-+ return err;
-+
-+ return setup (target, targetType);
-+}
-+
-+error_t
-+setup_auth_target (void)
-+{
-+ static auth_t auth;
-+ static mach_msg_type_name_t authType = MACH_MSG_TYPE_COPY_SEND;
-+
-+ if (MACH_PORT_VALID (auth))
-+ mach_port_deallocate (mach_task_self (), auth);
-+
-+ auth = getauth ();
-+ if (! MACH_PORT_VALID (auth))
-+ return errno;
-+
-+ return setup (auth, authType);
-+}
-+
-+error_t
-+setup_hurd_target (void)
-+{
-+ char *name = (char *) setup_argument;
-+ mach_port_t request;
-+ mach_msg_type_name_t requestType;
-+
-+ request = file_name_lookup (name, 0, 0);
-+ if (! MACH_PORT_VALID (request))
-+ return errno;
-+ requestType = MACH_MSG_TYPE_COPY_SEND;
-+
-+ return setup (request, requestType);
-+}
-+
-+task_t extract_target_task;
-+mach_port_t extract_target_port;
-+mach_msg_type_name_t extract_target_type;
-+
-+error_t
-+setup_extract_target (void)
-+{
-+ error_t err;
-+ char *name = (char *) setup_argument;
-+ mach_port_t request;
-+ mach_msg_type_name_t requestType;
-+
-+ err = mach_port_extract_right (extract_target_task,
-+ extract_target_port,
-+ extract_target_type,
-+ &request,
-+ &requestType);
-+ if (err)
-+ error (1, err, "mach_port_extract_right");
-+ if (err)
-+ return err;
-+ requestType = MACH_MSG_TYPE_COPY_SEND;
-+ return setup (request, requestType);
-+}
-+
-+const char *argp_program_version = STANDARD_HURD_VERSION (rpcscan);
-+
-+char **cmd_argv;
-+int verbose;
-+int numeric;
-+int subsystem;
-+
-+#define OPT_TARGET_TASK -1
-+#define OPT_TARGET_THREAD -2
-+#define OPT_TARGET_PROC -3
-+#define OPT_TARGET_AUTH -4
-+#define OPT_TARGET_EXTRACT -5
-+
-+static const struct argp_option options[] =
-+{
-+ {NULL, 0, NULL, OPTION_DOC, "Target selection", 1},
-+ {"task", OPT_TARGET_TASK, NULL, 0, "target a task port", 1},
-+ {"thread", OPT_TARGET_THREAD, NULL, 0, "target a thread port", 1},
-+ {"proc", OPT_TARGET_PROC, NULL, 0, "target a proc port", 1},
-+ {"auth", OPT_TARGET_AUTH, NULL, 0, "target an auth port", 1},
-+ {"extract", OPT_TARGET_EXTRACT, "PID.PORT", 0, "target port PORT of PID", 1},
-+
-+ {NULL, 0, NULL, OPTION_DOC, "Options", 2},
-+ {"verbose", 'v', NULL, 0, "be verbose", 2},
-+ {"numeric", 'n', NULL, 0, "show numeric message ids", 2},
-+ {"subsystem", 's', NULL, 0, "show subsystem names", 2},
-+ {0}
-+};
-+
-+static const char args_doc[] = "[FILE]";
-+static const char doc[] = "Scan a given Mach port.";
-+
-+/* Parse our options... */
-+error_t
-+parse_opt (int key, char *arg, struct argp_state *state)
-+{
-+ error_t err;
-+ switch (key)
-+ {
-+ case 'v':
-+ verbose = 1;
-+ break;
-+
-+ case 'n':
-+ numeric = 1;
-+ break;
-+
-+ case 's':
-+ subsystem = 1;
-+ break;
-+
-+#define SELECT_TARGET(target) \
-+ if (setup_target) \
-+ argp_error (state, "Multiple targets specified."); \
-+ setup_target = target;
-+
-+ case OPT_TARGET_TASK:
-+ SELECT_TARGET (setup_task_target);
-+ break;
-+
-+ case OPT_TARGET_THREAD:
-+ SELECT_TARGET (setup_thread_target);
-+ break;
-+
-+ case OPT_TARGET_PROC:
-+ SELECT_TARGET (setup_proc_target);
-+ break;
-+
-+ case OPT_TARGET_AUTH:
-+ SELECT_TARGET (setup_auth_target);
-+ break;
-+
-+ case OPT_TARGET_EXTRACT:;
-+ process_t proc;
-+ pid_t pid;
-+ char *end;
-+
-+ pid = strtol (arg, &end, 10);
-+ if (arg == end || *end != '.')
-+ argp_error (state, "Expected format PID.PORT, got `%s'.", arg);
-+
-+ arg = end + 1;
-+ extract_target_port = strtol (arg, &end, 10);
-+ if (arg == end || *end != '\0')
-+ argp_error (state, "Expected format PORT, got `%s'.", arg);
-+
-+ proc = getproc ();
-+ err = proc_pid2task (proc, pid, &extract_target_task);
-+ if (err)
-+ argp_failure (state, 1, err,
-+ "Could not get task of process %d", pid);
-+
-+ extract_target_type = MACH_MSG_TYPE_COPY_SEND; /* XXX */
-+ SELECT_TARGET (setup_extract_target);
-+ break;
-+
-+ case ARGP_KEY_ARG:
-+ SELECT_TARGET (setup_hurd_target);
-+ setup_argument = arg;
-+ break;
-+#undef SELECT_TARGET
-+
-+ case ARGP_KEY_NO_ARGS:
-+ if (setup_target == NULL)
-+ argp_usage (state);
-+ break;
-+
-+ default:
-+ return ARGP_ERR_UNKNOWN;
-+ }
-+ return 0;
-+}
-+
-+const struct argp_child children[] =
-+ {
-+ { .argp=&msgid_argp, },
-+ { 0 }
-+ };
-+
-+const struct argp argp = { options, parse_opt, args_doc, doc, &children };
-+
-+void
-+format_msgid (char *buf, size_t len, mach_msg_id_t id)
-+{
-+ if (numeric)
-+ numeric:
-+ snprintf (buf, len, "%d", id);
-+ else
-+ {
-+ const struct msgid_info *info;
-+ info = msgid_info (id);
-+ if (info == NULL)
-+ goto numeric;
-+
-+ if (subsystem)
-+ snprintf (buf, len, "%s/%s", info->subsystem, info->name);
-+ else
-+ snprintf (buf, len, "%s", info->name);
-+ }
-+}
-+
-+int
-+main (int argc, char **argv, char **envp)
-+{
-+ error_t err;
-+ mach_msg_id_t msgid;
-+
-+ /* Parse our arguments. */
-+ argp_parse (&argp, argc, argv, ARGP_IN_ORDER, 0, 0);
-+
-+ err = setup_target ();
-+ if (err)
-+ /* Initial setup failed. Bail out. */
-+ error (1, err, "%s",
-+ setup_target == setup_hurd_target? (char *) setup_argument: "setup");
-+
-+ for (msgid = 0; msgid < 500000; msgid++)
-+ {
-+ err = send (msgid);
-+ switch (err)
-+ {
-+ case MACH_SEND_INVALID_DEST:
-+ err = setup_target ();
-+ if (err)
-+ error (1, err, "setup");
-+ msgid--; /* redo */
-+ continue;
-+
-+ case MIG_BAD_ID:
-+ /* do nothing */
-+ break;
-+
-+ default:;
-+ char buf[80];
-+ format_msgid (buf, sizeof buf, msgid);
-+ if (verbose)
-+ error (0, err, "%s", buf);
-+ else
-+ fprintf (stdout, "%s\n", buf);
-+ }
-+ }
-+
-+ return EXIT_SUCCESS;
-+}
---
-2.1.4
-
diff --git a/debian/patches/series b/debian/patches/series
index 2aa2a2ee..7af65350 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -61,8 +61,6 @@ exec_filename_use.patch
exec_filename_fix.patch
huge-nodecache0001-xxx-huge-nodecache.patch
dde-enable-device.patch
-rpcscan0001-utils-split-off-the-message-id-parsing.patch
-rpcscan0002-utils-rpcscan-new-utility.patch
introspection0001-hurd-add-an-Hurd-server-introspection-protocol.patch
introspection0002-libintrospection-a-library-for-Hurd-server-introspec.patch
introspection0003-libports-implement-the-Hurd-server-introspection-pro.patch