blob: 635abe46ba985583f10f7ca5be7e74e927825e23 [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/*******************************************************************************
* Copyright 2021, Fraunhofer SIT
* All rights reserved.
*******************************************************************************/
/**
* The purpose of this file is to copy it into your project and
* include it during compilation if you don't want to link against
* libtss2-tctildr at compile time.
* It will attempt to load libtss2-esys.so during runtime.
* It will either work similarly to directly linking to libtss2-tctildr.so
* at compile-time or return a NOT_IMPLEMENTED error.
*
* For new versions of this file, please check:
* http://github.com/tpm2-software/tpm2-tss/tss2-dlopen
*/
#include <dlfcn.h>
#include <stdio.h>
#include <tss2/tss2_tctildr.h>
#define str(s) xstr(s)
#define xstr(s) #s
#ifdef ENABLE_WARN
#define WARN(str, ...) do { fprintf(stderr, "WARNING: " str "\n", ## __VA_ARGS__); } while (0)
#else /* ENABLE_WARN */
#define WARN(...) do { } while (0)
#endif /* ENABLE_WARN */
#define LIB "libtss2-tctildr.so.0"
static void *dlhandle = NULL;
static TSS2_RC
init_dlhandle(void)
{
if (dlhandle)
return TSS2_RC_SUCCESS;
dlhandle = dlopen(LIB, RTLD_NOW | RTLD_LOCAL);
if (!dlhandle) {
WARN("Library " LIB " not found: %s.", dlerror());
return TSS2_TCTI_RC_NOT_IMPLEMENTED;
}
return TSS2_RC_SUCCESS;
}
TSS2_RC
Tss2_TctiLdr_Initialize_Ex (const char *name,
const char *conf,
TSS2_TCTI_CONTEXT **context)
{
if (init_dlhandle() != TSS2_RC_SUCCESS)
return TSS2_TCTI_RC_NOT_IMPLEMENTED;
static TSS2_RC (*sym) (const char *name, const char *conf, TSS2_TCTI_CONTEXT **context) = NULL;
if (!sym)
sym = dlsym(dlhandle, "Tss2_TctiLdr_Initialize_Ex");
if (!sym) {
WARN("Function Tss2_TctiLdr_Initialize_Ex not found.");
return TSS2_TCTI_RC_NOT_IMPLEMENTED;
}
return sym(name, conf, context);
}
TSS2_RC
Tss2_TctiLdr_Initialize (const char *nameConf,
TSS2_TCTI_CONTEXT **context)
{
if (init_dlhandle() != TSS2_RC_SUCCESS)
return TSS2_TCTI_RC_NOT_IMPLEMENTED;
static TSS2_RC (*sym) (const char *nameConf, TSS2_TCTI_CONTEXT **context) = NULL;
if (!sym)
sym = dlsym(dlhandle, "Tss2_TctiLdr_Initialize");
if (!sym) {
WARN("Function Tss2_TctiLdr_Initialize not found.");
return TSS2_TCTI_RC_NOT_IMPLEMENTED;
}
return sym(nameConf, context);
}
TSS2_RC
Tss2_TctiLdr_GetInfo (const char *name,
TSS2_TCTI_INFO **info)
{
if (init_dlhandle() != TSS2_RC_SUCCESS)
return TSS2_TCTI_RC_NOT_IMPLEMENTED;
static TSS2_RC (*sym) (const char *name, TSS2_TCTI_INFO **info) = NULL;
if (!sym)
sym = dlsym(dlhandle, "Tss2_TctiLdr_GetInfo");
if (!sym) {
WARN("Function Tss2_TctiLdr_GetInfo not found.");
return TSS2_TCTI_RC_NOT_IMPLEMENTED;
}
return sym(name, info);
}
void
Tss2_TctiLdr_Finalize (TSS2_TCTI_CONTEXT **context)
{
if (!context || !*context)
return;
static void (*sym) (TSS2_TCTI_CONTEXT **context) = NULL;
if (!sym)
sym = dlsym(dlhandle, "Tss2_TctiLdr_Finalize");
if (!sym) {
WARN("Function Tss2_TctiLdr_Finalize not found.");
return;
}
sym(context);
}
void
Tss2_TctiLdr_FreeInfo (TSS2_TCTI_INFO **info)
{
if (!info || !*info)
return;
static void (*sym) (TSS2_TCTI_INFO **info) = NULL;
if (!sym)
sym = dlsym(dlhandle, "Tss2_TctiLdr_FreeInfo");
if (!sym) {
WARN("Function Tss2_TctiLdr_FreeInfo not found.");
return;
}
sym(info);
}