Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
rasmartins committed Apr 16, 2012
1 parent 7562d8e commit 06f1825
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 7 deletions.
5 changes: 4 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ check_symbol_exists(RPL_OS_LINUX "rpl/platform.h" RPL_OS_LINUX)
check_symbol_exists(RPL_OS_WINDOWS "rpl/platform.h" RPL_OS_WINDOWS)

if (RPL_OS_LINUX)
set(RPL_LIBS pthread rt)
set(RPL_LIBS pthread rt dl)
elseif(RPL_OS_WINDOWS)
set(RPL_LIBS wsock32 ws2_32)
endif()
Expand All @@ -25,6 +25,9 @@ target_link_libraries(test_platform rpl ${RPL_LIBS})
add_executable(test_error test/test_error.c)
target_link_libraries(test_error rpl ${RPL_LIBS})

add_executable(test_dll test/test_dll.c)
target_link_libraries(test_dll rpl ${RPL_LIBS})

add_executable(test_udp_socket test/test_udp_socket.c)
target_link_libraries(test_udp_socket rpl ${RPL_LIBS})

Expand Down
17 changes: 16 additions & 1 deletion src/rpl/dll.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

/* RPL headers. */
#include <rpl/platform.h>
#include <rpl/error.h>
#include <rpl/dll.h>

/* Platform headers. */
Expand Down Expand Up @@ -58,16 +59,28 @@ rpl_dll_free(rpl_dll_t* dll)
*dll = NULL;
}

void
rpl_bool_t
rpl_dll_open(rpl_dll_t dll, const char* file)
{
rpl_dll_close(dll);

#if defined(RPL_OS_WINDOWS)
dll->handle = LoadLibrary(file);
if (dll->handle != NULL)
return RPL_TRUE;

rpl_error_set(GetLastError());

#elif defined(RPL_OS_UNIX)
dll->handle = dlopen(file, RTLD_NOW);
if (dll->handle != NULL)
return RPL_TRUE;

rpl_error_set(RPL_ERROR_NO_CODE);
rpl_error_set_message(dlerror());
#endif

return RPL_FALSE;
}

void
Expand Down Expand Up @@ -104,5 +117,7 @@ rpl_dll_get(rpl_dll_t dll, const char* symbol_name)
symbol = dlsym(dll->handle, symbol_name);

#endif

return symbol;
}

3 changes: 2 additions & 1 deletion src/rpl/dll.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@

/* RPL headers. */
#include <rpl/platform.h>
#include <rpl/types.h>

/** Dynamic-link Library object. */
typedef struct rpl_dll* rpl_dll_t;
Expand All @@ -36,7 +37,7 @@ rpl_dll_new(void);
void
rpl_dll_free(rpl_dll_t* dll);

void
rpl_bool_t
rpl_dll_open(rpl_dll_t dll, const char* file);

void
Expand Down
37 changes: 33 additions & 4 deletions src/rpl/error.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,20 @@ rpl_error_set(int error)
e->code = error;
}

void
rpl_error_clear(void)
{
struct rpl_error* e = rpl_tls_key_get_value(rpl_error_key);
e->code = 0;
}

void
rpl_error_set_message(const char* message)
{
struct rpl_error* e = rpl_tls_key_get_value(rpl_error_key);
strncpy(e->message, message, MAX_MESSAGE_SIZE);
}

const char*
rpl_error_translate(int error)
{
Expand All @@ -108,14 +122,23 @@ rpl_error_translate(int error)
struct rpl_error* e = rpl_tls_key_get_value(rpl_error_key);

#if defined(RPL_OS_UNIX)
if (e->code == RPL_ERROR_NO_CODE)
return e->message;

if (strerror_r(error, e->message, MAX_MESSAGE_SIZE) == 0)
return e->message;

#elif defined(RPL_OS_WINDOWS)
WORD lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
DWORD size = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, "%0",
error, lang, e->message, MAX_MESSAGE_SIZE,
NULL);
WORD lang = 0;
DWORD size = 0;

if (e->code == RPL_ERROR_NO_CODE)
return e->message;

lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
size = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, "%0",
error, lang, e->message, MAX_MESSAGE_SIZE,
NULL);
if (size > 0)
{
for (--size; size >= 0; --size)
Expand All @@ -132,3 +155,9 @@ rpl_error_translate(int error)
return "unable to translate error";
}

const char*
rpl_error_translate_last(void)
{
struct rpl_error* e = rpl_tls_key_get_value(rpl_error_key);
return rpl_error_translate(e->code);
}
11 changes: 11 additions & 0 deletions src/rpl/error.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@

extern rpl_tls_key_t rpl_error_key;

#define RPL_ERROR_NO_CODE 2147483647

void
rpl_error_init(void);

Expand All @@ -43,7 +45,16 @@ rpl_error_get(void);
void
rpl_error_set(int error);

void
rpl_error_clear(void);

void
rpl_error_set_message(const char* message);

const char*
rpl_error_translate(int error);

const char*
rpl_error_translate_last(void);

#endif
1 change: 1 addition & 0 deletions src/rpl/rpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <rpl/types.h>
#include <rpl/network/udp_socket.h>
#include <rpl/network/tcp_socket.h>
#include <rpl/dll.h>

/**
* @defgroup INIT Initialization
Expand Down

0 comments on commit 06f1825

Please sign in to comment.