summaryrefslogtreecommitdiffstats
path: root/libdvdread-embedded/msvc/contrib/dlfcn.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdvdread-embedded/msvc/contrib/dlfcn.c')
-rw-r--r--libdvdread-embedded/msvc/contrib/dlfcn.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/libdvdread-embedded/msvc/contrib/dlfcn.c b/libdvdread-embedded/msvc/contrib/dlfcn.c
new file mode 100644
index 0000000..01b5781
--- /dev/null
+++ b/libdvdread-embedded/msvc/contrib/dlfcn.c
@@ -0,0 +1,96 @@
+/*
+ * Adopted from Apache DSO code.
+ * Portions copyright Apache Software Foundation
+ *
+ * Structures and types used to implement dlopen, dlsym, etc.
+ * on Windows 95/NT.
+ */
+#include <windows.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "../include/dlfcn.h"
+#include "../include/os_types.h"
+
+void *dlopen(const char *module_name, int mode)
+{
+ UINT em;
+ HINSTANCE dsoh;
+ char path[MAX_PATH], *p;
+ (void)mode;
+ /* Load the module...
+ * per PR2555, the LoadLibraryEx function is very picky about slashes.
+ * Debugging on NT 4 SP 6a reveals First Chance Exception within NTDLL.
+ * LoadLibrary in the MS PSDK also reveals that it -explicitly- states
+ * that backslashes must be used.
+ *
+ * Transpose '\' for '/' in the filename.
+ */
+ (void)strncpy(path, module_name, MAX_PATH);
+ path[MAX_PATH - 1] = 0;
+ p = path;
+ while ((p = strchr(p, '/')))
+ *p = '\\';
+
+ /* First assume the dso/dll's required by -this- dso are sitting in the
+ * same path or can be found in the usual places. Failing that, let's
+ * let that dso look in the apache root.
+ */
+ em = SetErrorMode(SEM_FAILCRITICALERRORS);
+ dsoh = LoadLibraryEx(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
+ if (!dsoh)
+ {
+ SetLastError(0); // clear the last error
+ dsoh = LoadLibraryEx(path, NULL, 0);
+ }
+ SetErrorMode(em);
+ SetLastError(0); // clear the last error
+ return (void *)dsoh;
+}
+
+char *dlerror(void)
+{
+ int len, nErrorCode;
+ static char errstr[120];
+ /* This is -not- threadsafe code, but it's about the best we can do.
+ * mostly a potential problem for isapi modules, since LoadModule
+ * errors are handled within a single config thread.
+ */
+
+ if((nErrorCode = GetLastError()) == 0)
+ return((char *)0);
+
+ SetLastError(0); // clear the last error
+ len = snprintf(errstr, sizeof(errstr), "(%d) ", nErrorCode);
+
+ len += FormatMessage(
+ FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ nErrorCode,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
+ (LPTSTR) errstr + len,
+ sizeof(errstr) - len,
+ NULL
+ );
+ /* FormatMessage may have appended a newline (\r\n). So remove it
+ * and use ": " instead like the Unix errors. The error may also
+ * end with a . before the return - if so, trash it.
+ */
+ if (len > 1 && errstr[len-2] == '\r' && errstr[len-1] == '\n') {
+ if (len > 2 && errstr[len-3] == '.')
+ len--;
+ errstr[len-2] = ':';
+ errstr[len-1] = ' ';
+ }
+ return errstr;
+}
+
+int dlclose(void *handle)
+{
+ return FreeLibrary(handle);
+}
+
+void *dlsym(void *handle, const char *name)
+{
+ return GetProcAddress(handle, name);
+}