xref: /minix/minix/fs/procfs/main.c (revision 0a6a1f1d)
1 /* ProcFS - main.c - main functions of the process file system */
2 
3 #include "inc.h"
4 
5 static void init_hook(void);
6 
7 /* The hook functions that will be called by VTreeFS. */
8 static struct fs_hooks hooks = {
9 	.init_hook	= init_hook,
10 	.lookup_hook	= lookup_hook,
11 	.getdents_hook	= getdents_hook,
12 	.read_hook	= read_hook,
13 	.rdlink_hook	= rdlink_hook,
14 };
15 
16 /*
17  * Construct a tree of static files from a null-terminated array of file
18  * structures, recursively creating directories which have their associated
19  * data point to child file structures.
20  */
21 static void
22 construct_tree(struct inode * dir, struct file * files)
23 {
24 	struct file *file;
25 	struct inode *node;
26 	struct inode_stat stat;
27 
28 	stat.uid = SUPER_USER;
29 	stat.gid = SUPER_USER;
30 	stat.size = 0;
31 	stat.dev = NO_DEV;
32 
33 	for (file = files; file->name != NULL; file++) {
34 		stat.mode = file->mode;
35 
36 		node = add_inode(dir, file->name, NO_INDEX, &stat, (index_t)0,
37 		    (cbdata_t)file->data);
38 
39 		assert(node != NULL);
40 
41 		if (S_ISDIR(file->mode))
42 			construct_tree(node, (struct file *)file->data);
43 	}
44 }
45 
46 /*
47  * Initialization hook.  Generate the static part of the tree.
48  */
49 static void
50 init_hook(void)
51 {
52 	static int first_time = TRUE;
53 	struct inode *root;
54 	int r;
55 
56 	if (first_time) {
57 		/*
58 		 * Initialize some state.  If we are incompatible with the kernel,
59 		 * exit immediately.
60 		 */
61 		if ((r = init_tree()) != OK)
62 			panic("init_tree failed!");
63 
64 		root = get_root_inode();
65 
66 		construct_tree(root, root_files);
67 
68 		service_init();
69 
70 		first_time = FALSE;
71 	}
72 }
73 
74 /*
75  * ProcFS entry point.
76  */
77 int main(void)
78 {
79 	static struct inode_stat stat;
80 
81 	/* Properties of the root directory. */
82 	stat.mode 	= DIR_ALL_MODE;
83 	stat.uid 	= SUPER_USER;
84 	stat.gid 	= SUPER_USER;
85 	stat.size 	= 0;
86 	stat.dev 	= NO_DEV;
87 
88 	/* Run VTreeFS. */
89 	run_vtreefs(&hooks, NR_INODES, 0, &stat, NR_PROCS + NR_TASKS,
90 	    BUF_SIZE);
91 
92 	return 0;
93 }
94