Converted curenv calls into an opaque macro
[akaros.git] / kern / src / kfs.c
1 /*
2  * Copyright (c) 2009 The Regents of the University of California
3  * Barret Rhoden <brho@cs.berkeley.edu>
4  * See LICENSE for details.
5  */
6
7 #include <kfs.h>
8 #include <string.h>
9 #include <assert.h>
10 #include <ros/error.h>
11
12 #define DECL_PROG(x) extern uint8_t _binary_obj_user_apps_##x##_start[], _binary_obj_user_apps_##x##_size[];      
13
14 #define KFS_ENTRY(x) {#x, _binary_obj_user_apps_##x##_start, (size_t) _binary_obj_user_apps_##x##_size},
15
16 /*
17  * Hardcode the files included in the KFS.  This needs to be in sync with the
18  * userapps in kern/src/Makefrag.
19  * Make sure to declare it, and add an entry.  Keep MAX_KFS_FILES big enough too
20  */
21 DECL_PROG(parlib_matrix);
22 DECL_PROG(roslib_null);
23 DECL_PROG(roslib_hello);
24 DECL_PROG(roslib_proctests);
25 DECL_PROG(roslib_spawn);
26 DECL_PROG(roslib_measurements);
27
28 struct kfs_entry kfs[MAX_KFS_FILES] = {
29         KFS_ENTRY(parlib_matrix)
30         KFS_ENTRY(roslib_null)
31         KFS_ENTRY(roslib_hello)
32         KFS_ENTRY(roslib_proctests)
33         KFS_ENTRY(roslib_spawn)
34         KFS_ENTRY(roslib_measurements)
35 };
36
37 ssize_t kfs_lookup_path(char* path)
38 {
39         for (int i = 0; i < MAX_KFS_FILES; i++)
40                 // need to think about how to copy-in something of unknown length
41                 if (!strncmp(kfs[i].name, path, strlen(path)))
42                         return i;
43         return -EINVAL;
44 }
45
46 /*
47  * Creates a process from the file pointed to by the KFS inode (index)
48  * This should take a real inode or something to point to the real location,
49  * and env_create shouldn't assume everything is contiguous
50  */
51 env_t* kfs_proc_create(size_t kfs_inode)
52 {
53         if (kfs_inode < 0 || kfs_inode >= MAX_KFS_FILES)
54                 panic("Invalid kfs_inode.  Check you error codes!");
55         return env_create(kfs[kfs_inode].start, kfs[kfs_inode].size);
56 }