Index: uspace/lib/fdisk/include/fdisk.h
===================================================================
--- uspace/lib/fdisk/include/fdisk.h	(revision e96047c95e2e340c70836a813474717696c06c3e)
+++ uspace/lib/fdisk/include/fdisk.h	(revision 8227d634855cabb163487dd2efe9a1b301377b9d)
@@ -44,10 +44,12 @@
 extern fdisk_dev_info_t *fdisk_dev_first(fdisk_dev_list_t *);
 extern fdisk_dev_info_t *fdisk_dev_next(fdisk_dev_info_t *);
-extern int fdisk_dev_get_svcname(fdisk_dev_info_t *, char **);
-extern void fdisk_dev_get_svcid(fdisk_dev_info_t *, service_id_t *);
-extern int fdisk_dev_capacity(fdisk_dev_info_t *, fdisk_cap_t *);
+extern int fdisk_dev_info_get_svcname(fdisk_dev_info_t *, char **);
+extern void fdisk_dev_info_get_svcid(fdisk_dev_info_t *, service_id_t *);
+extern int fdisk_dev_info_capacity(fdisk_dev_info_t *, fdisk_cap_t *);
 
 extern int fdisk_dev_open(service_id_t, fdisk_dev_t **);
 extern void fdisk_dev_close(fdisk_dev_t *);
+extern int fdisk_dev_get_svcname(fdisk_dev_t *, char **);
+extern int fdisk_dev_capacity(fdisk_dev_t *, fdisk_cap_t *);
 
 extern int fdisk_label_get_info(fdisk_dev_t *, fdisk_label_info_t *);
@@ -57,11 +59,15 @@
 extern fdisk_part_t *fdisk_part_first(fdisk_dev_t *);
 extern fdisk_part_t *fdisk_part_next(fdisk_part_t *);
+extern int fdisk_part_get_info(fdisk_part_t *, fdisk_part_info_t *);
 extern int fdisk_part_get_max_avail(fdisk_dev_t *, fdisk_cap_t *);
-extern int fdisk_part_create(fdisk_dev_t *, fdisk_partspec_t *,
+extern int fdisk_part_create(fdisk_dev_t *, fdisk_part_spec_t *,
     fdisk_part_t **);
 extern int fdisk_part_destroy(fdisk_part_t *);
+extern void fdisk_pspec_init(fdisk_part_spec_t *);
 
 extern int fdisk_cap_format(fdisk_cap_t *, char **);
+extern int fdisk_cap_parse(const char *, fdisk_cap_t *);
 extern int fdisk_ltype_format(fdisk_label_type_t, char **);
+extern int fdisk_fstype_format(fdisk_fstype_t, char **);
 
 #endif
Index: uspace/lib/fdisk/include/types/fdisk.h
===================================================================
--- uspace/lib/fdisk/include/types/fdisk.h	(revision e96047c95e2e340c70836a813474717696c06c3e)
+++ uspace/lib/fdisk/include/types/fdisk.h	(revision 8227d634855cabb163487dd2efe9a1b301377b9d)
@@ -41,4 +41,41 @@
 #include <stdint.h>
 
+typedef enum {
+	cu_byte = 0,
+	cu_kbyte,
+	cu_mbyte,
+	cu_gbyte,
+	cu_tbyte,
+	cu_pbyte,
+	cu_ebyte,
+	cu_zbyte,
+	cu_ybyte
+} fdisk_cunit_t;
+
+#define CU_LIMIT (cu_ybyte + 1)
+
+/** File system type */
+typedef enum {
+	fdfs_none = 0,
+	fdfs_unknown,
+	fdfs_exfat,
+	fdfs_fat,
+	fdfs_minix,
+	fdfs_ext4
+} fdisk_fstype_t;
+
+/** Highest fstype value + 1 */
+#define FDFS_LIMIT (fdfs_ext4 + 1)
+/** Lowest fstype allowed for creation */
+#define FDFS_CREATE_LO fdfs_exfat
+/** Highest fstype allowed for creation + 1 */
+#define FDFS_CREATE_HI (fdfs_ext4 + 1)
+
+/** Partition capacity */
+typedef struct {
+	uint64_t value;
+	fdisk_cunit_t cunit;
+} fdisk_cap_t;
+
 /** List of devices available for managing by fdisk */
 typedef struct {
@@ -70,7 +107,19 @@
 } fdisk_label_type_t;
 
+/** Highest label type + 1 */
+#define FDL_LIMIT (fdl_gpt + 1)
+/** Lowest label type allowed for creation */
+#define FDL_CREATE_LO fdl_mbr
+/** Highest label type allowed for creation + 1 */
+#define FDL_CREATE_HI (fdl_gpt + 1)
+
 /** Open fdisk device */
 typedef struct {
+	/** Label type */
 	fdisk_label_type_t ltype;
+	/** Partitions */
+	list_t parts; /* of fdisk_part_t */
+	/** Service ID */
+	service_id_t sid;
 } fdisk_dev_t;
 
@@ -82,27 +131,28 @@
 /** Partition */
 typedef struct {
+	/** Containing device */
+	fdisk_dev_t *dev;
+	/** Link to fdisk_dev_t.parts */
+	link_t ldev;
+	/** Capacity */
+	fdisk_cap_t capacity;
+	/** File system type */
+	fdisk_fstype_t fstype;
 } fdisk_part_t;
-
-typedef enum {
-	cu_byte = 0,
-	cu_kbyte,
-	cu_mbyte,
-	cu_gbyte,
-	cu_tbyte,
-	cu_pbyte,
-	cu_ebyte,
-	cu_zbyte,
-	cu_ybyte
-} fdisk_cunit_t;
-
-/** Partition capacity */
-typedef struct {
-	uint64_t value;
-	fdisk_cunit_t cunit;
-} fdisk_cap_t;
 
 /** Specification of new partition */
 typedef struct {
-} fdisk_partspec_t;
+	/** Desired capacity */
+	fdisk_cap_t capacity;
+	/** File system type */
+	fdisk_fstype_t fstype;
+} fdisk_part_spec_t;
+
+/** Partition info */
+typedef struct {
+	fdisk_cap_t capacity;
+	/** File system type */
+	fdisk_fstype_t fstype;
+} fdisk_part_info_t;
 
 #endif
Index: uspace/lib/fdisk/src/fdisk.c
===================================================================
--- uspace/lib/fdisk/src/fdisk.c	(revision e96047c95e2e340c70836a813474717696c06c3e)
+++ uspace/lib/fdisk/src/fdisk.c	(revision 8227d634855cabb163487dd2efe9a1b301377b9d)
@@ -39,7 +39,20 @@
 #include <fdisk.h>
 #include <loc.h>
+#include <mem.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <str.h>
+
+static const char *cu_str[] = {
+	[cu_byte] = "B",
+	[cu_kbyte] = "kB",
+	[cu_mbyte] = "MB",
+	[cu_gbyte] = "GB",
+	[cu_tbyte] = "TB",
+	[cu_pbyte] = "PB",
+	[cu_ebyte] = "EB",
+	[cu_zbyte] = "ZB",
+	[cu_ybyte] = "YB"
+};
 
 static void fdisk_dev_info_delete(fdisk_dev_info_t *info)
@@ -144,10 +157,10 @@
 }
 
-void fdisk_dev_get_svcid(fdisk_dev_info_t *info, service_id_t *rsid)
+void fdisk_dev_info_get_svcid(fdisk_dev_info_t *info, service_id_t *rsid)
 {
 	*rsid = info->svcid;
 }
 
-int fdisk_dev_get_svcname(fdisk_dev_info_t *info, char **rname)
+int fdisk_dev_info_get_svcname(fdisk_dev_info_t *info, char **rname)
 {
 	char *name;
@@ -169,5 +182,5 @@
 }
 
-int fdisk_dev_capacity(fdisk_dev_info_t *info, fdisk_cap_t *cap)
+int fdisk_dev_info_capacity(fdisk_dev_info_t *info, fdisk_cap_t *cap)
 {
 	size_t bsize;
@@ -179,4 +192,6 @@
 		if (rc != EOK)
 			return rc;
+
+		info->blk_inited = true;
 	}
 
@@ -204,4 +219,6 @@
 
 	dev->ltype = fdl_none;
+	dev->sid = sid;
+	list_initialize(&dev->parts);
 	*rdev = dev;
 	return EOK;
@@ -211,4 +228,43 @@
 {
 	free(dev);
+}
+
+int fdisk_dev_get_svcname(fdisk_dev_t *dev, char **rname)
+{
+	char *name;
+	int rc;
+
+	rc = loc_service_get_name(dev->sid, &name);
+	if (rc != EOK)
+		return rc;
+
+	*rname = name;
+	return EOK;
+}
+
+int fdisk_dev_capacity(fdisk_dev_t *dev, fdisk_cap_t *cap)
+{
+	size_t bsize;
+	aoff64_t nblocks;
+	int rc;
+
+	rc = block_init(EXCHANGE_SERIALIZE, dev->sid, 2048);
+	if (rc != EOK)
+		return rc;
+
+	rc = block_get_bsize(dev->sid, &bsize);
+	if (rc != EOK)
+		return EIO;
+
+	rc = block_get_nblocks(dev->sid, &nblocks);
+	if (rc != EOK)
+		return EIO;
+
+	block_fini(dev->sid);
+
+	cap->value = bsize * nblocks;
+	cap->cunit = cu_byte;
+
+	return EOK;
 }
 
@@ -230,7 +286,15 @@
 int fdisk_label_destroy(fdisk_dev_t *dev)
 {
+	fdisk_part_t *part;
+
 	if (dev->ltype == fdl_none)
 		return ENOENT;
 
+	part = fdisk_part_first(dev);
+	while (part != NULL) {
+		(void) fdisk_part_destroy(part); /* XXX */
+		part = fdisk_part_first(dev);
+	}
+
 	dev->ltype = fdl_none;
 	return EOK;
@@ -239,10 +303,29 @@
 fdisk_part_t *fdisk_part_first(fdisk_dev_t *dev)
 {
-	return NULL;
+	link_t *link;
+
+	link = list_first(&dev->parts);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, fdisk_part_t, ldev);
 }
 
 fdisk_part_t *fdisk_part_next(fdisk_part_t *part)
 {
-	return NULL;
+	link_t *link;
+
+	link = list_next(&part->ldev, &part->dev->parts);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, fdisk_part_t, ldev);
+}
+
+int fdisk_part_get_info(fdisk_part_t *part, fdisk_part_info_t *info)
+{
+	info->capacity = part->capacity;
+	info->fstype = part->fstype;
+	return EOK;
 }
 
@@ -252,7 +335,20 @@
 }
 
-int fdisk_part_create(fdisk_dev_t *dev, fdisk_partspec_t *pspec,
+int fdisk_part_create(fdisk_dev_t *dev, fdisk_part_spec_t *pspec,
     fdisk_part_t **rpart)
 {
+	fdisk_part_t *part;
+
+	part = calloc(1, sizeof(fdisk_part_t));
+	if (part == NULL)
+		return ENOMEM;
+
+	part->dev = dev;
+	list_append(&part->ldev, &dev->parts);
+	part->capacity = pspec->capacity;
+	part->fstype = pspec->fstype;
+
+	if (rpart != NULL)
+		*rpart = part;
 	return EOK;
 }
@@ -260,5 +356,12 @@
 int fdisk_part_destroy(fdisk_part_t *part)
 {
-	return EOK;
+	list_remove(&part->ldev);
+	free(part);
+	return EOK;
+}
+
+void fdisk_pspec_init(fdisk_part_spec_t *pspec)
+{
+	memset(pspec, 0, sizeof(fdisk_part_spec_t));
 }
 
@@ -266,9 +369,51 @@
 {
 	int rc;
-
-	rc = asprintf(rstr, "%" PRIu64 " B", cap->value);
+	const char *sunit;
+
+	sunit = NULL;
+
+	if (cap->cunit < 0 || cap->cunit >= CU_LIMIT)
+		assert(false);
+
+	sunit = cu_str[cap->cunit];
+	rc = asprintf(rstr, "%" PRIu64 " %s", cap->value, sunit);
 	if (rc < 0)
 		return ENOMEM;
 
+	return EOK;
+}
+
+int fdisk_cap_parse(const char *str, fdisk_cap_t *cap)
+{
+	char *eptr;
+	char *p;
+	unsigned long val;
+	int i;
+
+	val = strtoul(str, &eptr, 10);
+
+	while (*eptr == ' ')
+		++eptr;
+
+	if (*eptr == '\0') {
+		cap->cunit = cu_byte;
+	} else {
+		for (i = 0; i < CU_LIMIT; i++) {
+			if (str_lcasecmp(eptr, cu_str[i],
+			    str_length(cu_str[i])) == 0) {
+				p = eptr + str_size(cu_str[i]);
+				while (*p == ' ')
+					++p;
+				if (*p == '\0')
+					goto found;
+			}
+		}
+
+		return EINVAL;
+found:
+		cap->cunit = i;
+	}
+
+	cap->value = val;
 	return EOK;
 }
@@ -303,4 +448,39 @@
 }
 
+int fdisk_fstype_format(fdisk_fstype_t fstype, char **rstr)
+{
+	const char *sfstype;
+	char *s;
+
+	sfstype = NULL;
+	switch (fstype) {
+	case fdfs_none:
+		sfstype = "None";
+		break;
+	case fdfs_unknown:
+		sfstype = "Unknown";
+		break;
+	case fdfs_exfat:
+		sfstype = "ExFAT";
+		break;
+	case fdfs_fat:
+		sfstype = "FAT";
+		break;
+	case fdfs_minix:
+		sfstype = "MINIX";
+		break;
+	case fdfs_ext4:
+		sfstype = "Ext4";
+		break;
+	}
+
+	s = str_dup(sfstype);
+	if (s == NULL)
+		return ENOMEM;
+
+	*rstr = s;
+	return EOK;
+}
+
 /** @}
  */
