1 /* -*- mode: c; indent-tabs-mode: nil -*- */ 2 /* 3 * Copyright 2009 by the Massachusetts Institute of Technology. 4 * All Rights Reserved. 5 * 6 * Export of this software from the United States of America may 7 * require a specific license from the United States Government. 8 * It is the responsibility of any person or organization contemplating 9 * export to obtain such a license before exporting. 10 * 11 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and 12 * distribute this software and its documentation for any purpose and 13 * without fee is hereby granted, provided that the above copyright 14 * notice appear in all copies and that both that copyright notice and 15 * this permission notice appear in supporting documentation, and that 16 * the name of M.I.T. not be used in advertising or publicity pertaining 17 * to distribution of the software without specific, written prior 18 * permission. Furthermore if you modify this software you must label 19 * your software as modified software and not distribute it in such a 20 * fashion that it might be confused with the original M.I.T. software. 21 * M.I.T. makes no representations about the suitability of 22 * this software for any purpose. It is provided "as is" without express 23 * or implied warranty. 24 */ 25 26 /* Glue routine for gss_inquire_name */ 27 28 #include "mglueP.h" 29 30 OM_uint32 KRB5_CALLCONV 31 gss_inquire_name(OM_uint32 *minor_status, 32 gss_name_t name, 33 int *name_is_MN, 34 gss_OID *MN_mech, 35 gss_buffer_set_t *attrs) 36 { 37 OM_uint32 status, tmp; 38 gss_union_name_t union_name; 39 gss_mechanism mech; 40 41 if (minor_status != NULL) 42 *minor_status = 0; 43 44 if (MN_mech != NULL) 45 *MN_mech = GSS_C_NO_OID; 46 47 if (attrs != NULL) 48 *attrs = GSS_C_NO_BUFFER_SET; 49 50 if (minor_status == NULL) 51 return GSS_S_CALL_INACCESSIBLE_WRITE; 52 53 if (name == GSS_C_NO_NAME) 54 return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME; 55 56 union_name = (gss_union_name_t)name; 57 58 if (union_name->mech_type == GSS_C_NO_OID) { 59 /* We don't yet support non-mechanism attributes */ 60 if (name_is_MN != NULL) 61 *name_is_MN = 0; 62 *minor_status = 0; 63 return GSS_S_COMPLETE; 64 } 65 66 if (name_is_MN != NULL) 67 *name_is_MN = 1; 68 69 if (MN_mech != NULL) { 70 status = generic_gss_copy_oid(minor_status, 71 union_name->mech_type, 72 MN_mech); 73 if (GSS_ERROR(status)) 74 return status; 75 } 76 77 mech = gssint_get_mechanism(name->mech_type); 78 if (mech == NULL) { 79 gss_release_oid(&tmp, MN_mech); 80 return GSS_S_BAD_NAME; 81 } 82 83 if (mech->gss_inquire_name == NULL) { 84 gss_release_oid(&tmp, MN_mech); 85 return GSS_S_UNAVAILABLE; 86 } 87 88 status = (*mech->gss_inquire_name)(minor_status, 89 union_name->mech_name, 90 NULL, 91 NULL, 92 attrs); 93 if (status != GSS_S_COMPLETE) { 94 generic_gss_release_oid(&tmp, MN_mech); 95 map_error(minor_status, mech); 96 } 97 98 return status; 99 } 100