Removed nasty tabs.
[lwext4.git] / ext4.h
1 /*\r
2  * Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com)\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  *\r
9  * - Redistributions of source code must retain the above copyright\r
10  *   notice, this list of conditions and the following disclaimer.\r
11  * - Redistributions in binary form must reproduce the above copyright\r
12  *   notice, this list of conditions and the following disclaimer in the\r
13  *   documentation and/or other materials provided with the distribution.\r
14  * - The name of the author may not be used to endorse or promote products\r
15  *   derived from this software without specific prior written permission.\r
16  *\r
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\r
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  */\r
28 \r
29 /** @addtogroup lwext4\r
30  * @{\r
31  */\r
32 /**\r
33  * @file  ext4.h\r
34  * @brief Ext4 high level operations (files, directories, mountpoints...).\r
35  *        Client has to include only this file.\r
36  */\r
37 \r
38 #ifndef EXT4_H_\r
39 #define EXT4_H_\r
40 \r
41 #include <ext4_config.h>\r
42 #include <ext4_blockdev.h>\r
43 #include <stdint.h>\r
44 \r
45 /********************************FILE OPEN FLAGS*****************************/\r
46 \r
47 #ifndef O_RDONLY\r
48 #define O_RDONLY    00\r
49 #endif\r
50 \r
51 #ifndef O_WRONLY\r
52 #define O_WRONLY    01\r
53 #endif\r
54 \r
55 #ifndef O_RDWR\r
56 #define O_RDWR      02\r
57 #endif\r
58 \r
59 #ifndef O_CREAT\r
60 #define O_CREAT     0100\r
61 #endif\r
62 \r
63 #ifndef O_EXCL\r
64 #define O_EXCL      0200\r
65 #endif\r
66 \r
67 #ifndef O_TRUNC\r
68 #define O_TRUNC     01000\r
69 #endif\r
70 \r
71 #ifndef O_APPEND\r
72 #define O_APPEND    02000\r
73 #endif\r
74 \r
75 /********************************FILE SEEK FLAGS*****************************/\r
76 \r
77 #ifndef SEEK_SET\r
78 #define SEEK_SET    0\r
79 #endif\r
80 \r
81 #ifndef SEEK_CUR\r
82 #define SEEK_CUR    1\r
83 #endif\r
84 \r
85 #ifndef SEEK_END\r
86 #define SEEK_END    2\r
87 #endif\r
88 \r
89 /********************************OS LOCK INFERFACE***************************/\r
90 \r
91 /**@brief   OS dependent lock interface.*/\r
92 struct ext4_lock {\r
93 \r
94     /**@brief   Lock access to mountpoint*/\r
95     void (*lock)(void);\r
96 \r
97     /**@brief   Unlock access to mountpoint*/\r
98     void (*unlock)(void);\r
99 };\r
100 \r
101 \r
102 /********************************FILE DESCRIPTOR*****************************/\r
103 \r
104 /**@brief   File descriptor*/\r
105 typedef struct ext4_file {\r
106 \r
107     /**@brief   Pountpoint handle.*/\r
108     struct ext4_mountpoint *mp;\r
109 \r
110     /**@brief   File inode id*/\r
111     uint32_t inode;\r
112 \r
113     /**@brief   Open flags.*/\r
114     uint32_t flags;\r
115 \r
116     /**@brief   File size.*/\r
117     uint64_t fsize;\r
118 \r
119     /**@brief   File position*/\r
120     uint64_t fpos;\r
121 }ext4_file;\r
122 \r
123 /*****************************DIRECTORY DESCRIPTOR***************************/\r
124 /**@brief   Directory entry types. Copy from ext4_types.h*/\r
125 enum  {\r
126     EXT4_DIRENTRY_UNKNOWN = 0,\r
127     EXT4_DIRENTRY_REG_FILE,\r
128     EXT4_DIRENTRY_DIR,\r
129     EXT4_DIRENTRY_CHRDEV,\r
130     EXT4_DIRENTRY_BLKDEV,\r
131     EXT4_DIRENTRY_FIFO,\r
132     EXT4_DIRENTRY_SOCK,\r
133     EXT4_DIRENTRY_SYMLINK\r
134 };\r
135 \r
136 /**@brief   Directory entry descriptor. Copy from ext4_types.h*/\r
137 typedef struct {\r
138     uint32_t inode;\r
139     uint16_t entry_length;\r
140     uint8_t  name_length;\r
141     union {\r
142         uint8_t name_length_high;\r
143         uint8_t inode_type;\r
144     };\r
145     uint8_t name[255];\r
146 }ext4_direntry;\r
147 \r
148 typedef struct  {\r
149     /**@brief   File descriptor*/\r
150     ext4_file f;\r
151     /**@brief   Current direntry.*/\r
152     ext4_direntry de;\r
153 }ext4_dir;\r
154 \r
155 /********************************MOUNT OPERATIONS****************************/\r
156 \r
157 /**@brief   Register a block device to a name.\r
158  *          @warning Block device has to be filled by\r
159  *          @ref EXT4_BLOCKDEV_STATIC_INSTANCE. Block cache may be created\r
160  *          @ref EXT4_BCACHE_STATIC_INSTANCE.\r
161  *          Block cache may by created automaticly when bc parameter is 0.\r
162  * @param   bd block device\r
163  * @param   bd block device cache (0 = automatic cache mode)\r
164  * @param   dev_name register name\r
165  * @param   standard error code*/\r
166 int ext4_device_register(struct ext4_blockdev *bd, struct ext4_bcache *bc,\r
167         const char *dev_name);\r
168 \r
169 /**@brief   Mount a block device with EXT4 partition to the mountpoint.\r
170  * @param   dev_name block device name (@ref ext4_device_register)\r
171  * @param   mount_point pount point, for example\r
172  *          -   /\r
173  *          -   /my_partition/\r
174  *          -   /my_second_partition/\r
175  *\r
176  * @return standard error code */\r
177 int ext4_mount(const char * dev_name,  char *mount_point);\r
178 \r
179 /**@brief   Umount operation.\r
180  * @param   mount_point mount name\r
181  * @return  standard error code */\r
182 int ext4_umount(char *mount_point);\r
183 \r
184 \r
185 /**@brief   Some of the filesystem stats.*/\r
186 struct ext4_mount_stats {\r
187     uint32_t inodes_count;\r
188     uint32_t free_inodes_count;\r
189     uint64_t blocks_count;\r
190     uint64_t free_blocks_count;\r
191 \r
192     uint32_t block_size;\r
193     uint32_t block_group_count;\r
194     uint32_t blocks_per_group;\r
195     uint32_t inodes_per_group;\r
196 \r
197     char volume_name[16];\r
198 };\r
199 \r
200 /**@brief   Get file system params.\r
201  * @param   mount_point mount path\r
202  * @param   stats ext fs stats\r
203  * @return  standard error code */\r
204 int ext4_mount_point_stats(const char *mount_point,\r
205     struct ext4_mount_stats *stats);\r
206 \r
207 /********************************FILE OPERATIONS*****************************/\r
208 \r
209 /**@brief   Remove file by path.\r
210  * @param   path path to file\r
211  * @return  standard error code */\r
212 int ext4_fremove(const char *path);\r
213 \r
214 /**@brief   File open function.\r
215  * @param   filename, (has to start from mountpoint)\r
216  *          /my_partition/my_file\r
217  * @param   flags open file flags\r
218  *  |---------------------------------------------------------------|\r
219  *  |   r or rb                 O_RDONLY                            |\r
220  *  |---------------------------------------------------------------|\r
221  *  |   w or wb                 O_WRONLY|O_CREAT|O_TRUNC            |\r
222  *  |---------------------------------------------------------------|\r
223  *  |   a or ab                 O_WRONLY|O_CREAT|O_APPEND           |\r
224  *  |---------------------------------------------------------------|\r
225  *  |   r+ or rb+ or r+b        O_RDWR                              |\r
226  *  |---------------------------------------------------------------|\r
227  *  |   w+ or wb+ or w+b        O_RDWR|O_CREAT|O_TRUNC              |\r
228  *  |---------------------------------------------------------------|\r
229  *  |   a+ or ab+ or a+b        O_RDWR|O_CREAT|O_APPEND             |\r
230  *  |---------------------------------------------------------------|\r
231  *\r
232  * @return  standard error code*/\r
233 int ext4_fopen (ext4_file *f, const char *path, const char *flags);\r
234 \r
235 /**@brief   File close function.\r
236  * @param   f file handle\r
237  * @return  standard error code*/\r
238 int ext4_fclose(ext4_file *f);\r
239 \r
240 /**@brief   Read data from file.\r
241  * @param   f file handle\r
242  * @param   buf output buffer\r
243  * @param   size bytes to read\r
244  * @param   rcnt readed bytes (may be NULL)\r
245  * @return  standard error code*/\r
246 int ext4_fread (ext4_file *f, void *buf, uint32_t size, uint32_t *rcnt);\r
247 \r
248 /**@brief   Write data to file.\r
249  * @param   f file handle\r
250  * @param   buf data to write\r
251  * @param   size write length\r
252  * @param   wcnt bytes written (may be NULL)\r
253  * @return  standard error code*/\r
254 int ext4_fwrite(ext4_file *f, void *buf, uint32_t size, uint32_t *wcnt);\r
255 \r
256 /**@brief   File seek operation.\r
257  * @param   f file handle\r
258  * @param   offset offset to seek\r
259  * @param   origin seek type:\r
260  *              @ref SEEK_SET\r
261  *              @ref SEEK_CUR\r
262  *              @ref SEEK_END\r
263  * @return  standard error code*/\r
264 int ext4_fseek (ext4_file *f, uint64_t offset, uint32_t origin);\r
265 \r
266 /**@brief   Get file position.\r
267  * @param   f file handle\r
268  * @return  actual file position */\r
269 uint64_t ext4_ftell (ext4_file *f);\r
270 \r
271 /**@brief   Get file size.\r
272  * @param   f file handle\r
273  * @return  file size */\r
274 uint64_t ext4_fsize (ext4_file *f);\r
275 \r
276 /*********************************DIRECTORY OPERATION***********************/\r
277 \r
278 /**@brief   Recursive directory remove.\r
279  * @param   path directory path to remove\r
280  * @return  standard error code*/\r
281 int ext4_dir_rm(const char *path);\r
282 \r
283 /**@brief   Create new directory.\r
284  * @param   name new directory name\r
285  * @return  standard error code*/\r
286 int ext4_dir_mk(const char *path);\r
287 \r
288 /**@brief   Directory open.\r
289  * @param   d directory handle\r
290  * @param   path directory path\r
291  * @return  standard error code*/\r
292 int ext4_dir_open (ext4_dir *d, const char *path);\r
293 \r
294 /**@brief   Directory close.\r
295  * @param   d directory handle\r
296  * @return  standard error code*/\r
297 int ext4_dir_close(ext4_dir *d);\r
298 \r
299 \r
300 /**@brief   Return directory entry by id.\r
301  * @param   d directory handle\r
302  * @param   id entry id\r
303  * @return  directory entry id (NULL id no entry)*/\r
304 ext4_direntry* ext4_dir_entry_get(ext4_dir *d, uint32_t id);\r
305 \r
306 #endif /* EXT4_H_ */\r
307 \r
308 /**\r
309  * @}\r
310  */\r