summaryrefslogtreecommitdiff
path: root/doc/vfs.txt
blob: 7902148241d9a4f13585122fd2cf1e36c94ec305 (plain) (blame)
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