Index: uspace/lib/c/generic/io/chardev.c
===================================================================
--- uspace/lib/c/generic/io/chardev.c	(revision 06412bada4d61173430c35dc86bfba47ad6b47fc)
+++ uspace/lib/c/generic/io/chardev.c	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -91,8 +91,11 @@
  * @param size Maximum number of bytes to read
  * @param nread Place to store actual number of bytes read
+ * @param flags @c chardev_f_nonblock to return immediately even if no
+ *              bytes are available
  *
  * @return EOK on success or non-zero error code
  */
-errno_t chardev_read(chardev_t *chardev, void *buf, size_t size, size_t *nread)
+errno_t chardev_read(chardev_t *chardev, void *buf, size_t size, size_t *nread,
+    chardev_flags_t flags)
 {
 	async_exch_t *exch = async_exchange_begin(chardev->sess);
@@ -104,5 +107,5 @@
 
 	ipc_call_t answer;
-	aid_t req = async_send_0(exch, CHARDEV_READ, &answer);
+	aid_t req = async_send_1(exch, CHARDEV_READ, flags, &answer);
 	errno_t rc = async_data_read_start(exch, buf, size);
 	async_exchange_end(exch);
Index: uspace/lib/c/generic/io/chardev_srv.c
===================================================================
--- uspace/lib/c/generic/io/chardev_srv.c	(revision 06412bada4d61173430c35dc86bfba47ad6b47fc)
+++ uspace/lib/c/generic/io/chardev_srv.c	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -48,5 +48,8 @@
 	size_t size;
 	size_t nread;
+	chardev_flags_t flags;
 	errno_t rc;
+
+	flags = IPC_GET_ARG1(*icall);
 
 	ipc_call_t call;
@@ -70,5 +73,5 @@
 	}
 
-	rc = srv->srvs->ops->read(srv, buf, size, &nread);
+	rc = srv->srvs->ops->read(srv, buf, size, &nread, flags);
 	if (rc != EOK && nread == 0) {
 		async_answer_0(&call, rc);
Index: uspace/lib/c/include/io/chardev.h
===================================================================
--- uspace/lib/c/include/io/chardev.h	(revision 06412bada4d61173430c35dc86bfba47ad6b47fc)
+++ uspace/lib/c/include/io/chardev.h	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -36,4 +36,5 @@
 #include <async.h>
 #include <stddef.h>
+#include <types/io/chardev.h>
 
 typedef struct {
@@ -43,5 +44,6 @@
 extern errno_t chardev_open(async_sess_t *, chardev_t **);
 extern void chardev_close(chardev_t *);
-extern errno_t chardev_read(chardev_t *, void *, size_t, size_t *);
+extern errno_t chardev_read(chardev_t *, void *, size_t, size_t *,
+    chardev_flags_t);
 extern errno_t chardev_write(chardev_t *, const void *, size_t, size_t *);
 
Index: uspace/lib/c/include/io/chardev_srv.h
===================================================================
--- uspace/lib/c/include/io/chardev_srv.h	(revision 06412bada4d61173430c35dc86bfba47ad6b47fc)
+++ uspace/lib/c/include/io/chardev_srv.h	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -41,4 +41,5 @@
 #include <stdbool.h>
 #include <stddef.h>
+#include <types/io/chardev.h>
 
 typedef struct chardev_ops chardev_ops_t;
@@ -59,5 +60,6 @@
 	errno_t (*open)(chardev_srvs_t *, chardev_srv_t *);
 	errno_t (*close)(chardev_srv_t *);
-	errno_t (*read)(chardev_srv_t *, void *, size_t, size_t *);
+	errno_t (*read)(chardev_srv_t *, void *, size_t, size_t *,
+	    chardev_flags_t);
 	errno_t (*write)(chardev_srv_t *, const void *, size_t, size_t *);
 	void (*def_handler)(chardev_srv_t *, ipc_call_t *);
Index: uspace/lib/c/include/types/io/chardev.h
===================================================================
--- uspace/lib/c/include/types/io/chardev.h	(revision 06412bada4d61173430c35dc86bfba47ad6b47fc)
+++ uspace/lib/c/include/types/io/chardev.h	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -35,4 +35,6 @@
 /** Chardev read/write operation flags */
 typedef enum {
+	/** No flags */
+	chardev_f_none = 0,
 	/** Do not block even if no bytes can be transferred */
 	chardev_f_nonblock = 0x1
