First version
[3rdparty/ote_partner/tlk.git] / lib / fs / ext2 / ext2_priv.h
1 /*
2  * Copyright (c) 2007 Travis Geiselbrecht
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files
6  * (the "Software"), to deal in the Software without restriction,
7  * including without limitation the rights to use, copy, modify, merge,
8  * publish, distribute, sublicense, and/or sell copies of the Software,
9  * and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  * 
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  * 
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23
24 #ifndef __EXT2_PRIV_H
25 #define __EXT2_PRIV_H
26
27 #include <lib/bio.h>
28 #include <lib/bcache.h>
29 #include "ext2_fs.h"
30
31 typedef uint32_t blocknum_t;
32 typedef uint32_t inodenum_t;
33 typedef uint32_t groupnum_t;
34
35 typedef struct {
36         bdev_t *dev;
37         bcache_t cache;
38
39         struct ext2_super_block sb;
40         int s_group_count;
41         struct ext2_group_desc *gd;
42         struct ext2_inode root_inode;
43 } ext2_t;
44
45 struct cache_block {
46         blocknum_t num;
47         void *ptr;
48 };
49
50 /* open file handle */
51 typedef struct {
52         ext2_t *ext2;
53
54         struct cache_block ind_cache[3]; // cache of indirect blocks as they're scanned
55         struct ext2_inode inode;
56 } ext2_file_t;
57
58 /* internal routines */
59 int ext2_load_inode(ext2_t *ext2, inodenum_t num, struct ext2_inode *inode);
60 int ext2_lookup(ext2_t *ext2, const char *path, inodenum_t *inum); // path to inode
61
62 /* io */
63 int ext2_read_block(ext2_t *ext2, void *buf, blocknum_t bnum);
64 int ext2_get_block(ext2_t *ext2, void **ptr, blocknum_t bnum);
65 int ext2_put_block(ext2_t *ext2, blocknum_t bnum);
66
67 off_t ext2_file_len(ext2_t *ext2, struct ext2_inode *inode);
68 int ext2_read_inode(ext2_t *ext2, struct ext2_inode *inode, void *buf, off_t offset, size_t len);
69 int ext2_read_link(ext2_t *ext2, struct ext2_inode *inode, char *str, size_t len);
70
71 /* mode stuff */
72 #define S_IFMT      0170000
73 #define S_IFIFO     0010000
74 #define S_IFCHR     0020000
75 #define S_IFDIR     0040000
76 #define S_IFBLK     0060000
77 #define S_IFREG     0100000
78 #define S_IFLNK     0120000
79 #define S_IFSOCK    0140000
80
81 #define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
82 #define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
83 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
84 #define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK)
85 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
86 #define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)
87 #define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
88
89 #endif
90