diff options
author | Alexandra Ellwood <lxs@mit.edu> | 2008-09-30 21:23:17 +0000 |
---|---|---|
committer | Alexandra Ellwood <lxs@mit.edu> | 2008-09-30 21:23:17 +0000 |
commit | 89db2820d03f280d0bf0e217d520e89c2bb8acd2 (patch) | |
tree | baf4c5e5930974bf928509aea9d511d947b623f2 /src/ccapi/server/mac | |
parent | 6b6d24e1ae0aadffb9062ac94ae8e600e09dbef0 (diff) | |
download | krb5-89db2820d03f280d0bf0e217d520e89c2bb8acd2.tar.gz krb5-89db2820d03f280d0bf0e217d520e89c2bb8acd2.tar.xz krb5-89db2820d03f280d0bf0e217d520e89c2bb8acd2.zip |
CCAPI should use common ipc and stream code
KIM and CCAPI should share the same IPC and stream object types.
Modified CCAPI to use code in src/util (stream) and src/util/mac (ipc)
ticket: new
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@20787 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/ccapi/server/mac')
-rw-r--r-- | src/ccapi/server/mac/ccs_os_server.c | 174 |
1 files changed, 17 insertions, 157 deletions
diff --git a/src/ccapi/server/mac/ccs_os_server.c b/src/ccapi/server/mac/ccs_os_server.c index c99547fe87..98bc6b30a8 100644 --- a/src/ccapi/server/mac/ccs_os_server.c +++ b/src/ccapi/server/mac/ccs_os_server.c @@ -27,118 +27,33 @@ #include "ccs_common.h" #include <syslog.h> -#include <Kerberos/kipc_server.h> -#include "cci_mig_requestServer.h" -#include "cci_mig_reply.h" +#include "k5_mig_server.h" #include "ccs_os_server.h" - /* ------------------------------------------------------------------------ */ -static boolean_t ccs_server_demux (mach_msg_header_t *request, - mach_msg_header_t *reply) +int32_t k5_ipc_server_add_client (mach_port_t in_client_port) { - boolean_t handled = false; - - if (!handled) { - handled = ccs_server (request, reply); - } - - if (!handled && request->msgh_id == MACH_NOTIFY_NO_SENDERS) { - kern_return_t err = KERN_SUCCESS; - - err = ccs_server_remove_client (request->msgh_local_port); - - if (!err) { - /* Check here for a client in our table and free rights associated with it */ - err = mach_port_mod_refs (mach_task_self (), request->msgh_local_port, - MACH_PORT_RIGHT_RECEIVE, -1); - } - - if (!err) { - handled = 1; /* was a port we are tracking */ - } - - cci_check_error (err); - } - - return handled; + return cci_check_error (ccs_server_add_client (in_client_port)); } /* ------------------------------------------------------------------------ */ -kern_return_t ccs_mipc_create_client_connection (mach_port_t in_server_port, - mach_port_t *out_connection_port) +int32_t k5_ipc_server_remove_client (mach_port_t in_client_port) { - kern_return_t err = KERN_SUCCESS; - mach_port_t connection_port = MACH_PORT_NULL; - mach_port_t old_notification_target = MACH_PORT_NULL; - - if (!err) { - err = mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_RECEIVE, &connection_port); - } - - if (!err) { - err = mach_port_move_member (mach_task_self (), connection_port, kipc_server_get_listen_portset ()); - } - - if (!err) { - /* request no-senders notification so we can tell when client quits/crashes */ - err = mach_port_request_notification (mach_task_self (), connection_port, - MACH_NOTIFY_NO_SENDERS, 1, connection_port, - MACH_MSG_TYPE_MAKE_SEND_ONCE, &old_notification_target ); - } - - if (!err) { - err = ccs_server_add_client (connection_port); - } - - if (!err) { - *out_connection_port = connection_port; - connection_port = MACH_PORT_NULL; - } - - if (MACH_PORT_VALID (connection_port)) { mach_port_deallocate (mach_task_self (), connection_port); } - - return cci_check_error (err); + return cci_check_error (ccs_server_remove_client (in_client_port)); } + /* ------------------------------------------------------------------------ */ -kern_return_t ccs_mipc_request (mach_port_t in_connection_port, - mach_port_t in_reply_port, - cci_mipc_inl_request_t in_inl_request, - mach_msg_type_number_t in_inl_requestCnt, - cci_mipc_ool_request_t in_ool_request, - mach_msg_type_number_t in_ool_requestCnt) +kern_return_t k5_ipc_server_handle_request (mach_port_t in_connection_port, + mach_port_t in_reply_port, + k5_ipc_stream in_request_stream) { - kern_return_t err = KERN_SUCCESS; - cci_stream_t request_stream = NULL; - - if (!err) { - err = cci_stream_new (&request_stream); - } - - if (!err) { - if (in_inl_requestCnt) { - err = cci_stream_write (request_stream, in_inl_request, in_inl_requestCnt); - - } else if (in_ool_requestCnt) { - err = cci_stream_write (request_stream, in_ool_request, in_ool_requestCnt); - - } else { - err = cci_check_error (ccErrBadInternalMessage); - } - } - - if (!err) { - err = ccs_server_handle_request (in_connection_port, in_reply_port, request_stream); - } - - cci_stream_release (request_stream); - if (in_ool_requestCnt) { vm_deallocate (mach_task_self (), (vm_address_t) in_ool_request, in_ool_requestCnt); } - - return cci_check_error (err); + return cci_check_error (ccs_server_handle_request (in_connection_port, + in_reply_port, + in_request_stream)); } #pragma mark - @@ -152,8 +67,6 @@ cc_int32 ccs_os_server_initialize (int argc, const char *argv[]) openlog (argv[0], LOG_CONS | LOG_PID, LOG_AUTH); syslog (LOG_INFO, "Starting up."); - syslog (LOG_NOTICE, "Exiting: %s (%d)", kipc_error_string (err), err); - return cci_check_error (err); } @@ -163,10 +76,7 @@ cc_int32 ccs_os_server_cleanup (int argc, const char *argv[]) { cc_int32 err = 0; - openlog (argv[0], LOG_CONS | LOG_PID, LOG_AUTH); - syslog (LOG_INFO, "Starting up."); - - syslog (LOG_NOTICE, "Exiting: %s (%d)", kipc_error_string (err), err); + syslog (LOG_NOTICE, "Exiting."); return cci_check_error (err); } @@ -175,64 +85,14 @@ cc_int32 ccs_os_server_cleanup (int argc, const char *argv[]) cc_int32 ccs_os_server_listen_loop (int argc, const char *argv[]) { - /* Run the Mach IPC listen loop. - * This will call ccs_mipc_create_client_connection for new clients - * and ccs_mipc_request for existing clients */ - - return cci_check_error (kipc_server_run_server (ccs_server_demux)); + return cci_check_error (k5_ipc_server_listen_loop ()); } /* ------------------------------------------------------------------------ */ cc_int32 ccs_os_server_send_reply (ccs_pipe_t in_reply_pipe, - cci_stream_t in_reply_stream) + k5_ipc_stream in_reply_stream) { - kern_return_t err = KERN_SUCCESS; - cci_mipc_inl_reply_t inl_reply; - mach_msg_type_number_t inl_reply_length = 0; - cci_mipc_ool_reply_t ool_reply = NULL; - mach_msg_type_number_t ool_reply_length = 0; - - if (!ccs_pipe_valid (in_reply_pipe)) { err = cci_check_error (ccErrBadParam); } - if (!in_reply_stream ) { err = cci_check_error (ccErrBadParam); } - - if (!err) { - /* depending on how big the message is, use the fast inline buffer or - * the slow dynamically allocated buffer */ - mach_msg_type_number_t reply_length = cci_stream_size (in_reply_stream); - - if (reply_length > kCCAPIMaxILMsgSize) { - cci_debug_printf ("%s choosing out of line buffer (size is %d)", - __FUNCTION__, reply_length); - - err = vm_read (mach_task_self (), - (vm_address_t) cci_stream_data (in_reply_stream), reply_length, - (vm_address_t *) &ool_reply, &ool_reply_length); - cci_check_error (err); - - } else { - //cci_debug_printf ("%s choosing in line buffer (size is %d)", - // __FUNCTION__, reply_length); - - inl_reply_length = reply_length; - memcpy (inl_reply, cci_stream_data (in_reply_stream), reply_length); - } - } - - if (!err) { - err = ccs_mipc_reply (in_reply_pipe, - inl_reply, inl_reply_length, - ool_reply, ool_reply_length); - cci_check_error (err); - } - - if (!err) { - /* Because we use ",dealloc" ool_reply will be freed by mach. Don't double free it. */ - ool_reply = NULL; - ool_reply_length = 0; - } - - if (ool_reply_length) { vm_deallocate (mach_task_self (), (vm_address_t) ool_reply, ool_reply_length); } - - return cci_check_error (err); + return cci_check_error (k5_ipc_server_send_reply (in_reply_pipe, + in_reply_stream)); } |