// vfs.cpp // Virtual file system subsystem for HOS // Author: Josh Holtrop // Date: 05/10/05 // Modified: 05/10/05 #define _HOS_CPP_ _HOS_CPP_ extern "C" { #include "hos_defines.h" #include "display/kout.h" } #include "vfs.h" #include "fs/FileSystem.h" #include "fs/VFSMount.h" #include "fs/ext2/ext2.h" #include "lang/vector.h" #include "lang/string.h" #include "devices.h" inode_num_t rootInode; vector *mountPoints; vector *fses; int vfs_init() { mountPoints = new vector; fses = new vector; ext2_init(); return 0; } int vfs_register(char *fs, FileSystem *(*mount_func)(device_t)) { string fsName(fs); if (vfs_get_mount_func(fsName)) return -1; FSHandle fsh = {fsName, mount_func}; fses->add(fsh); return 0; } int vfs_mount(device_t device, char *fsType, char *mountPoint) { string mountPt(mountPoint); string fsName(fsType); if (!vfs_get_mount_func(fsName)) return -501; if (mountPt == "/") { if (mountPoints->size()) { kprintf("/ must be the first filesystem mounted!\n"); return -1; } FileSystem *fs = vfs_attempt_mount(device, fsType); if (fs == NULL) return -2; rootInode = fs->getRootInodeNumber(); mountPoints->add(VFSMount(device, fs, mountPt, 0)); return 0; } else { // TODO: mount a second filesystem } return 500; } FileSystem *vfs_attempt_mount(device_t device, char *fsType) { mount_func_t mount_func; if (( mount_func = vfs_get_mount_func(string(fsType)) )) return mount_func(device); else return NULL; } mount_func_t vfs_get_mount_func(const string & fsName) { for (unsigned int i = 0; i < fses->size(); i++) { if (fsName == (*fses)[i].name) return (*fses)[i].mount_func; } return NULL; }