PageRenderTime 19ms CodeModel.GetById 13ms app.highlight 3ms RepoModel.GetById 1ms app.codeStats 1ms

/crypto/heimdal/lib/gssapi/krb5/inquire_context.c

https://bitbucket.org/freebsd/freebsd-head/
C | 110 lines | 62 code | 16 blank | 32 comment | 14 complexity | 5fd17f7fc613cfcabade858fc0fc0b32 MD5 | raw file
  1/*
  2 * Copyright (c) 1997, 2003 Kungliga Tekniska Hรถgskolan
  3 * (Royal Institute of Technology, Stockholm, Sweden).
  4 * All rights reserved.
  5 *
  6 * Redistribution and use in source and binary forms, with or without
  7 * modification, are permitted provided that the following conditions
  8 * are met:
  9 *
 10 * 1. Redistributions of source code must retain the above copyright
 11 *    notice, this list of conditions and the following disclaimer.
 12 *
 13 * 2. Redistributions in binary form must reproduce the above copyright
 14 *    notice, this list of conditions and the following disclaimer in the
 15 *    documentation and/or other materials provided with the distribution.
 16 *
 17 * 3. Neither the name of the Institute nor the names of its contributors
 18 *    may be used to endorse or promote products derived from this software
 19 *    without specific prior written permission.
 20 *
 21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 31 * SUCH DAMAGE.
 32 */
 33
 34#include "gsskrb5_locl.h"
 35
 36OM_uint32 GSSAPI_CALLCONV _gsskrb5_inquire_context (
 37    OM_uint32 * minor_status,
 38	const gss_ctx_id_t context_handle,
 39	gss_name_t * src_name,
 40	gss_name_t * targ_name,
 41	OM_uint32 * lifetime_rec,
 42	gss_OID * mech_type,
 43	OM_uint32 * ctx_flags,
 44	int * locally_initiated,
 45	int * open_context
 46    )
 47{
 48    krb5_context context;
 49    OM_uint32 ret;
 50    gsskrb5_ctx ctx = (gsskrb5_ctx)context_handle;
 51    gss_name_t name;
 52
 53    if (src_name)
 54	*src_name = GSS_C_NO_NAME;
 55    if (targ_name)
 56	*targ_name = GSS_C_NO_NAME;
 57
 58    GSSAPI_KRB5_INIT (&context);
 59
 60    HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex);
 61
 62    if (src_name) {
 63	name = (gss_name_t)ctx->source;
 64	ret = _gsskrb5_duplicate_name (minor_status, name, src_name);
 65	if (ret)
 66	    goto failed;
 67    }
 68
 69    if (targ_name) {
 70	name = (gss_name_t)ctx->target;
 71	ret = _gsskrb5_duplicate_name (minor_status, name, targ_name);
 72	if (ret)
 73	    goto failed;
 74    }
 75
 76    if (lifetime_rec) {
 77	ret = _gsskrb5_lifetime_left(minor_status,
 78				     context,
 79				     ctx->lifetime,
 80				     lifetime_rec);
 81	if (ret)
 82	    goto failed;
 83    }
 84
 85    if (mech_type)
 86	*mech_type = GSS_KRB5_MECHANISM;
 87
 88    if (ctx_flags)
 89	*ctx_flags = ctx->flags;
 90
 91    if (locally_initiated)
 92	*locally_initiated = ctx->more_flags & LOCAL;
 93
 94    if (open_context)
 95	*open_context = ctx->more_flags & OPEN;
 96
 97    *minor_status = 0;
 98
 99    HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex);
100    return GSS_S_COMPLETE;
101
102failed:
103    if (src_name)
104	_gsskrb5_release_name(NULL, src_name);
105    if (targ_name)
106	_gsskrb5_release_name(NULL, targ_name);
107
108    HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex);
109    return ret;
110}