Fixed dynlib Windows issues after merge.

Signed-off-by: Martin Bremmer <martin.bremmer@adlinktech.com>
This commit is contained in:
Martin Bremmer 2019-09-03 12:02:20 +02:00
parent 3fc777e631
commit 09eba90c90
3 changed files with 56 additions and 69 deletions

View file

@ -17,79 +17,79 @@
#include "dds/ddsrt/types.h" #include "dds/ddsrt/types.h"
#include "dds/ddsrt/string.h" #include "dds/ddsrt/string.h"
dds_retcode_t ddsrt_dlopen(const char *name, bool translate, dds_return_t ddsrt_dlopen(const char *name, bool translate,
ddsrt_dynlib_t *handle) { ddsrt_dynlib_t *handle) {
dds_retcode_t retcode = DDS_RETCODE_OK; dds_return_t retcode = DDS_RETCODE_OK;
assert( handle ); assert( handle );
*handle = NULL; *handle = NULL;
if ((translate) && (strrchr(name, '/') == NULL ) if ((translate) && (strrchr(name, '/') == NULL )
&& (strrchr(name, '\\') == NULL )) { && (strrchr(name, '\\') == NULL )) {
/* Add suffix to the name and try to open. */ /* Add suffix to the name and try to open. */
static const char suffix[] = ".dll"; static const char suffix[] = ".dll";
size_t len = strlen(name) + sizeof(suffix); size_t len = strlen(name) + sizeof(suffix);
char* libName = ddsrt_malloc(len); char* libName = ddsrt_malloc(len);
sprintf_s(libName, len, "%s%s", name, suffix); sprintf_s(libName, len, "%s%s", name, suffix);
*handle = LoadLibrary(libName); *handle = (ddsrt_dynlib_t)LoadLibrary(libName);
ddsrt_free(libName); ddsrt_free(libName);
} }
if (*handle == NULL) { if (*handle == NULL) {
/* Name contains a path, /* Name contains a path,
* (auto)translate is disabled or * (auto)translate is disabled or
* LoadLibrary on translated name failed. */ * LoadLibrary on translated name failed. */
*handle = LoadLibrary(name); *handle = (ddsrt_dynlib_t)LoadLibrary(name);
} }
if (*handle != NULL) { if (*handle != NULL) {
retcode = DDS_RETCODE_OK; retcode = DDS_RETCODE_OK;
} else { } else {
retcode = DDS_RETCODE_ERROR; retcode = DDS_RETCODE_ERROR;
} }
return retcode; return retcode;
} }
dds_retcode_t ddsrt_dlclose(ddsrt_dynlib_t handle) { dds_return_t ddsrt_dlclose(ddsrt_dynlib_t handle) {
assert ( handle ); assert ( handle );
return (FreeLibrary(handle) == 0) ? DDS_RETCODE_ERROR : DDS_RETCODE_OK; return (FreeLibrary((HMODULE)handle) == 0) ? DDS_RETCODE_ERROR : DDS_RETCODE_OK;
} }
dds_retcode_t ddsrt_dlsym(ddsrt_dynlib_t handle, const char *symbol, dds_return_t ddsrt_dlsym(ddsrt_dynlib_t handle, const char *symbol,
void **address) { void **address) {
dds_retcode_t retcode = DDS_RETCODE_OK; dds_return_t retcode = DDS_RETCODE_OK;
assert( handle ); assert( handle );
assert( address ); assert( address );
assert( symbol ); assert( symbol );
*address = GetProcAddress(handle, symbol); *address = GetProcAddress((HMODULE)handle, symbol);
if ( *address == NULL ) { if ( *address == NULL ) {
retcode = DDS_RETCODE_ERROR; retcode = DDS_RETCODE_ERROR;
} }
return retcode; return retcode;
} }
dds_retcode_t ddsrt_dlerror(char *buf, size_t buflen) { dds_return_t ddsrt_dlerror(char *buf, size_t buflen) {
/* Hopefully (and likely), the last error is /* Hopefully (and likely), the last error is
* related to a Library action attempt. */ * related to a Library action attempt. */
DWORD err; DWORD err;
assert ( buf ); assert ( buf );
dds_retcode_t retcode = DDS_RETCODE_OK; dds_return_t retcode = DDS_RETCODE_OK;
err = GetLastError(); err = GetLastError();
if ( err == 0 ) { if ( err == 0 ) {
retcode = DDS_RETCODE_NOT_FOUND; retcode = DDS_RETCODE_NOT_FOUND;
} else { } else {
retcode = ddsrt_strerror_r(err, buf, buflen); retcode = ddsrt_strerror_r(err, buf, buflen);
} }
return retcode; return retcode;
} }

View file

@ -10,6 +10,7 @@
# SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause # SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
# #
include(CUnit) include(CUnit)
include(GenerateExportHeader)
include(GenerateDummyExportHeader) include(GenerateDummyExportHeader)
list(APPEND sources list(APPEND sources
@ -90,10 +91,7 @@ generate_dummy_export_header(
BASE_NAME dds BASE_NAME dds
EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/include/dds/export.h") EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/include/dds/export.h")
generate_dummy_export_header( generate_export_header(${test_lib_name} BASE_NAME LIB_TEST)
${test_lib_name}
BASE_NAME lib_test
EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/lib_test_export.h")
if(HAVE_MULTI_PROCESS) if(HAVE_MULTI_PROCESS)
# A separate application is required to test process management. # A separate application is required to test process management.

View file

@ -185,14 +185,3 @@ CU_Test(ddsrt_library, dlclose_error)
CU_ASSERT_EQUAL(r, DDS_RETCODE_ERROR); CU_ASSERT_EQUAL(r, DDS_RETCODE_ERROR);
} }
CU_Test(ddsrt_library, dlerror_notfound)
{
char buffer[256];
dds_return_t r;
ddsrt_dlerror(buffer, sizeof(buffer));
r = ddsrt_dlerror(buffer, sizeof(buffer));
CU_ASSERT_EQUAL(r, DDS_RETCODE_NOT_FOUND);
}