Index: uspace/lib/c/generic/io/io.c
===================================================================
--- uspace/lib/c/generic/io/io.c	(revision f787c8e603e6091f428e7d4b79342b95a4fc26f4)
+++ uspace/lib/c/generic/io/io.c	(revision b13d80b2d3d6107331beeefec2ede2df8f661cba)
@@ -185,9 +185,11 @@
 }
 
-static bool parse_mode(const char *fmode, int *mode, bool *create, bool *truncate)
+static bool parse_mode(const char *fmode, int *mode, bool *create, bool *excl,
+    bool *truncate)
 {
 	/* Parse mode except first character. */
 	const char *mp = fmode;
-	if (*mp++ == 0) {
+
+	if (*mp++ == '\0') {
 		errno = EINVAL;
 		return false;
@@ -201,8 +203,17 @@
 		mp++;
 		plus = true;
-	} else
+	} else {
 		plus = false;
-
-	if (*mp != 0) {
+	}
+
+	bool ex;
+	if (*mp == 'x') {
+		mp++;
+		ex = true;
+	} else {
+		ex = false;
+	}
+
+	if (*mp != '\0') {
 		errno = EINVAL;
 		return false;
@@ -211,4 +222,5 @@
 	*create = false;
 	*truncate = false;
+	*excl = false;
 
 	/* Parse first character of fmode and determine mode for vfs_open(). */
@@ -216,8 +228,13 @@
 	case 'r':
 		*mode = plus ? MODE_READ | MODE_WRITE : MODE_READ;
+		if (ex) {
+			errno = EINVAL;
+			return false;
+		}
 		break;
 	case 'w':
 		*mode = plus ? MODE_READ | MODE_WRITE : MODE_WRITE;
 		*create = true;
+		*excl = ex;
 		if (!plus)
 			*truncate = true;
@@ -227,4 +244,9 @@
 		if (plus) {
 			errno = ENOTSUP;
+			return false;
+		}
+
+		if (ex) {
+			errno = EINVAL;
 			return false;
 		}
@@ -307,5 +329,5 @@
  *
  * @param path Path of the file to open.
- * @param mode Mode string, (r|w|a)[b|t][+].
+ * @param mode Mode string, (r|w|a)[b|t][+][x].
  *
  */
@@ -314,7 +336,8 @@
 	int mode;
 	bool create;
+	bool excl;
 	bool truncate;
 
-	if (!parse_mode(fmode, &mode, &create, &truncate))
+	if (!parse_mode(fmode, &mode, &create, &excl, &truncate))
 		return NULL;
 
@@ -327,5 +350,7 @@
 
 	int flags = WALK_REGULAR;
-	if (create)
+	if (create && excl)
+		flags |= WALK_MUST_CREATE;
+	else if (create)
 		flags |= WALK_MAY_CREATE;
 	int file;
