1 #include <lunaix/device.h>
3 #include <lunaix/fs/devfs.h>
4 #include <lunaix/spike.h>
6 extern struct v_inode_ops devfs_inode_ops;
7 extern struct v_file_ops devfs_file_ops;
10 devfs_read(struct v_inode* inode, void* buffer, size_t len, size_t fpos)
14 struct device* dev = (struct device*)inode->data;
20 return dev->read(dev, buffer, fpos, len);
24 devfs_write(struct v_inode* inode, void* buffer, size_t len, size_t fpos)
28 struct device* dev = (struct device*)inode->data;
34 return dev->write(dev, buffer, fpos, len);
38 devfs_get_itype(struct device* dev)
40 int itype = VFS_IFFILE;
41 int dev_if = dev->dev_type & DEV_MSKIF;
42 if (dev_if == DEV_IFCAT) {
44 } else if (dev_if == DEV_IFVOL) {
45 itype |= VFS_IFVOLDEV;
47 itype |= VFS_IFSEQDEV;
53 devfs_mknod(struct v_dnode* dnode, struct device* dev)
57 struct v_inode* devnod = vfs_i_find(dnode->super_block, dev->dev_id);
59 if ((devnod = vfs_i_alloc(dnode->super_block))) {
60 devnod->id = dev->dev_id;
62 devnod->itype = devfs_get_itype(dev);
64 vfs_i_addhash(devnod);
70 vfs_assign_inode(dnode, devnod);
75 devfs_dirlookup(struct v_inode* this, struct v_dnode* dnode)
77 struct device* dev = device_getbyname(this->data, &dnode->name);
81 return devfs_mknod(dnode, dev);
85 devfs_readdir(struct v_file* file, struct dir_context* dctx)
87 struct device* dev = device_getbyoffset(file->inode->data, dctx->index);
91 dctx->read_complete_callback(
92 dctx, dev->name.value, dev->name.len, devfs_get_itype(dev));
97 devfs_init_inode(struct v_superblock* vsb, struct v_inode* inode)
99 inode->ops = &devfs_inode_ops;
100 inode->default_fops = &devfs_file_ops;
104 devfs_mount(struct v_superblock* vsb, struct v_dnode* mount_point)
106 vsb->ops.init_inode = devfs_init_inode;
108 struct v_inode* rootnod = vfs_i_alloc(vsb);
115 rootnod->itype = VFS_IFDIR;
117 vfs_i_addhash(rootnod);
118 vfs_assign_inode(mount_point, rootnod);
124 devfs_unmount(struct v_superblock* vsb)
132 struct filesystem* fs = fsm_new_fs("devfs", 5);
134 fs->mount = devfs_mount;
135 fs->unmount = devfs_unmount;
138 struct v_inode_ops devfs_inode_ops = { .dir_lookup = devfs_dirlookup,
139 .open = default_inode_open,
140 .mkdir = default_inode_mkdir,
141 .rmdir = default_inode_rmdir };
143 struct v_file_ops devfs_file_ops = { .close = default_file_close,
145 .write = devfs_write,
146 .seek = default_file_seek,
147 .readdir = devfs_readdir };