summaryrefslogtreecommitdiff
path: root/fs/vfs.h
blob: f8a4b19a0f6b0741fec8eaf0ac89c901489e930a (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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
typedef struct vfs_fd vfs_fd_t;
typedef struct vfs_inode vfs_inode_t;
typedef struct vfs_vm_object vfs_vm_object_t;
typedef struct vfs_mounts vfs_mounts_t;
#ifndef VFS_H
#define VFS_H
#include <limits.h>
#include <sched/scheduler.h>
#include <socket.h>
#include <stddef.h>
#include <stdint.h>

// FIXME: Is there some standard value for this?
#define O_NONBLOCK (1 << 0)
#define O_READ (1 << 1)
#define O_WRITE (1 << 2)
#define O_CREAT (1 << 3)
#define O_RDONLY O_READ
#define O_WRONLY O_WRITE
#define O_RDWR (O_WRITE | O_READ)

#define FS_TYPE_FILE 0
#define FS_TYPE_UNIX_SOCKET 1
#define FS_TYPE_CHAR_DEVICE 2
#define FS_TYPE_BLOCK_DEVICE 3
#define FS_TYPE_DIRECTORY 4
#define FS_TYPE_LINK 7

struct vfs_vm_object {
  void *virtual_object;
  void **object;
  uint64_t size;
};

struct vfs_mounts {
  char *path;
  vfs_inode_t *local_root;
};

struct dirent {
  unsigned int d_ino;    // File serial number.
  char d_name[PATH_MAX]; // Filename string of entry.
};

struct vfs_fd {
  size_t offset;
  int flags;
  int mode;
  int reference_count; // Number of usages of this file descriptor,
                       // once it reaches zero then the contents can
                       // be freed.
  vfs_inode_t *inode;
};

struct vfs_inode {
  int inode_num;
  int type;
  uint8_t has_data;
  uint8_t can_write;
  uint8_t is_open;
  void *internal_object;
  uint64_t file_size;
  vfs_inode_t *(*open)(const char *path);
  int (*create_file)(const char *path, int mode);
  int (*read)(uint8_t *buffer, uint64_t offset, uint64_t len, vfs_fd_t *fd);
  int (*write)(uint8_t *buffer, uint64_t offset, uint64_t len, vfs_fd_t *fd);
  void (*close)(vfs_fd_t *fd);
  int (*create_directory)(const char *path, int mode);
  vfs_vm_object_t *(*get_vm_object)(uint64_t length, uint64_t offset,
                                    vfs_fd_t *fd);
  int (*truncate)(vfs_fd_t *fd, size_t length);
};

int vfs_close(int fd);
vfs_fd_t *get_vfs_fd(int fd);
int vfs_open(const char *file, int flags, int mode);
void vfs_mount(char *path, vfs_inode_t *local_root);
int vfs_pwrite(int fd, void *buf, uint64_t count, uint64_t offset);
int raw_vfs_pwrite(vfs_fd_t *vfs_fd, void *buf, uint64_t count,
                   uint64_t offset);
int vfs_pread(int fd, void *buf, uint64_t count, uint64_t offset);
vfs_vm_object_t *vfs_get_vm_object(int fd, uint64_t length, uint64_t offset);
int vfs_dup2(int org_fd, int new_fd);
vfs_inode_t *vfs_internal_open(const char *file);
int vfs_mkdir(const char *path, int mode);
int vfs_create_fd(int flags, int mode, vfs_inode_t *inode, vfs_fd_t **fd);
int vfs_ftruncate(int fd, size_t length);
vfs_inode_t *vfs_create_inode(
    int inode_num, int type, uint8_t has_data, uint8_t can_write,
    uint8_t is_open, void *internal_object, uint64_t file_size,
    vfs_inode_t *(*open)(const char *path),
    int (*create_file)(const char *path, int mode),
    int (*read)(uint8_t *buffer, uint64_t offset, uint64_t len, vfs_fd_t *fd),
    int (*write)(uint8_t *buffer, uint64_t offset, uint64_t len, vfs_fd_t *fd),
    void (*close)(vfs_fd_t *fd),
    int (*create_directory)(const char *path, int mode),
    vfs_vm_object_t *(*get_vm_object)(uint64_t length, uint64_t offset,
                                      vfs_fd_t *fd),
    int (*truncate)(vfs_fd_t *fd, size_t length));
#endif