Mercurial > molko
annotate libmlk-core/mlk/core/vfs-dir.h @ 641:fcd124e513ea
core: reintroduce VFS
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 01 Oct 2023 09:18:01 +0200 |
parents | 9850089c9671 |
children |
rev | line source |
---|---|
640 | 1 /* |
2 * vfs-dir.h -- VFS subsystem for directories | |
3 * | |
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr> | |
5 * | |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 #ifndef MLK_CORE_VFS_DIR_H | |
20 #define MLK_CORE_VFS_DIR_H | |
21 | |
641
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
22 /** |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
23 * \file mlk/core/vfs-dir.h |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
24 * \brief VFS subsystem for directories. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
25 * |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
26 * This module can be used to read files relative to a filesystem directory path |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
27 * using mlk/core/vfs.h abstract VFS module. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
28 * |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
29 * It is implemented using the ::MLK_CONTAINER_OF macro which means you can |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
30 * use it and derive from it to add or modify its functions. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
31 * |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
32 * ## Members used |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
33 * |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
34 * The following VFS members are used: |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
35 * |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
36 * - ::mlk_vfs::finish |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
37 * - ::mlk_vfs::open |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
38 * |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
39 * The following VFS file member are used: |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
40 * |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
41 * - ::mlk_vfs_file::finish |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
42 * - ::mlk_vfs_file::flush |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
43 * - ::mlk_vfs_file::read |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
44 * - ::mlk_vfs_file::write |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
45 */ |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
46 |
640 | 47 #include <mlk/util/util.h> |
48 | |
49 #include "vfs.h" | |
50 | |
641
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
51 /** |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
52 * \struct mlk_vfs_dir_file |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
53 * \brief VFS file implementation for filesystem files. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
54 */ |
640 | 55 struct mlk_vfs_dir_file { |
641
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
56 /** |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
57 * (read-only) |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
58 * |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
59 * Path to the opened file. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
60 */ |
640 | 61 char path[MLK_PATH_MAX]; |
62 | |
641
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
63 /** |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
64 * (read-write) |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
65 * |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
66 * Abstract VFS file to implement. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
67 */ |
640 | 68 struct mlk_vfs_file file; |
69 | |
70 /** \cond MLK_PRIVATE_DECLS */ | |
71 void *handle; | |
72 /** \endcond MLK_PRIVATE_DECLS */ | |
73 }; | |
74 | |
641
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
75 /** |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
76 * \struct mlk_vfs_zip |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
77 * \brief VFS implementation for filesystem directories. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
78 */ |
640 | 79 struct mlk_vfs_dir { |
80 /** | |
81 * (read-only) | |
82 * | |
83 * Path to the directory. | |
84 */ | |
85 char path[MLK_PATH_MAX]; | |
86 | |
641
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
87 /** |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
88 * (read-write) |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
89 * |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
90 * Abstract VFS to implement. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
91 */ |
640 | 92 struct mlk_vfs vfs; |
93 }; | |
94 | |
95 #if defined(__cplusplus) | |
96 extern "C" { | |
97 #endif | |
98 | |
641
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
99 /** |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
100 * Initialize the directory object and its underlying VFS module. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
101 * |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
102 * \pre dir != NULL |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
103 * \pre path != NULL |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
104 * \param dir the dir implementation to initialize |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
105 * \param path the path to the directory |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
106 */ |
640 | 107 void |
108 mlk_vfs_dir_init(struct mlk_vfs_dir *dir, const char *path); | |
109 | |
641
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
110 /** |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
111 * Implements ::mlk_vfs::open virtual function. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
112 */ |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
113 struct mlk_vfs_file * |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
114 mlk_vfs_dir_open(struct mlk_vfs_dir *dir, const char *entry, const char *mode); |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
115 |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
116 /** |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
117 * Implements ::mlk_vfs::finish virtual function. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
118 */ |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
119 void |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
120 mlk_vfs_dir_finish(struct mlk_vfs_dir *dir); |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
121 |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
122 /** |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
123 * Implements ::mlk_vfs_file::read virtual function. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
124 */ |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
125 size_t |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
126 mlk_vfs_dir_file_read(struct mlk_vfs_dir_file *file, void *buf, size_t bufsz); |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
127 |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
128 /** |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
129 * Implements ::mlk_vfs_file::write virtual function. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
130 */ |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
131 size_t |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
132 mlk_vfs_dir_file_write(struct mlk_vfs_dir_file *file, const void *buf, size_t bufsz); |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
133 |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
134 /** |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
135 * Implements ::mlk_vfs_file::flush virtual function. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
136 */ |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
137 int |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
138 mlk_vfs_dir_file_flush(struct mlk_vfs_dir_file *file); |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
139 |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
140 /** |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
141 * Implements ::mlk_vfs_file::finish virtual function. |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
142 */ |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
143 void |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
144 mlk_vfs_dir_file_finish(struct mlk_vfs_dir_file *file); |
fcd124e513ea
core: reintroduce VFS
David Demelier <markand@malikania.fr>
parents:
640
diff
changeset
|
145 |
640 | 146 #if defined(__cplusplus) |
147 } | |
148 #endif | |
149 | |
150 #endif /* !MLK_CORE_VFS_DIR_H */ |