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.5 diff -u -r1.5 bucket-manage-mt.c --- libhurd-cap-server/bucket-manage-mt.c 15 Apr 2004 11:06:23 -0000 1.5 +++ libhurd-cap-server/bucket-manage-mt.c 14 Aug 2004 20:30:05 -0000 @@ -63,6 +63,9 @@ /* The timeout for the worker thread as an L4 time period. */ l4_time_t timeout; + + /* The root capability object */ + hurd_cap_obj_t root; }; @@ -115,7 +118,8 @@ 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; @@ -139,9 +143,17 @@ 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, 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 @@ -563,7 +575,7 @@ ctx.bucket = bucket; ctx.from = from; ctx.obj = NULL; - err = manage_demuxer (&ctx, worker); + err = manage_demuxer (&ctx, worker, info->root); } /* Post-processing. */ @@ -768,6 +780,7 @@ : 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);