@@ -13,34 +13,45 @@ use super::support::PathLike;
13
13
use super :: { Reader , Writer , Seek } ;
14
14
use super :: { SeekSet , SeekCur , SeekEnd , SeekStyle } ;
15
15
use rt:: rtio:: { RtioFileStream , IoFactory , IoFactoryObject } ;
16
- use rt:: io:: { io_error, read_error, EndOfFile } ;
16
+ use rt:: io:: { io_error, read_error, EndOfFile ,
17
+ FileMode , FileAccess , Open , Read , Create , ReadWrite } ;
17
18
use rt:: local:: Local ;
18
19
use rt:: test:: * ;
19
- use libc:: { O_RDWR , O_RDONLY , O_WRONLY , S_IWUSR , S_IRUSR ,
20
- O_CREAT , O_TRUNC , O_APPEND } ;
21
20
22
- /// Instructions on how to open a file and return a `FileStream`.
23
- enum FileMode {
24
- /// Opens an existing file. IoError if file does not exist.
25
- Open ,
26
- /// Creates a file. IoError if file exists.
27
- Create ,
28
- /// Opens an existing file or creates a new one.
29
- OpenOrCreate ,
30
- /// Opens an existing file or creates a new one, positioned at EOF.
31
- Append ,
32
- /// Opens an existing file, truncating it to 0 bytes.
33
- Truncate ,
34
- /// Opens an existing file or creates a new one, truncating it to 0 bytes.
35
- CreateOrTruncate ,
21
+ /// Open a file for reading/writing, as indicated by `path`.
22
+ pub fn open < P : PathLike > ( path : & P ,
23
+ mode : FileMode ,
24
+ access : FileAccess
25
+ ) -> Option < FileStream > {
26
+ let open_result = unsafe {
27
+ let io = Local :: unsafe_borrow :: < IoFactoryObject > ( ) ;
28
+ ( * io) . fs_open ( path, mode, access)
29
+ } ;
30
+ match open_result {
31
+ Ok ( fd) => Some ( FileStream {
32
+ fd : fd,
33
+ last_nread : -1
34
+ } ) ,
35
+ Err ( ioerr) => {
36
+ io_error:: cond. raise ( ioerr) ;
37
+ None
38
+ }
39
+ }
36
40
}
37
41
38
- /// How should the file be opened? `FileStream`s opened with `Read` will
39
- /// raise an `io_error` condition if written to.
40
- enum FileAccess {
41
- Read ,
42
- Write ,
43
- ReadWrite
42
+ /// Unlink (remove) a file from the filesystem, as indicated
43
+ /// by `path`.
44
+ pub fn unlink < P : PathLike > ( path : & P ) {
45
+ let unlink_result = unsafe {
46
+ let io = Local :: unsafe_borrow :: < IoFactoryObject > ( ) ;
47
+ ( * io) . fs_unlink ( path)
48
+ } ;
49
+ match unlink_result {
50
+ Ok ( _) => ( ) ,
51
+ Err ( ioerr) => {
52
+ io_error:: cond. raise ( ioerr) ;
53
+ }
54
+ }
44
55
}
45
56
46
57
/// Abstraction representing *positional* access to a file. In this case,
@@ -61,55 +72,6 @@ pub struct FileStream {
61
72
}
62
73
63
74
impl FileStream {
64
- pub fn open < P : PathLike > ( path : & P ,
65
- mode : FileMode ,
66
- access : FileAccess
67
- ) -> Option < FileStream > {
68
- let open_result = unsafe {
69
- let io = Local :: unsafe_borrow :: < IoFactoryObject > ( ) ;
70
- let mut flags = match mode {
71
- Open => 0 ,
72
- Create => O_CREAT ,
73
- OpenOrCreate => O_CREAT ,
74
- Append => O_APPEND ,
75
- Truncate => O_TRUNC ,
76
- CreateOrTruncate => O_TRUNC | O_CREAT
77
- } ;
78
- flags = match access {
79
- Read => flags | O_RDONLY ,
80
- Write => flags | O_WRONLY ,
81
- ReadWrite => flags | O_RDWR
82
- } ;
83
- let create_mode = match mode {
84
- Create |OpenOrCreate |CreateOrTruncate =>
85
- S_IRUSR | S_IWUSR ,
86
- _ => 0
87
- } ;
88
- ( * io) . fs_open ( path, flags as int , create_mode as int )
89
- } ;
90
- match open_result {
91
- Ok ( fd) => Some ( FileStream {
92
- fd : fd,
93
- last_nread : -1
94
- } ) ,
95
- Err ( ioerr) => {
96
- io_error:: cond. raise ( ioerr) ;
97
- None
98
- }
99
- }
100
- }
101
- fn unlink < P : PathLike > ( path : & P ) {
102
- let unlink_result = unsafe {
103
- let io = Local :: unsafe_borrow :: < IoFactoryObject > ( ) ;
104
- ( * io) . fs_unlink ( path)
105
- } ;
106
- match unlink_result {
107
- Ok ( _) => ( ) ,
108
- Err ( ioerr) => {
109
- io_error:: cond. raise ( ioerr) ;
110
- }
111
- }
112
- }
113
75
}
114
76
115
77
impl Reader for FileStream {
@@ -188,20 +150,20 @@ fn file_test_smoke_test_impl() {
188
150
let message = "it's alright. have a good time" ;
189
151
let filename = & Path ( "./tmp/file_rt_io_file_test.txt" ) ;
190
152
{
191
- let mut write_stream = FileStream :: open ( filename, Create , ReadWrite ) . unwrap ( ) ;
153
+ let mut write_stream = open ( filename, Create , ReadWrite ) . unwrap ( ) ;
192
154
write_stream. write ( message. as_bytes ( ) ) ;
193
155
}
194
156
{
195
157
use str;
196
- let mut read_stream = FileStream :: open ( filename, Open , Read ) . unwrap ( ) ;
158
+ let mut read_stream = open ( filename, Open , Read ) . unwrap ( ) ;
197
159
let mut read_buf = [ 0 , .. 1028 ] ;
198
160
let read_str = match read_stream. read ( read_buf) . unwrap ( ) {
199
161
-1 |0 => fail ! ( "shouldn't happen" ) ,
200
162
n => str:: from_bytes ( read_buf. slice_to ( n) )
201
163
} ;
202
164
assert ! ( read_str == message. to_owned( ) ) ;
203
165
}
204
- FileStream :: unlink ( filename) ;
166
+ unlink ( filename) ;
205
167
}
206
168
}
207
169
@@ -217,7 +179,7 @@ fn file_test_invalid_path_opened_without_create_should_raise_condition_impl() {
217
179
do io_error:: cond. trap ( |_| {
218
180
called = true ;
219
181
} ) . inside {
220
- let result = FileStream :: open ( filename, Open , Read ) ;
182
+ let result = open ( filename, Open , Read ) ;
221
183
assert ! ( result. is_none( ) ) ;
222
184
}
223
185
assert ! ( called) ;
@@ -235,7 +197,7 @@ fn file_test_unlinking_invalid_path_should_raise_condition_impl() {
235
197
do io_error:: cond. trap ( |_| {
236
198
called = true ;
237
199
} ) . inside {
238
- FileStream :: unlink ( filename) ;
200
+ unlink ( filename) ;
239
201
}
240
202
assert ! ( called) ;
241
203
}
@@ -252,11 +214,11 @@ fn file_test_io_non_positional_read_impl() {
252
214
let mut read_mem = [ 0 , .. 8 ] ;
253
215
let filename = & Path ( "./tmp/file_rt_io_file_test_positional.txt" ) ;
254
216
{
255
- let mut rw_stream = FileStream :: open ( filename, Create , ReadWrite ) . unwrap ( ) ;
217
+ let mut rw_stream = open ( filename, Create , ReadWrite ) . unwrap ( ) ;
256
218
rw_stream. write ( message. as_bytes ( ) ) ;
257
219
}
258
220
{
259
- let mut read_stream = FileStream :: open ( filename, Open , Read ) . unwrap ( ) ;
221
+ let mut read_stream = open ( filename, Open , Read ) . unwrap ( ) ;
260
222
{
261
223
let read_buf = read_mem. mut_slice ( 0 , 4 ) ;
262
224
read_stream. read ( read_buf) ;
@@ -266,7 +228,7 @@ fn file_test_io_non_positional_read_impl() {
266
228
read_stream. read ( read_buf) ;
267
229
}
268
230
}
269
- FileStream :: unlink ( filename) ;
231
+ unlink ( filename) ;
270
232
let read_str = str:: from_bytes ( read_mem) ;
271
233
assert ! ( read_str == message. to_owned( ) ) ;
272
234
}
@@ -287,17 +249,17 @@ fn file_test_io_seeking_impl() {
287
249
let mut tell_pos_post_read;
288
250
let filename = & Path ( "./tmp/file_rt_io_file_test_seeking.txt" ) ;
289
251
{
290
- let mut rw_stream = FileStream :: open ( filename, Create , ReadWrite ) . unwrap ( ) ;
252
+ let mut rw_stream = open ( filename, Create , ReadWrite ) . unwrap ( ) ;
291
253
rw_stream. write ( message. as_bytes ( ) ) ;
292
254
}
293
255
{
294
- let mut read_stream = FileStream :: open ( filename, Open , Read ) . unwrap ( ) ;
256
+ let mut read_stream = open ( filename, Open , Read ) . unwrap ( ) ;
295
257
read_stream. seek ( set_cursor as i64 , SeekSet ) ;
296
258
tell_pos_pre_read = read_stream. tell ( ) ;
297
259
read_stream. read ( read_mem) ;
298
260
tell_pos_post_read = read_stream. tell ( ) ;
299
261
}
300
- FileStream :: unlink ( filename) ;
262
+ unlink ( filename) ;
301
263
let read_str = str:: from_bytes ( read_mem) ;
302
264
assert ! ( read_str == message. slice( 4 , 8 ) . to_owned( ) ) ;
303
265
assert ! ( tell_pos_pre_read == set_cursor) ;
@@ -320,16 +282,16 @@ fn file_test_io_seek_and_write_impl() {
320
282
let mut read_mem = [ 0 , .. 13 ] ;
321
283
let filename = & Path ( "./tmp/file_rt_io_file_test_seek_and_write.txt" ) ;
322
284
{
323
- let mut rw_stream = FileStream :: open ( filename, Create , ReadWrite ) . unwrap ( ) ;
285
+ let mut rw_stream = open ( filename, Create , ReadWrite ) . unwrap ( ) ;
324
286
rw_stream. write ( initial_msg. as_bytes ( ) ) ;
325
287
rw_stream. seek ( seek_idx as i64 , SeekSet ) ;
326
288
rw_stream. write ( overwrite_msg. as_bytes ( ) ) ;
327
289
}
328
290
{
329
- let mut read_stream = FileStream :: open ( filename, Open , Read ) . unwrap ( ) ;
291
+ let mut read_stream = open ( filename, Open , Read ) . unwrap ( ) ;
330
292
read_stream. read ( read_mem) ;
331
293
}
332
- FileStream :: unlink ( filename) ;
294
+ unlink ( filename) ;
333
295
let read_str = str:: from_bytes ( read_mem) ;
334
296
io:: println ( fmt ! ( "read_str: '%?' final_msg: '%?'" , read_str, final_msg) ) ;
335
297
assert ! ( read_str == final_msg. to_owned( ) ) ;
@@ -350,11 +312,11 @@ fn file_test_io_seek_shakedown_impl() {
350
312
let mut read_mem = [ 0 , .. 4 ] ;
351
313
let filename = & Path ( "./tmp/file_rt_io_file_test_seek_shakedown.txt" ) ;
352
314
{
353
- let mut rw_stream = FileStream :: open ( filename, Create , ReadWrite ) . unwrap ( ) ;
315
+ let mut rw_stream = open ( filename, Create , ReadWrite ) . unwrap ( ) ;
354
316
rw_stream. write ( initial_msg. as_bytes ( ) ) ;
355
317
}
356
318
{
357
- let mut read_stream = FileStream :: open ( filename, Open , Read ) . unwrap ( ) ;
319
+ let mut read_stream = open ( filename, Open , Read ) . unwrap ( ) ;
358
320
359
321
read_stream. seek ( -4 , SeekEnd ) ;
360
322
read_stream. read ( read_mem) ;
@@ -371,7 +333,7 @@ fn file_test_io_seek_shakedown_impl() {
371
333
let read_str = str:: from_bytes ( read_mem) ;
372
334
assert ! ( read_str == chunk_one. to_owned( ) ) ;
373
335
}
374
- FileStream :: unlink ( filename) ;
336
+ unlink ( filename) ;
375
337
}
376
338
}
377
339
#[ test]
0 commit comments