1
+ use r_efi:: protocols:: file;
2
+
1
3
use crate :: ffi:: OsString ;
2
4
use crate :: fmt;
3
5
use crate :: hash:: Hash ;
@@ -22,7 +24,12 @@ pub struct ReadDir(!);
22
24
pub struct DirEntry ( !) ;
23
25
24
26
#[ derive( Clone , Debug ) ]
25
- pub struct OpenOptions { }
27
+ pub struct OpenOptions {
28
+ mode : u64 ,
29
+ append : bool ,
30
+ truncate : bool ,
31
+ create_new : bool ,
32
+ }
26
33
27
34
#[ derive( Copy , Clone , Debug , Default ) ]
28
35
pub struct FileTimes { }
@@ -141,15 +148,57 @@ impl DirEntry {
141
148
142
149
impl OpenOptions {
143
150
pub fn new ( ) -> OpenOptions {
144
- OpenOptions { }
151
+ OpenOptions { mode : 0 , append : false , create_new : false , truncate : false }
152
+ }
153
+
154
+ pub fn read ( & mut self , read : bool ) {
155
+ if read {
156
+ self . mode |= file:: MODE_READ ;
157
+ } else {
158
+ self . mode &= !file:: MODE_READ ;
159
+ }
160
+ }
161
+
162
+ pub fn write ( & mut self , write : bool ) {
163
+ if write {
164
+ // Valid Combinations: Read, Read/Write, Read/Write/Create
165
+ self . read ( true ) ;
166
+ self . mode |= file:: MODE_WRITE ;
167
+ } else {
168
+ self . mode &= !file:: MODE_WRITE ;
169
+ }
170
+ }
171
+
172
+ pub fn append ( & mut self , append : bool ) {
173
+ // Docs state that `.write(true).append(true)` has the same effect as `.append(true)`
174
+ if append {
175
+ self . write ( true ) ;
176
+ }
177
+ self . append = append;
145
178
}
146
179
147
- pub fn read ( & mut self , _read : bool ) { }
148
- pub fn write ( & mut self , _write : bool ) { }
149
- pub fn append ( & mut self , _append : bool ) { }
150
- pub fn truncate ( & mut self , _truncate : bool ) { }
151
- pub fn create ( & mut self , _create : bool ) { }
152
- pub fn create_new ( & mut self , _create_new : bool ) { }
180
+ pub fn truncate ( & mut self , truncate : bool ) {
181
+ self . truncate = truncate;
182
+ }
183
+
184
+ pub fn create ( & mut self , create : bool ) {
185
+ if create {
186
+ self . mode |= file:: MODE_CREATE ;
187
+ } else {
188
+ self . mode &= !file:: MODE_CREATE ;
189
+ }
190
+ }
191
+
192
+ pub fn create_new ( & mut self , create_new : bool ) {
193
+ self . create_new = create_new;
194
+ }
195
+
196
+ const fn is_mode_valid ( & self ) -> bool {
197
+ // Valid Combinations: Read, Read/Write, Read/Write/Create
198
+ self . mode == file:: MODE_READ
199
+ || self . mode == ( file:: MODE_READ | file:: MODE_WRITE )
200
+ || self . mode == ( file:: MODE_READ | file:: MODE_WRITE | file:: MODE_CREATE )
201
+ }
153
202
}
154
203
155
204
impl File {
@@ -311,12 +360,12 @@ pub fn stat(_p: &Path) -> io::Result<FileAttr> {
311
360
unsupported ( )
312
361
}
313
362
314
- pub fn lstat ( _p : & Path ) -> io:: Result < FileAttr > {
315
- unsupported ( )
363
+ pub fn lstat ( p : & Path ) -> io:: Result < FileAttr > {
364
+ stat ( p )
316
365
}
317
366
318
- pub fn canonicalize ( _p : & Path ) -> io:: Result < PathBuf > {
319
- unsupported ( )
367
+ pub fn canonicalize ( p : & Path ) -> io:: Result < PathBuf > {
368
+ crate :: path :: absolute ( p )
320
369
}
321
370
322
371
pub fn copy ( _from : & Path , _to : & Path ) -> io:: Result < u64 > {
0 commit comments