diff options
Diffstat (limited to 'src/ccapi/lib/ccapi_context.c')
-rw-r--r-- | src/ccapi/lib/ccapi_context.c | 295 |
1 files changed, 147 insertions, 148 deletions
diff --git a/src/ccapi/lib/ccapi_context.c b/src/ccapi/lib/ccapi_context.c index 9b1d05dc83..da8aa59f08 100644 --- a/src/ccapi/lib/ccapi_context.c +++ b/src/ccapi/lib/ccapi_context.c @@ -49,15 +49,15 @@ typedef struct cci_context_d { /* ------------------------------------------------------------------------ */ -struct cci_context_d cci_context_initializer = { - NULL +struct cci_context_d cci_context_initializer = { + NULL VECTOR_FUNCTIONS_INITIALIZER, NULL, 0, 0 }; -cc_context_f cci_context_f_initializer = { +cc_context_f cci_context_f_initializer = { ccapi_context_release, ccapi_context_get_change_time, ccapi_context_get_default_ccache_name, @@ -73,7 +73,7 @@ cc_context_f cci_context_f_initializer = { ccapi_context_wait_for_change }; -static cc_int32 cci_context_sync (cci_context_t in_context, +static cc_int32 cci_context_sync (cci_context_t in_context, cc_uint32 in_launch); #ifdef TARGET_OS_MAC @@ -88,19 +88,19 @@ MAKE_FINI_FUNCTION(cci_thread_fini); static int cci_thread_init (void) { cc_int32 err = ccNoError; - + if (!err) { err = cci_context_change_time_thread_init (); } - + if (!err) { err = cci_ipc_thread_init (); } - + if (!err) { add_error_table (&et_CAPI_error_table); } - + return err; } @@ -111,7 +111,7 @@ static void cci_thread_fini (void) if (!INITIALIZER_RAN (cci_thread_init) || PROGRAM_EXITING ()) { return; } - + remove_error_table(&et_CAPI_error_table); cci_context_change_time_thread_fini (); cci_ipc_thread_fini (); @@ -132,64 +132,64 @@ cc_int32 cc_initialize (cc_context_t *out_context, cc_int32 err = ccNoError; cci_context_t context = NULL; static char *vendor_string = "MIT Kerberos CCAPI"; - + if (!out_context) { err = cci_check_error (ccErrBadParam); } - + if (!err) { err = CALL_INIT_FUNCTION (cci_thread_init); } - + if (!err) { - switch (in_version) { - case ccapi_version_2: + switch (in_version) { + case ccapi_version_2: case ccapi_version_3: case ccapi_version_4: case ccapi_version_5: case ccapi_version_6: case ccapi_version_7: break; - - default: + + default: err = ccErrBadAPIVersion; break; } } - + if (!err) { context = malloc (sizeof (*context)); - if (context) { + if (context) { *context = cci_context_initializer; - } else { - err = cci_check_error (ccErrNoMem); + } else { + err = cci_check_error (ccErrNoMem); } } - + if (!err) { context->functions = malloc (sizeof (*context->functions)); - if (context->functions) { + if (context->functions) { *context->functions = cci_context_f_initializer; - } else { - err = cci_check_error (ccErrNoMem); + } else { + err = cci_check_error (ccErrNoMem); } } - + if (!err) { context->identifier = cci_identifier_uninitialized; *out_context = (cc_context_t) context; context = NULL; /* take ownership */ - + if (out_supported_version) { *out_supported_version = ccapi_version_max; } - + if (out_vendor) { *out_vendor = vendor_string; } } - + ccapi_context_release ((cc_context_t) context); - + return cci_check_error (err); } @@ -198,30 +198,30 @@ cc_int32 cc_initialize (cc_context_t *out_context, #endif /* ------------------------------------------------------------------------ */ -/* - * Currently does not need to talk to the server since the server must - * handle cleaning up resources from crashed clients anyway. - * - * NOTE: if server communication is ever added here, make sure that +/* + * Currently does not need to talk to the server since the server must + * handle cleaning up resources from crashed clients anyway. + * + * NOTE: if server communication is ever added here, make sure that * krb5_stdcc_shutdown calls an internal function which does not talk to the - * server. krb5_stdcc_shutdown is called from thread fini functions and may - * crash talking to the server depending on what order the OS calls the fini - * functions (ie: if the ipc layer fini function is called first). + * server. krb5_stdcc_shutdown is called from thread fini functions and may + * crash talking to the server depending on what order the OS calls the fini + * functions (ie: if the ipc layer fini function is called first). */ cc_int32 ccapi_context_release (cc_context_t in_context) { cc_int32 err = ccNoError; cci_context_t context = (cci_context_t) in_context; - + if (!in_context) { err = ccErrBadParam; } - + if (!err) { cci_identifier_release (context->identifier); free (context->functions); free (context); } - + return err; } @@ -233,10 +233,10 @@ cc_int32 ccapi_context_get_change_time (cc_context_t in_context, cc_int32 err = ccNoError; cci_context_t context = (cci_context_t) in_context; k5_ipc_stream reply = NULL; - + if (!in_context ) { err = cci_check_error (ccErrBadParam); } if (!out_change_time) { err = cci_check_error (ccErrBadParam); } - + if (!err) { err = cci_context_sync (context, 0); } @@ -246,25 +246,25 @@ cc_int32 ccapi_context_get_change_time (cc_context_t in_context, context->identifier, NULL, &reply); } - + if (!err && krb5int_ipc_stream_size (reply) > 0) { cc_time_t change_time = 0; - + /* got a response from the server */ err = krb5int_ipc_stream_read_time (reply, &change_time); - + if (!err) { err = cci_context_change_time_update (context->identifier, change_time); } } - + if (!err) { err = cci_context_change_time_get (out_change_time); } - + krb5int_ipc_stream_release (reply); - + return cci_check_error (err); } @@ -276,13 +276,13 @@ cc_int32 ccapi_context_wait_for_change (cc_context_t in_context) cci_context_t context = (cci_context_t) in_context; k5_ipc_stream request = NULL; k5_ipc_stream reply = NULL; - + if (!in_context) { err = cci_check_error (ccErrBadParam); } - + if (!err) { err = krb5int_ipc_stream_new (&request); } - + if (!err) { err = krb5int_ipc_stream_write_time (request, context->last_wait_for_change_time); } @@ -290,18 +290,18 @@ cc_int32 ccapi_context_wait_for_change (cc_context_t in_context) if (!err) { err = cci_context_sync (context, 1); } - + if (!err) { err = cci_ipc_send (cci_context_wait_for_change_msg_id, context->identifier, - request, + request, &reply); } if (!err) { err = krb5int_ipc_stream_read_time (reply, &context->last_wait_for_change_time); } - + krb5int_ipc_stream_release (request); krb5int_ipc_stream_release (reply); @@ -318,26 +318,26 @@ cc_int32 ccapi_context_get_default_ccache_name (cc_context_t in_context, k5_ipc_stream reply = NULL; char *reply_name = NULL; char *name = NULL; - + if (!in_context) { err = cci_check_error (ccErrBadParam); } if (!out_name ) { err = cci_check_error (ccErrBadParam); } - + if (!err) { err = cci_context_sync (context, 0); } - + if (!err) { err = cci_ipc_send_no_launch (cci_context_get_default_ccache_name_msg_id, context->identifier, NULL, &reply); } - + if (!err) { if (krb5int_ipc_stream_size (reply) > 0) { /* got a response from the server */ err = krb5int_ipc_stream_read_string (reply, &reply_name); - + if (!err) { name = reply_name; } @@ -345,14 +345,14 @@ cc_int32 ccapi_context_get_default_ccache_name (cc_context_t in_context, name = k_cci_context_initial_ccache_name; } } - + if (!err) { err = cci_string_new (out_name, name); } - + krb5int_ipc_stream_release (reply); krb5int_ipc_stream_free_string (reply_name); - + return cci_check_error (err); } @@ -367,46 +367,46 @@ cc_int32 ccapi_context_open_ccache (cc_context_t in_context, k5_ipc_stream request = NULL; k5_ipc_stream reply = NULL; cci_identifier_t identifier = NULL; - + if (!in_context ) { err = cci_check_error (ccErrBadParam); } if (!in_name ) { err = cci_check_error (ccErrBadParam); } if (!out_ccache ) { err = cci_check_error (ccErrBadParam); } - + if (!err) { err = krb5int_ipc_stream_new (&request); } - + if (!err) { err = krb5int_ipc_stream_write_string (request, in_name); } - + if (!err) { err = cci_context_sync (context, 0); } - + if (!err) { err = cci_ipc_send_no_launch (cci_context_open_ccache_msg_id, context->identifier, request, &reply); } - + if (!err && !(krb5int_ipc_stream_size (reply) > 0)) { err = ccErrCCacheNotFound; } - + if (!err) { err = cci_identifier_read (&identifier, reply); } - + if (!err) { err = cci_ccache_new (out_ccache, identifier); } - + cci_identifier_release (identifier); krb5int_ipc_stream_release (reply); krb5int_ipc_stream_release (request); - + return cci_check_error (err); } @@ -419,36 +419,36 @@ cc_int32 ccapi_context_open_default_ccache (cc_context_t in_context, cci_context_t context = (cci_context_t) in_context; k5_ipc_stream reply = NULL; cci_identifier_t identifier = NULL; - + if (!in_context) { err = cci_check_error (ccErrBadParam); } if (!out_ccache) { err = cci_check_error (ccErrBadParam); } - + if (!err) { err = cci_context_sync (context, 0); } - + if (!err) { err = cci_ipc_send_no_launch (cci_context_open_default_ccache_msg_id, context->identifier, NULL, &reply); } - + if (!err && !(krb5int_ipc_stream_size (reply) > 0)) { err = ccErrCCacheNotFound; } - + if (!err) { err = cci_identifier_read (&identifier, reply); } - + if (!err) { err = cci_ccache_new (out_ccache, identifier); } - + cci_identifier_release (identifier); krb5int_ipc_stream_release (reply); - + return cci_check_error (err); } @@ -457,7 +457,7 @@ cc_int32 ccapi_context_open_default_ccache (cc_context_t in_context, cc_int32 ccapi_context_create_ccache (cc_context_t in_context, const char *in_name, cc_uint32 in_cred_vers, - const char *in_principal, + const char *in_principal, cc_ccache_t *out_ccache) { cc_int32 err = ccNoError; @@ -465,51 +465,51 @@ cc_int32 ccapi_context_create_ccache (cc_context_t in_context, k5_ipc_stream request = NULL; k5_ipc_stream reply = NULL; cci_identifier_t identifier = NULL; - + if (!in_context ) { err = cci_check_error (ccErrBadParam); } if (!in_name ) { err = cci_check_error (ccErrBadParam); } if (!in_principal) { err = cci_check_error (ccErrBadParam); } if (!out_ccache ) { err = cci_check_error (ccErrBadParam); } - + if (!err) { err = krb5int_ipc_stream_new (&request); } - + if (!err) { err = krb5int_ipc_stream_write_string (request, in_name); } - + if (!err) { err = krb5int_ipc_stream_write_uint32 (request, in_cred_vers); } - + if (!err) { err = krb5int_ipc_stream_write_string (request, in_principal); } - + if (!err) { err = cci_context_sync (context, 1); } - + if (!err) { err = cci_ipc_send (cci_context_create_ccache_msg_id, context->identifier, request, &reply); } - + if (!err) { err = cci_identifier_read (&identifier, reply); } - + if (!err) { err = cci_ccache_new (out_ccache, identifier); } - + cci_identifier_release (identifier); krb5int_ipc_stream_release (reply); krb5int_ipc_stream_release (request); - + return cci_check_error (err); } @@ -517,7 +517,7 @@ cc_int32 ccapi_context_create_ccache (cc_context_t in_context, cc_int32 ccapi_context_create_default_ccache (cc_context_t in_context, cc_uint32 in_cred_vers, - const char *in_principal, + const char *in_principal, cc_ccache_t *out_ccache) { cc_int32 err = ccNoError; @@ -525,46 +525,46 @@ cc_int32 ccapi_context_create_default_ccache (cc_context_t in_context, k5_ipc_stream request = NULL; k5_ipc_stream reply = NULL; cci_identifier_t identifier = NULL; - + if (!in_context ) { err = cci_check_error (ccErrBadParam); } if (!in_principal) { err = cci_check_error (ccErrBadParam); } if (!out_ccache ) { err = cci_check_error (ccErrBadParam); } - + if (!err) { err = krb5int_ipc_stream_new (&request); } - + if (!err) { err = krb5int_ipc_stream_write_uint32 (request, in_cred_vers); } - + if (!err) { err = krb5int_ipc_stream_write_string (request, in_principal); } - + if (!err) { err = cci_context_sync (context, 1); } - + if (!err) { err = cci_ipc_send (cci_context_create_default_ccache_msg_id, context->identifier, request, &reply); } - + if (!err) { err = cci_identifier_read (&identifier, reply); } - + if (!err) { err = cci_ccache_new (out_ccache, identifier); } - + cci_identifier_release (identifier); krb5int_ipc_stream_release (reply); krb5int_ipc_stream_release (request); - + return cci_check_error (err); } @@ -572,7 +572,7 @@ cc_int32 ccapi_context_create_default_ccache (cc_context_t in_context, cc_int32 ccapi_context_create_new_ccache (cc_context_t in_context, cc_uint32 in_cred_vers, - const char *in_principal, + const char *in_principal, cc_ccache_t *out_ccache) { cc_int32 err = ccNoError; @@ -580,46 +580,46 @@ cc_int32 ccapi_context_create_new_ccache (cc_context_t in_context, k5_ipc_stream request = NULL; k5_ipc_stream reply = NULL; cci_identifier_t identifier = NULL; - + if (!in_context ) { err = cci_check_error (ccErrBadParam); } if (!in_principal) { err = cci_check_error (ccErrBadParam); } if (!out_ccache ) { err = cci_check_error (ccErrBadParam); } - + if (!err) { err = krb5int_ipc_stream_new (&request); } - + if (!err) { err = krb5int_ipc_stream_write_uint32 (request, in_cred_vers); } - + if (!err) { err = krb5int_ipc_stream_write_string (request, in_principal); } - + if (!err) { err = cci_context_sync (context, 1); } - + if (!err) { err = cci_ipc_send (cci_context_create_new_ccache_msg_id, context->identifier, request, &reply); } - + if (!err) { err = cci_identifier_read (&identifier, reply); } - + if (!err) { err = cci_ccache_new (out_ccache, identifier); } - + cci_identifier_release (identifier); krb5int_ipc_stream_release (reply); krb5int_ipc_stream_release (request); - + return cci_check_error (err); } @@ -632,21 +632,21 @@ cc_int32 ccapi_context_new_ccache_iterator (cc_context_t in_context, cci_context_t context = (cci_context_t) in_context; k5_ipc_stream reply = NULL; cci_identifier_t identifier = NULL; - + if (!in_context ) { err = cci_check_error (ccErrBadParam); } if (!out_iterator) { err = cci_check_error (ccErrBadParam); } - + if (!err) { err = cci_context_sync (context, 0); } - + if (!err) { err = cci_ipc_send_no_launch (cci_context_new_ccache_iterator_msg_id, context->identifier, NULL, &reply); } - + if (!err) { if (krb5int_ipc_stream_size (reply) > 0) { err = cci_identifier_read (&identifier, reply); @@ -654,7 +654,7 @@ cc_int32 ccapi_context_new_ccache_iterator (cc_context_t in_context, identifier = cci_identifier_uninitialized; } } - + if (!err) { err = cci_ccache_iterator_new (out_iterator, identifier); } @@ -674,34 +674,34 @@ cc_int32 ccapi_context_lock (cc_context_t in_context, cc_int32 err = ccNoError; cci_context_t context = (cci_context_t) in_context; k5_ipc_stream request = NULL; - + if (!in_context) { err = cci_check_error (ccErrBadParam); } - + if (!err) { err = krb5int_ipc_stream_new (&request); } - + if (!err) { err = krb5int_ipc_stream_write_uint32 (request, in_lock_type); } - + if (!err) { err = krb5int_ipc_stream_write_uint32 (request, in_block); } - + if (!err) { err = cci_context_sync (context, 1); } - + if (!err) { err = cci_ipc_send (cci_context_lock_msg_id, context->identifier, request, NULL); } - + krb5int_ipc_stream_release (request); - + return cci_check_error (err); } @@ -711,20 +711,20 @@ cc_int32 ccapi_context_unlock (cc_context_t in_context) { cc_int32 err = ccNoError; cci_context_t context = (cci_context_t) in_context; - + if (!in_context) { err = cci_check_error (ccErrBadParam); } - + if (!err) { err = cci_context_sync (context, 1); } - + if (!err) { err = cci_ipc_send (cci_context_unlock_msg_id, context->identifier, NULL, NULL); } - + return cci_check_error (err); } @@ -737,27 +737,27 @@ cc_int32 ccapi_context_compare (cc_context_t in_context, cc_int32 err = ccNoError; cci_context_t context = (cci_context_t) in_context; cci_context_t compare_to_context = (cci_context_t) in_compare_to_context; - + if (!in_context ) { err = cci_check_error (ccErrBadParam); } if (!in_compare_to_context) { err = cci_check_error (ccErrBadParam); } if (!out_equal ) { err = cci_check_error (ccErrBadParam); } - + if (!err) { err = cci_context_sync (context, 0); } - + if (!err) { err = cci_context_sync (compare_to_context, 0); } - + if (!err) { - /* If both contexts can't talk to the server, then + /* If both contexts can't talk to the server, then * we assume they are equivalent */ - err = cci_identifier_compare (context->identifier, + err = cci_identifier_compare (context->identifier, compare_to_context->identifier, out_equal); } - + return cci_check_error (err); } @@ -767,16 +767,16 @@ cc_int32 ccapi_context_compare (cc_context_t in_context, /* ------------------------------------------------------------------------ */ -static cc_int32 cci_context_sync (cci_context_t in_context, +static cc_int32 cci_context_sync (cci_context_t in_context, cc_uint32 in_launch) { cc_int32 err = ccNoError; cci_context_t context = (cci_context_t) in_context; k5_ipc_stream reply = NULL; cci_identifier_t new_identifier = NULL; - + if (!in_context) { err = cci_check_error (ccErrBadParam); } - + if (!err) { /* Use the uninitialized identifier because we may be talking */ /* to a different server which would reject our identifier and */ @@ -793,7 +793,7 @@ static cc_int32 cci_context_sync (cci_context_t in_context, &reply); } } - + if (!err) { if (krb5int_ipc_stream_size (reply) > 0) { err = cci_identifier_read (&new_identifier, reply); @@ -801,7 +801,7 @@ static cc_int32 cci_context_sync (cci_context_t in_context, new_identifier = cci_identifier_uninitialized; } } - + if (!err) { cc_uint32 equal = 0; @@ -815,20 +815,19 @@ static cc_int32 cci_context_sync (cci_context_t in_context, new_identifier = NULL; /* take ownership */ } } - + if (!err && context->synchronized) { err = cci_context_change_time_sync (context->identifier); } - + if (!err && !context->synchronized) { /* Keep state about whether this is the first call to avoid always */ /* modifying the global change time on the context's first ipc call. */ context->synchronized = 1; } - + cci_identifier_release (new_identifier); krb5int_ipc_stream_release (reply); - + return cci_check_error (err); } - |