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
|