91 lines
2.3 KiB
C
91 lines
2.3 KiB
C
|
/* ProcFS - main.c - by Alen Stojanov and David van Moolenbroek */
|
||
|
|
||
|
#include "inc.h"
|
||
|
|
||
|
FORWARD _PROTOTYPE( void init_hook, (void) );
|
||
|
|
||
|
/* The hook functions that will be called by VTreeFS. */
|
||
|
PRIVATE struct fs_hooks hooks = {
|
||
|
init_hook,
|
||
|
NULL, /* cleanup_hook */
|
||
|
lookup_hook,
|
||
|
getdents_hook,
|
||
|
read_hook,
|
||
|
rdlink_hook,
|
||
|
NULL /* message_hook */
|
||
|
};
|
||
|
|
||
|
/*===========================================================================*
|
||
|
* construct_tree *
|
||
|
*===========================================================================*/
|
||
|
PRIVATE void construct_tree(struct inode *dir, struct file *files)
|
||
|
{
|
||
|
/* Construct a tree of static files from a null-terminated array of
|
||
|
* file structures, recursively creating directories which have their
|
||
|
* associated data point to child file structures.
|
||
|
*/
|
||
|
struct file *file;
|
||
|
struct inode *node;
|
||
|
struct inode_stat stat;
|
||
|
|
||
|
stat.uid = SUPER_USER;
|
||
|
stat.gid = SUPER_USER;
|
||
|
stat.size = 0;
|
||
|
stat.dev = NO_DEV;
|
||
|
|
||
|
for (file = files; file->name != NULL; file++) {
|
||
|
stat.mode = file->mode;
|
||
|
|
||
|
node = add_inode(dir, file->name, NO_INDEX, &stat, (index_t) 0,
|
||
|
(cbdata_t) file->data);
|
||
|
|
||
|
assert(node != NULL);
|
||
|
|
||
|
if (S_ISDIR(file->mode))
|
||
|
construct_tree(node, (struct file *) file->data);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*===========================================================================*
|
||
|
* init_hook *
|
||
|
*===========================================================================*/
|
||
|
PRIVATE void init_hook(void)
|
||
|
{
|
||
|
/* Initialization hook. Generate the static part of the tree.
|
||
|
*/
|
||
|
struct inode *root;
|
||
|
|
||
|
root = get_root_inode();
|
||
|
|
||
|
construct_tree(root, root_files);
|
||
|
}
|
||
|
|
||
|
/*===========================================================================*
|
||
|
* main *
|
||
|
*===========================================================================*/
|
||
|
PUBLIC int main(int argc, char *argv[])
|
||
|
{
|
||
|
/* ProcFS entry point.
|
||
|
*/
|
||
|
struct inode_stat stat;
|
||
|
int r;
|
||
|
|
||
|
/* Initialize some state. If we are incompatible with the kernel, exit
|
||
|
* immediately.
|
||
|
*/
|
||
|
if ((r = init_tree()) != OK)
|
||
|
return r;
|
||
|
|
||
|
/* Properties of the root directory. */
|
||
|
stat.mode = DIR_ALL_MODE;
|
||
|
stat.uid = SUPER_USER;
|
||
|
stat.gid = SUPER_USER;
|
||
|
stat.size = 0;
|
||
|
stat.dev = NO_DEV;
|
||
|
|
||
|
/* Start VTreeFS. This call does not return. */
|
||
|
start_vtreefs(&hooks, NR_INODES, &stat, NR_PROCS + NR_TASKS);
|
||
|
|
||
|
return 0;
|
||
|
}
|