#include <stdio.h>
#include <string.h>
+#include "internal/thread_once.h"
#include <openssl/bio.h>
#include <openssl/crypto.h>
#include <openssl/trace.h>
#include "internal/bio.h"
#include "internal/nelem.h"
-#include "internal/cryptlib_int.h"
+#include "crypto/cryptlib.h"
#include "e_os.h" /* strcasecmp for Windows */
TRACE_CATEGORY_(PKCS12_DECRYPT),
TRACE_CATEGORY_(X509V3_POLICY),
TRACE_CATEGORY_(BN_CTX),
+ TRACE_CATEGORY_(STORE),
};
const char *OSSL_trace_get_category_name(int num)
return 1;
}
+static int do_ossl_trace_init(void);
+static CRYPTO_ONCE trace_inited = CRYPTO_ONCE_STATIC_INIT;
+DEFINE_RUN_ONCE_STATIC(ossl_trace_init)
+{
+ return do_ossl_trace_init();
+}
+
static int set_trace_data(int category, int type, BIO **channel,
const char **prefix, const char **suffix,
int (*attach_cb)(int, int, const void *),
char *curr_prefix = NULL;
char *curr_suffix = NULL;
- /* Ensure ossl_trace_init() is called */
- OPENSSL_init_crypto(0, NULL);
+ /* Ensure do_ossl_trace_init() is called once */
+ if (!RUN_ONCE(&trace_inited, ossl_trace_init))
+ return 0;
curr_channel = trace_channels[category].bio;
curr_prefix = trace_channels[category].prefix;
return 1;
}
-#endif
-int ossl_trace_init(void)
+static int do_ossl_trace_init(void)
{
-#ifndef OPENSSL_NO_TRACE
trace_lock = CRYPTO_THREAD_lock_new();
- if (trace_lock == NULL)
- return 0;
-#endif
-
- return 1;
+ return trace_lock != NULL;
}
+#endif
+
void ossl_trace_cleanup(void)
{
#ifndef OPENSSL_NO_TRACE