5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry/*
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry/*
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * Copyright 1993 by OpenVision Technologies, Inc.
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry *
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * Permission to use, copy, modify, distribute, and sell this software
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * and its documentation for any purpose is hereby granted without fee,
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * provided that the above copyright notice appears in all copies and
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * that both that copyright notice and this permission notice appear in
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * supporting documentation, and that the name of OpenVision not be used
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * in advertising or publicity pertaining to distribution of the software
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * without specific, written prior permission. OpenVision makes no
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * representations about the suitability of this software for any
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * purpose. It is provided "as is" without express or implied warranty.
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry *
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * PERFORMANCE OF THIS SOFTWARE.
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <sys/param.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <unistd.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <assert.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <stdio.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <stdlib.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <string.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <k5-int.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <krb5.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <mglueP.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include "gssapiP_spnego.h"
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include "gssapiP_generic.h"
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <gssapi_err_generic.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry/* X internationalization!! */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline int
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrycompare_OM_uint32 (OM_uint32 a, OM_uint32 b)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (a < b)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return -1;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry else if (a == b)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry else
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return 1;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic inline void
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barryfree_string (char *s)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry free(s);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include "error_map.h"
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#include <stdio.h>
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#define get_error_message spnego_gss_get_error_message
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrychar *get_error_message(OM_uint32 minor_code)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry gsserrmap *p = k5_getspecific(K5_KEY_GSS_SPNEGO_ERROR_MESSAGE);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry char *msg = NULL;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#ifdef DEBUG
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry fprintf(stderr, "%s(%lu, p=%p)", __func__, (unsigned long) minor_code,
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry (void *) p);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#endif
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (p) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry char **v = gsserrmap_find(p, minor_code);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (v) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry msg = *v;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#ifdef DEBUG
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry fprintf(stderr, " FOUND!");
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#endif
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (msg == 0)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry msg = (char *)error_message(minor_code);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#ifdef DEBUG
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry fprintf(stderr, " -> %p/%s\n", (void *) msg, msg);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#endif
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return msg;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barrystatic int save_error_string_nocopy(OM_uint32 minor_code, char *msg)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry gsserrmap *p;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry int ret;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#ifdef DEBUG
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry fprintf(stderr, "%s(%lu, %s)", __func__, (unsigned long) minor_code, msg);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#endif
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry p = k5_getspecific(K5_KEY_GSS_SPNEGO_ERROR_MESSAGE);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (!p) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry p = malloc(sizeof(*p));
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (p == NULL) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry ret = 1;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry goto fail;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (gsserrmap_init(p) != 0) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry free(p);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry p = NULL;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry ret = 1;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry goto fail;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (k5_setspecific(K5_KEY_GSS_SPNEGO_ERROR_MESSAGE, p) != 0) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry gsserrmap_destroy(p);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry free(p);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry p = NULL;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry ret = 1;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry goto fail;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry ret = gsserrmap_replace_or_insert(p, minor_code, msg);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry /* Solaris SPNEGO */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (ret) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry gsserrmap_destroy(p);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry free(p);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry p = NULL;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barryfail:
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#ifdef DEBUG
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry fprintf(stderr, " p=%p %s\n", (void *)p, ret ? "FAIL" : "SUCCESS");
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#endif
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return ret;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barryvoid save_error_string(OM_uint32 minor_code, char *msg)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry char *s = strdup(msg);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (s) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (save_error_string_nocopy(minor_code, s) != 0)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry free(s);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barryvoid save_error_message(OM_uint32 minor_code, const char *format, ...)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry char *s;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry int n;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry va_list ap;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry va_start(ap, format);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry n = vasprintf(&s, format, ap);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry va_end(ap);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (n >= 0) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (save_error_string_nocopy(minor_code, s) != 0)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry free(s);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barryvoid spnego_gss_save_error_info(OM_uint32 minor_code, spnego_gss_ctx_id_t ctx)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry char *s;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#ifdef DEBUG
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry fprintf(stderr, "%s(%lu, ctx=%p)\n", __func__,
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry (unsigned long) minor_code, (void *)ctx);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#endif
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry s = (char *)spnego_get_error_message(ctx, minor_code);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#ifdef DEBUG
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry fprintf(stderr, "%s(%lu, ctx=%p) saving: %s\n", __func__,
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry (unsigned long) minor_code, (void *)ctx, s);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#endif
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry save_error_string(minor_code, s);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry /* The get_error_message call above resets the error message in
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry ctx. Put it back, in case we make this call again *sigh*. */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry spnego_set_error_message(ctx, minor_code, "%s", s);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry spnego_free_error_message(ctx, s);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barryvoid spnego_gss_delete_error_info(void *p)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry gsserrmap_destroy(p);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn BarryOM_uint32
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barryspnego_gss_display_status2(minor_status, status_value, status_type,
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry mech_type, message_context, status_string)
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry OM_uint32 *minor_status;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry OM_uint32 status_value;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry int status_type;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry gss_OID mech_type;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry OM_uint32 *message_context;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry gss_buffer_t status_string;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry{
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry status_string->length = 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry status_string->value = NULL;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if ((mech_type != GSS_C_NULL_OID) &&
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry !g_OID_equal(gss_mech_spnego, mech_type)) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry *minor_status = 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return(GSS_S_BAD_MECH);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (status_type == GSS_C_GSS_CODE) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return(g_display_major_status(minor_status, status_value,
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry message_context, status_string));
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry } else if (status_type == GSS_C_MECH_CODE) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry /*
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * Solaris SPNEGO
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * This init call appears to be not needed as
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry * gss_spnegoint_lib_init() is called on dl open.
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#if 0
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry (void) gss_spnegoint_initialize_library();
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry#endif
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (*message_context) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry *minor_status = (OM_uint32) G_BAD_MSG_CTX;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return(GSS_S_FAILURE);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry /* If this fails, there's not much we can do... */
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry if (g_make_string_buffer(spnego_gss_get_error_message(status_value),
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry status_string) != 0) {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry *minor_status = ENOMEM;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return(GSS_S_FAILURE);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry } else
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry *minor_status = 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return(0);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry } else {
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry *minor_status = 0;
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry return(GSS_S_BAD_STATUS);
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry }
5e01956f3000408c2a2c5a08c8d0acf2c2a9d8eeGlenn Barry}