Index: libroar/error.c
===================================================================
--- libroar/error.c	(revision 4871)
+++ libroar/error.c	(revision 4876)
@@ -125,4 +125,8 @@
 void   roar_err_update(void) {
  int * err = roar_errno2();
+
+ // NOTE: _NEVER_ call ROAR_{DBG,INFO,WARN,ERRO}() in here! (will result in endless loop)
+ //printf("*err=%i, errno=%i\n", *err, (int)errno);
+
  if ( *err != ROAR_ERROR_NONE ) {
   roar_err_to_errno();
@@ -144,4 +148,7 @@
 
  switch (errno) {
+#ifdef EACCES
+  case EACCES:       _roar_errno = ROAR_ERROR_PERM; break;
+#endif
 #ifdef EPERM
   case EPERM:        _roar_errno = ROAR_ERROR_PERM; break;
Index: libroar/vio.c
===================================================================
--- libroar/vio.c	(revision 4873)
+++ libroar/vio.c	(revision 4876)
@@ -297,5 +297,7 @@
  roar_err_clear_all();
  if ( (fh = open(filename, flags, mode)) == -1 ) {
+  ROAR_DBG("roar_vio_open_file(*): errno=%s", strerror(errno));
   roar_err_update();
+  ROAR_DBG("roar_vio_open_file(*): errno=%s", strerror(errno));
   return -1;
  }
Index: libroar/vio_dstr.c
===================================================================
--- libroar/vio_dstr.c	(revision 4824)
+++ libroar/vio_dstr.c	(revision 4876)
@@ -329,6 +329,11 @@
    break;
   case ROAR_VIO_DEF_TYPE_FILE:
-    if ( roar_vio_open_file(calls, def->d.file, def->o_flags, def->o_mode) == -1 )
+    roar_libroar_nowarn();
+    if ( roar_vio_open_file(calls, def->d.file, def->o_flags, def->o_mode) == -1 ) {
+     roar_libroar_warn();
+     ROAR_DBG("roar_vio_open_default(*): Can not open file: %i", roar_error);
      return -1;
+    }
+    roar_libroar_warn();
    break;
   case ROAR_VIO_DEF_TYPE_SOCKET:
@@ -356,5 +361,5 @@
 }
 
-#define _ret(x) roar_mm_free(dstr); return (x)
+#define _ret(x) do { int _err = roar_error; roar_mm_free(dstr); roar_error = _err; roar_err_to_errno(); return (x); } while (0)
 
 int     roar_vio_open_dstr_vio(struct roar_vio_calls * calls,
@@ -548,4 +553,5 @@
    case ROAR_VIO_DSTR_OBJT_NULL:
    case ROAR_VIO_DSTR_OBJT_ZERO:
+   case ROAR_VIO_DSTR_OBJT_FULL:
    case ROAR_VIO_DSTR_OBJT_NRANDOM:
    case ROAR_VIO_DSTR_OBJT_TANTALOS:
@@ -745,5 +751,5 @@
 }
 
-#define _ret(x) roar_vio_close(calls); ROAR_DBG("roar_vio_dstr_build_chain(*) = %i", (x)); return (x)
+#define _ret(x) do { int _err = roar_error; roar_vio_close(calls); roar_error = _err; roar_err_to_errno(); ROAR_DBG("roar_vio_dstr_build_chain(*) = %i", (x)); return (x); } while(0)
 
 int     roar_vio_dstr_build_chain(struct roar_vio_dstr_chain * chain, struct roar_vio_calls * calls,
@@ -871,4 +877,5 @@
     case ROAR_VIO_DSTR_OBJT_NULL:
     case ROAR_VIO_DSTR_OBJT_ZERO:
+    case ROAR_VIO_DSTR_OBJT_FULL:
     case ROAR_VIO_DSTR_OBJT_NRANDOM:
       if ( roar_vio_open_misc_by_name(tc, roar_vio_dstr_get_name(c->type)) == -1 ) {
Index: libroar/vio_misc.c
===================================================================
--- libroar/vio_misc.c	(revision 4826)
+++ libroar/vio_misc.c	(revision 4876)
@@ -131,4 +131,10 @@
 }
 
+static ssize_t roar_vio_misc_op_full(void * buf, size_t len, struct roar_vio_calls * vio, struct roar_vio_misc * callbacks)
+{
+ roar_err_set(ROAR_ERROR_NOSPC);
+ return -1;
+}
+
 static ssize_t roar_vio_misc_op_random_nonce(void * buf, size_t len, struct roar_vio_calls * vio, struct roar_vio_misc * callbacks) {
  if ( roar_random_gen_nonce(buf, len) == -1 )
@@ -147,4 +153,5 @@
 static const struct roar_vio_misc libroar_vio_miscs[] = {
  {.name = "null", .support_nonblocking = 1, .read = roar_vio_misc_op_return_zero, .write = roar_vio_misc_op_return_len},
+ {.name = "full", .support_nonblocking = 1, .read = roar_vio_misc_op_return_zero, .write = roar_vio_misc_op_full},
  {.name = "zero", .support_nonblocking = 1, .read = roar_vio_misc_op_zero,        .write = roar_vio_misc_op_return_len},
  {.name = "nrandom", .support_nonblocking = 1,
Index: libroar/vio_ops.c
===================================================================
--- libroar/vio_ops.c	(revision 4708)
+++ libroar/vio_ops.c	(revision 4876)
@@ -45,6 +45,10 @@
  ROAR_DBG("roar_vio_copy_data(out=%p, in=%p) = ?", out, in);
 
- if ( out == NULL || in == NULL )
+ if ( out == NULL || in == NULL ) {
+  roar_err_set(ROAR_ERROR_FAULT);
   return -1;
+ }
+
+ roar_err_clear_all();
 
  while ((len = roar_vio_read(in, buf, ROAR_VIO_COPY_BUFSIZE)) > 0) {
@@ -58,4 +62,6 @@
  ROAR_DBG("roar_vio_copy_data(out=%p, in=%p): len=%li, done=%li", out, in, (long int)len, (long int)done);
 
+ roar_err_clear_all();
+
  ROAR_DBG("roar_vio_copy_data(out=%p, in=%p) = %li", out, in, (long int)done);
  return done;
