Implement wait_directory_event, and the appropriate cleanup. No actual directory...
[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 #include <sync.h>
28
29 #define PATH_DELIMITER_CHAR   '/'
30 #define PATH_DELIMITER_STRING "/"
31
32 #define FILE_MODE_READ            (1 << 0)
33 #define FILE_MODE_WRITE           (1 << 1)
34 #define FILE_MODE_SHARE_READ      (1 << 2)
35 #define FILE_MODE_SHARE_WRITE     (1 << 3)
36 #define FILE_MODE_NO_CACHE        (1 << 4)
37 #define FILE_MODE_DELETE_ON_CLOSE (1 << 29)
38 #define FILE_MODE_CREATE          (1 << 30)
39 #define FILE_MODE_TRUNCATE        (1 << 31)
40
41 #define FILE_ATTR_DIRECTORY      (1 << 0)
42 #define FILE_ATTR_OWNER_READABLE (1 << 1)
43 #define FILE_ATTR_OWNER_WRITABLE (1 << 2)
44 #define FILE_ATTR_WORLD_READABLE (1 << 3)
45 #define FILE_ATTR_WORLD_WRITABLE (1 << 4)
46 #define FILE_ATTR_DELETED        (1 << 31)
47
48 #define MOUNT_FLAG_READONLY (1 << 0)
49
50 #define EVENT_QUEUE_CAPACITY 256
51
52 typedef struct mounted_volume mounted_volume_t;
53 typedef struct file file_t;
54 typedef struct file_instance file_instance_t;
55
56 typedef dword_t (*fs_mount_proc_t)(const char *device, const char *mountpoint, dword_t flags);
57 typedef dword_t (*fs_unmount_proc_t)(mounted_volume_t *volume);
58 typedef dword_t (*fs_load_proc_t)(file_t **file);
59 typedef dword_t (*fs_unload_proc_t)(file_t *file);
60 typedef dword_t (*fs_open_proc_t)(file_instance_t **instance);
61 typedef dword_t (*fs_close_proc_t)(file_instance_t *instance);
62 typedef dword_t (*fs_delete_proc_t)(mounted_volume_t *volume, const char *path, bool_t purge);
63 typedef dword_t (*fs_read_proc_t)(file_instance_t *file, void *buffer, qword_t offset, size_t length, size_t *bytes_read);
64 typedef dword_t (*fs_write_proc_t)(file_instance_t *file, const void *buffer, qword_t offset, size_t length, size_t *bytes_written);
65 typedef dword_t (*fs_list_dir_proc_t)(file_instance_t *directory, char *filename, bool_t continue_scan);
66 typedef dword_t (*fs_set_proc_t)(file_t *file, dword_t info_type, const void *buffer, size_t size);
67
68 typedef enum
69 {
70     FILE_INFO_ATTRIBUTES,
71     FILE_INFO_NAME,
72     FILE_INFO_TIME,
73     FILE_INFO_SIZE,
74     FILE_INFO_OWNER,
75 } file_info_type_t;
76
77 typedef struct
78 {
79     list_entry_t list;
80     char name[16];
81     fs_mount_proc_t mount;
82     fs_unmount_proc_t unmount;
83     fs_load_proc_t load_file;
84     fs_unload_proc_t unload_file;
85     fs_open_proc_t open_file;
86     fs_close_proc_t close_file;
87     fs_delete_proc_t delete_file;
88     fs_read_proc_t read_file;
89     fs_write_proc_t write_file;
90     fs_list_dir_proc_t list_dir;
91     fs_set_proc_t set_file;
92 } fs_driver_t;
93
94 typedef struct
95 {
96     clock_time_t creation_time;
97     clock_time_t modification_time;
98     clock_time_t last_access_time;
99 } file_time_info_t;
100
101 typedef struct
102 {
103     dword_t type;
104     char filename[VARIABLE_SIZE];
105 } file_event_t;
106
107 typedef struct
108 {
109     list_entry_t list;
110     file_event_t event;
111 } event_queue_entry_t;
112
113 typedef struct
114 {
115     list_entry_t list;
116     lock_t lock;
117     file_instance_t *directory;
118     dword_t event_mask;
119     semaphore_t event_semaphore;
120     list_entry_t event_queue;
121 } event_watch_entry_t;
122
123 struct file
124 {
125     object_t header;
126     mounted_volume_t *volume;
127     char *path;
128     dword_t global_mode;
129     dword_t attributes;
130     qword_t size;
131     dword_t owner_uid;
132 };
133
134 struct file_instance
135 {
136     object_t header;
137     file_t *global;
138     dword_t mode;
139     event_watch_entry_t *watch;
140 };
141
142 #include <device.h>
143
144 struct mounted_volume
145 {
146     list_entry_t list;
147     char *mountpoint;
148     dword_t flags;
149     resource_t resource;
150     device_t *device;
151     qword_t open_files;
152     fs_driver_t *driver;
153 };
154
155 void register_filesystem_driver(fs_driver_t *driver);
156 bool_t unregister_filesystem_driver(fs_driver_t *driver);
157 dword_t register_mounted_volume(mounted_volume_t *volume);
158 dword_t unregister_mounted_volume(mounted_volume_t *volume);
159 dword_t normalize_path(const char *path, char *normalized_path);
160 dword_t open_file_internal(const char *path, file_instance_t **instance, dword_t mode, dword_t attributes);
161 dword_t open_file(const char *path, handle_t *handle, dword_t mode, dword_t attributes);
162 dword_t delete_file(const char *path);
163 dword_t query_file(handle_t handle, file_info_type_t info_type, void *buffer, size_t size);
164 dword_t set_file(handle_t handle, file_info_type_t set_type, void *buffer, size_t size);
165 dword_t list_directory(handle_t handle, char *filename, bool_t continue_scan);
166 dword_t read_file(handle_t handle, void *buffer, qword_t offset, size_t size, size_t *bytes_read);
167 dword_t write_file(handle_t handle, const void *buffer, qword_t offset, size_t size, size_t *bytes_written);
168 dword_t mount(const char *device, const char *mountpoint, const char *filesystem, dword_t flags);
169 dword_t unmount(const char *device);
170
171 #endif