Index: uspace/app/hrctl/hrctl.c
===================================================================
--- uspace/app/hrctl/hrctl.c	(revision ee83e9cf5b7876922b8efc19ac46344d1f5194bf)
+++ uspace/app/hrctl/hrctl.c	(revision b0f13664307c5f49642065cfc42aec7d4a3040cb)
@@ -53,17 +53,18 @@
     "\n"
     "Options:\n"
-    "  -h, --help              display this help and exit\n"
-    "  -C, --config-file=path  create an array from file,\n"
-    "                          sample file at: " HRCTL_SAMPLE_CONFIG_PATH "\n"
-    "  -s, --status            display status of active arrays\n"
-    "  -a, --assemble=NAME     assemble an existing array\n"
-    "  -c, --create=NAME       create new array\n"
-    "  -n                      non-zero number of devices\n"
-    "  -l, --level=LEVEL       set the RAID level,\n"
-    "                          valid values: 0, 1, 5, linear\n"
-    "  -0                      striping\n"
-    "  -1                      mirroring\n"
-    "  -5                      distributed parity\n"
-    "  -L                      linear concatenation\n"
+    "  -h, --help                display this help and exit\n"
+    "  -C, --create-file=path    create an array from file,\n"
+    "                            sample file at: " HRCTL_SAMPLE_CONFIG_PATH "\n"
+    "  -A, --assemble-file=path  create an array from file\n"
+    "  -s, --status              display status of active arrays\n"
+    "  -c, --create=NAME         create new array\n"
+    "  -a, --assemble=NAME       assemble an existing array\n"
+    "  -n                        non-zero number of devices\n"
+    "  -l, --level=LEVEL         set the RAID level,\n"
+    "                            valid values: 0, 1, 5, linear\n"
+    "  -0                        striping\n"
+    "  -1                        mirroring\n"
+    "  -5                        distributed parity\n"
+    "  -L                        linear concatenation\n"
     "\n"
     "Example usage:\n"
@@ -83,5 +84,6 @@
 	{ "create", required_argument, 0, 'c' },
 	{ "level", required_argument, 0, 'l' },
-	{ "config-file", required_argument, 0, 'C' },
+	{ "create-file", required_argument, 0, 'C' },
+	{ "assemble-file", required_argument, 0, 'A' },
 	{ 0, 0, 0, 0 }
 };
@@ -154,9 +156,10 @@
 
 	level_str = sif_node_get_attr(narray, "level");
-	if (level_str == NULL) {
-		rc = EIO;
-		goto error;
-	}
-	cfg->level = strtol(level_str, NULL, 10);
+	if (level_str == NULL)
+		cfg->level = hr_l_empty;
+	else if (str_cmp(level_str, "linear") == 0)
+		cfg->level = hr_l_linear;
+	else
+		cfg->level = strtol(level_str, NULL, 10);
 
 	dev_no_str = sif_node_get_attr(narray, "n");
@@ -228,5 +231,5 @@
 
 	while (c != -1) {
-		c = getopt_long(argc, argv, "hsC:c:a:l:015Ln:",
+		c = getopt_long(argc, argv, "hsC:c:A:a:l:015Ln:",
 		    long_options, NULL);
 		switch (c) {
@@ -239,12 +242,4 @@
 				return 1;
 			return 0;
-		case 'a':
-			if (str_size(optarg) > sizeof(cfg->devname) - 1) {
-				printf("hrctl: device name too long\n");
-				return 1;
-			}
-			str_cpy(cfg->devname, sizeof(cfg->devname), optarg);
-			assemble = true;
-			break;
 		case 'C':
 			/* only support 1 array inside config for now XXX */
@@ -264,4 +259,20 @@
 			create = true;
 			break;
+		case 'A':
+			rc = load_config(optarg, cfg);
+			if (rc != EOK) {
+				printf("hrctl: failed to load config\n");
+				return 1;
+			}
+			assemble = true;
+			goto skip;
+		case 'a':
+			if (str_size(optarg) > sizeof(cfg->devname) - 1) {
+				printf("hrctl: device name too long\n");
+				return 1;
+			}
+			str_cpy(cfg->devname, sizeof(cfg->devname), optarg);
+			assemble = true;
+			break;
 		case 'l':
 			if (cfg->level != hr_l_empty)
@@ -296,8 +307,4 @@
 			if ((int) cfg->dev_no + optind != argc)
 				goto bad;
-			if (cfg->dev_no > HR_MAXDEVS) {
-				printf("hrctl: too many devices\n");
-				return 1;
-			}
 			rc = fill_config_devs(argc, argv, optind, cfg);
 			if (rc != EOK)
@@ -308,10 +315,20 @@
 
 skip:
-	if ((create && assemble) ||
-	    (!create && !assemble) ||
-	    (create && cfg->level == hr_l_empty) ||
-	    (assemble && cfg->level != hr_l_empty) ||
-	    (cfg->dev_no == 0)) {
+	if ((create && assemble) || (!create && !assemble))
 		goto bad;
+
+	if (create && cfg->level == hr_l_empty) {
+		printf("hrctl: invalid level, exiting\n");
+		return 1;
+	}
+
+	if (cfg->dev_no > HR_MAXDEVS) {
+		printf("hrctl: too many devices, exiting\n");
+		return 1;
+	}
+
+	if (cfg->dev_no == 0) {
+		printf("hrctl: invalid number of devices, exiting\n");
+		return 1;
 	}
 
@@ -327,5 +344,6 @@
 		printf("hrctl: hr_create() rc: %s\n", str_error(rc));
 	} else if (assemble) {
-		printf("hrctl: assemble not implemented yet\n");
+		rc = hr_assemble(hr, cfg);
+		printf("hrctl: hr_assemble() rc: %s\n", str_error(rc));
 	}
 
