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
|
The VFS in T/CE :
File are objects that implement an abstract file class in the kernel. Its methods are :
- int open(process *pr, int mode)
- void close(process *pr)
- int read(size_t offset, size_t len, char *buffer)
- int write(size_t offset, size_t len, char *buffer)
- int stat(struct file_info *info)
- file* get_child(char* name)
- int add_child(char* name, file *child)
- int get_size()
The following syscall interface is given to the process (fd_t is a file descriptor, an int) :
- fd_t open(char* filename, int mode)
- fd_t open_relative(fd_t root, char* filename, int mode)
- int stat(char* filename, struct file_info *info)
- int stat_relative(fd_t root, char* filename, struct file_info *info)
- int statf(fd_t file, struct file_info *info)
- void close(fd_t file)
- int read(fd_t file, size_t offset, size_t len, char *buffer)
- int write(fd_t file, size_t offset, size_t len, char *buffer)
- int link(char *from, char *to, int mode)
- int dev_control(fd_t file, char *data)
struct file_info {
int type
int dev_type
int mode
int uid, gid
int size
}
File open modes flags :
- FM_READ open for reading
- FM_WRITE open for writing
- FM_TRUNC truncate existing file
- FM_CREATE create file if it doesn't exist
- FM_DELETE delete the file - incompatible with everything else
note : if mode contains neither FM_READ nor FM_WRITE, then the file will be created/truncated according to the flags given,
but will not be actually oppenned, so the return value of open will be 0.
Important remark :
The kernel does NOT keep track of what your current position in the file is. And it's a bit hard, too,
because terminals behave differently than files, and so do directories, etc. So that's why there is no
FM_APPEND : when you open a file, you can do whatever you want.
Link modes :
- LM_SYMLINK
- LM_HARDLINK (don't count on that really being implemented)
- LM_MOUNT
- LM_OUTPUT_TO (keyboard outputs to virtual terminal, virtual terminal outputs to display, that kind of stuff.)
File type flags :
- FT_FILE
- FT_DIR // block devices that contain a partition table will have this flag
- FT_SYMLINK
- FT_DEV // any kind of device with special properties (keyboard, hdd, disk partition, ...)
- FT_TERMINAL // virtual terminal
Device types :
- DT_BLOCK
- DT_PCKBD
- DT_VGATXT
- DT_VESAFB
Examples :
- Standard file :
type : FT_FILE
size : file length
- Standard dir :
type : FT_DIR
size : number of entries
- A display adapter
type : FT_DEV
dev_type : DT_VGATXT
capabilities : read/write at given offset, mmap
size : width << 16 + height
content format : (raw) 16 bit for each character (attribute & text)
- A keyboard
type : FT_DEV
dev_type : DT_PCKBD
capabilities : read from a (FIFO) buffer, offset is ignored
size : unused (zero)
content format : read 16-bit keycodes from IBM-PC keyboard format
|