Index: libhurd-cap-server/bucket-manage-mt.c
===================================================================
RCS file: /cvsroot/hurd/hurd-l4/libhurd-cap-server/bucket-manage-mt.c,v
retrieving revision 1.15
diff -u -p -r1.15 bucket-manage-mt.c
--- libhurd-cap-server/bucket-manage-mt.c	2 Dec 2004 17:46:51 -0000	1.15
+++ libhurd-cap-server/bucket-manage-mt.c	11 Jan 2005 18:08:22 -0000
@@ -74,6 +74,9 @@ struct worker_info
 
   /* The timeout for the worker thread as an L4 time period.  */
   l4_time_t timeout;
+
+  /* The root capability object */
+  hurd_cap_obj_t root;
 };
 
 
@@ -125,7 +128,8 @@ lookup_client (hurd_cap_bucket_t bucket,
    is returned, CTX->MSG must contain the reply message.  */
 static error_t
 __attribute__((always_inline))
-manage_demuxer (hurd_cap_rpc_context_t ctx, _hurd_cap_list_item_t worker)
+manage_demuxer (hurd_cap_rpc_context_t ctx, _hurd_cap_list_item_t worker,
+		hurd_cap_obj_t root)
 {
   error_t err = 0;
   hurd_cap_bucket_t bucket = ctx->bucket;
@@ -148,9 +152,17 @@ manage_demuxer (hurd_cap_rpc_context_t c
 
   if (l4_msg_label (ctx->msg) == HURD_CAP_MSG_LABEL_GET_ROOT)
     {
-      /* This is the "get the root capability" RPC.  FIXME: Needs to
-	 be implemented.  */
-      return ENOSYS;
+      /* This is the "get the root capability" RPC.  */
+      hurd_cap_handle_t cap;
+
+      if (!root)
+        return ENOSYS;
+      err = hurd_cap_bucket_inject (bucket, root, ctx->from, &cap);
+      if (err)
+	return err;
+      l4_msg_clear (ctx->msg);
+      l4_msg_append_word (ctx->msg, cap);
+      return 0;
     }
 
   /* Every normal RPC must have at least one untyped word, which
@@ -616,7 +628,7 @@ manage_mt_worker (void *arg, bool async)
 		  ctx.bucket = bucket;
 		  ctx.from = from;
 		  ctx.obj = NULL;
-		  err = manage_demuxer (&ctx, worker);
+		  err = manage_demuxer (&ctx, worker, info->root);
 		}
 
 	      /* Post-processing.  */
@@ -932,6 +944,7 @@ hurd_cap_bucket_manage_mt (hurd_cap_buck
     : l4_time_period (UINT64_C (1000000) * global_timeout_sec);
 
   info.bucket = bucket;
+  info.root = root;
   info.manager_tid = l4_myself ();
   info.timeout = (worker_timeout_sec == 0) ? L4_NEVER
     : l4_time_period (UINT64_C (1000000) * worker_timeout_sec);
