/** * Initialize a previously allocated error of type * GLOBUS_ERROR_TYPE_GSSAPI * @ingroup globus_gssapi_error_object * * @param error * The previously allocated error object. * @param base_source * Pointer to the originating module. * @param base_cause * The error object causing the error. If this is the original * error this paramater may be NULL. * @param major_status * The GSSAPI major status * @param minor_status * The GSSAPI minor status * @return * The resulting error object. You may have to call * globus_error_put() on this object before passing it on. */ globus_object_t * globus_error_initialize_gssapi_error( globus_object_t * error, globus_module_descriptor_t * base_source, globus_object_t * base_cause, const OM_uint32 major_status, const OM_uint32 minor_status) { globus_l_gssapi_error_data_t * instance_data; globus_object_t * minor_obj; gss_OID_set actual_mechs; OM_uint32 local_minor_status; extern gss_OID gss_mech_globus_gssapi_openssl; instance_data = (globus_l_gssapi_error_data_t *) malloc(sizeof(globus_l_gssapi_error_data_t)); instance_data->major_status = major_status; instance_data->minor_status = minor_status; instance_data->is_globus_gsi = GLOBUS_FALSE; if(gss_indicate_mechs( &local_minor_status, &actual_mechs) == GSS_S_COMPLETE) { int boolean; if(gss_test_oid_set_member( &local_minor_status, gss_mech_globus_gssapi_openssl, actual_mechs, &boolean) == GSS_S_COMPLETE && boolean) { instance_data->is_globus_gsi = GLOBUS_TRUE; } gss_release_oid_set(&local_minor_status, &actual_mechs); } if(instance_data->is_globus_gsi) { minor_obj = globus_error_get((globus_result_t) minor_status); if(!base_cause) { base_cause = minor_obj; } else if(minor_obj) { base_cause = globus_error_initialize_base( minor_obj, globus_error_get_source(base_cause), base_cause); } } globus_object_set_local_instance_data(error, instance_data); return globus_error_initialize_base(error, base_source, base_cause); }/* globus_error_initialize_gssapi_error() */
globus_result_t globus_i_gsi_cred_error_join_chains_result( globus_result_t outter_error, globus_result_t inner_error) { globus_result_t result; globus_object_t * result_error_obj = NULL; globus_object_t * outter_error_obj = NULL; globus_object_t * inner_error_obj = NULL; globus_object_t * temp_error_obj = NULL; static char * _function_name_ = "globus_i_gsi_cred_error_join_chains"; GLOBUS_I_GSI_CRED_DEBUG_ENTER; outter_error_obj = globus_error_get(outter_error); inner_error_obj = globus_error_get(inner_error); if(outter_error_obj && inner_error_obj) { temp_error_obj = outter_error_obj; while(globus_error_get_cause(temp_error_obj)) { temp_error_obj = globus_error_get_cause(temp_error_obj); } temp_error_obj = globus_error_initialize_base(temp_error_obj, globus_error_get_source(temp_error_obj), inner_error_obj); result_error_obj = outter_error_obj; } else if(inner_error_obj) { result_error_obj = inner_error_obj; } else { result_error_obj = globus_error_construct_error( GLOBUS_GSI_CREDENTIAL_MODULE, NULL, GLOBUS_GSI_CRED_ERROR_CREATING_ERROR_OBJ, __FILE__, _function_name_, __LINE__, "Couldn't join inner and outer error chains"); } result = globus_error_put(result_error_obj); GLOBUS_I_GSI_CRED_DEBUG_EXIT; return result; }
globus_object_t * globus_error_construct_base (globus_module_descriptor_t * source_module, globus_object_t * causal_error) { globus_object_t * newerror; globus_object_t * initerror; newerror = globus_object_construct (GLOBUS_ERROR_TYPE_BASE); initerror = globus_error_initialize_base (newerror, source_module, causal_error); if ( initerror == NULL ) { if ( newerror != NULL ) { globus_object_free (newerror); } } return initerror; }
globus_object_t * globus_i_ftp_client_wrap_ftp_error( globus_module_descriptor_t * base_source, int code, const char * message, int error_type, const char * source_file, const char * source_func, int source_line, const char * format, ...) { va_list ap; globus_object_t * error; globus_object_t * causal_error; globus_l_error_ftp_data_t * data; causal_error = globus_object_construct(GLOBUS_ERROR_TYPE_FTP); if(!causal_error) { goto error_object; } data = (globus_l_error_ftp_data_t *) globus_malloc(sizeof(globus_l_error_ftp_data_t)); if(!data) { goto error_data; } data->code = code; data->message = globus_libc_strdup(message); globus_object_set_local_instance_data(causal_error, data); globus_error_initialize_base(causal_error, base_source, NULL); va_start(ap, format); error = globus_error_v_construct_error( base_source, causal_error, error_type, source_file, source_func, source_line, format, ap); va_end(ap); if(!error) { goto error_construct; } return error; error_construct: error_data: globus_object_free(causal_error); error_object: return NULL; }