Since the default functions (e.g., iofunc_open_default()) can be installed in the jump table directly, there's no reason you couldn't embed them within your own functions.
Here's an example of how you would do that with your own io_open handler:
int main (int argc, char **argv) { … /* install all of the default functions */ iofunc_func_init (_RESMGR_CONNECT_NFUNCS, &connect_funcs, _RESMGR_IO_NFUNCS, &io_funcs); /* take over the open function */ connect_funcs.open = io_open; … } int io_open (resmgr_context_t *ctp, io_open_t *msg, RESMGR_HANDLE_T *handle, void *extra) { return (iofunc_open_default (ctp, msg, handle, extra)); }
Obviously, this is just an incremental step that lets you gain control in your io_open handler when the message arrives from the client. You may wish to do something before or after the default function does its thing:
/* example of doing something before */ extern int accepting_opens_now; int io_open (resmgr_context_t *ctp, io_open_t *msg, RESMGR_HANDLE_T *handle, void *extra) { if (!accepting_opens_now) { return (EBUSY); } /* * at this point, we're okay to let the open happen, * so let the default function do the "work". */ return (iofunc_open_default (ctp, msg, handle, extra)); }
Or:
/* example of doing something after */ int io_open (resmgr_context_t *ctp, io_open_t *msg, RESMGR_HANDLE_T *handle, void *extra) { int sts; /* * have the default function do the checking * and the work for us */ sts = iofunc_open_default (ctp, msg, handle, extra); /* * if the default function says it's okay to let the open * happen, we want to log the request */ if (sts == EOK) { log_open_request (ctp, msg); } return (sts); }
It goes without saying that you can do something before and after the standard default POSIX handler.
The principal advantage of this approach is that you can add to the functionality of the standard default POSIX handlers with very little effort.