1226031Sstas/*
2226031Sstas * Copyright (c) 2010, PADL Software Pty Ltd.
3226031Sstas * All rights reserved.
4226031Sstas *
5226031Sstas * Redistribution and use in source and binary forms, with or without
6226031Sstas * modification, are permitted provided that the following conditions
7226031Sstas * are met:
8226031Sstas *
9226031Sstas * 1. Redistributions of source code must retain the above copyright
10226031Sstas *    notice, this list of conditions and the following disclaimer.
11226031Sstas *
12226031Sstas * 2. Redistributions in binary form must reproduce the above copyright
13226031Sstas *    notice, this list of conditions and the following disclaimer in the
14226031Sstas *    documentation and/or other materials provided with the distribution.
15226031Sstas *
16226031Sstas * 3. Neither the name of PADL Software nor the names of its contributors
17226031Sstas *    may be used to endorse or promote products derived from this software
18226031Sstas *    without specific prior written permission.
19226031Sstas *
20226031Sstas * THIS SOFTWARE IS PROVIDED BY PADL SOFTWARE AND CONTRIBUTORS ``AS IS'' AND
21226031Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22226031Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23226031Sstas * ARE DISCLAIMED.  IN NO EVENT SHALL PADL SOFTWARE OR CONTRIBUTORS BE LIABLE
24226031Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25226031Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26226031Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27226031Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28226031Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29226031Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30226031Sstas * SUCH DAMAGE.
31226031Sstas */
32226031Sstas
33226031Sstas#include "mech_locl.h"
34226031Sstas
35226031SstasGSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL
36226031Sstasgss_inquire_name(OM_uint32 *minor_status,
37226031Sstas		 gss_name_t input_name,
38226031Sstas		 int *name_is_MN,
39226031Sstas		 gss_OID *MN_mech,
40226031Sstas		 gss_buffer_set_t *attrs)
41226031Sstas{
42226031Sstas    OM_uint32 major_status = GSS_S_UNAVAILABLE;
43226031Sstas    struct _gss_name *name = (struct _gss_name *) input_name;
44226031Sstas    struct _gss_mechanism_name *mn;
45226031Sstas
46226031Sstas    *minor_status = 0;
47226031Sstas    if (name_is_MN != NULL)
48226031Sstas        *name_is_MN = 0;
49226031Sstas    if (MN_mech != NULL)
50226031Sstas        *MN_mech = GSS_C_NO_OID;
51226031Sstas    if (attrs != NULL)
52226031Sstas        *attrs = GSS_C_NO_BUFFER_SET;
53226031Sstas
54226031Sstas    if (input_name == GSS_C_NO_NAME)
55226031Sstas        return GSS_S_BAD_NAME;
56226031Sstas
57226031Sstas    HEIM_SLIST_FOREACH(mn, &name->gn_mn, gmn_link) {
58226031Sstas        gssapi_mech_interface m = mn->gmn_mech;
59226031Sstas
60226031Sstas        if (!m->gm_inquire_name)
61226031Sstas            continue;
62226031Sstas
63226031Sstas        major_status = m->gm_inquire_name(minor_status,
64226031Sstas                                          mn->gmn_name,
65226031Sstas                                          NULL,
66226031Sstas                                          MN_mech,
67226031Sstas                                          attrs);
68226031Sstas        if (major_status == GSS_S_COMPLETE) {
69226031Sstas            if (name_is_MN != NULL)
70226031Sstas                *name_is_MN = 1;
71226031Sstas            if (MN_mech != NULL && *MN_mech == GSS_C_NO_OID)
72226031Sstas                *MN_mech = &m->gm_mech_oid;
73226031Sstas            break;
74226031Sstas        }
75226031Sstas        _gss_mg_error(m, major_status, *minor_status);
76226031Sstas    }
77226031Sstas
78226031Sstas    return major_status;
79226031Sstas}
80