[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: How to clone a port right
From: |
Carl Fredrik Hammar |
Subject: |
Re: How to clone a port right |
Date: |
Wed, 8 Jul 2009 16:33:02 +0200 |
User-agent: |
Mutt/1.5.18 (2008-05-17) |
Hi,
On Tue, Jul 07, 2009 at 09:24:27PM +0300, Sergiu Ivanov wrote:
> /* Opens the port on which to set the mountee. */
> error_t
> open_port (int flags, mach_port_t * underlying,
> mach_msg_type_name_t * underlying_type, task_t task,
> void *cookie)
> {
> err = 0;
>
> /* Create a port to `np`. */
> newpi = netfs_make_protid
> (netfs_make_peropen (np, flags, NULL), user);
> if (!newpi)
> {
> iohelp_free_iouser (user);
> return errno;
> }
>
> *underlying = underlying_port = ports_get_send_right (newpi);
> *underlying_type = MACH_MSG_TYPE_COPY_SEND;
>
> ports_port_deref (newpi);
>
> return err;
> } /*open_port */
>
> [...]
>
> Now the question: can the reason for such failure be the fact that the
> port right stored in underlying_node is used both in unionmount and in
> the mountee? If so, is there a way to clone the port right?
This issue has been resolved in IRC, but I'll answer the question
for the record. The port right is copied by mach_msg, if its type
is MACH_MSG_TYPE_COPY_SEND. And this is the type you passed in
UNDERLYING_TYPE, so it is copied. To move it you use ..._MOVE_SEND,
you can also create a send right from a receive right with ..._MAKE_SEND.
Regards,
Fredrik