Index: uspace/lib/c/generic/io/con_srv.c
===================================================================
--- uspace/lib/c/generic/io/con_srv.c	(revision c19a5a59bb6be5cf8da4e0c9a6a35d207103bc14)
+++ uspace/lib/c/generic/io/con_srv.c	(revision c821184900f17ef522a28aef06369f66ec1d6e4c)
@@ -93,6 +93,7 @@
 	}
 
-	rc = srv->srvs->ops->read(srv, buf, size);
-	if (rc < 0) {
+	size_t nread;
+	rc = srv->srvs->ops->read(srv, buf, size, &nread);
+	if (rc != EOK) {
 		async_answer_0(rcallid, rc);
 		async_answer_0(callid, rc);
@@ -101,11 +102,8 @@
 	}
 
-	async_data_read_finalize(rcallid, buf, size);
+	async_data_read_finalize(rcallid, buf, nread);
 	free(buf);
 
-	if (rc >= 0)
-		async_answer_1(callid, EOK, rc);
-	else
-		async_answer_0(callid, rc);
+	async_answer_1(callid, EOK, nread);
 }
 
@@ -128,11 +126,9 @@
 	}
 
-	rc = srv->srvs->ops->write(srv, data, size);
+	size_t nwritten = 0;
+	rc = srv->srvs->ops->write(srv, data, size, &nwritten);
 	free(data);
 
-	if (rc >= 0)
-		async_answer_1(callid, EOK, rc);
-	else
-		async_answer_0(callid, rc);
+	async_answer_1(callid, rc, nwritten);
 }
 
Index: uspace/lib/c/include/io/con_srv.h
===================================================================
--- uspace/lib/c/include/io/con_srv.h	(revision c19a5a59bb6be5cf8da4e0c9a6a35d207103bc14)
+++ uspace/lib/c/include/io/con_srv.h	(revision c821184900f17ef522a28aef06369f66ec1d6e4c)
@@ -69,6 +69,6 @@
 	int (*open)(con_srvs_t *, con_srv_t *);
 	int (*close)(con_srv_t *);
-	int (*read)(con_srv_t *, void *, size_t);
-	int (*write)(con_srv_t *, void *, size_t);
+	int (*read)(con_srv_t *, void *, size_t, size_t *);
+	int (*write)(con_srv_t *, void *, size_t, size_t *);
 	void (*sync)(con_srv_t *);
 	void (*clear)(con_srv_t *);
Index: uspace/lib/gui/terminal.c
===================================================================
--- uspace/lib/gui/terminal.c	(revision c19a5a59bb6be5cf8da4e0c9a6a35d207103bc14)
+++ uspace/lib/gui/terminal.c	(revision c821184900f17ef522a28aef06369f66ec1d6e4c)
@@ -64,6 +64,6 @@
 static int term_open(con_srvs_t *, con_srv_t *);
 static int term_close(con_srv_t *);
-static int term_read(con_srv_t *, void *, size_t);
-static int term_write(con_srv_t *, void *, size_t);
+static int term_read(con_srv_t *, void *, size_t, size_t *);
+static int term_write(con_srv_t *, void *, size_t, size_t *);
 static void term_sync(con_srv_t *);
 static void term_clear(con_srv_t *);
@@ -386,5 +386,5 @@
 }
 
-static int term_read(con_srv_t *srv, void *buf, size_t size)
+static int term_read(con_srv_t *srv, void *buf, size_t size, size_t *nread)
 {
 	terminal_t *term = srv_to_terminal(srv);
@@ -431,5 +431,6 @@
 	}
 	
-	return size;
+	*nread = size;
+	return EOK;
 }
 
@@ -462,5 +463,5 @@
 }
 
-static int term_write(con_srv_t *srv, void *data, size_t size)
+static int term_write(con_srv_t *srv, void *data, size_t size, size_t *nwritten)
 {
 	terminal_t *term = srv_to_terminal(srv);
@@ -470,5 +471,6 @@
 		term_write_char(term, str_decode(data, &off, size));
 	
-	return size;
+	*nwritten = size;
+	return EOK;
 }
 
