void (*close)(struct fs_node* node);
struct fs_node* (*finddir)(struct fs_node* node, const char* name);
int (*readdir)(struct fs_node* node, uint32_t* inout_index, void* buf, uint32_t buf_len);
+ int (*ioctl)(struct fs_node* node, uint32_t cmd, void* arg);
+ uintptr_t (*mmap)(struct fs_node* node, uintptr_t addr, uint32_t length, uint32_t prot, uint32_t offset);
} fs_node_t;
struct vfs_dirent {
static uint32_t pty_master_write_fn(fs_node_t* node, uint32_t offset, uint32_t size, const uint8_t* buffer);
static uint32_t pty_slave_read_fn(fs_node_t* node, uint32_t offset, uint32_t size, uint8_t* buffer);
static uint32_t pty_slave_write_fn(fs_node_t* node, uint32_t offset, uint32_t size, const uint8_t* buffer);
+static int pty_slave_ioctl_fn(fs_node_t* node, uint32_t cmd, void* arg);
static void pty_init_pair(int idx) {
struct pty_pair* p = &g_ptys[idx];
p->slave_node.inode = PTY_SLAVE_INO_BASE + (uint32_t)idx;
p->slave_node.read = &pty_slave_read_fn;
p->slave_node.write = &pty_slave_write_fn;
+ p->slave_node.ioctl = &pty_slave_ioctl_fn;
}
/* --- DevFS pts directory callbacks --- */
return (uint32_t)rc;
}
+static int pty_slave_ioctl_fn(fs_node_t* node, uint32_t cmd, void* arg) {
+ int idx = pty_ino_to_idx(node->inode);
+ if (idx < 0) return -ENODEV;
+ return pty_slave_ioctl_idx(idx, cmd, arg);
+}
+
int pty_master_can_read(void) { return pty_master_can_read_idx(0); }
int pty_master_can_write(void) { return pty_master_can_write_idx(0); }
int pty_slave_can_read(void) { return pty_slave_can_read_idx(0); }
if (!f || !f->node) return -EBADF;
fs_node_t* n = f->node;
- if (n->flags != FS_CHARDEVICE) return -ENOTTY;
- if (n->inode == 3) return tty_ioctl(cmd, user_arg);
- if (pty_is_slave_ino(n->inode)) return pty_slave_ioctl_idx(pty_ino_to_idx(n->inode), cmd, user_arg);
- if (pty_is_master_ino(n->inode)) return -ENOTTY;
+ if (n->ioctl) return n->ioctl(n, cmd, user_arg);
return -ENOTTY;
}
return (uint32_t)rc;
}
+static int tty_devfs_ioctl(fs_node_t* node, uint32_t cmd, void* arg) {
+ (void)node;
+ return tty_ioctl(cmd, arg);
+}
+
void tty_init(void) {
spinlock_init(&tty_lock);
line_len = 0;
g_dev_console_node.inode = 10;
g_dev_console_node.read = &tty_devfs_read;
g_dev_console_node.write = &tty_devfs_write;
+ g_dev_console_node.ioctl = &tty_devfs_ioctl;
devfs_register_device(&g_dev_console_node);
/* Register /dev/tty */
g_dev_tty_node.inode = 3;
g_dev_tty_node.read = &tty_devfs_read;
g_dev_tty_node.write = &tty_devfs_write;
+ g_dev_tty_node.ioctl = &tty_devfs_ioctl;
devfs_register_device(&g_dev_tty_node);
}