Format dlopen.c

This commit is contained in:
interfiberschool 2023-05-25 11:54:12 -04:00 committed by GitHub
parent 9181d91988
commit 4ec4a0ecf5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,91 +1,93 @@
#include "dlopen.h" #include "dlopen.h"
#include <stdlib.h> #include <stdlib.h>
struct hotwire_dll_t hw_dlopen(const char *file, int flags) { struct hotwire_dll_t hw_dlopen(const char* file, int flags)
{
struct hotwire_dll_t dll; struct hotwire_dll_t dll;
// UNIX specific code(MacOS uses the same API as linux for dlopen) // UNIX specific code(MacOS uses the same API as linux for dlopen)
#if defined(__linux__) || defined(__APPLE__) #if defined(__linux__) || defined(__APPLE__)
dll.dll_handle = dlopen(file, flags); dll.dll_handle = dlopen(file, flags);
if (dll.dll_handle == NULL) { if (dll.dll_handle == NULL) {
printf("Could not load dll(UNIX api call returned error)\n"); printf("Could not load dll(UNIX api call returned error)\n");
printf("Error message: %s\n", dlerror()); printf("Error message: %s\n", dlerror());
exit(-1); exit(-1);
} }
#endif #endif
// Windows specific code // Windows specific code
#if defined(_WIN32) #if defined(_WIN32)
dll.dll_handle = LoadLibrary(file); dll.dll_handle = LoadLibrary(file);
if (!dll.dll_handle) { if (!dll.dll_handle) {
printf("Could not load dll(Windows api call returned error)\n"); printf("Could not load dll(Windows api call returned error)\n");
hw_platform_win32_get_last_error(TEXT("LoadLibrary")); hw_platform_win32_get_last_error(TEXT("LoadLibrary"));
exit(-1); exit(-1);
} }
#endif #endif
return dll; return dll;
} }
void *hw_dlsym(struct hotwire_dll_t dll, const char *symbol) { void* hw_dlsym(struct hotwire_dll_t dll, const char* symbol)
{
#if defined(_WIN32) #if defined(_WIN32)
return GetProcAddress(dll.dll_handle, symbol); return GetProcAddress(dll.dll_handle, symbol);
#endif #endif
#if defined(__linux) || defined(__APPLE__) #if defined(__linux) || defined(__APPLE__)
return dlsym(dll.dll_handle, symbol); return dlsym(dll.dll_handle, symbol);
#endif #endif
} }
enum hotwire_status_code hw_dlclose(struct hotwire_dll_t handle) { enum hotwire_status_code hw_dlclose(struct hotwire_dll_t handle)
{
#if defined(__linux) || defined(__APPLE__) #if defined(__linux) || defined(__APPLE__)
if (dlclose(handle.dll_handle) != 0) { if (dlclose(handle.dll_handle) != 0) {
return Failed; return Failed;
} else { }
return Success; else {
} return Success;
}
#endif #endif
#if defined(__WIN32) #if defined(__WIN32)
if (FreeLibrary(handle.dll_handle)) { if (FreeLibrary(handle.dll_handle)) {
return Success; return Success;
} else { }
return Failed; else {
} return Failed;
}
#endif #endif
return NoPlatform; return NoPlatform;
} }
#if defined(_WIN32) #if defined(_WIN32)
void hw_platform_win32_get_last_error(LPTSTR lpszFunction) { void hw_platform_win32_get_last_error(LPTSTR lpszFunction)
LPVOID lpMsgBuf; {
LPVOID lpDisplayBuf; LPVOID lpMsgBuf;
DWORD dw = GetLastError(); LPVOID lpDisplayBuf;
DWORD dw = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL);
(LPTSTR)&lpMsgBuf, 0, NULL);
// Display the error message and exit the process // Display the error message and exit the process
lpDisplayBuf = lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR));
(LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf) + StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR),
lstrlen((LPCTSTR)lpszFunction) + 40) * TEXT("%s failed with error %d: %s"), lpszFunction, dw,
sizeof(TCHAR)); lpMsgBuf);
StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR),
TEXT("%s failed with error %d: %s"), lpszFunction, dw,
lpMsgBuf);
printf("Error message: %s", (LPCTSTR)lpDisplayBuf); printf("Error message: %s", (LPCTSTR)lpDisplayBuf);
LocalFree(lpMsgBuf); LocalFree(lpMsgBuf);
LocalFree(lpDisplayBuf); LocalFree(lpDisplayBuf);
} }
#endif #endif