From 562ba9bb747b638c41ba041b1ccef92063182c17 Mon Sep 17 00:00:00 2001 From: Zhi Guan Date: Wed, 2 Nov 2022 12:21:02 +0800 Subject: [PATCH] Add dl wrapper --- include/gmssl/dylib.h | 54 +++++++++++++++++++++++++++++++++++++++++++ src/sdf/sdf_int.h | 12 ++++------ src/sdf/sdf_meth.c | 25 ++++---------------- src/skf/skf_int.h | 11 +++------ src/skf/skf_meth.c | 22 +++--------------- 5 files changed, 68 insertions(+), 56 deletions(-) create mode 100644 include/gmssl/dylib.h diff --git a/include/gmssl/dylib.h b/include/gmssl/dylib.h new file mode 100644 index 00000000..ead269c3 --- /dev/null +++ b/include/gmssl/dylib.h @@ -0,0 +1,54 @@ +/* + * Copyright 2014-2022 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +#ifndef GMSSL_DYLIB_H +#define GMSSL_DYLIB_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifdef WIN32 + +#include + +typedef HMODULE dylib_handle_t; + +#define dylib_load_library(so_path) LoadLibraryA(so_path) +#define dylib_get_function(handle,name) GetProcAddress(handle,name) +#define dylib_close_library(handle) +#define dylib_error_str() + + +#else + +#include + +typedef void *dylib_handle_t; + +#define dylib_load_library(so_path) dlopen(so_path,RTLD_LAZY) +#define dylib_get_function(handle,name) dlsym(handle,name) +#define dylib_close_library(handle) dlclose(handle) +#define dylib_error_str() dlerror() + + +#endif + + + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/sdf/sdf_int.h b/src/sdf/sdf_int.h index 87eb562d..eae0db4c 100755 --- a/src/sdf/sdf_int.h +++ b/src/sdf/sdf_int.h @@ -11,11 +11,10 @@ #ifndef SDFUTIL_SDF_METH_H #define SDFUTIL_SDF_METH_H + +#include #include "sdf.h" -#ifdef WIN32 -#include -#endif typedef int (*SDF_OpenDevice_FuncPtr)( void **phDeviceHandle); @@ -350,11 +349,8 @@ typedef int (*SDF_DeleteObject_FuncPtr)( typedef struct sdf_method_st { char *name; -#ifdef WIN32 - HMODULE dso; -#else - void *dso; -#endif + dylib_handle_t dso; + SDF_OpenDevice_FuncPtr OpenDevice; SDF_CloseDevice_FuncPtr CloseDevice; SDF_OpenSession_FuncPtr OpenSession; diff --git a/src/sdf/sdf_meth.c b/src/sdf/sdf_meth.c index 39dd6c28..44b87e68 100755 --- a/src/sdf/sdf_meth.c +++ b/src/sdf/sdf_meth.c @@ -11,22 +11,13 @@ #include #include #include -#ifdef WIN32 -#include -#else -#include -#endif +#include #include "sdf_int.h" #define SDFerr(a,b) -#ifdef WIN32 #define SDF_METHOD_BIND_FUNCTION_EX(func,name) \ - sdf->func = (SDF_##func##_FuncPtr)GetProcAddress(sdf->dso, "SDF_"#name) -#else -#define SDF_METHOD_BIND_FUNCTION_EX(func,name) \ - sdf->func = (SDF_##func##_FuncPtr)dlsym(sdf->dso, "SDF_"#name) -#endif + sdf->func = (SDF_##func##_FuncPtr)dylib_get_function(sdf->dso, "SDF_"#name) #define SDF_METHOD_BIND_FUNCTION(func) \ SDF_METHOD_BIND_FUNCTION_EX(func,func) @@ -42,19 +33,11 @@ SDF_METHOD *SDF_METHOD_load_library(const char *so_path) } memset(sdf, 0, sizeof(*sdf)); -#ifdef WIN32 - if ((sdf->dso = LoadLibraryA(so_path)) == NULL) { + if (!(sdf->dso = dylib_load_library(so_path))) { + fprintf(stderr, "%s %d: %s\n", __FILE__, __LINE__, dylib_error_str()); goto end; } -#else - if (!(sdf->dso = dlopen(so_path, 0/*RTLD_LAZY*/))) { // FIXME: dlfcn.h, dlopen, RTLD_LAZY not in windows! - fprintf(stderr, "%s %d: %s\n", __FILE__, __LINE__, dlerror()); - SDFerr(SDF_F_SDF_METHOD_LOAD_LIBRARY, SDF_R_DSO_LOAD_FAILURE); - goto end; - } -#endif - SDF_METHOD_BIND_FUNCTION(OpenDevice); SDF_METHOD_BIND_FUNCTION(CloseDevice); SDF_METHOD_BIND_FUNCTION(OpenSession); diff --git a/src/skf/skf_int.h b/src/skf/skf_int.h index 9e8cc0f3..89a74d44 100755 --- a/src/skf/skf_int.h +++ b/src/skf/skf_int.h @@ -11,12 +11,10 @@ #ifndef SKFUTIL_SKF_INT_H #define SKFUTIL_SKF_INT_H +#include #include "../sgd.h" #include "skf.h" -#ifdef WIN32 -#include -#endif typedef ULONG (DEVAPI *SKF_WaitForDevEvent_FuncPtr)( @@ -476,11 +474,8 @@ typedef ULONG (DEVAPI *SKF_CloseHandle_FuncPtr)( typedef struct skf_method_st { char *name; -#ifdef WIN32 - HMODULE dso; -#else - void *dso; -#endif + dylib_handle_t dso; + SKF_WaitForDevEvent_FuncPtr WaitForDevEvent; SKF_CancelWaitForDevEvent_FuncPtr CancelWaitForDevEvent; SKF_EnumDev_FuncPtr EnumDev; diff --git a/src/skf/skf_meth.c b/src/skf/skf_meth.c index 1cba2019..5a9b49c1 100755 --- a/src/skf/skf_meth.c +++ b/src/skf/skf_meth.c @@ -11,24 +11,15 @@ #include #include #include -#ifdef WIN32 -#include -#else -#include -#endif +#include #include "skf.h" #include "skf_ext.h" #include "skf_int.h" #define SKFerr(e,r) -#ifdef WIN32 #define SKF_METHOD_BIND_FUNCTION_EX(func,name) \ - skf->func = (SKF_##func##_FuncPtr)GetProcAddress(skf->dso, "SKF_"#name) -#else -#define SKF_METHOD_BIND_FUNCTION_EX(func,name) \ - skf->func = (SKF_##func##_FuncPtr)dlsym(skf->dso, "SKF_"#name) -#endif + skf->func = (SKF_##func##_FuncPtr)dylib_get_function(skf->dso, "SKF_"#name) #define SKF_METHOD_BIND_FUNCTION(func) \ SKF_METHOD_BIND_FUNCTION_EX(func,func) @@ -43,17 +34,10 @@ SKF_METHOD *SKF_METHOD_load_library(const char *so_path) SKFerr(SKF_F_SKF_METHOD_LOAD_LIBRARY, ERR_R_MALLOC_FAILURE); goto end; } -#ifdef WIN32 - if ((skf->dso = LoadLibraryA(so_path)) == NULL) { - goto end; - } - -#else - if (!(skf->dso = dlopen(so_path, 0/*RTLD_LAZY*/))) {//FIXME:dlopen not in windows + if (!(skf->dso = dylib_load_library(so_path))) { SKFerr(SKF_F_SKF_METHOD_LOAD_LIBRARY, SKF_R_DSO_LOAD_FAILURE); goto end; } -#endif SKF_METHOD_BIND_FUNCTION(WaitForDevEvent); SKF_METHOD_BIND_FUNCTION(CancelWaitForDevEvent);