1/*
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
3 */
4
5#include <assert.h>
6
7#include "gssapi_err_generic.h"
8#include "gssapi_err_krb5.h"
9#include "gssapiP_krb5.h"
10
11#include "gss_libinit.h"
12#include "k5-platform.h"
13
14#include "mglueP.h"
15/*
16 * Initialize the GSSAPI library.
17 */
18
19MAKE_INIT_FUNCTION(gssint_lib_init);
20MAKE_FINI_FUNCTION(gssint_lib_fini);
21
22int gssint_lib_init(void)
23{
24    int err;
25
26#ifdef SHOW_INITFINI_FUNCS
27    printf("gssint_lib_init\n");
28#endif
29
30#if !USE_BUNDLE_ERROR_STRINGS
31    add_error_table(&et_k5g_error_table);
32    add_error_table(&et_ggss_error_table);
33#endif
34#if 0 /* SUNW15resync */
35    err = gssint_mechglue_init();
36    if (err)
37	return err;
38#endif
39    err = k5_mutex_finish_init(&gssint_krb5_keytab_lock);
40    if (err)
41	return err;
42    err = k5_key_register(K5_KEY_GSS_KRB5_SET_CCACHE_OLD_NAME, free);
43    if (err)
44	return err;
45    err = k5_key_register(K5_KEY_GSS_KRB5_CCACHE_NAME, free);
46    if (err)
47	return err;
48    err = k5_key_register(K5_KEY_GSS_KRB5_ERROR_MESSAGE,
49                          krb5_gss_delete_error_info);
50    if (err)
51	return err;
52#ifndef _WIN32
53    err = k5_mutex_finish_init(&kg_kdc_flag_mutex);
54    if (err)
55	return err;
56#endif
57    return k5_mutex_finish_init(&kg_vdb.mutex);
58}
59
60void gssint_lib_fini(void)
61{
62    if (!INITIALIZER_RAN(gssint_lib_init) || PROGRAM_EXITING()) {
63#ifdef SHOW_INITFINI_FUNCS
64	printf("gssint_lib_fini: skipping\n");
65#endif
66	return;
67    }
68#ifdef SHOW_INITFINI_FUNCS
69    printf("gssint_lib_fini\n");
70#endif
71#if !USE_BUNDLE_ERROR_STRINGS
72    remove_error_table(&et_k5g_error_table);
73    remove_error_table(&et_ggss_error_table);
74#endif
75    k5_key_delete(K5_KEY_GSS_KRB5_SET_CCACHE_OLD_NAME);
76    k5_key_delete(K5_KEY_GSS_KRB5_CCACHE_NAME);
77    k5_mutex_destroy(&kg_vdb.mutex);
78#ifndef _WIN32
79    k5_mutex_destroy(&kg_kdc_flag_mutex);
80#endif
81    k5_mutex_destroy(&gssint_krb5_keytab_lock);
82#if 0 /* SUNW15resync */
83    gssint_mechglue_fini();
84#endif
85}
86
87OM_uint32 gssint_initialize_library (void)
88{
89    return CALL_INIT_FUNCTION(gssint_lib_init);
90}
91