1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#[allow(dead_code)]
#[allow(non_camel_case_types)]
#[allow(non_upper_case_globals)]
mod erfs_binding;
use std::slice;
pub use erfs_binding::ErfsRoot;
pub use erfs_binding::ErfsHandle;
pub fn read(fs: ErfsRoot, path: &str) -> Result<&'static [u8], i32> {
let mut buf = 0 as *const u8;
let mut size :u32 = 0;
let pbuf = &mut buf as *mut *const u8;
let psize = &mut size as *mut u32;
let ret :i32;
unsafe {
ret = erfs_binding::erfs_read(fs, path.as_ptr(), path.len() as u32, pbuf, psize);
}
if ret == 0 {
unsafe {
Ok(slice::from_raw_parts(buf, size as usize))
}
} else {
Err(ret)
}
}
pub fn open(fs: ErfsRoot, path: &str) -> Result<(ErfsHandle, u32), i32> {
let mut handle: ErfsHandle = 0 as ErfsHandle;
let mut size :u32 = 0;
let phandle = &mut handle as *mut ErfsHandle;
let psize = &mut size as *mut u32;
let ret :i32;
unsafe {
ret = erfs_binding::erfs_open(fs, path.as_ptr(), path.len() as u32, phandle, psize);
}
if ret == 0 {
Ok((handle, size as u32))
} else {
Err(ret)
}
}
pub fn entry_flags(entry: ErfsHandle) -> Result<u32, i32> {
let mut flags :u32 = 0;
let pflags = &mut flags as *mut u32;
let ret:i32;
unsafe {
ret = erfs_binding::erfs_entryflags(entry, pflags);
}
if ret == 0 {
Ok(flags)
} else {
Err(ret as i32)
}
}
pub fn entry_size(entry: ErfsHandle) -> Result<u32, i32> {
let mut size :u32 = 0;
let psize = &mut size as *mut u32;
let ret:i32;
unsafe {
ret = erfs_binding::erfs_entryflags(entry, psize);
}
if ret == 0 {
Ok(size)
} else {
Err(ret as i32)
}
}
pub fn entry_name(fs: ErfsRoot, entry: ErfsHandle) -> Result<&'static [u8], i32> {
let mut buf = 0 as *const u8;
let mut size :u32 = 0;
let pbuf = &mut buf as *mut *const u8;
let psize = &mut size as *mut u32;
let ret :i32;
unsafe {
ret = erfs_binding::erfs_entryname(fs, entry, pbuf, psize);
}
if ret == 0 {
unsafe {
Ok(slice::from_raw_parts(buf, size as usize))
}
} else {
Err(ret)
}
}
pub fn read_file(fs: ErfsRoot, entry: ErfsHandle) -> Result<&'static [u8], i32> {
let mut buf = 0 as *const u8;
let mut size :u32 = 0;
let pbuf = &mut buf as *mut *const u8;
let psize = &mut size as *mut u32;
let ret :i32;
unsafe {
ret = erfs_binding::erfs_readfile(fs, entry, pbuf, psize);
}
if ret == 0 {
unsafe {
Ok(slice::from_raw_parts(buf, size as usize))
}
} else {
Err(ret)
}
}
pub fn read_dir(fs: ErfsRoot, dir: ErfsHandle, index: u32) -> Result<ErfsHandle, i32> {
let mut handle: ErfsHandle = 0 as ErfsHandle;
let phandle = &mut handle as *mut ErfsHandle;
let ret :i32;
unsafe {
ret = erfs_binding::erfs_readdir(fs, dir, index, phandle);
}
if ret == 0 {
Ok(handle)
} else {
Err(ret)
}
}