Error messages to stderr only.
For MS Windows: Make code model path absolute. Call LoadLibrary only when *.cm file exists. Until now spurious return from LoadLibrary prevented error message, when *.cm was not found, followed by a crash upon 'quit'.
This commit is contained in:
parent
fa5ac4a0cd
commit
32901f9d0c
|
|
@ -47,6 +47,8 @@ typedef void * funptr_t;
|
||||||
#else /* ifdef HAS_WINGUI */
|
#else /* ifdef HAS_WINGUI */
|
||||||
#undef BOOLEAN
|
#undef BOOLEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#include <shlwapi.h>
|
||||||
|
#include <libloaderapi.h>
|
||||||
typedef FARPROC funptr_t;
|
typedef FARPROC funptr_t;
|
||||||
void *dlopen(const char *, int);
|
void *dlopen(const char *, int);
|
||||||
funptr_t dlsym(void *, const char *);
|
funptr_t dlsym(void *, const char *);
|
||||||
|
|
@ -420,7 +422,7 @@ int add_udn(int n,Evt_Udn_Info_t **udns){
|
||||||
|
|
||||||
int load_opus(const char *name)
|
int load_opus(const char *name)
|
||||||
{
|
{
|
||||||
void *lib;
|
void *lib = NULL;
|
||||||
char *msg;
|
char *msg;
|
||||||
int num;
|
int num;
|
||||||
SPICEdev **devs;
|
SPICEdev **devs;
|
||||||
|
|
@ -428,9 +430,10 @@ int load_opus(const char *name)
|
||||||
funptr_t fetch;
|
funptr_t fetch;
|
||||||
|
|
||||||
lib = dlopen(name, RTLD_NOW);
|
lib = dlopen(name, RTLD_NOW);
|
||||||
|
// fprintf(stdout, "Lib %s has handle %p\n", name, lib);
|
||||||
if (!lib) {
|
if (!lib) {
|
||||||
msg = dlerror();
|
msg = dlerror();
|
||||||
printf("Error opening code model \"%s\": %s\n", name, msg);
|
fprintf(stderr, "Error opening code model \"%s\"\n: %s\n", name, msg);
|
||||||
FREE_DLERR_MSG(msg);
|
FREE_DLERR_MSG(msg);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -445,7 +448,7 @@ int load_opus(const char *name)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
msg = dlerror();
|
msg = dlerror();
|
||||||
printf("Error getting the list of devices: %s\n",
|
fprintf(stderr, "Error getting the list of devices: %s\n",
|
||||||
msg);
|
msg);
|
||||||
FREE_DLERR_MSG(msg);
|
FREE_DLERR_MSG(msg);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
@ -453,7 +456,7 @@ int load_opus(const char *name)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
msg = dlerror();
|
msg = dlerror();
|
||||||
printf("Error finding the number of devices: %s\n", msg);
|
fprintf(stderr, "Error finding the number of devices: %s\n", msg);
|
||||||
FREE_DLERR_MSG(msg);
|
FREE_DLERR_MSG(msg);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -474,7 +477,7 @@ int load_opus(const char *name)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
msg = dlerror();
|
msg = dlerror();
|
||||||
printf("Error getting the list of user-defined types: %s\n",
|
fprintf(stderr, "Error getting the list of user-defined types: %s\n",
|
||||||
msg);
|
msg);
|
||||||
FREE_DLERR_MSG(msg);
|
FREE_DLERR_MSG(msg);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
@ -482,7 +485,7 @@ int load_opus(const char *name)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
msg = dlerror();
|
msg = dlerror();
|
||||||
printf("Error finding the number of user-defined types: %s\n", msg);
|
fprintf(stderr, "Error finding the number of user-defined types: %s\n", msg);
|
||||||
FREE_DLERR_MSG(msg);
|
FREE_DLERR_MSG(msg);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -501,7 +504,7 @@ int load_opus(const char *name)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
msg = dlerror();
|
msg = dlerror();
|
||||||
printf("Error getting interface pointer: %s\n", msg);
|
fprintf(stderr, "Error getting interface pointer: %s\n", msg);
|
||||||
FREE_DLERR_MSG(msg);
|
FREE_DLERR_MSG(msg);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -522,7 +525,33 @@ static char errstr[sizeof errstr_fmt - 3 + 3 * sizeof(unsigned long)];
|
||||||
void *dlopen(const char *name, int type)
|
void *dlopen(const char *name, int type)
|
||||||
{
|
{
|
||||||
NG_IGNORE(type);
|
NG_IGNORE(type);
|
||||||
return LoadLibrary(name);
|
/* Replace / by \\ */
|
||||||
|
char* tmp, * tmpdel;
|
||||||
|
tmp = tmpdel = copy(name);
|
||||||
|
while (*tmp != '\0') {
|
||||||
|
if (*tmp == '/')
|
||||||
|
*tmp = '\\';
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
/* LoadLibrary returns some value even if lib is not available (maybe
|
||||||
|
due to relative path given) */
|
||||||
|
void* ret;
|
||||||
|
if (PathIsRelative(tmpdel)) {
|
||||||
|
/* Replace relative by absolute path */
|
||||||
|
char ngpath[512];
|
||||||
|
GetModuleFileName(NULL, ngpath, 512);
|
||||||
|
PathRemoveFileSpec(ngpath);
|
||||||
|
PathCombine(ngpath, ngpath, tmpdel);
|
||||||
|
if (PathFileExists(ngpath))
|
||||||
|
ret = LoadLibrary(ngpath);
|
||||||
|
else
|
||||||
|
ret = NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret = LoadLibrary(tmpdel);
|
||||||
|
}
|
||||||
|
tfree(tmpdel);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
funptr_t dlsym(void *hDll, const char *funcname)
|
funptr_t dlsym(void *hDll, const char *funcname)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue