1 /* #pragma ident "@(#)g_dsp_name.c 1.13 04/02/23 SMI" */ 2 /* 3 * Copyright 1996 by Sun Microsystems, Inc. 4 * 5 * Permission to use, copy, modify, distribute, and sell this software 6 * and its documentation for any purpose is hereby granted without fee, 7 * provided that the above copyright notice appears in all copies and 8 * that both that copyright notice and this permission notice appear in 9 * supporting documentation, and that the name of Sun Microsystems not be used 10 * in advertising or publicity pertaining to distribution of the software 11 * without specific, written prior permission. Sun Microsystems makes no 12 * representations about the suitability of this software for any 13 * purpose. It is provided "as is" without express or implied warranty. 14 * 15 * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 16 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 17 * EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 18 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 19 * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 20 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 21 * PERFORMANCE OF THIS SOFTWARE. 22 */ 23 24 /* 25 * glue routine for gss_display_name() 26 * 27 */ 28 29 #include "mglueP.h" 30 #include <stdio.h> 31 #ifdef HAVE_STDLIB_H 32 #include <stdlib.h> 33 #endif 34 #include <string.h> 35 36 static OM_uint32 37 val_dsp_name_args( 38 OM_uint32 *minor_status, 39 gss_name_t input_name, 40 gss_buffer_t output_name_buffer, 41 gss_OID *output_name_type) 42 { 43 44 /* Initialize outputs. */ 45 46 if (minor_status != NULL) 47 *minor_status = 0; 48 49 if (output_name_buffer != GSS_C_NO_BUFFER) { 50 output_name_buffer->length = 0; 51 output_name_buffer->value = NULL; 52 } 53 54 if (output_name_type != NULL) 55 *output_name_type = GSS_C_NO_OID; 56 57 /* Validate arguments. */ 58 59 if (minor_status == NULL) 60 return (GSS_S_CALL_INACCESSIBLE_WRITE); 61 62 if (output_name_buffer == GSS_C_NO_BUFFER) 63 return (GSS_S_CALL_INACCESSIBLE_WRITE); 64 65 if (input_name == GSS_C_NO_NAME) 66 return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME); 67 68 return (GSS_S_COMPLETE); 69 } 70 71 72 OM_uint32 KRB5_CALLCONV 73 gss_display_name (minor_status, 74 input_name, 75 output_name_buffer, 76 output_name_type) 77 78 OM_uint32 * minor_status; 79 gss_name_t input_name; 80 gss_buffer_t output_name_buffer; 81 gss_OID * output_name_type; 82 83 { 84 OM_uint32 major_status; 85 gss_union_name_t union_name; 86 87 major_status = val_dsp_name_args(minor_status, input_name, 88 output_name_buffer, output_name_type); 89 if (major_status != GSS_S_COMPLETE) 90 return (major_status); 91 92 union_name = (gss_union_name_t) input_name; 93 94 if (union_name->mech_type) { 95 /* 96 * OK, we have a mechanism-specific name; let's use it! 97 */ 98 return (gssint_display_internal_name(minor_status, 99 union_name->mech_type, 100 union_name->mech_name, 101 output_name_buffer, 102 output_name_type)); 103 } 104 105 if ((output_name_buffer->value = 106 gssalloc_malloc(union_name->external_name->length + 1)) == NULL) 107 return (GSS_S_FAILURE); 108 output_name_buffer->length = union_name->external_name->length; 109 (void) memcpy(output_name_buffer->value, 110 union_name->external_name->value, 111 union_name->external_name->length); 112 ((char *)output_name_buffer->value)[output_name_buffer->length] = '\0'; 113 114 if (output_name_type != NULL) 115 *output_name_type = union_name->name_type; 116 117 return(GSS_S_COMPLETE); 118 } 119