2 * Copyright (c) 1997 - 2001, 2003 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
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.
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.
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
34 #include "gssapi_locl.h"
36 RCSID("$Id: init.c,v 1.7 2003/07/22 19:50:11 lha Exp $");
39 #include "auth/kerberos/krb5_init_context.h"
42 static HEIMDAL_MUTEX gssapi_krb5_context_mutex = HEIMDAL_MUTEX_INITIALIZER;
43 static int created_key;
44 static HEIMDAL_thread_key gssapi_context_key;
47 gssapi_destroy_thread_context(void *ptr)
49 struct gssapi_thr_context *ctx = ptr;
53 if (ctx->error_string)
54 free(ctx->error_string);
55 HEIMDAL_MUTEX_destroy(&ctx->mutex);
60 struct gssapi_thr_context *
61 gssapi_get_thread_context(int createp)
63 struct gssapi_thr_context *ctx;
66 HEIMDAL_MUTEX_lock(&gssapi_krb5_context_mutex);
70 ctx = HEIMDAL_getspecific(gssapi_context_key);
74 ctx = malloc(sizeof(*ctx));
77 ctx->error_string = NULL;
78 HEIMDAL_MUTEX_init(&ctx->mutex);
79 HEIMDAL_setspecific(gssapi_context_key, ctx, ret);
83 HEIMDAL_MUTEX_unlock(&gssapi_krb5_context_mutex);
86 HEIMDAL_MUTEX_unlock(&gssapi_krb5_context_mutex);
93 /* Init krb5 with an event context. Disgusting Samba-specific hack */
96 gssapi_krb5_init_ev (void *event_context)
98 static struct smb_krb5_context *smb_krb5_context;
99 krb5_error_code ret = 0;
101 HEIMDAL_MUTEX_lock(&gssapi_krb5_context_mutex);
103 if(smb_krb5_context == NULL) {
104 ret = smb_krb5_init_context(event_context, &smb_krb5_context);
106 if (ret == 0 && !created_key) {
107 HEIMDAL_key_create(&gssapi_context_key,
108 gssapi_destroy_thread_context,
111 smb_krb5_free_context(smb_krb5_context);
112 smb_krb5_context = NULL;
117 gssapi_krb5_context = smb_krb5_context->krb5_context;
120 HEIMDAL_MUTEX_unlock(&gssapi_krb5_context_mutex);
126 gssapi_krb5_init (void)
128 krb5_error_code ret = 0;
130 ret = gssapi_krb5_init_ev(NULL);
132 HEIMDAL_MUTEX_lock(&gssapi_krb5_context_mutex);
134 if(gssapi_krb5_context == NULL) {
135 ret = krb5_init_context (&gssapi_krb5_context);
137 if (ret == 0 && !created_key) {
138 HEIMDAL_key_create(&gssapi_context_key,
139 gssapi_destroy_thread_context,
142 krb5_free_context(gssapi_krb5_context);
143 gssapi_krb5_context = NULL;
148 HEIMDAL_MUTEX_unlock(&gssapi_krb5_context_mutex);