summaryrefslogtreecommitdiff
path: root/debian/patches/0002-proc-register-for-new-task-notifications.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/0002-proc-register-for-new-task-notifications.patch')
-rw-r--r--debian/patches/0002-proc-register-for-new-task-notifications.patch126
1 files changed, 126 insertions, 0 deletions
diff --git a/debian/patches/0002-proc-register-for-new-task-notifications.patch b/debian/patches/0002-proc-register-for-new-task-notifications.patch
new file mode 100644
index 00000000..f982e448
--- /dev/null
+++ b/debian/patches/0002-proc-register-for-new-task-notifications.patch
@@ -0,0 +1,126 @@
+From df3730a2eb4da4687dd76ad8668808af247db903 Mon Sep 17 00:00:00 2001
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Mon, 16 Sep 2013 16:09:05 +0200
+Subject: [PATCH hurd 2/5] proc: register for new task notifications
+
+* proc/Makefile (MIGSTUBS): Add `gnumachServer.o'.
+* proc/main.c (message_demuxer): Handle the `task_notify' protocol.
+(main): Register for new task notificatinos.
+* proc/mgt.c (S_mach_notify_new_task): Add server function.
+---
+ proc/Makefile | 4 +++-
+ proc/main.c | 11 ++++++++++-
+ proc/mgt.c | 35 ++++++++++++++++++++++++++++++++++-
+ 3 files changed, 47 insertions(+), 3 deletions(-)
+
+diff --git a/proc/Makefile b/proc/Makefile
+index aa31ffb..2275a66 100644
+--- a/proc/Makefile
++++ b/proc/Makefile
+@@ -27,9 +27,11 @@ SRCS = wait.c hash.c host.c info.c main.c mgt.c notify.c pgrp.c msg.c \
+ MIGSFLAGS = -imacros $(srcdir)/mig-mutate.h
+
+ MIGSTUBS = processServer.o notifyServer.o \
+- ourmsgUser.o proc_excUser.o proc_excServer.o
++ ourmsgUser.o proc_excUser.o proc_excServer.o \
++ task_notifyServer.o
+ OBJS = $(SRCS:.c=.o) $(MIGSTUBS)
+ HURDLIBS = ihash ports shouldbeinlibc
++
+ OTHERLIBS = -lpthread
+
+ include ../Makeconf
+diff --git a/proc/main.c b/proc/main.c
+index 3419d44..b4288fb 100644
+--- a/proc/main.c
++++ b/proc/main.c
+@@ -31,6 +31,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+ #include <pids.h>
+
+ #include "proc.h"
++#include "gnumach_U.h"
+
+ const char *argp_program_version = STANDARD_HURD_VERSION (proc);
+
+@@ -38,6 +39,7 @@ const char *argp_program_version = STANDARD_HURD_VERSION (proc);
+ #include "notify_S.h"
+ #include "../libports/interrupt_S.h"
+ #include "proc_exc_S.h"
++#include "task_notify_S.h"
+
+ int
+ message_demuxer (mach_msg_header_t *inp,
+@@ -47,7 +49,8 @@ message_demuxer (mach_msg_header_t *inp,
+ if ((routine = process_server_routine (inp)) ||
+ (routine = notify_server_routine (inp)) ||
+ (routine = ports_interrupt_server_routine (inp)) ||
+- (routine = proc_exc_server_routine (inp)))
++ (routine = proc_exc_server_routine (inp)) ||
++ (routine = task_notify_server_routine (inp)))
+ {
+ pthread_mutex_lock (&global_lock);
+ (*routine) (inp, outp);
+@@ -152,6 +155,12 @@ main (int argc, char **argv, char **envp)
+ if (err)
+ error (0, err, "Increasing priority failed");
+
++ err = register_new_task_notification (_hurd_host_priv,
++ generic_port,
++ MACH_MSG_TYPE_MAKE_SEND);
++ if (err)
++ error (0, err, "Registering task notifications failed");
++
+ {
+ /* Get our stderr set up to print on the console, in case we have
+ to panic or something. */
+diff --git a/proc/mgt.c b/proc/mgt.c
+index 02d69db..32408ae 100644
+--- a/proc/mgt.c
++++ b/proc/mgt.c
+@@ -1,5 +1,5 @@
+ /* Process management
+- Copyright (C) 1992,93,94,95,96,99,2000,01,02,13
++ Copyright (C) 1992,93,94,95,96,99,2000,01,02,13,14
+ Free Software Foundation, Inc.
+
+ This file is part of the GNU Hurd.
+@@ -981,3 +981,36 @@ S_proc_get_code (struct proc *callerp,
+
+ return 0;
+ }
++
++/* Handle new task notifications from the kernel. */
++error_t
++S_mach_notify_new_task (mach_port_t notify,
++ mach_port_t task,
++ mach_port_t parent)
++{
++ struct proc *parentp, *childp;
++
++ if (notify != generic_port)
++ return EOPNOTSUPP;
++
++ parentp = task_find_nocreate (parent);
++ if (! parentp)
++ {
++ mach_port_deallocate (mach_task_self (), task);
++ mach_port_deallocate (mach_task_self (), parent);
++ return ESRCH;
++ }
++
++ childp = task_find_nocreate (task);
++ if (! childp)
++ {
++ mach_port_mod_refs (mach_task_self (), task, MACH_PORT_RIGHT_SEND, +1);
++ childp = new_proc (task);
++ }
++
++ /* XXX do something interesting */
++
++ mach_port_deallocate (mach_task_self (), task);
++ mach_port_deallocate (mach_task_self (), parent);
++ return 0;
++}
+--
+2.1.3
+