int (*close_dup) ( resmgr_context_t *ctp, io_close_t *msg, RESMGR_OCB_T *ocb )
struct _io_close { uint16_t type; uint16_t combine_len; }; typedef union { struct _io_close i; } io_close_t;
If you take over this function, you would almost always call iofunc_close_dup_default() in addition to the work you do. This is because the base layer keeps track of the number of open(), dup(), and close() messages issued for a particular OCB, and will then synthesize a close OCB I/O function handler outcall (see below) when the last close() message has been received for a particular OCB.
Note that the receive IDs present in ctp->rcvid may not necessarily match up with those passed to the open connect function handler. For example, when a client disconnects without sending _IO_CLOSE, the resource manager framework handles the resulting pulse and fakes an _IO_CLOSE message. Any attempt to reply directly to this message via ctp->rcvid (which should be 0), or to leave it blocked and reply later, will fail.
The default implementation iofunc_close_dup_default() calls the helper function iofunc_close_dup(), which does not do any permission checking.