}
 
     if (!io) {
-        //set_error(ctx->err_msg);
         err = EINVAL;
-        goto end;
+        set_error(glb_cc, err, posix_error, "io handler not set"
+               " (canl_io_read)");
+        return -1;
     }
     
     if (!buffer || !size) {
         err = EINVAL;
-        update_error(glb_cc, "no memory to write into (canl_io_read)");
+        set_error(glb_cc, err, posix_error, "no memory to write into"
+               " (canl_io_read)");
         return -1;
     }
 
     //read something using openssl
     b_recvd = ssl_read(glb_cc, io_cc, buffer, size, timeout);
-    if (b_recvd == -1) {
-        err = errno; //TODO check again
-        goto end;
+    if (b_recvd <= 0) {
+    update_error(glb_cc, "can't read from connection"
+            " (canl_io_read)");
     }
-end:
-    if (err)
-        update_error(glb_cc, "can't read from connection"
-                " (canl_io_read)");
     return b_recvd;
 }
 
 
     if (!io) {
         err = EINVAL;
-        goto end;
+        set_error(glb_cc, err, posix_error, "io handler not set"
+               " (canl_io_write)");
+        return -1;
     }
 
     if (!buffer || !size) {
 
     //write something using openssl
     b_written = ssl_write(glb_cc, io_cc, buffer, size, timeout);
-    if (b_written == -1) {
-        err = errno; //TODO check again
-        goto end;
-    }
-
-end:
-    if (err) {
+    if (b_written <= 0) {
         update_error(glb_cc, "can't write to connection"
                 " (canl_io_write)");
-        return -1;
     }
     return b_written;
 }
 
         EVP_PKEY_free(cc->cert_key->key);
         cc->cert_key->key = NULL;
     }
-/*    cc->cert_key->key = EVP_PKEY_new(void);
-    if (!cc->cert_key->key) {
-        err = ERR_get_error();
-        set_error(cc, err, ssl_error, "not enough memory for"
-                " key storage (set_key_file)");
-        return err;
-    }
-*/
     key_file = fopen(key, "rb");
     if (!key_file) {
        err = errno;
                 " (set_key_file)");
         goto end;
     }
+    if (fclose(key_file)){
+        err = errno;
+        set_error(cc, err, posix_error, "cannot close file with key"
+                " (set_key_file)");
+        return errno;
+    }
+    return 0;
 
 end:
-    err = fclose(key_file);
+    if (fclose(key_file)){
+        err = errno;
+        update_error(cc, "cannot close file with key"
+                " (set_key_file)");
+    }
     return err;
 }
 
         X509_free(cc->cert_key->cert);
         cc->cert_key->cert = NULL;
     }
-/*    cc->cert_key->cert = EVP_PKEY_new(void);
-    if (!cc->cert_key->cert) {
-        err = ERR_get_error();
-        set_error(cc, err, ssl_error, "not enough memory for"
-                " key storage (set_key_file)");
-        return err;
-    }
-*/
     cert_file = fopen(cert, "rb");
     if (!cert_file) {
        err = errno;
         set_error(cc, err, posix_error, "cannot open file with cert"
-                " (set_key_file)");
+                " (set_cert_file)");
         return err;
     }
     /*TODO NULL NULL, callback and user data*/
     if (!cc->cert_key->cert) {
         err = ERR_get_error();
         set_error(cc, err, ssl_error, "error while writing certificate"
-                " to context (set_key_file)");
+                " to context (set_cert_file)");
         goto end;
     }
 
+    if (fclose(cert_file)){
+        err = errno;
+        set_error(cc, err, posix_error, "cannot close file with certificate"
+                " (set_cert_file)");
+        return errno;
+    }
+    return 0;
+
 end:
-    err = fclose(cert_file);
+    if (fclose(cert_file)){
+        err = errno;
+        update_error(cc, "cannot close file with certificate"
+                " (set_cert_file)");
+    }
     return err;
 }
 
         err = canl_set_ctx_own_cert_file(my_ctx, serv_cert, serv_key, 
                 NULL, NULL);
         if (err) {
-            printf("[SERVER] cannot set certificate or file to context\n");
+            printf("[SERVER] cannot set certificate or key to context\n");
         }
     }
 
         printf("[SERVER] message \"%s\" sent successfully\n", buf);
     }
 
-    err = canl_io_read (my_ctx, my_io_h, buf, sizeof(buf)-1, NULL);
+    err = canl_io_read (my_ctx, my_new_io_h, buf, sizeof(buf)-1, NULL);
     if (err > 0) {
         buf[err] = '\0';
         printf ("[SERVER] received: %s\n", buf);
 
     int touted = 0;
     int to = 0; // bool
 
-    if (!io->s_ctx->ssl_io) {
+    if (!io->s_ctx || !io->s_ctx->ssl_io) {
         err = EINVAL;
-        goto end;
-    }
-
-    if (!cc) {
-        return -1;
-    }
-    if (!io) {
-        err = EINVAL;
-        goto end;
-    }
-
-    if (!buffer) {
-        err = EINVAL; //TODO really?
-        set_error(cc, err, posix_error, "Nothing to write (ssl_write)");
-        errno = err;
+        set_error(cc, err, posix_error, "wrong ssl handler (ssl_read)");
         return -1;
     }
     
     int expected = 0, error = 0;
     int timeout;
 
-    if (!io->s_ctx->ssl_io) {
+    if (!io->s_ctx || !io->s_ctx->ssl_io) {
         err = EINVAL;
-        goto end;
-    }
-
-    if (!cc) {
-        return -1;
-    }
-    if (!io) {
-        err = EINVAL;
-        goto end;
-    }
-
-    if (!buffer) {
-        err = EINVAL; //TODO really?
-        set_error(cc, err, posix_error, "Not enough memory to read to (ssl_read)");
-        errno = err;
+        set_error(cc, err, posix_error, "wrong ssl handler (ssl_read)");
         return -1;
     }
 
         curtime = time(NULL);
 
         if (ret > 0) {
-            ret2 = SSL_read(io->s_ctx->ssl_io, str + nwritten, strlen(str) - nwritten);
+            ret2 = SSL_read(io->s_ctx->ssl_io, str + nwritten,
+                    strlen(str) - nwritten);
 
             if (ret2 <= 0) {
                 expected = error = SSL_get_error(io->s_ctx->ssl_io, ret2);
     } while (TEST_SELECT(ret, ret2, timeout, curtime, starttime, error));
 
 end:
-    if (ret <= 0 || ret2 <= 0) { //TODO ret2 < 0 originally
+    if (ret <= 0 || ret2 <= 0) { // what if ret2 == 0? conn closed?
         err = -1; //TODO what to assign
         if (timeout != -1 && (curtime - starttime >= timeout)){
-            set_error(cc, ETIMEDOUT, posix_error, "Connection stuck during read: timeout reached. (ssl_read)");
+            set_error(cc, ETIMEDOUT, posix_error, "Connection stuck"
+                   " during read: timeout reached. (ssl_read)");
         }
         else
-            set_error(cc, err, unknown_error, "Error during SSL read: (ssl_read)");
+            set_error(cc, err, unknown_error, "Error during SSL"
+                    " read: (ssl_read)");
     }
     else
         err = ret2;