Index: libroar/basic.c
===================================================================
--- libroar/basic.c	(revision 4806)
+++ libroar/basic.c	(revision 4873)
@@ -63,8 +63,8 @@
  int workarounds_store;
 
- roar_errno = ROAR_ERROR_UNKNOWN;
+ roar_err_set(ROAR_ERROR_UNKNOWN);
 
  if ( timeout != 0 ) {
-  roar_errno = ROAR_ERROR_INVAL;
+  roar_err_set(ROAR_ERROR_INVAL);
   return -1;
  }
@@ -231,5 +231,5 @@
 
  if ( fh == -1 )
-  roar_errno = ROAR_ERROR_CONNREFUSED;
+  roar_err_set(ROAR_ERROR_CONNREFUSED);
 
  ROAR_DBG("roar_connect_raw(*) = %i", fh);
@@ -246,9 +246,9 @@
 
  if ( con == NULL ) {
-  roar_errno = ROAR_ERROR_INVAL;
-  return -1;
- }
-
- roar_errno = ROAR_ERROR_UNKNOWN;
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
+
+ roar_err_set(ROAR_ERROR_UNKNOWN);
  fh = roar_connect_raw2(server, flags, timeout);
 
@@ -262,5 +262,5 @@
 
  if ( con == NULL || fh == -1 ) {
-  roar_errno = ROAR_ERROR_INVAL;
+  roar_err_set(ROAR_ERROR_INVAL);
   return -1;
  }
@@ -278,5 +278,5 @@
   con->flags |= ROAR_CON_FLAGS_VIO;
 
- roar_errno = ROAR_ERROR_NONE;
+ roar_err_set(ROAR_ERROR_NONE);
  return 0;
 }
@@ -337,5 +337,5 @@
  roar_connect_fh(con, -2);
 
- roar_errno = ROAR_ERROR_NONE;
+ roar_err_set(ROAR_ERROR_NONE);
 
  return 0;
@@ -384,5 +384,5 @@
  int max_len;
 
- roar_errno = ROAR_ERROR_UNKNOWN;
+ roar_err_set(ROAR_ERROR_UNKNOWN);
 
  ROAR_DBG("roar_identify(*): try to identify myself...");
Index: libroar/ctl.c
===================================================================
--- libroar/ctl.c	(revision 4740)
+++ libroar/ctl.c	(revision 4873)
@@ -194,8 +194,8 @@
  m.data[0] = id;
 
- roar_errno = ROAR_ERROR_UNKNOWN;
+ roar_err_set(ROAR_ERROR_UNKNOWN);
 
  if ( roar_req(con, &m, NULL) == -1 ) {
-  roar_errno = ROAR_ERROR_PROTO;
+  roar_err_set(ROAR_ERROR_PROTO);
   return -1;
  }
Index: libroar/ltm.c
===================================================================
--- libroar/ltm.c	(revision 4708)
+++ libroar/ltm.c	(revision 4873)
@@ -66,5 +66,5 @@
 
  if ( mt == 0 || streams == NULL || slen == 0 || mes == NULL || buf == NULL ) {
-  roar_errno = ROAR_ERROR_INVAL;
+  roar_err_set(ROAR_ERROR_INVAL);
   return -1;
  }
@@ -81,5 +81,5 @@
    break;
   default:
-    roar_errno = ROAR_ERROR_NOTSUP;
+    roar_err_set(ROAR_ERROR_NOTSUP);
     return -1;
    break;
@@ -95,5 +95,5 @@
 
  if ( mes->datalen > LIBROAR_BUFFER_MSGDATA ) {
-  roar_errno = ROAR_ERROR_NOTSUP;
+  roar_err_set(ROAR_ERROR_NOTSUP);
   return -1;
  }
Index: libroar/notify.c
===================================================================
--- libroar/notify.c	(revision 4708)
+++ libroar/notify.c	(revision 4873)
@@ -60,5 +60,5 @@
 static struct roar_notify_core * _libroar_notify_core = NULL;
 
-#define _CKRCORE(ret) if ( core == NULL ) { if ( _libroar_notify_core == NULL ) { roar_errno = ROAR_ERROR_INVAL; return (ret); } else { core = _libroar_notify_core; } }
+#define _CKRCORE(ret) if ( core == NULL ) { if ( _libroar_notify_core == NULL ) { roar_err_set(ROAR_ERROR_INVAL); return (ret); } else { core = _libroar_notify_core; } }
 #define _CKICORE() _CKRCORE(-1)
 
@@ -97,5 +97,5 @@
    break;
   default:
-    roar_errno = ROAR_ERROR_INVAL;
+    roar_err_set(ROAR_ERROR_INVAL);
     return NULL;
    break;
@@ -172,5 +172,5 @@
 int roar_notify_core_new_global(ssize_t lists) {
  if ( _libroar_notify_core != NULL ) {
-  roar_errno = ROAR_ERROR_INVAL;
+  roar_err_set(ROAR_ERROR_INVAL);
   return -1;
  }
@@ -202,5 +202,5 @@
  if ( event == NULL || cb == NULL ) {
   ROAR_DBG("roar_notify_core_subscribe(core=%p, event=%p, cb=%p, userdata=%p) = NULL // errno = EINVAL", core, event, cb, userdata);
-  roar_errno = ROAR_ERROR_INVAL;
+  roar_err_set(ROAR_ERROR_FAULT);
   return NULL;
  }
@@ -246,5 +246,5 @@
 
  if ( subscriber == NULL ) {
-  roar_errno = ROAR_ERROR_INVAL;
+  roar_err_set(ROAR_ERROR_FAULT);
   return -1;
  }
@@ -275,5 +275,5 @@
 
  if ( event == NULL ) {
-  roar_errno = ROAR_ERROR_INVAL;
+  roar_err_set(ROAR_ERROR_FAULT);
   return -1;
  }
Index: libroar/proto.c
===================================================================
--- libroar/proto.c	(revision 4708)
+++ libroar/proto.c	(revision 4873)
@@ -65,5 +65,5 @@
  char * bufptr;
 
- roar_errno = ROAR_ERROR_UNKNOWN;
+ roar_err_set(ROAR_ERROR_UNKNOWN);
 
  ROAR_DBG("roar_send_message(*): try to send an request...");
@@ -87,5 +87,5 @@
     buf[2]              = (unsigned char)  mes->cmd;
     // ...
-    roar_errno = ROAR_ERROR_NOTSUP;
+    roar_err_set(ROAR_ERROR_NOTSUP);
     return -1;
    break;
@@ -107,10 +107,9 @@
    break;
   default:
-    roar_errno = ROAR_ERROR_NOTSUP;
+    roar_err_set(ROAR_ERROR_NOTSUP);
     return -1;
  }
 
  if ( roar_vio_write(vio, buf, headerlen) != headerlen ) {
-  roar_errno = ROAR_ERROR_PIPE;
   return -1;
  }
@@ -118,5 +117,4 @@
  if ( mes->datalen != 0 ) {
   if ( roar_vio_write(vio, data == NULL ? mes->data : data, mes->datalen) != mes->datalen ) {
-   roar_errno = ROAR_ERROR_PIPE;
    return -1;
   }
@@ -125,10 +123,9 @@
  if ( crclen != 0 ) {
   if ( roar_vio_write(vio, crc, crclen) != crclen ) {
-   roar_errno = ROAR_ERROR_PIPE;
-   return -1;
-  }
- }
-
- roar_errno = ROAR_ERROR_NONE;
+   return -1;
+  }
+ }
+
+ roar_err_clear();
 
  ROAR_DBG("roar_send_message(*) = 0");
@@ -154,5 +151,5 @@
  char * bufptr;
 
- roar_errno = ROAR_ERROR_UNKNOWN;
+ roar_err_set(ROAR_ERROR_UNKNOWN);
 
  ROAR_DBG("roar_recv_message(*): try to get a response form the server...");
@@ -167,5 +164,5 @@
 
  if ( roar_vio_read(vio, buf, _ROAR_MESS_BUF_LEN_V0) != _ROAR_MESS_BUF_LEN_V0 ) {
-  roar_errno = ROAR_ERROR_PROTO;
+  roar_err_set(ROAR_ERROR_PROTO);
   return -1;
  }
@@ -195,5 +192,5 @@
    break;
   default:
-    roar_errno = ROAR_ERROR_PROTO;
+    roar_err_set(ROAR_ERROR_PROTO);
     return -1;
    break;
@@ -205,5 +202,5 @@
   needlen = headerlen - _ROAR_MESS_BUF_LEN_V0;
   if ( roar_vio_read(vio, buf+_ROAR_MESS_BUF_LEN_V0, needlen) != (ssize_t)needlen ) {
-   roar_errno = ROAR_ERROR_PROTO;
+   roar_err_set(ROAR_ERROR_PROTO);
    return -1;
   }
@@ -235,5 +232,5 @@
   ROAR_DBG("roar_recv_message(*): no data in this pkg");
   ROAR_DBG("roar_recv_message(*) = 0");
-  roar_errno = ROAR_ERROR_NONE;
+  roar_err_clear();
   return 0;
  }
@@ -243,23 +240,22 @@
    ROAR_DBG("roar_recv_message(*): Got data!");
    ROAR_DBG("roar_recv_message(*) = 0");
-   roar_errno = ROAR_ERROR_NONE;
+   roar_err_clear();
    return 0;
   }
 
-  roar_errno = ROAR_ERROR_PIPE;
   return -1;
  } else {
   if ( data == NULL ) {
-   roar_errno = ROAR_ERROR_MSGSIZE;
+   roar_err_set(ROAR_ERROR_MSGSIZE);
    return -1;
   }
 
   if ( (*data = malloc(mes->datalen)) == NULL ) {
-   roar_errno = ROAR_ERROR_NOMEM;
+   roar_err_set(ROAR_ERROR_NOMEM);
    return -1;
   }
 
   if ( mes->datalen == 0 ) {
-   roar_errno = ROAR_ERROR_NONE;
+   roar_err_clear();
    return 0;
   }
@@ -268,9 +264,9 @@
    ROAR_DBG("roar_recv_message(*): Got data!");
    ROAR_DBG("roar_recv_message(*) = 0");
-   roar_errno = ROAR_ERROR_NONE;
+   roar_err_clear();
    return 0;
   }
 
-  roar_errno = ROAR_ERROR_PIPE;
+  roar_err_set(ROAR_ERROR_PIPE);
   return -1;
  }
Index: libroar/vio.c
===================================================================
--- libroar/vio.c	(revision 4831)
+++ libroar/vio.c	(revision 4873)
@@ -46,6 +46,8 @@
 int roar_vio_init_calls (struct roar_vio_calls * calls) {
 #ifdef _CAN_OPERATE
- if ( calls == NULL )
-  return -1;
+ if ( calls == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
 
  memset((void*)calls, 0, sizeof(struct roar_vio_calls));
@@ -72,6 +74,8 @@
 
 int roar_vio_set_inst (struct roar_vio_calls * vio, void * inst) {
- if ( vio == NULL )
-  return -1;
+ if ( vio == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
 
  vio->inst = inst;
@@ -85,6 +89,8 @@
 
 int roar_vio_get_fh   (struct roar_vio_calls * vio) {
- if ( vio == NULL )
-  return -1;
+ if ( vio == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
 
  return ((int)(ROAR_INSTINT)vio->inst) - 1;
@@ -93,68 +99,122 @@
 
 ssize_t roar_vio_read (struct roar_vio_calls * vio, void *buf, size_t count) {
+ ssize_t ret;
+
  ROAR_DBG("roar_vio_read(vio=%p, buf=%p, count=%u) = ?", vio, buf, (unsigned int)count);
 
- if ( vio == NULL )
-  return -1;
-
- if ( vio->read == NULL )
-  return -1;
-
- return vio->read(vio, buf, count);
+ if ( vio == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
+
+ if ( vio->read == NULL ) {
+  roar_err_set(ROAR_ERROR_NOSYS);
+  return -1;
+ }
+
+ roar_err_clear_all();
+ ret = vio->read(vio, buf, count);
+ roar_err_update();
+
+ return ret;
 }
 
 ssize_t roar_vio_write(struct roar_vio_calls * vio, void *buf, size_t count) {
+ ssize_t ret;
+
  ROAR_DBG("roar_vio_write(vio=%p, buf=%p, count=%u) = ?", vio, buf, (unsigned int)count);
 
- if ( vio == NULL )
-  return -1;
-
- if ( vio->write == NULL )
-  return -1;
-
- return vio->write(vio, buf, count);
+ if ( vio == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
+
+ if ( vio->write == NULL ) {
+  roar_err_set(ROAR_ERROR_NOSYS);
+  return -1;
+ }
+
+ roar_err_clear_all();
+ ret = vio->write(vio, buf, count);
+ roar_err_update();
+
+ return ret;
 }
 
 off_t   roar_vio_lseek(struct roar_vio_calls * vio, off_t offset, int whence) {
+ off_t ret;
+
  ROAR_DBG("roar_vio_lseek(vio=%p, offset=%u, whence=%i) = ?", vio, (unsigned int)offset, whence);
 
- if ( vio == NULL )
-  return -1;
-
- if ( vio->lseek == NULL )
-  return -1;
-
- return vio->lseek(vio, offset, whence);
+ if ( vio == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
+
+ if ( vio->lseek == NULL ) {
+  roar_err_set(ROAR_ERROR_NOSYS);
+  return -1;
+ }
+
+ roar_err_clear_all();
+ ret = vio->lseek(vio, offset, whence);
+ roar_err_update();
+
+ return ret;
 }
 
 int     roar_vio_nonblock(struct roar_vio_calls * vio, int state) {
+ int ret;
+
  ROAR_DBG("roar_vio_nonblock(vio=%p, state=%i) = ?", vio, state);
 
- if ( vio == NULL )
-  return -1;
-
- if ( vio->nonblock == NULL )
-  return -1;
-
- return vio->nonblock(vio, state);
+ if ( vio == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
+
+ if ( vio->nonblock == NULL ) {
+  roar_err_set(ROAR_ERROR_NOSYS);
+  return -1;
+ }
+
+ roar_err_clear_all();
+ ret = vio->nonblock(vio, state);
+ roar_err_update();
+
+ return ret;
 }
 
 int     roar_vio_sync    (struct roar_vio_calls * vio) {
+ int ret;
+
  ROAR_DBG("roar_vio_sync(vio=%p) = ?", vio);
 
- if ( vio == NULL )
-  return -1;
-
- if ( vio->sync == NULL )
-  return -1;
-
- return vio->sync(vio);
+ if ( vio == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
+
+ if ( vio->sync == NULL ) {
+  roar_err_set(ROAR_ERROR_NOSYS);
+  return -1;
+ }
+
+ roar_err_clear_all();
+ ret = vio->sync(vio);
+ roar_err_update();
+
+ return ret;
 }
 
 int     roar_vio_ctl     (struct roar_vio_calls * vio, int cmd, void * data) {
+ int ret;
+
  ROAR_DBG("roar_vio_ctl(vio=%p, cmd=%i, data=%p) = ?", vio, cmd, data);
 
- if ( vio == NULL )
-  return -1;
+ if ( vio == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
 
  ROAR_DBG("roar_vio_ctl(vio=%p, cmd=0x%.8x, data=%p): vio->ctl=%p", vio, cmd, data, vio->ctl);
@@ -166,30 +226,49 @@
     ROAR_ERR("roar_vio_ctl(vio=%p, cmd=0x%.8x, data=%p): Please recompile your program to fix this. (No additional steps are required beside that.)", vio, cmd, data);
     ROAR_DBG("roar_vio_ctl(vio=%p, cmd=0x%.8x, data=%p) = -1", vio, cmd, data);
+    roar_err_set(ROAR_ERROR_BADRQC);
     return -1;
    break;
  }
 
- if ( vio->ctl == NULL )
-  return -1;
-
- return vio->ctl(vio, cmd, data);
+ if ( vio->ctl == NULL ) {
+  roar_err_set(ROAR_ERROR_NOSYS);
+  return -1;
+ }
+
+ roar_err_clear_all();
+ ret = vio->ctl(vio, cmd, data);
+ roar_err_update();
+
+ return ret;
 }
 
 int     roar_vio_close    (struct roar_vio_calls * vio) {
+ int ret;
+
  ROAR_DBG("roar_vio_close(vio=%p) = ?", vio);
 
- if ( vio == NULL )
-  return -1;
-
- if ( vio->close == NULL )
-  return -1;
-
- return vio->close(vio);
+ if ( vio == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
+
+ if ( vio->close == NULL ) {
+  roar_err_set(ROAR_ERROR_NOSYS);
+  return -1;
+ }
+
+ roar_err_clear_all();
+ ret = vio->close(vio);
+ roar_err_update();
+
+ return ret;
 }
 
 // specal commands:
 int     roar_vio_accept  (struct roar_vio_calls * calls, struct roar_vio_calls * dst) {
- if (dst == NULL || calls == NULL)
-  return -1;
+ if (dst == NULL || calls == NULL) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
 
  return roar_vio_ctl(dst, ROAR_VIO_CTL_ACCEPT, calls);
@@ -205,6 +284,10 @@
  int fh;
 
- if ( calls == NULL || filename == NULL )
-  return -1;
+ roar_debug_warn_obsolete("roar_vio_open_file", "roar_vio_open_dstr", NULL);
+
+ if ( calls == NULL || filename == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
+  return -1;
+ }
 
 #ifdef ROAR_TARGET_WIN32
@@ -212,12 +295,17 @@
 #endif
 
- if ( (fh = open(filename, flags, mode)) == -1 )
-  return -1;
+ roar_err_clear_all();
+ if ( (fh = open(filename, flags, mode)) == -1 ) {
+  roar_err_update();
+  return -1;
+ }
 
  if ( roar_vio_open_fh(calls, fh) == -1 ) {
   close(fh);
-  return -1;
- }
-
+  roar_err_update();
+  return -1;
+ }
+
+ roar_err_update();
  return 0;
 #else
@@ -584,4 +672,5 @@
  }
 
+ roar_err_set(ROAR_ERROR_BADRQC);
  return -1;
 }
@@ -708,5 +797,5 @@
   return -1;
 
- errno = 0;
+ roar_err_clear_all();
 
  while ( (r = roar_vio_read((struct roar_vio_calls *) vio->inst, buf, count)) > 0 ) {
@@ -734,5 +823,5 @@
   return -1;
 
- errno = 0;
+ roar_err_clear_all();
 
  while ( (r = roar_vio_write((struct roar_vio_calls *) vio->inst, buf, count)) > 0 ) {
Index: libroar/vs.c
===================================================================
--- libroar/vs.c	(revision 4850)
+++ libroar/vs.c	(revision 4873)
@@ -49,8 +49,8 @@
 #define FLAG_DIR_OUT   0x2000
 
-#define _initerr()  do { errno = 0; roar_err_clear(); } while(0)
-#define _seterr(x)  do { if ( error != NULL ) *error = (x); ROAR_DBG("roar_vs_*(*): *error=%s(%i)", roar_vs_strerr((x)), (x)); } while(0)
-#define _seterrre() do { _seterr(roar_errno); } while(0)
-#define _seterrse() do { roar_err_from_errno(); _seterr(roar_errno); } while(0)
+#define _initerr()  roar_err_clear_all()
+#define _seterr(x)  do { if ( error != NULL ) *error = (x); roar_err_set((x)); ROAR_DBG("roar_vs_*(*): *error=%s(%i)", roar_vs_strerr((x)), (x)); } while(0)
+#define _seterrre() do { _seterr(roar_error); } while(0)
+#define _seterrse() do { roar_err_from_errno(); _seterr(roar_error); } while(0)
 #define _ckvss(ret) do { if ( vss == NULL ) { _seterr(ROAR_ERROR_INVAL); return (ret); } } while(0)
 
@@ -405,10 +405,5 @@
  if ( ret == -1 ) {
 #ifdef EAGAIN
-  if ( errno == EAGAIN )
-   return 0;
-#endif
-
-#ifdef EWOULDBLOCK
-  if ( errno == EWOULDBLOCK )
+  if ( roar_error == ROAR_ERROR_AGAIN )
    return 0;
 #endif
