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/string.h"
dds_retcode_t ddsrt_dlopen(const char *name, bool translate,
ddsrt_dynlib_t *handle) {
dds_retcode_t retcode = DDS_RETCODE_OK;
dds_return_t ddsrt_dlopen(const char *name, bool translate,
ddsrt_dynlib_t *handle) {
dds_return_t retcode = DDS_RETCODE_OK;
assert( handle );
*handle = NULL;
assert( handle );
*handle = NULL;
if ((translate) && (strrchr(name, '/') == NULL )
&& (strrchr(name, '\\') == NULL )) {
/* Add suffix to the name and try to open. */
static const char suffix[] = ".dll";
size_t len = strlen(name) + sizeof(suffix);
char* libName = ddsrt_malloc(len);
sprintf_s(libName, len, "%s%s", name, suffix);
*handle = LoadLibrary(libName);
ddsrt_free(libName);
}
if ((translate) && (strrchr(name, '/') == NULL )
&& (strrchr(name, '\\') == NULL )) {
/* Add suffix to the name and try to open. */
static const char suffix[] = ".dll";
size_t len = strlen(name) + sizeof(suffix);
char* libName = ddsrt_malloc(len);
sprintf_s(libName, len, "%s%s", name, suffix);
*handle = (ddsrt_dynlib_t)LoadLibrary(libName);
ddsrt_free(libName);
}
if (*handle == NULL) {
/* Name contains a path,
* (auto)translate is disabled or
* LoadLibrary on translated name failed. */
*handle = LoadLibrary(name);
}
if (*handle == NULL) {
/* Name contains a path,
* (auto)translate is disabled or
* LoadLibrary on translated name failed. */
*handle = (ddsrt_dynlib_t)LoadLibrary(name);
}
if (*handle != NULL) {
retcode = DDS_RETCODE_OK;
} else {
retcode = DDS_RETCODE_ERROR;
}
if (*handle != NULL) {
retcode = DDS_RETCODE_OK;
} else {
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 );
return (FreeLibrary(handle) == 0) ? DDS_RETCODE_ERROR : DDS_RETCODE_OK;
assert ( handle );
return (FreeLibrary((HMODULE)handle) == 0) ? DDS_RETCODE_ERROR : DDS_RETCODE_OK;
}
dds_retcode_t ddsrt_dlsym(ddsrt_dynlib_t handle, const char *symbol,
void **address) {
dds_retcode_t retcode = DDS_RETCODE_OK;
dds_return_t ddsrt_dlsym(ddsrt_dynlib_t handle, const char *symbol,
void **address) {
dds_return_t retcode = DDS_RETCODE_OK;
assert( handle );
assert( address );
assert( symbol );
assert( handle );
assert( address );
assert( symbol );
*address = GetProcAddress(handle, symbol);
if ( *address == NULL ) {
retcode = DDS_RETCODE_ERROR;
}
*address = GetProcAddress((HMODULE)handle, symbol);
if ( *address == NULL ) {
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
* related to a Library action attempt. */
DWORD err;
assert ( buf );
/* Hopefully (and likely), the last error is
* related to a Library action attempt. */
DWORD err;
assert ( buf );
dds_retcode_t retcode = DDS_RETCODE_OK;
dds_return_t retcode = DDS_RETCODE_OK;
err = GetLastError();
if ( err == 0 ) {
retcode = DDS_RETCODE_NOT_FOUND;
} else {
retcode = ddsrt_strerror_r(err, buf, buflen);
}
err = GetLastError();
if ( err == 0 ) {
retcode = DDS_RETCODE_NOT_FOUND;
} else {
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
#
include(CUnit)
include(GenerateExportHeader)
include(GenerateDummyExportHeader)
list(APPEND sources
@ -90,10 +91,7 @@ generate_dummy_export_header(
BASE_NAME dds
EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/include/dds/export.h")
generate_dummy_export_header(
${test_lib_name}
BASE_NAME lib_test
EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/lib_test_export.h")
generate_export_header(${test_lib_name} BASE_NAME LIB_TEST)
if(HAVE_MULTI_PROCESS)
# 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_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);
}