#if defined(_WIN32)
# define WIN32_LEAN_AND_MEAN 1
# include <windows.h>
# define DLLHANDLE HMODULE
# define LOADERLIB "p6loader.dll"
# define LOADLIB(fn) LoadLibraryA((fn))
# define LOADSYMBOL(h,s) GetProcAddress((HMODULE)(h),(s))
# define FREELIB(h) FreeLibrary((HMODULE)(h))
#else
# include <string.h>
# include <dlfcn.h>
# include <unistd.h>
# define DLLHANDLE void*
# define LOADERLIB "libp6loader.so"
# define LOADLIB(fn) dlopen((fn),RTLD_NOW)
# define LOADSYMBOL(h,s) dlsym((h),(s))
# define FREELIB(h) !dlclose((h))
#endif
#include <stdio.h>
#include <stdlib.h>
#undef P6ASSERT
#define P6ASSERT(x)
using namespace P6R;
DLLHANDLE ghDll = NULL;
{
if(!pBuffer || !cBuffer)
return eInvalidArg;
pBuffer[0] = '\0';
#if defined(_WIN32)
if(0 != ::GetModuleFileNameA(NULL,pBuffer,(DWORD)cBuffer)) {
while(*pTmp) {
if('\\' == *pTmp) *pTmp = '/';
pTmp++;
}
pszEnd = strrchr(pBuffer,'/');
if(NULL != pszEnd) *pszEnd = '\0';
}
else err = eFail;
#elif defined(__SUNPRO_CC)
const P6CHAR *pszExecName = NULL;
if(NULL != (pszExecName = getexecname())) {
if('/' != *pszExecName) {
getcwd(pBuffer,cBuffer);
strcat(pBuffer,"/");
strcat(pBuffer,pszExecName);
}
else {
strcat(pBuffer,pszExecName);
}
pszEnd = strrchr(pBuffer,'/');
if(NULL != pszEnd) *pszEnd = '\0';
}
else err = eFail;
#elif defined(__linux__)
if(-1 != readlink("/proc/self/exe",pBuffer,cBuffer-1)) {
pszEnd = strrchr(pBuffer,'/');
if(NULL != pszEnd) *pszEnd = '\0';
err = P6R::eOk;
}
#endif
return err;
}
{
P6ERR err = eDllNotFound;
strcat(&szLib[0],"/");
strcat(&szLib[0],LOADERLIB);
if(NULL != (ghDll = LOADLIB(&szLib[0]))) {
gp6GetDirectory = (
P6GETDIRECTORY) LOADSYMBOL(ghDll,
"p6GetDirectory");
gp6ErrToStr = (
P6ERRTOSTR) LOADSYMBOL(ghDll,
"p6ErrToStr");
gp6ErrToWStr = (
P6ERRTOWSTR) LOADSYMBOL(ghDll,
"p6ErrToWStr");
gp6AtomicInc32 = (
P6ATOMICINC32) LOADSYMBOL(ghDll,
"p6AtomicInc32");
gp6AtomicDec32 = (
P6ATOMICDEC32) LOADSYMBOL(ghDll,
"p6AtomicDec32");
gp6TraceAddref = (
P6TRACEADDREF) LOADSYMBOL(ghDll,
"p6TraceAddref");
gp6TraceRelease = (
P6TRACERELEASE) LOADSYMBOL(ghDll,
"p6TraceRelease");
if(gp6InitializeLoader && gp6CleanupLoader && gp6CreateInstance && gp6GetRuntimeIface && \
gp6ErrToStr && gp6ErrToWStr && gp6AtomicInc32 && gp6AtomicDec32) {
err = eOk;
}
else {
if(!gp6InitializeLoader) printf("ERROR: Symbol Not Found [ p6InitializeLoader ]\n");
if(!gp6CleanupLoader) printf("ERROR: Symbol Not Found [ p6CleanupLoader ]\n");
if(!gp6CreateInstance) printf("ERROR: Symbol Not Found [ p6CreateInstance ]\n");
if(!gp6GetRuntimeIface) printf("ERROR: Symbol Not Found [ p6GetRuntimeIface ]\n");
if(!gp6GetDirectory) printf("ERROR: Symbol Not Found [ gp6GetDirectory ]\n");
if(!gp6ErrToStr) printf("ERROR: Symbol Not Found [ p6ErrToStr ]\n");
if(!gp6ErrToWStr) printf("ERROR: Symbol Not Found [ p6ErrToWStr ]\n");
if(!gp6AtomicInc32) printf("ERROR: Symbol Not Found [ p6AtomicInc32 ]\n");
if(!gp6AtomicDec32) printf("ERROR: Symbol Not Found [ p6AtomicDec32 ]\n");
if(!gp6TraceAddref) printf("ERROR: Symbol Not Found [ p6TraceAddref ]\n");
if(!gp6TraceRelease) printf("ERROR: Symbol Not Found [ p6TraceRelease ]\n");
err = eNotFound;
}
}
else {
#if defined(_WIN32)
printf("ERROR: Failed to dynamially load '%s' [ %x ]\nERROR: OS Error: %x\n",&szLib[0],err,::GetLastError());
#else
printf("ERROR: Failed to dynamially load '%s' [ %x ]\nERROR: OS Error: %s\n",&szLib[0],err,dlerror());
#endif
}
}
return err;
}
static void unloadSymbols()
{
if(NULL != ghDll) {
(void) FREELIB(ghDll);
}
}
{
if(
P6FAILED(err = gp6InitializeLoader(pLogSink,nVerbosity,fFlags))) {
printf(
"ERROR: p6InitializeLoader() Failed [ %s ]\n",gp6ErrToStr(err,&szErr[0],
P6CHARCNT(szErr)));
}
}
return err;
}
{
P6ERR err = gp6CleanupLoader();
unloadSymbols();
return err;
}
{
if(!gp6GetRuntimeIface) return eNotInitialized;
return gp6GetRuntimeIface(iid, ppIface);
}
{
if(!gp6CreateInstance) return eNotInitialized;
return gp6CreateInstance(pOuter,cid,iid,ppIface);
}
{
if(!gp6CreateCryptoInstance) return eNotInitialized;
return gp6CreateCryptoInstance(cid,iid,ppIface);
}
{
if(!gp6GetDirectory) return eNotInitialized;
return gp6GetDirectory(nDir,pBuffer,cBuffer,pcWritten);
}
{
if(!gp6ErrToStr) return NULL;
return gp6ErrToStr(err,pszBuffer,cBuffer);
}
{
if(!gp6ErrToWStr) return NULL;
return gp6ErrToWStr(err,pszBuffer,cBuffer);
}
{
if(!gp6AtomicInc32) return 0;
return gp6AtomicInc32(pVar);
}
{
if(!gp6AtomicDec32) return 0;
return gp6AtomicDec32(pVar);
}
{
if(!gp6TraceAddref) return eNotInitialized;
return gp6TraceAddref(pszClassname,cClassSize,classAddr,refCount,pSerialNumber);
}
{
if(!gp6TraceRelease) return eNotInitialized;
return gp6TraceRelease(pszClassname,classAddr,refCount,pSerialNumber);
}
{
return eOk;
}