use define ABI_VERSION when declaring backends, patch by Stelios Bounanos M0GLD

git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@2719 7ae35d74-ebe9-4afe-98af-79ac388436b8
Hamlib-1.2.10
Stéphane Fillod, F8CFE 2009-09-04 21:30:32 +00:00
rodzic 6282f571eb
commit e7a8fe2fb2
2 zmienionych plików z 39 dodań i 20 usunięć

Wyświetl plik

@ -286,6 +286,28 @@ int rig_load_all_backends()
#define MAXFUNCNAMELEN 64
typedef int (*backend_init_t)(rig_ptr_t);
/*
* rig_check_backend_version
* Check that the versioned init function name for be_name is the correct version.
*/
static backend_init_t rig_check_backend_version(const lt_dlhandle be_handle, const char *be_name,
backend_init_t **be_init)
{
char initfname[MAXFUNCNAMELEN];
snprintf(initfname, MAXFUNCNAMELEN, "initrigs%d_%s", ABI_VERSION, be_name);
*be_init = (backend_init_t) lt_dlsym(be_handle, initfname);
if (!*be_init) {
rig_debug(RIG_DEBUG_ERR, "rig: dlsym(%s) failed (%s)\n",
initfname, lt_dlerror());
return -RIG_EINVAL;
}
return RIG_OK;
}
/*
* rig_load_backend
* Dynamically load a rig backend through dlopen mechanism
@ -295,10 +317,9 @@ int HAMLIB_API rig_load_backend(const char *be_name)
# define PREFIX "hamlib-"
lt_dlhandle be_handle;
int (*be_init)(rig_ptr_t);
backend_init_t be_init;
int status;
char libname[PATH_MAX];
char initfname[MAXFUNCNAMELEN];
char probefname[MAXFUNCNAMELEN];
int i;
@ -333,26 +354,16 @@ int HAMLIB_API rig_load_backend(const char *be_name)
* external module not found? try dlopenself for backends
* compiled in static
*/
if (!be_handle) {
if (!be_handle || rig_check_backend_version(be_handle, be_name, &be_init) != RIG_OK) {
rig_debug(RIG_DEBUG_VERBOSE, "rig: lt_dlopen(\"%s\") failed (%s), "
"trying static symbols...\n",
libname, lt_dlerror());
be_handle = lt_dlopen (NULL);
}
if (!be_handle) {
rig_debug(RIG_DEBUG_ERR, "rig: lt_dlopen(\"%s\") failed (%s)\n",
if (!be_handle || rig_check_backend_version(be_handle, be_name, &be_init) != RIG_OK) {
rig_debug(RIG_DEBUG_ERR, "rig: lt_dlopen(\"%s\") failed (%s)\n",
libname, lt_dlerror());
return -RIG_EINVAL;
}
snprintf(initfname, MAXFUNCNAMELEN, "initrigs%d_%s", ABI_VERSION, be_name);
be_init = (int (*)(rig_ptr_t)) lt_dlsym (be_handle, initfname);
if (!be_init) {
rig_debug(RIG_DEBUG_ERR, "rig: dlsym(%s) failed (%s)\n",
initfname, lt_dlerror());
lt_dlclose(be_handle);
return -RIG_EINVAL;
}
}

Wyświetl plik

@ -32,24 +32,32 @@
#define EXTERN_C extern
#endif
#define CONCAT4(w__, x__, y__, z__) w__ ## x__ ## y__ ## z__
#define MAKE_VERSIONED_FN(prefix__, version__, name_args__) CONCAT4(prefix__, version__, _, name_args__)
/* void MAKE_VERSIONED_FN(foo, 42, bar(int i)) -> void foo42_bar(int i) */
#ifndef ABI_VERSION
#error ABI_VERSION undefined! Did you include config.h?
#endif
#ifdef DECLARE_INITRIG_BACKEND
#undef DECLARE_INITRIG_BACKEND
#endif
#define DECLARE_INITRIG_BACKEND(backend) EXTERN_C BACKEND_EXPORT(int) initrigs2_##backend(void *be_handle)
#define DECLARE_INITRIG_BACKEND(backend) EXTERN_C BACKEND_EXPORT(int) MAKE_VERSIONED_FN(initrigs, ABI_VERSION, backend(void *be_handle))
#ifdef DECLARE_PROBERIG_BACKEND
#undef DECLARE_PROBERIG_BACKEND
#endif
#define DECLARE_PROBERIG_BACKEND(backend) EXTERN_C BACKEND_EXPORT(rig_model_t) probeallrigs2_##backend(hamlib_port_t *port, rig_probe_func_t cfunc, rig_ptr_t data)
#define DECLARE_PROBERIG_BACKEND(backend) EXTERN_C BACKEND_EXPORT(rig_model_t) MAKE_VERSIONED_FN(probeallrigs, ABI_VERSION, backend(hamlib_port_t *port, rig_probe_func_t cfunc, rig_ptr_t data))
#ifdef DECLARE_INITROT_BACKEND
#undef DECLARE_INITROT_BACKEND
#endif
#define DECLARE_INITROT_BACKEND(backend) EXTERN_C BACKEND_EXPORT(int) initrots2_##backend(void *be_handle)
#define DECLARE_INITROT_BACKEND(backend) EXTERN_C BACKEND_EXPORT(int) MAKE_VERSIONED_FN(initrots, ABI_VERSION, backend(void *be_handle))
#ifdef DECLARE_PROBEROT_BACKEND
#undef DECLARE_PROBEROT_BACKEND
#endif
#define DECLARE_PROBEROT_BACKEND(backend) EXTERN_C BACKEND_EXPORT(rot_model_t) probeallrots2_##backend(hamlib_port_t *port, rig_probe_func_t cfunc, rig_ptr_t data)
#define DECLARE_PROBEROT_BACKEND(backend) EXTERN_C BACKEND_EXPORT(rot_model_t) MAKE_VERSIONED_FN(probeallrots, ABI_VERSION, backend(hamlib_port_t *port, rig_probe_func_t cfunc, rig_ptr_t data))
#endif /* _REGISTER_H */