Index: uspace/srv/loader/main.c
===================================================================
--- uspace/srv/loader/main.c	(revision 40313e4adaa4947231bde53cbb7817f349abb372)
+++ uspace/srv/loader/main.c	(revision bbdbf864caf174598e10071c9291344c461489ef)
@@ -54,7 +54,7 @@
 #include <ipc/loader.h>
 #include <loader/pcb.h>
-#include <console.h>
 #include <errno.h>
 #include <async.h>
+#include <string.h>
 #include <as.h>
 
@@ -77,4 +77,11 @@
 static char *arg_buf = NULL;
 
+/** Number of preset files */
+static int filc = 0;
+/** Preset files vector */
+static char **filv = NULL;
+/** Buffer holding all preset files */
+static fs_node_t *fil_buf = NULL;
+
 static elf_info_t prog_info;
 static elf_info_t interp_info;
@@ -85,5 +92,5 @@
 static bool connected;
 
-static void loader_get_taskid(ipc_callid_t rid, ipc_call_t *request)
+static void ldr_get_taskid(ipc_callid_t rid, ipc_call_t *request)
 {
 	ipc_callid_t callid;
@@ -112,5 +119,5 @@
  * @param request
  */
-static void loader_set_pathname(ipc_callid_t rid, ipc_call_t *request)
+static void ldr_set_pathname(ipc_callid_t rid, ipc_call_t *request)
 {
 	ipc_callid_t callid;
@@ -148,5 +155,5 @@
  * @param request
  */
-static void loader_set_args(ipc_callid_t rid, ipc_call_t *request)
+static void ldr_set_args(ipc_callid_t rid, ipc_call_t *request)
 {
 	ipc_callid_t callid;
@@ -221,4 +228,68 @@
 }
 
+/** Receive a call setting preset files of the program to execute.
+ *
+ * @param rid
+ * @param request
+ */
+static void ldr_set_files(ipc_callid_t rid, ipc_call_t *request)
+{
+	ipc_callid_t callid;
+	size_t buf_size;
+	if (!ipc_data_write_receive(&callid, &buf_size)) {
+		ipc_answer_0(callid, EINVAL);
+		ipc_answer_0(rid, EINVAL);
+		return;
+	}
+	
+	if ((buf_size % sizeof(fs_node_t)) != 0) {
+		ipc_answer_0(callid, EINVAL);
+		ipc_answer_0(rid, EINVAL);
+		return;
+	}
+	
+	if (fil_buf != NULL) {
+		free(fil_buf);
+		fil_buf = NULL;
+	}
+	
+	if (filv != NULL) {
+		free(filv);
+		filv = NULL;
+	}
+	
+	fil_buf = malloc(buf_size);
+	if (!fil_buf) {
+		ipc_answer_0(callid, ENOMEM);
+		ipc_answer_0(rid, ENOMEM);
+		return;
+	}
+	
+	ipc_data_write_finalize(callid, fil_buf, buf_size);
+	
+	int count = buf_size / sizeof(fs_node_t);
+	
+	/* Allocate filvv */
+	filv = malloc((count + 1) * sizeof(fs_node_t *));
+	
+	if (filv == NULL) {
+		free(fil_buf);
+		ipc_answer_0(rid, ENOMEM);
+		return;
+	}
+	
+	/*
+	 * Fill filv with argument pointers
+	 */
+	int i;
+	for (i = 0; i < count; i++)
+		filv[i] = &fil_buf[i];
+	
+	filc = count;
+	filv[count] = NULL;
+	
+	ipc_answer_0(rid, EOK);
+}
+
 /** Load the previously selected program.
  *
@@ -227,5 +298,5 @@
  * @return 0 on success, !0 on error.
  */
-static int loader_load(ipc_callid_t rid, ipc_call_t *request)
+static int ldr_load(ipc_callid_t rid, ipc_call_t *request)
 {
 	int rc;
@@ -242,4 +313,7 @@
 	pcb.argc = argc;
 	pcb.argv = argv;
+	
+	pcb.filc = filc;
+	pcb.filv = filv;
 	
 	if (prog_info.interp == NULL) {
@@ -271,5 +345,5 @@
  * @return 0 on success, !0 on error.
  */
-static void loader_run(ipc_callid_t rid, ipc_call_t *request)
+static void ldr_run(ipc_callid_t rid, ipc_call_t *request)
 {
 	const char *cp;
@@ -284,5 +358,4 @@
 		DPRINTF("Run ELF interpreter.\n");
 		DPRINTF("Entry point: 0x%lx\n", interp_info.entry);
-		console_close();
 		
 		ipc_answer_0(rid, EOK);
@@ -290,9 +363,8 @@
 	} else {
 		/* Statically linked program */
-		console_close();
 		ipc_answer_0(rid, EOK);
 		elf_run(&prog_info, &pcb);
-	} 
-
+	}
+	
 	/* Not reached */
 }
@@ -303,5 +375,5 @@
  * to execute the loaded program).
  */
-static void loader_connection(ipc_callid_t iid, ipc_call_t *icall)
+static void ldr_connection(ipc_callid_t iid, ipc_call_t *icall)
 {
 	ipc_callid_t callid;
@@ -331,17 +403,20 @@
 			exit(0);
 		case LOADER_GET_TASKID:
-			loader_get_taskid(callid, &call);
+			ldr_get_taskid(callid, &call);
 			continue;
 		case LOADER_SET_PATHNAME:
-			loader_set_pathname(callid, &call);
+			ldr_set_pathname(callid, &call);
 			continue;
 		case LOADER_SET_ARGS:
-			loader_set_args(callid, &call);
+			ldr_set_args(callid, &call);
+			continue;
+		case LOADER_SET_FILES:
+			ldr_set_files(callid, &call);
 			continue;
 		case LOADER_LOAD:
-			loader_load(callid, &call);
+			ldr_load(callid, &call);
 			continue;
 		case LOADER_RUN:
-			loader_run(callid, &call);
+			ldr_run(callid, &call);
 			/* Not reached */
 		default:
@@ -367,5 +442,5 @@
 	
 	/* Set a handler of incomming connections. */
-	async_set_client_connection(loader_connection);
+	async_set_client_connection(ldr_connection);
 	
 	/* Register at naming service. */
