+ fs_root = twifs_dir_node(NULL, NULL, 0);
+}
+
+struct twifs_node*
+__twifs_new_node(struct twifs_node* parent, const char* name, int name_len)
+{
+ struct twifs_node* node = cake_grab(twi_pile);
+ memset(node, 0, sizeof(*node));
+
+ node->name = HSTR(name, name_len);
+ hstr_rehash(&node->name, HSTR_FULL_HASH);
+ llist_init_head(&node->children);
+
+ if (parent) {
+ llist_append(&parent->children, &node->siblings);
+ }
+
+ return node;
+}
+
+void
+twifs_rm_node(struct twifs_node* node)
+{
+ // TODO recursivly delete any sub-directories.
+ if ((node->itype & VFS_INODE_TYPE_DIR)) {
+ struct twifs_node* dir = __twifs_get_node(node, &vfs_dot);
+ struct twifs_node* dir2 = __twifs_get_node(node, &vfs_ddot);
+ vfs_i_free(dir->inode);
+ vfs_i_free(dir2->inode);
+ cake_release(twi_pile, dir);
+ cake_release(twi_pile, dir2);
+ }
+ llist_delete(&node->siblings);
+ vfs_i_free(node->inode);
+ cake_release(twi_pile, node);
+}
+
+struct twifs_node*
+twifs_file_node(struct twifs_node* parent, const char* name, int name_len)
+{
+ struct twifs_node* twi_node = __twifs_new_node(parent, name, name_len);
+ twi_node->itype = VFS_INODE_TYPE_FILE;