From 6fea2c436a6f4a501be632e9bb7453570c09fb8e Mon Sep 17 00:00:00 2001 From: Sverker Eriksson Date: Thu, 19 Sep 2013 19:13:13 +0200 Subject: erts, crypto: Support NIF library with unicode filename on windows --- erts/emulator/sys/win32/erl_win32_sys_ddll.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'erts/emulator/sys') diff --git a/erts/emulator/sys/win32/erl_win32_sys_ddll.c b/erts/emulator/sys/win32/erl_win32_sys_ddll.c index 4c8d83ab16..553d3b0983 100644 --- a/erts/emulator/sys/win32/erl_win32_sys_ddll.c +++ b/erts/emulator/sys/win32/erl_win32_sys_ddll.c @@ -38,7 +38,7 @@ #include "erl_nif.h" #define EXT_LEN 4 -#define FILE_EXT ".dll" +#define FILE_EXT_WCHAR L".dll" static DWORD tls_index = 0; static TWinDynDriverCallbacks wddc; @@ -57,11 +57,14 @@ void erl_sys_ddll_init(void) { /* * Open a shared object + * Expecting 'full_name' as an UTF-8 string. */ int erts_sys_ddll_open2(const char *full_name, void **handle, ErtsSysDdllError* err) { + HINSTANCE hinstance; int len; char dlname[MAXPATHLEN + 1]; + char* wcp; if ((len = sys_strlen(full_name)) >= MAXPATHLEN - EXT_LEN) { if (err != NULL) { @@ -69,10 +72,23 @@ int erts_sys_ddll_open2(const char *full_name, void **handle, ErtsSysDdllError* } return ERL_DE_LOAD_ERROR_NAME_TO_LONG; } - sys_strcpy(dlname, full_name); - sys_strcpy(dlname+len, FILE_EXT); - return erts_sys_ddll_open_noext(dlname, handle, err); + + wcp = erts_convert_filename_to_wchar(full_name, len, dlname, sizeof(dlname), + ERTS_ALC_T_TMP, &used, EXT_LEN); + wcscpy(&wcp[used], FILE_EXT_WCHAR); + + if ((hinstance = LoadLibraryW(wcp)) == NULL) { + int code = ERL_DE_DYNAMIC_ERROR_OFFSET - GetLastError(); + if (err != NULL) { + err->str = erts_sys_ddll_error(code); + } + return code; + } + + *handle = (void *) hinstance; + return ERL_DE_NO_ERROR; } + int erts_sys_ddll_open_noext(char *dlname, void **handle, ErtsSysDdllError* err) { HINSTANCE hinstance; -- cgit v1.2.3 From 3a0402e1157a89fac210f2276d9461aab30a9968 Mon Sep 17 00:00:00 2001 From: Patrik Nyblom Date: Tue, 24 Sep 2013 16:19:44 +0200 Subject: Fix open_ddll for win --- erts/emulator/sys/win32/erl_win32_sys_ddll.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) (limited to 'erts/emulator/sys') diff --git a/erts/emulator/sys/win32/erl_win32_sys_ddll.c b/erts/emulator/sys/win32/erl_win32_sys_ddll.c index 553d3b0983..2d3f073cc2 100644 --- a/erts/emulator/sys/win32/erl_win32_sys_ddll.c +++ b/erts/emulator/sys/win32/erl_win32_sys_ddll.c @@ -63,8 +63,9 @@ int erts_sys_ddll_open2(const char *full_name, void **handle, ErtsSysDdllError* { HINSTANCE hinstance; int len; - char dlname[MAXPATHLEN + 1]; - char* wcp; + wchar_t* wcp; + Sint used; + int code; if ((len = sys_strlen(full_name)) >= MAXPATHLEN - EXT_LEN) { if (err != NULL) { @@ -73,20 +74,23 @@ int erts_sys_ddll_open2(const char *full_name, void **handle, ErtsSysDdllError* return ERL_DE_LOAD_ERROR_NAME_TO_LONG; } - wcp = erts_convert_filename_to_wchar(full_name, len, dlname, sizeof(dlname), - ERTS_ALC_T_TMP, &used, EXT_LEN); - wcscpy(&wcp[used], FILE_EXT_WCHAR); + wcp = (wchar_t*)erts_convert_filename_to_wchar((byte*)full_name, len, + NULL, 0, + ERTS_ALC_T_TMP, &used, EXT_LEN); + wcscpy(&wcp[used/2 - 1], FILE_EXT_WCHAR); if ((hinstance = LoadLibraryW(wcp)) == NULL) { - int code = ERL_DE_DYNAMIC_ERROR_OFFSET - GetLastError(); + code = ERL_DE_DYNAMIC_ERROR_OFFSET - GetLastError(); if (err != NULL) { err->str = erts_sys_ddll_error(code); } - return code; } - - *handle = (void *) hinstance; - return ERL_DE_NO_ERROR; + else { + code = ERL_DE_NO_ERROR; + *handle = (void *) hinstance; + } + erts_free(ERTS_ALC_T_TMP, wcp); + return code; } int erts_sys_ddll_open_noext(char *dlname, void **handle, ErtsSysDdllError* err) -- cgit v1.2.3