97 lines
2.7 KiB
C
97 lines
2.7 KiB
C
/* VTreeFS - vtreefs.c - by Alen Stojanov and David van Moolenbroek */
|
|
|
|
#include "inc.h"
|
|
|
|
static unsigned int inodes;
|
|
static struct inode_stat *root_stat;
|
|
static index_t root_entries;
|
|
|
|
/*===========================================================================*
|
|
* init_server *
|
|
*===========================================================================*/
|
|
static int init_server(int UNUSED(type), sef_init_info_t *UNUSED(info))
|
|
{
|
|
/* Initialize internal state, and register with VFS.
|
|
*/
|
|
|
|
/* Initialize the virtual tree. */
|
|
init_inodes(inodes, root_stat, root_entries);
|
|
|
|
return OK;
|
|
}
|
|
|
|
/*===========================================================================*
|
|
* got_signal *
|
|
*===========================================================================*/
|
|
static void got_signal(int signal)
|
|
{
|
|
/* We received a signal.
|
|
*/
|
|
|
|
if (signal != SIGTERM)
|
|
return;
|
|
|
|
fsdriver_terminate();
|
|
}
|
|
|
|
/*===========================================================================*
|
|
* sef_local_startup *
|
|
*===========================================================================*/
|
|
static void sef_local_startup(void)
|
|
{
|
|
sef_setcb_init_fresh(init_server);
|
|
sef_setcb_init_restart(init_server);
|
|
|
|
sef_setcb_signal_handler(got_signal);
|
|
|
|
/* No support for live update yet. */
|
|
|
|
sef_startup();
|
|
}
|
|
|
|
/*===========================================================================*
|
|
* fs_other *
|
|
*===========================================================================*/
|
|
void fs_other(const message *m_ptr, int __unused ipc_status)
|
|
{
|
|
/* We received a message that is not among the recognized file system
|
|
* requests. Call the message hook, if there is one.
|
|
*/
|
|
message msg;
|
|
|
|
if (vtreefs_hooks->message_hook != NULL) {
|
|
/* Not all of vtreefs's users play nice with the message, so
|
|
* make a copy to allow it to be modified.
|
|
*/
|
|
msg = *m_ptr;
|
|
|
|
vtreefs_hooks->message_hook(&msg);
|
|
}
|
|
}
|
|
|
|
/*===========================================================================*
|
|
* start_vtreefs *
|
|
*===========================================================================*/
|
|
void start_vtreefs(struct fs_hooks *hooks, unsigned int nr_inodes,
|
|
struct inode_stat *stat, index_t nr_indexed_entries)
|
|
{
|
|
/* This is the main routine of this service. It uses the main loop as
|
|
* provided by the fsdriver library. The routine returns once the file
|
|
* system has been unmounted and the process is signaled to exit.
|
|
*/
|
|
|
|
/* Use global variables to work around the inability to pass parameters
|
|
* through SEF to the initialization function..
|
|
*/
|
|
vtreefs_hooks = hooks;
|
|
inodes = nr_inodes;
|
|
root_stat = stat;
|
|
root_entries = nr_indexed_entries;
|
|
|
|
sef_local_startup();
|
|
|
|
fsdriver_task(&vtreefs_table);
|
|
|
|
cleanup_inodes();
|
|
}
|