1 #include <klibc/stdio.h>
2 #include <lunaix/device.h>
3 #include <lunaix/fs/twifs.h>
4 #include <lunaix/mm/valloc.h>
6 struct llist_header dev_list;
8 static struct twifs_node* dev_root;
11 __dev_read(struct v_file* file, void* buffer, size_t len);
14 __dev_write(struct v_file* file, void* buffer, size_t len);
19 dev_root = twifs_toplevel_node("dev", 3);
21 llist_init_head(&dev_list);
25 device_add(struct device* parent, void* underlay, char* name_fmt, ...)
27 struct device* dev = vzalloc(sizeof(struct device));
30 va_start(args, name_fmt);
33 __sprintf_internal(dev->name_val, name_fmt, DEVICE_NAME_SIZE, args);
35 dev->name = HSTR(dev->name_val, strlen);
37 dev->underlay = underlay;
39 hstr_rehash(&dev->name, HSTR_FULL_HASH);
40 llist_append(&dev_list, &dev->dev_list);
42 struct twifs_node* dev_node =
43 twifs_file_node(dev_root, dev->name_val, strlen);
45 dev_node->fops.read = __dev_read;
46 dev_node->fops.write = __dev_write;
48 dev->fs_node = dev_node;
55 __dev_read(struct v_file* file, void* buffer, size_t len)
57 struct twifs_node* dev_node = (struct twifs_node*)file->inode->data;
58 struct device* dev = (struct device*)dev_node->data;
63 return dev->read(dev, buffer, file->f_pos, len);
67 __dev_write(struct v_file* file, void* buffer, size_t len)
69 struct twifs_node* dev_node = (struct twifs_node*)file->inode->data;
70 struct device* dev = (struct device*)dev_node->data;
75 return dev->write(dev, buffer, file->f_pos, len);
79 device_remove(struct device* dev)
81 llist_delete(&dev->dev_list);
82 twifs_rm_node((struct twifs_node*)dev->fs_node);