Make it so that volumes can be mounted anywhere.
[monolithium.git] / kernel / include / filesystem.h
1 /*
2  * filesystem.h
3  *
4  * Copyright (C) 2016 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Affero General Public License as
8  * published by the Free Software Foundation, either version 3 of the
9  * License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Affero General Public License for more details.
15  *
16  * You should have received a copy of the GNU Affero General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef _FILESYSTEM_H_
21 #define _FILESYSTEM_H_
22
23 #include <common.h>
24 #include <object.h>
25 #include <list.h>
26 #include <clock.h>
27
28 #define PATH_DELIMITER_CHAR   '/'
29 #define PATH_DELIMITER_STRING "/"
30
31 #define FILE_MODE_READ            (1 << 0)
32 #define FILE_MODE_WRITE           (1 << 1)
33 #define FILE_MODE_SHARE_READ      (1 << 2)
34 #define FILE_MODE_SHARE_WRITE     (1 << 3)
35 #define FILE_MODE_NO_CACHE        (1 << 4)
36 #define FILE_MODE_DELETE_ON_CLOSE (1 << 29)
37 #define FILE_MODE_CREATE          (1 << 30)
38 #define FILE_MODE_TRUNCATE        (1 << 31)
39
40 #define FILE_ATTR_DIRECTORY      (1 << 0)
41 #define FILE_ATTR_OWNER_READABLE (1 << 1)
42 #define FILE_ATTR_OWNER_WRITABLE (1 << 2)
43 #define FILE_ATTR_WORLD_READABLE (1 << 3)
44 #define FILE_ATTR_WORLD_WRITABLE (1 << 4)
45 #define FILE_ATTR_DELETED        (1 << 31)
46
47 #define MOUNT_FLAG_READONLY (1 << 0)
48
49 typedef struct mounted_volume mounted_volume_t;
50 typedef struct file file_t;
51 typedef struct file_instance file_instance_t;
52
53 typedef dword_t (*fs_mount_proc_t)(const char *device, const char *mountpoint, dword_t flags);
54 typedef dword_t (*fs_unmount_proc_t)(mounted_volume_t *volume);
55 typedef dword_t (*fs_load_proc_t)(file_t **file);
56 typedef dword_t (*fs_unload_proc_t)(file_t *file);
57 typedef dword_t (*fs_open_proc_t)(file_instance_t **instance);
58 typedef dword_t (*fs_close_proc_t)(file_instance_t *instance);
59 typedef dword_t (*fs_delete_proc_t)(mounted_volume_t *volume, const char *path, bool_t purge);
60 typedef dword_t (*fs_read_proc_t)(file_instance_t *file, void *buffer, qword_t offset, size_t length, size_t *bytes_read);
61 typedef dword_t (*fs_write_proc_t)(file_instance_t *file, const void *buffer, qword_t offset, size_t length, size_t *bytes_written);
62 typedef dword_t (*fs_list_dir_proc_t)(file_instance_t *directory, char *filename, bool_t continue_scan);
63 typedef dword_t (*fs_set_proc_t)(file_t *file, dword_t info_type, const void *buffer, size_t size);
64
65 typedef enum
66 {
67     FILE_INFO_ATTRIBUTES,
68     FILE_INFO_NAME,
69     FILE_INFO_TIME,
70     FILE_INFO_SIZE,
71     FILE_INFO_OWNER,
72 } file_info_type_t;
73
74 typedef struct
75 {
76     list_entry_t list;
77     char name[16];
78     fs_mount_proc_t mount;
79     fs_unmount_proc_t unmount;
80     fs_load_proc_t load_file;
81     fs_unload_proc_t unload_file;
82     fs_open_proc_t open_file;
83     fs_close_proc_t close_file;
84     fs_delete_proc_t delete_file;
85     fs_read_proc_t read_file;
86     fs_write_proc_t write_file;
87     fs_list_dir_proc_t list_dir;
88     fs_set_proc_t set_file;
89 } fs_driver_t;
90
91 typedef struct
92 {
93     clock_time_t creation_time;
94     clock_time_t modification_time;
95     clock_time_t last_access_time;
96 } file_time_info_t;
97
98 struct file
99 {
100     object_t header;
101     mounted_volume_t *volume;
102     char *path;
103     dword_t global_mode;
104     dword_t attributes;
105     qword_t size;
106     dword_t owner_uid;
107 };
108
109 struct file_instance
110 {
111     object_t header;
112     file_t *global;
113     dword_t mode;
114 };
115
116 #include <device.h>
117
118 struct mounted_volume
119 {
120     list_entry_t list;
121     char *mountpoint;
122     dword_t flags;
123     resource_t resource;
124     device_t *device;
125     qword_t open_files;
126     fs_driver_t *driver;
127 };
128
129 void register_filesystem_driver(fs_driver_t *driver);
130 bool_t unregister_filesystem_driver(fs_driver_t *driver);
131 dword_t register_mounted_volume(mounted_volume_t *volume);
132 dword_t unregister_mounted_volume(mounted_volume_t *volume);
133 dword_t normalize_path(const char *path, char *normalized_path);
134 dword_t open_file_internal(const char *path, file_instance_t **instance, dword_t mode, dword_t attributes);
135 dword_t open_file(const char *path, handle_t *handle, dword_t mode, dword_t attributes);
136 dword_t delete_file(const char *path);
137 dword_t query_file(handle_t handle, file_info_type_t info_type, void *buffer, size_t size);
138 dword_t set_file(handle_t handle, file_info_type_t set_type, void *buffer, size_t size);
139 dword_t list_directory(handle_t handle, char *filename, bool_t continue_scan);
140 dword_t read_file(handle_t handle, void *buffer, qword_t offset, size_t size, size_t *bytes_read);
141 dword_t write_file(handle_t handle, const void *buffer, qword_t offset, size_t size, size_t *bytes_written);
142 dword_t mount(const char *device, const char *mountpoint, const char *filesystem, dword_t flags);
143 dword_t unmount(const char *device);
144
145 #endif