qse/lib/http/httpd-std-mod.h

216 lines
4.8 KiB
C

/* Override the global definition QSE_ENABLE_STATIC_MODULE
* for httpd on platforms with mature dynamic loading support.
*/
#if defined(QSE_ENABLE_STATIC_MODULE) && \
(defined(USE_LTDL) || defined(_WIN32) || defined(__OS2__))
# undef QSE_ENABLE_STATIC_MODULE
#endif
static void* mod_open (qse_httpd_t* httpd, const qse_char_t* sysname)
{
#if defined(USE_LTDL)
void* h;
qse_mchar_t* modpath;
#if defined(QSE_CHAR_IS_MCHAR)
modpath = sysname;
#else
modpath = qse_wcstombsdup (sysname, QSE_NULL, qse_httpd_getmmgr(httpd));
if (!modpath)
{
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOMEM);
return QSE_NULL;
}
#endif
h = lt_dlopenext (modpath);
if (!h) qse_httpd_seterrnum (httpd, syserr_to_errnum(errno));
#if defined(QSE_CHAR_IS_MCHAR)
/* do nothing */
#else
QSE_MMGR_FREE (qse_httpd_getmmgr(httpd), modpath);
#endif
return h;
#elif defined(_WIN32)
HMODULE h;
h = LoadLibrary (sysname);
if (!h) qse_httpd_seterrnum (httpd, syserr_to_errnum(GetLastError()));
QSE_ASSERT (QSE_SIZEOF(h) <= QSE_SIZEOF(void*));
return h;
#elif defined(__OS2__)
HMODULE h;
qse_mchar_t* modpath;
char errbuf[CCHMAXPATH];
APIRET rc;
#if defined(QSE_CHAR_IS_MCHAR)
modpath = sysname;
#else
modpath = qse_wcstombsdup (sysname, QSE_NULL, qse_httpd_getmmgr(httpd));
if (!modpath)
{
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOMEM);
return QSE_NULL;
}
#endif
/* DosLoadModule() seems to have severe limitation on
* the file name it can load (max-8-letters.xxx) */
rc = DosLoadModule (errbuf, QSE_COUNTOF(errbuf) - 1, modpath, &h);
if (rc != NO_ERROR)
{
qse_httpd_seterrnum (httpd, syserr_to_errnum(rc));
h = QSE_NULL;
}
#if defined(QSE_CHAR_IS_MCHAR)
/* do nothing */
#else
QSE_MMGR_FREE (qse_httpd_getmmgr(httpd), modpath);
#endif
QSE_ASSERT (QSE_SIZEOF(h) <= QSE_SIZEOF(void*));
return h;
#elif defined(__DOS__) && defined(QSE_ENABLE_DOS_DYNAMIC_MODULE)
/* the DOS code here is not generic enough. it's for a specific
* dos-extender only. the best is to disable dynamic loading
* when building for DOS. */
void* h;
qse_mchar_t* modpath;
#if defined(QSE_CHAR_IS_MCHAR)
modpath = sysname;
#else
modpath = qse_wcstombsdup (sysname, QSE_NULL, qse_httpd_getmmgr(httpd));
if (!modpath)
{
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOMEM);
return QSE_NULL;
}
#endif
h = LoadModule (modpath);
if (!h) qse_httpd_seterrnum (httpd, syserr_to_errnum(errno));
#if defined(QSE_CHAR_IS_MCHAR)
/* do nothing */
#else
QSE_MMGR_FREE (qse_httpd_getmmgr(httpd), modpath);
#endif
QSE_ASSERT (QSE_SIZEOF(h) <= QSE_SIZEOF(void*));
return h;
#elif defined(USE_DLFCN)
void* h;
qse_mchar_t* modpath;
#if defined(QSE_CHAR_IS_MCHAR)
modpath = sysname;
#else
modpath = qse_wcstombsdup (sysname, QSE_NULL, qse_httpd_getmmgr(httpd));
if (!modpath)
{
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOMEM);
return QSE_NULL;
}
#endif
h = dlopen(modpath, RTLD_NOW);
if (!h) qse_httpd_seterrnum (httpd, QSE_HTTPD_ESYSERR);
#if defined(QSE_CHAR_IS_MCHAR)
/* do nothing */
#else
QSE_MMGR_FREE (qse_httpd_getmmgr(httpd), modpath);
#endif
return h;
#else
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL);
return QSE_NULL;
#endif
}
static void mod_close (qse_httpd_t* httpd, void* handle)
{
#if defined(USE_LTDL)
lt_dlclose (handle);
#elif defined(_WIN32)
FreeLibrary ((HMODULE)handle);
#elif defined(__OS2__)
DosFreeModule ((HMODULE)handle);
#elif defined(__DOS__) && defined(QSE_ENABLE_DOS_DYNAMIC_MODULE)
FreeModule (handle);
#elif defined(USE_DLFCN)
dlclose (handle);
#else
/* nothing to do */
#endif
}
static void* mod_symbol (qse_httpd_t* httpd, void* handle, const qse_char_t* name)
{
void* s;
qse_mchar_t* mname;
#if defined(QSE_CHAR_IS_MCHAR)
mname = name;
#else
mname = qse_wcstombsdup (name, QSE_NULL, qse_httpd_getmmgr(httpd));
if (!mname)
{
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOMEM);
return QSE_NULL;
}
#endif
#if defined(USE_LTDL)
s = lt_dlsym (handle, mname);
if (s == QSE_NULL) qse_httpd_seterrnum (httpd, syserr_to_errnum(errno));
#elif defined(_WIN32)
s = GetProcAddress ((HMODULE)handle, mname);
if (s == QSE_NULL) qse_httpd_seterrnum (httpd, syserr_to_errnum(GetLastError()));
#elif defined(__OS2__)
{
APIRET rc;
rc = DosQueryProcAddr ((HMODULE)handle, 0, mname, (PFN*)&s);
if (rc != NO_ERROR)
{
qse_httpd_seterrnum (httpd, syserr_to_errnum(rc));
s = QSE_NULL;
}
}
#elif defined(__DOS__) && defined(QSE_ENABLE_DOS_DYNAMIC_MODULE)
s = GetProcAddress (handle, mname);
if (s == QSE_NULL) qse_httpd_seterrnum (httpd, syserr_to_errnum(errno));
#elif defined(USE_DLFCN)
s = dlsym (handle, mname);
if (s == QSE_NULL) qse_httpd_seterrnum (httpd, QSE_HTTPD_ESYSERR);
#else
s = QSE_NULL;
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL);
#endif
#if defined(QSE_CHAR_IS_MCHAR)
/* nothing to do */
#else
QSE_MMGR_FREE (qse_httpd_getmmgr(httpd), mname);
#endif
return s;
}