xref: /freebsd/crypto/krb5/src/lib/gssapi/mechglue/g_dsp_name.c (revision b670c9bafc0e31c7609969bf374b2e80bdc00211)
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