diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2013-11-30 17:32:01 +0100 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2013-12-02 17:31:14 +0100 |
commit | 9cec7a2482a68ca1ae41d65fc8b94584d5020c3f (patch) | |
tree | 13431f2c926785ba5d18c9622372b99f0b4849cb /pfinet | |
parent | 89c0598d4c1c414c7c567995fd1d0e569fee3d08 (diff) |
pfinet: improve the pfinet_demuxer function
Handle multiple request types as recommended by the Mach Server
Writer's Guide section 4, subsection "Handling Multiple Request
Types". This avoids initializing the reply message in every X_server
function. The reply message has already been properly initialized in
libports, so there is no need to call mig_reply_setup.
* pfinet/main.c (pfinet_demuxer): Improve the demuxer function.
Diffstat (limited to 'pfinet')
-rw-r--r-- | pfinet/main.c | 52 |
1 files changed, 35 insertions, 17 deletions
diff --git a/pfinet/main.c b/pfinet/main.c index c9527195..dce16005 100644 --- a/pfinet/main.c +++ b/pfinet/main.c @@ -77,11 +77,11 @@ pfinet_demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp) { struct port_info *pi; - extern int io_server (mach_msg_header_t *, mach_msg_header_t *); - extern int socket_server (mach_msg_header_t *, mach_msg_header_t *); - extern int startup_notify_server (mach_msg_header_t *, mach_msg_header_t *); - extern int pfinet_server (mach_msg_header_t *, mach_msg_header_t *); - extern int iioctl_server (mach_msg_header_t *, mach_msg_header_t *); + mig_routine_t io_server_routine (mach_msg_header_t *); + mig_routine_t socket_server_routine (mach_msg_header_t *); + mig_routine_t pfinet_server_routine (mach_msg_header_t *); + mig_routine_t iioctl_server_routine (mach_msg_header_t *); + mig_routine_t startup_notify_server_routine (mach_msg_header_t *); /* We have several classes in one bucket, which need to be demuxed differently. */ @@ -90,20 +90,38 @@ pfinet_demuxer (mach_msg_header_t *inp, if (pi) { ports_port_deref (pi); - - return (io_server (inp, outp) - || socket_server (inp, outp) - || pfinet_server (inp, outp) - || iioctl_server (inp, outp) - || trivfs_demuxer (inp, outp) - || startup_notify_server (inp, outp)); + + mig_routine_t routine; + if ((routine = io_server_routine (inp)) || + (routine = socket_server_routine (inp)) || + (routine = pfinet_server_routine (inp)) || + (routine = iioctl_server_routine (inp)) || + (routine = NULL, trivfs_demuxer (inp, outp)) || + (routine = startup_notify_server_routine (inp))) + { + if (routine) + (*routine) (inp, outp); + return TRUE; + } + else + return FALSE; } else - return (socket_server (inp, outp) - || pfinet_server (inp, outp) - || iioctl_server (inp, outp) - || trivfs_demuxer (inp, outp) - || startup_notify_server (inp, outp)); + { + mig_routine_t routine; + if ((routine = socket_server_routine (inp)) || + (routine = pfinet_server_routine (inp)) || + (routine = iioctl_server_routine (inp)) || + (routine = NULL, trivfs_demuxer (inp, outp)) || + (routine = startup_notify_server_routine (inp))) + { + if (routine) + (*routine) (inp, outp); + return TRUE; + } + else + return FALSE; + } } /* The system is going down; destroy all the extant port rights. That |