summaryrefslogtreecommitdiff
path: root/kernel/src/generic/devfs.hpp
blob: 5497b883475a4d8b5df3fa0948d1c6d55607e8fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#pragma once
#include <cstdint>
#include <generic/vfs.hpp>

struct devfs_node {
    vfs::pipe* write_pipe;
    vfs::pipe* read_pipe;

    std::int32_t (*open)(file_descriptor* fd, devfs_node* node);
    std::int32_t (*ioctl)(devfs_node* node, std::uint64_t req, void* arg);
    signed long (*read)(file_descriptor* fd, devfs_node* node, void* buffer, std::size_t count);
    signed long (*write)(file_descriptor* fd, devfs_node* node, void* buffer, std::size_t count);
    bool (*poll)(devfs_node* node, vfs_poll_type type);

    std::int32_t (*close)(file_descriptor* fd, devfs_node* node);

    void* arg;

    bool is_root;

    bool is_a_tty;
    char path[256];

    std::uint64_t mmap;
    std::uint64_t mmap_size;

    std::uint64_t id;

    devfs_node* next;
};

static_assert(sizeof(devfs_node) < 4096, "fsfsdf");

// for non input devices
namespace devfs {
    void create(bool is_tty, char* path, void* arg, std::uint64_t mmap, std::uint64_t mmap_size, std::int32_t (*open)(file_descriptor*fd, devfs_node* node), std::int32_t (*ioctl)(devfs_node* node, std::uint64_t req, void* arg), signed long (*read)(file_descriptor* fd, devfs_node* node, void* buffer, std::size_t count), signed long (*write)(file_descriptor* fd, devfs_node* node, void* buffer, std::size_t count), bool (*poll)(devfs_node* node, vfs_poll_type type), std::int32_t (*close)(file_descriptor* fd, devfs_node* node));
    void init(vfs::node* new_node);
}