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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
640
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * vfs-dir.h -- VFS subsystem for directories
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr>
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #ifndef MLK_CORE_VFS_DIR_H
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #define MLK_CORE_VFS_DIR_H
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 #include <mlk/util/util.h>
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 #include "vfs.h"
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 char path[MLK_PATH_MAX];
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 struct mlk_vfs_file file;
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 /** \cond MLK_PRIVATE_DECLS */
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 void *handle;
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 /** \endcond MLK_PRIVATE_DECLS */
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 };
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 struct mlk_vfs_dir {
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 /**
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 * (read-only)
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 *
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 * Path to the directory.
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 */
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 char path[MLK_PATH_MAX];
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 struct mlk_vfs vfs;
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 };
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 #if defined(__cplusplus)
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 extern "C" {
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 #endif
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 void
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 mlk_vfs_dir_init(struct mlk_vfs_dir *dir, const char *path);
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 #if defined(__cplusplus)
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 }
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 #endif
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
149
9850089c9671 core: resurrect VFS
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 #endif /* !MLK_CORE_VFS_DIR_H */