Index: libroar/roardl.c
===================================================================
--- libroar/roardl.c	(revision 5270)
+++ libroar/roardl.c	(revision 5275)
@@ -40,4 +40,122 @@
 #endif
 
+struct roar_dl_lhandle {
+ struct roar_dl_librarypara * para;
+ struct roar_dl_libraryinst * lib;
+#if defined(ROAR_HAVE_LIBDL)
+ void * handle;
+#endif
+};
+
+
+struct roar_dl_librarypara * roar_dl_para_new(const char * args, void * binargv,
+                                              const char * appname, const char * abiversion) {
+ struct roar_dl_librarypara * ret = roar_mm_malloc(sizeof(struct roar_dl_librarypara));
+ ssize_t argc;
+ int err;
+
+ if ( ret == NULL )
+  return NULL;
+
+ memset(ret, 0, sizeof(struct roar_dl_librarypara));
+
+ ret->version    = ROAR_DL_LIBPARA_VERSION;
+ ret->len        = sizeof(struct roar_dl_librarypara);
+ ret->refc       = 1;
+ ret->argc       = 0;
+ ret->argv       = NULL;
+ ret->args_store = NULL;
+ ret->binargv    = binargv;
+ ret->appname    = appname;
+ ret->abiversion = abiversion;
+
+ if ( args != NULL ) {
+  ret->args_store = roar_mm_strdup(args);
+  if ( ret->args_store == NULL ) {
+   err = roar_error;
+   roar_mm_free(ret);
+   roar_error = err;
+   return NULL;
+  }
+
+  argc = roar_keyval_split(&(ret->argv), ret->args_store, NULL, NULL, 0);
+  if ( argc == -1 ) {
+   err = roar_error;
+   roar_mm_free(ret->args_store);
+   roar_mm_free(ret);
+   roar_error = err;
+   return NULL;
+  }
+
+  ret->argc = argc;
+ }
+
+ return ret;
+}
+
+int roar_dl_para_ref                    (struct roar_dl_librarypara * para) {
+ if ( para == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
+
+ para->refc++;
+
+ return 0;
+}
+
+int roar_dl_para_unref                  (struct roar_dl_librarypara * para) {
+ if ( para == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
+
+ para->refc--;
+
+ if ( para->refc == 0 ) {
+  if ( para->args_store != NULL ) {
+   roar_mm_free(para->args_store);
+   roar_mm_free(para->argv);
+  }
+  roar_mm_free(para);
+ }
+
+ return 0;
+}
+int roar_dl_para_check_version          (struct roar_dl_librarypara * para,
+                                         const char * appname, const char * abiversion) {
+ if ( para == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
+
+ // check if both appnames are NULL or non-NULL.
+ if ( (para->appname == NULL && appname != NULL) || (para->appname != NULL && appname == NULL) ) {
+  roar_err_set(ROAR_ERROR_BADVERSION);
+  return -1;
+ }
+
+ // check if the appname matches if given.
+ if ( para->appname != NULL && !!strcmp(para->appname, appname) ) {
+  roar_err_set(ROAR_ERROR_BADVERSION);
+  return -1;
+ }
+
+ // check if both ABI versions are NULL or non-NULL.
+ if ( (para->abiversion == NULL && abiversion != NULL) || (para->abiversion != NULL && abiversion == NULL) ) {
+  roar_err_set(ROAR_ERROR_BADVERSION);
+  return -1;
+ }
+
+ // check if the ABI versions matches if given.
+ if ( para->abiversion != NULL && !!strcmp(para->abiversion, abiversion) ) {
+  roar_err_set(ROAR_ERROR_BADVERSION);
+  return -1;
+ }
+
+ return 0;
+}
+
+
 #if defined(ROAR_HAVE_LIBDL)
 static void * _roardl2ldl (struct roar_dl_lhandle * lhandle) {
@@ -52,11 +170,15 @@
 #endif
 
-struct roar_dl_lhandle * roar_dl_open(const char * filename, int flags, int ra_init) {
+struct roar_dl_lhandle * roar_dl_open(const char * filename, int flags,
+                                      int ra_init, struct roar_dl_librarypara * para) {
  struct roar_dl_lhandle * ret = NULL;
+ int err;
 
  // early errors just return.
 
- if ( flags != ROAR_DL_FLAG_DEFAUTS )
-  return NULL;
+ if ( flags != ROAR_DL_FLAG_DEFAUTS ) {
+  roar_err_set(ROAR_ERROR_NOTSUP);
+  return NULL;
+ }
 
  if ( (ret = roar_mm_malloc(sizeof(struct roar_dl_lhandle))) == NULL )
@@ -80,13 +202,25 @@
 #else
  roar_mm_free(ret);
+ roar_err_set(ROAR_ERROR_NOSYS);
  return NULL;
 #endif
 
- if ( ret == NULL )
-  return NULL;
+ ret->para = para;
 
  if ( ra_init ) {
-  roar_dl_ra_init(ret, NULL);
- }
+  if ( roar_dl_ra_init(ret, NULL, para) == -1 ) {
+   err = roar_error;
+   ROAR_WARN("roar_dl_open(filename='%s', flags=%i, ra_init=%i, para=%p): Can not init RA lib: %s", filename, flags, ra_init, para, roar_error2str(err));
+#if defined(ROAR_HAVE_LIBDL)
+   dlclose(ret->handle);
+#endif
+   roar_mm_free(ret);
+   roar_error = err;
+   return NULL;
+  }
+ }
+
+ if ( para != NULL )
+  roar_dl_para_ref(para);
 
  return ret;
@@ -96,8 +230,8 @@
  int ret = -1;
 
- if ( lhandle == ROAR_DL_HANDLE_DEFAULT )
-  return -1;
- if ( lhandle == ROAR_DL_HANDLE_NEXT )
-  return -1;
+ if ( lhandle == ROAR_DL_HANDLE_DEFAULT || lhandle == ROAR_DL_HANDLE_NEXT ) {
+  roar_err_set(ROAR_ERROR_BADFH);
+  return -1;
+ }
 
  if ( lhandle->lib != NULL && lhandle->lib->unload != NULL )
@@ -110,4 +244,7 @@
 #endif
 
+ if ( lhandle->para != NULL )
+  roar_dl_para_unref(lhandle->para);
+
  roar_mm_free(lhandle);
 
@@ -129,10 +266,11 @@
 }
 
-int                      roar_dl_ra_init(struct roar_dl_lhandle * lhandle, const char * prefix) {
+int                      roar_dl_ra_init(struct roar_dl_lhandle * lhandle,
+                                         const char * prefix,
+                                         struct roar_dl_librarypara * para) {
 #define _SUFFIX "_roaraudio_library_init"
  char name[80] = _SUFFIX;
  struct roar_dl_libraryinst * (*func)(struct roar_dl_librarypara * para);
  struct roar_dl_libraryinst * lib;
- struct roar_dl_librarypara * para = NULL;
  int i;
 
@@ -141,5 +279,6 @@
    return -1;
  } else {
-  para = lhandle->para;
+  if ( para == NULL )
+   para = lhandle->para;
  }
 
@@ -181,5 +320,5 @@
 }
 
-char *                   roar_dl_errstr(struct roar_dl_lhandle * lhandle) {
+const char * roar_dl_errstr(struct roar_dl_lhandle * lhandle) {
 #if defined(ROAR_HAVE_LIBDL)
  (void)lhandle;
@@ -190,3 +329,49 @@
 }
 
+struct roar_dl_librarypara       * roar_dl_getpara(struct roar_dl_lhandle * lhandle) {
+ if ( (void*)lhandle < (void*)128 ) {
+  roar_err_set(ROAR_ERROR_NOTSUP);
+  return NULL;
+ }
+
+ if ( lhandle->para == NULL ) {
+  roar_err_set(ROAR_ERROR_NOENT);
+  return NULL;
+ }
+
+ if ( roar_dl_para_ref(lhandle->para) == -1 )
+  return NULL;
+
+ return lhandle->para;
+}
+
+const struct roar_dl_libraryname * roar_dl_getlibname(struct roar_dl_lhandle * lhandle) {
+ if ( (void*)lhandle < (void*)128 ) {
+  roar_err_set(ROAR_ERROR_NOTSUP);
+  return NULL;
+ }
+
+ if ( lhandle->lib == NULL ) {
+  roar_err_set(ROAR_ERROR_BADLIB);
+  return NULL;
+ }
+
+ if ( lhandle->lib->libname == NULL ) {
+  roar_err_set(ROAR_ERROR_NOENT);
+  return NULL;
+ }
+
+ if ( lhandle->lib->libname->version != ROAR_DL_LIBNAME_VERSION ) {
+  roar_err_set(ROAR_ERROR_BADVERSION);
+  return NULL;
+ }
+
+ if ( lhandle->lib->libname->len != sizeof(struct roar_dl_libraryname) ) {
+  roar_err_set(ROAR_ERROR_HOLE);
+  return NULL;
+ }
+
+ return lhandle->lib->libname;
+}
+
 //ll
Index: libroar/vio_dstr.c
===================================================================
--- libroar/vio_dstr.c	(revision 5270)
+++ libroar/vio_dstr.c	(revision 5275)
@@ -289,8 +289,8 @@
 
 static void _roar_vio_dstr_init_otherlibs (void) {
- roar_dl_ra_init(ROAR_DL_HANDLE_DEFAULT, "libroardsp");
- roar_dl_ra_init(ROAR_DL_HANDLE_DEFAULT, "libroareio");
- roar_dl_ra_init(ROAR_DL_HANDLE_DEFAULT, "libroarlight");
- roar_dl_ra_init(ROAR_DL_HANDLE_DEFAULT, "libroarmidi");
+ roar_dl_ra_init(ROAR_DL_HANDLE_DEFAULT, "libroardsp",   NULL);
+ roar_dl_ra_init(ROAR_DL_HANDLE_DEFAULT, "libroareio",   NULL);
+ roar_dl_ra_init(ROAR_DL_HANDLE_DEFAULT, "libroarlight", NULL);
+ roar_dl_ra_init(ROAR_DL_HANDLE_DEFAULT, "libroarmidi",  NULL);
 }
 
