]> git.decadent.org.uk Git - nfs-utils.git/blob - support/gssapi/g_inq_context.c
2005-08-26 Kevin Coffman <kwc@citi.umich.edu>
[nfs-utils.git] / support / gssapi / g_inq_context.c
1 /* #ident       "@(#)g_inquire_context.c 1.2     96/01/18 SMI" */
2
3 /*
4  * Copyright 1996 by Sun Microsystems, Inc.
5  *
6  * Permission to use, copy, modify, distribute, and sell this software
7  * and its documentation for any purpose is hereby granted without fee,
8  * provided that the above copyright notice appears in all copies and
9  * that both that copyright notice and this permission notice appear in
10  * supporting documentation, and that the name of Sun Microsystems not be used
11  * in advertising or publicity pertaining to distribution of the software
12  * without specific, written prior permission. Sun Microsystems makes no
13  * representations about the suitability of this software for any
14  * purpose.  It is provided "as is" without express or implied warranty.
15  *
16  * SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18  * EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
20  * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
21  * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22  * PERFORMANCE OF THIS SOFTWARE.
23  */
24
25 /*
26  *  glue routine for gss_inquire_context
27  */
28
29 #include "mglueP.h"
30 #ifdef HAVE_STDLIB_H
31 #include <stdlib.h>
32 #endif
33
34 /* Last argument new for V2 */
35 OM_uint32 KRB5_CALLCONV
36 gss_inquire_context(
37             minor_status,
38             context_handle,
39             src_name,
40             targ_name,
41             lifetime_rec,
42             mech_type,
43             ctx_flags,
44             locally_initiated,
45             open)
46
47 OM_uint32 *     minor_status;
48 gss_ctx_id_t    context_handle;
49 gss_name_t *    src_name;
50 gss_name_t *    targ_name;
51 OM_uint32 *     lifetime_rec;
52 gss_OID *       mech_type;
53 OM_uint32 *     ctx_flags;
54 int *           locally_initiated;
55 int *           open;
56
57
58 {
59     gss_union_ctx_id_t  ctx;
60     gss_mechanism       mech;
61     OM_uint32           status, temp_minor;
62
63     gss_initialize();
64
65     /* if the context_handle is Null, return NO_CONTEXT error */
66
67     if(context_handle == GSS_C_NO_CONTEXT)
68         return(GSS_S_NO_CONTEXT);
69
70     /*
71      * select the approprate underlying mechanism routine and
72      * call it.
73      */
74
75     ctx = (gss_union_ctx_id_t) context_handle;
76     mech = __gss_get_mechanism (ctx->mech_type);
77
78     if (!mech || !mech->gss_inquire_context || !mech->gss_display_name) {
79         return(GSS_S_NO_CONTEXT);
80
81     }
82
83     status = mech->gss_inquire_context(
84 #ifdef USE_MECH_CONTEXT
85                         mech->context,
86 #endif
87                         minor_status,
88                         ctx->internal_ctx_id,
89                         src_name,
90                         targ_name,
91                         lifetime_rec,
92                         mech_type,
93                         ctx_flags,
94                         locally_initiated,
95                         open);
96
97     if (status != GSS_S_COMPLETE) {
98         return status;
99     }
100
101     /* need to convert names */
102
103     if (src_name) {
104             status = __gss_convert_name_to_union_name(minor_status, mech,
105                                                       *src_name, src_name);
106
107             if (status != GSS_S_COMPLETE) {
108 #ifdef USE_MECH_CONTEXT
109                 (void) mech->gss_release_name(mech->context,
110 #else
111                 (void) mech->gss_release_name(
112 #endif
113                                                 &temp_minor, src_name);
114 #ifdef USE_MECH_CONTEXT
115                 (void) mech->gss_release_name(mech->context,
116 #else
117                 (void) mech->gss_release_name(
118 #endif
119                                                 &temp_minor, targ_name);
120                 if (mech_type) {
121                                 mech_gss_release_oid(&temp_minor, mech_type,
122                                                         mech);
123                 }
124                 return (GSS_S_FAILURE);
125             }
126
127     }
128
129     if (targ_name) {
130             status = __gss_convert_name_to_union_name(minor_status, mech,
131                                                       *targ_name, targ_name);
132
133             if (status != GSS_S_COMPLETE) {
134                 if (mech_type) {
135                         mech_gss_release_oid(&temp_minor, mech_type, mech);
136                 }
137                 return (GSS_S_FAILURE);
138             }
139     }
140
141     return(GSS_S_COMPLETE);
142 }
143