Index: uspace/lib/block/libblock.c
===================================================================
--- uspace/lib/block/libblock.c	(revision 224c0e7cdf71623ced2dfae1613f0f4c6f94d45b)
+++ uspace/lib/block/libblock.c	(revision a1b7e80f43314ce5402c62baeed636abd4a0bd3c)
@@ -93,4 +93,5 @@
 static int get_block_size(async_sess_t *, size_t *);
 static int get_num_blocks(async_sess_t *, aoff64_t *);
+static int read_toc(async_sess_t *, uint8_t);
 static aoff64_t ba_ltop(devcon_t *, aoff64_t);
 
@@ -891,4 +892,30 @@
 }
 
+/** Get TOC from device.
+ *
+ * @param service_id Service ID of the block device.
+ * @param session    Starting session.
+ * @param data       Buffer to read TOC into.
+ *
+ * @return EOK on success.
+ * @return Error code on failure.
+ *
+ */
+int block_get_toc(service_id_t service_id, uint8_t session, void *data)
+{
+	devcon_t *devcon = devcon_search(service_id);
+	assert(devcon);
+	
+	fibril_mutex_lock(&devcon->comm_area_lock);
+	
+	int rc = read_toc(devcon->sess, session);
+	if (rc == EOK)
+		memcpy(data, devcon->comm_area, devcon->pblock_size);
+	
+	fibril_mutex_unlock(&devcon->comm_area_lock);
+	
+	return rc;
+}
+
 /** Read blocks from block device.
  *
@@ -981,4 +1008,14 @@
 }
 
+/** Get TOC from block device. */
+static int read_toc(async_sess_t *sess, uint8_t session)
+{
+	async_exch_t *exch = async_exchange_begin(sess);
+	int rc = async_req_1_0(exch, BD_READ_TOC, session);
+	async_exchange_end(exch);
+
+	return rc;
+}
+
 /** Convert logical block address to physical block address. */
 static aoff64_t ba_ltop(devcon_t *devcon, aoff64_t lba)
Index: uspace/lib/block/libblock.h
===================================================================
--- uspace/lib/block/libblock.h	(revision 224c0e7cdf71623ced2dfae1613f0f4c6f94d45b)
+++ uspace/lib/block/libblock.h	(revision a1b7e80f43314ce5402c62baeed636abd4a0bd3c)
@@ -114,4 +114,5 @@
 extern int block_get_bsize(service_id_t, size_t *);
 extern int block_get_nblocks(service_id_t, aoff64_t *);
+extern int block_get_toc(service_id_t, uint8_t, void *);
 extern int block_read_direct(service_id_t, aoff64_t, size_t, void *);
 extern int block_read_bytes_direct(service_id_t, aoff64_t, size_t, void *);
Index: uspace/lib/c/generic/str.c
===================================================================
--- uspace/lib/c/generic/str.c	(revision 224c0e7cdf71623ced2dfae1613f0f4c6f94d45b)
+++ uspace/lib/c/generic/str.c	(revision a1b7e80f43314ce5402c62baeed636abd4a0bd3c)
@@ -551,5 +551,5 @@
  *
  * Common legacy text encoding in hardware is 7-bit ASCII fitted into
- * a fixed-with byte buffer (bit 7 always zero), right-padded with spaces
+ * a fixed-width byte buffer (bit 7 always zero), right-padded with spaces
  * (ASCII 0x20). Convert space-padded ascii to string representation.
  *
Index: uspace/lib/c/include/ipc/bd.h
===================================================================
--- uspace/lib/c/include/ipc/bd.h	(revision 224c0e7cdf71623ced2dfae1613f0f4c6f94d45b)
+++ uspace/lib/c/include/ipc/bd.h	(revision a1b7e80f43314ce5402c62baeed636abd4a0bd3c)
@@ -42,5 +42,6 @@
 	BD_GET_NUM_BLOCKS,
 	BD_READ_BLOCKS,
-	BD_WRITE_BLOCKS
+	BD_WRITE_BLOCKS,
+	BD_READ_TOC
 } bd_request_t;
 
