@@ -12,60 +12,19 @@ use prelude::*;
12
12
use ptr:: null;
13
13
use libc:: c_void;
14
14
use rt:: uv:: { Request , NativeHandle , Loop , FsCallback , Buf ,
15
- status_to_maybe_uv_error_with_loop,
16
- vec_to_uv_buf, vec_from_uv_buf} ;
15
+ status_to_maybe_uv_error_with_loop} ;
17
16
use rt:: uv:: uvll;
18
17
use rt:: uv:: uvll:: * ;
19
18
use path:: Path ;
20
19
use cast:: transmute;
21
20
use libc:: { c_int} ;
22
21
use option:: { None , Some , Option } ;
23
- use vec;
24
22
25
23
pub struct FsRequest ( * uvll:: uv_fs_t ) ;
26
24
impl Request for FsRequest ;
27
25
28
- #[ allow( non_camel_case_types) ]
29
- pub enum UvFileFlag {
30
- O_RDONLY ,
31
- O_WRONLY ,
32
- O_RDWR ,
33
- O_CREAT ,
34
- O_TRUNC
35
- }
36
- // just want enough to get 0644
37
- #[ allow( non_camel_case_types) ]
38
- pub enum UvFileMode {
39
- S_IWUSR ,
40
- S_IRUSR ,
41
- S_IRGRP ,
42
- S_IROTH
43
- }
44
- pub fn map_flag ( v : UvFileFlag ) -> int {
45
- unsafe {
46
- match v {
47
- O_RDONLY => uvll:: get_O_RDONLY ( ) as int ,
48
- O_WRONLY => uvll:: get_O_WRONLY ( ) as int ,
49
- O_RDWR => uvll:: get_O_RDWR ( ) as int ,
50
- O_CREAT => uvll:: get_O_CREAT ( ) as int ,
51
- O_TRUNC => uvll:: get_O_TRUNC ( ) as int
52
- }
53
- }
54
- }
55
- pub fn map_mode ( v : UvFileMode ) -> int {
56
- unsafe {
57
- match v {
58
- S_IWUSR => uvll:: get_S_IWUSR ( ) as int ,
59
- S_IRUSR => uvll:: get_S_IRUSR ( ) as int ,
60
- S_IRGRP => uvll:: get_S_IRGRP ( ) as int ,
61
- S_IROTH => uvll:: get_S_IROTH ( ) as int
62
- }
63
- }
64
- }
65
-
66
26
pub struct RequestData {
67
27
complete_cb : Option < FsCallback > ,
68
- buf : Option < Buf > ,
69
28
raw_fd : Option < c_int >
70
29
}
71
30
@@ -82,7 +41,6 @@ impl FsRequest {
82
41
let fs_req = ( self . native_handle ( ) ) as * uvll:: uv_write_t ;
83
42
let data = ~RequestData {
84
43
complete_cb : cb,
85
- buf : None ,
86
44
raw_fd : None
87
45
} ;
88
46
unsafe {
@@ -112,15 +70,7 @@ impl FsRequest {
112
70
fn cleanup_and_delete ( self ) {
113
71
unsafe {
114
72
let data = uvll:: get_data_for_req ( self . native_handle ( ) ) ;
115
- let mut _data = transmute :: < * c_void , ~RequestData > ( data) ;
116
- // if set we're going to convert the buf param back into
117
- // a rust vec, as that's the mechanism by which the raw
118
- // uv_buf_t's .base field gets freed. We immediately discard
119
- // the result
120
- if _data. buf . is_some ( ) {
121
- let buf = _data. buf . take_unwrap ( ) ;
122
- vec_from_uv_buf ( buf) ;
123
- }
73
+ let _data = transmute :: < * c_void , ~RequestData > ( data) ;
124
74
uvll:: set_data_for_req ( self . native_handle ( ) , null :: < ( ) > ( ) ) ;
125
75
uvll:: fs_req_cleanup ( self . native_handle ( ) ) ;
126
76
free_req ( self . native_handle ( ) as * c_void )
@@ -192,18 +142,16 @@ impl FileDescriptor {
192
142
}
193
143
194
144
// as per bnoordhuis in #libuv: offset >= 0 uses prwrite instead of write
195
- fn write_common ( & self , loop_ : Loop , buf : ~ [ u8 ] , offset : i64 , cb : Option < FsCallback > )
145
+ fn write_common ( & self , loop_ : Loop , buf : Buf , offset : i64 , cb : Option < FsCallback > )
196
146
-> int {
197
147
let complete_cb_ptr = match cb {
198
148
Some ( _) => compl_cb,
199
149
None => 0 as * u8
200
150
} ;
201
151
let is_sync = cb. is_none ( ) ;
202
152
let mut req = FsRequest :: new ( cb) ;
203
- let len = buf. len ( ) ;
204
- let buf = vec_to_uv_buf ( buf) ;
205
153
let base_ptr = buf. base as * c_void ;
206
- req . get_req_data ( ) . buf = Some ( buf) ;
154
+ let len = buf. len as uint ;
207
155
req. get_req_data ( ) . raw_fd = Some ( self . native_handle ( ) ) ;
208
156
let result = unsafe {
209
157
uvll:: fs_write ( loop_. native_handle ( ) , req. native_handle ( ) ,
@@ -213,17 +161,17 @@ impl FileDescriptor {
213
161
if is_sync { req. cleanup_and_delete ( ) ; }
214
162
result
215
163
}
216
- pub fn write ( & self , loop_ : Loop , buf : ~ [ u8 ] , offset : i64 , cb : FsCallback )
164
+ pub fn write ( & self , loop_ : Loop , buf : Buf , offset : i64 , cb : FsCallback )
217
165
-> int {
218
166
self . write_common ( loop_, buf, offset, Some ( cb) )
219
167
}
220
- pub fn write_sync ( & self , loop_ : Loop , buf : ~ [ u8 ] , offset : i64 )
168
+ pub fn write_sync ( & self , loop_ : Loop , buf : Buf , offset : i64 )
221
169
-> int {
222
170
self . write_common ( loop_, buf, offset, None )
223
171
}
224
172
225
- fn read_common ( & self , loop_ : Loop , buf_ptr : Option < * c_void > ,
226
- len : uint , offset : i64 , cb : Option < FsCallback > )
173
+ fn read_common ( & self , loop_ : Loop , buf : Buf ,
174
+ offset : i64 , cb : Option < FsCallback > )
227
175
-> int {
228
176
let complete_cb_ptr = match cb {
229
177
Some ( _) => compl_cb,
@@ -232,31 +180,22 @@ impl FileDescriptor {
232
180
let is_sync = cb. is_none ( ) ;
233
181
let mut req = FsRequest :: new ( cb) ;
234
182
req. get_req_data ( ) . raw_fd = Some ( self . native_handle ( ) ) ;
183
+ let buf_ptr = buf. base as * c_void ;
235
184
let result = unsafe {
236
- let buf_ptr = match buf_ptr {
237
- Some ( ptr) => ptr,
238
- None => {
239
- let buf = vec:: from_elem ( len, 0u8 ) ;
240
- let buf = vec_to_uv_buf ( buf) ;
241
- req. get_req_data ( ) . buf = Some ( buf) ;
242
- buf. base as * c_void
243
- }
244
- } ;
245
185
uvll:: fs_read ( loop_. native_handle ( ) , req. native_handle ( ) ,
246
186
self . native_handle ( ) , buf_ptr,
247
- len, offset, complete_cb_ptr) as int
187
+ buf . len as uint , offset, complete_cb_ptr) as int
248
188
} ;
249
189
if is_sync { req. cleanup_and_delete ( ) ; }
250
190
result
251
191
}
252
- pub fn read ( & self , loop_ : Loop , buf_ptr : Option < * c_void > ,
253
- len : uint , offset : i64 , cb : FsCallback )
192
+ pub fn read ( & self , loop_ : Loop , buf : Buf , offset : i64 , cb : FsCallback )
254
193
-> int {
255
- self . read_common ( loop_, buf_ptr , len , offset, Some ( cb) )
194
+ self . read_common ( loop_, buf , offset, Some ( cb) )
256
195
}
257
- pub fn read_sync ( & self , loop_ : Loop , buf_ptr : Option < * c_void > , len : uint , offset : i64 )
196
+ pub fn read_sync ( & self , loop_ : Loop , buf : Buf , offset : i64 )
258
197
-> int {
259
- self . read_common ( loop_, buf_ptr , len , offset, None )
198
+ self . read_common ( loop_, buf , offset, None )
260
199
}
261
200
262
201
fn close_common ( self , loop_ : Loop , cb : Option < FsCallback > ) -> int {
@@ -316,61 +255,67 @@ impl NativeHandle<c_int> for FileDescriptor {
316
255
mod test {
317
256
use super :: * ;
318
257
//use rt::test::*;
319
- use option:: { Some } ;
320
- use libc:: { STDOUT_FILENO , c_void} ;
258
+ use libc:: { STDOUT_FILENO } ;
321
259
use vec;
322
260
use str;
323
261
use unstable:: run_in_bare_thread;
324
262
use path:: Path ;
325
- use rt:: uv:: { Loop , vec_to_uv_buf , vec_from_uv_buf ,
263
+ use rt:: uv:: { Loop , Buf , slice_to_uv_buf ,
326
264
status_to_maybe_uv_error_with_loop} ;
327
- use option:: { None } ;
265
+ use libc:: { O_CREAT , O_RDWR , O_RDONLY ,
266
+ S_IWUSR , S_IRUSR } ; //NOTE: need defs for S_**GRP|S_**OTH in libc:: ...
267
+ //S_IRGRP, S_IROTH};
328
268
329
269
fn file_test_full_simple_impl( ) {
330
270
do run_in_bare_thread {
331
271
let mut loop_ = Loop :: new ( ) ;
332
- let create_flags = map_flag ( O_RDWR ) |
333
- map_flag ( O_CREAT ) ;
334
- let read_flags = map_flag ( O_RDONLY ) ;
335
- // 0644
336
- let mode = map_mode ( S_IWUSR ) |
337
- map_mode ( S_IRUSR ) |
338
- map_mode ( S_IRGRP ) |
339
- map_mode ( S_IROTH ) ;
272
+ let create_flags = O_RDWR | O_CREAT ;
273
+ let read_flags = O_RDONLY ;
274
+ // 0644 BZZT! WRONG! 0600! See below.
275
+ let mode = S_IWUSR |S_IRUSR ;
276
+ // these aren't defined in std::libc :(
277
+ //map_mode(S_IRGRP) |
278
+ //map_mode(S_IROTH);
340
279
let path_str = "./file_full_simple.txt" ;
341
- let write_val = "hello" ;
342
- do FileDescriptor :: open ( loop_, Path ( path_str) , create_flags, mode)
280
+ let write_val = "hello" . as_bytes ( ) . to_owned ( ) ;
281
+ let write_buf = slice_to_uv_buf ( write_val) ;
282
+ let write_buf_ptr: * Buf = & write_buf;
283
+ let read_buf_len = 1028 ;
284
+ let read_mem = vec:: from_elem ( read_buf_len, 0u8 ) ;
285
+ let read_buf = slice_to_uv_buf ( read_mem) ;
286
+ let read_buf_ptr: * Buf = & read_buf;
287
+ do FileDescriptor :: open ( loop_, Path ( path_str) , create_flags as int , mode as int )
343
288
|req, uverr| {
344
289
let loop_ = req. get_loop ( ) ;
345
290
assert ! ( uverr. is_none( ) ) ;
346
291
let fd = FileDescriptor :: from_open_req ( req) ;
347
- let msg: ~[ u8 ] = write_val. as_bytes ( ) . to_owned ( ) ;
348
292
let raw_fd = fd. native_handle ( ) ;
349
- do fd. write ( loop_, msg, -1 ) |_, uverr| {
293
+ let buf = unsafe { * write_buf_ptr } ;
294
+ do fd. write ( loop_, buf, -1 ) |_, uverr| {
350
295
let fd = FileDescriptor ( raw_fd) ;
351
296
do fd. close ( loop_) |req, _| {
352
297
let loop_ = req. get_loop ( ) ;
353
298
assert ! ( uverr. is_none( ) ) ;
354
- do FileDescriptor :: open ( loop_, Path ( path_str) , read_flags, 0 )
299
+ do FileDescriptor :: open ( loop_, Path ( path_str) , read_flags as int , 0 )
355
300
|req, uverr| {
356
301
assert ! ( uverr. is_none( ) ) ;
357
302
let loop_ = req. get_loop ( ) ;
358
- let len = 1028 ;
359
303
let fd = FileDescriptor :: from_open_req ( req) ;
360
304
let raw_fd = fd. native_handle ( ) ;
361
- do fd. read ( loop_, None , len, 0 ) |req, uverr| {
305
+ let read_buf = unsafe { * read_buf_ptr } ;
306
+ do fd. read ( loop_, read_buf, 0 ) |req, uverr| {
362
307
assert ! ( uverr. is_none( ) ) ;
363
308
let loop_ = req. get_loop ( ) ;
364
309
// we know nread >=0 because uverr is none..
365
310
let nread = req. get_result ( ) as uint ;
366
311
// nread == 0 would be EOF
367
312
if nread > 0 {
368
- let buf = vec_from_uv_buf (
369
- req . get_req_data ( ) . buf . take_unwrap ( ) )
370
- . take_unwrap ( ) ;
371
- let read_str = str :: from_bytes (
372
- buf . slice ( 0 ,
373
- nread ) ) ;
313
+ let read_str = unsafe {
314
+ let read_buf = * read_buf_ptr ;
315
+ str :: from_bytes (
316
+ vec :: from_buf (
317
+ read_buf . base , nread ) )
318
+ } ;
374
319
assert ! ( read_str == ~"hello");
375
320
do FileDescriptor(raw_fd).close(loop_) |_,uverr| {
376
321
assert!(uverr.is_none());
@@ -393,50 +338,50 @@ mod test {
393
338
do run_in_bare_thread {
394
339
// setup
395
340
let mut loop_ = Loop::new();
396
- let create_flags = map_flag( O_RDWR) |
397
- map_flag( O_CREAT) ;
398
- let read_flags = map_flag( O_RDONLY) ;
341
+ let create_flags = O_RDWR |
342
+ O_CREAT;
343
+ let read_flags = O_RDONLY;
399
344
// 0644
400
- let mode = map_mode( S_IWUSR) |
401
- map_mode( S_IRUSR) |
402
- map_mode( S_IRGRP) |
403
- map_mode( S_IROTH) ;
345
+ let mode = S_IWUSR |
346
+ S_IRUSR;
347
+ // S_IRGRP |
348
+ // S_IROTH;
404
349
let path_str = " . /file_full_simple_sync. txt";
405
- let write_val = " hello";
350
+ let write_val = " hello".as_bytes().to_owned();
351
+ let write_buf = slice_to_uv_buf(write_val);
406
352
// open/create
407
- let result = FileDescriptor::open_sync(loop_, Path(path_str), create_flags, mode);
353
+ let result = FileDescriptor::open_sync(loop_, Path(path_str),
354
+ create_flags as int, mode as int);
408
355
assert!(status_to_maybe_uv_error_with_loop(
409
356
loop_.native_handle(), result as i32).is_none());
410
357
let fd = FileDescriptor(result as i32);
411
- let msg: ~[u8] = write_val.as_bytes().to_owned();
412
358
// write
413
- let result = fd.write_sync(loop_, msg , -1);
359
+ let result = fd.write_sync(loop_, write_buf , -1);
414
360
assert!(status_to_maybe_uv_error_with_loop(
415
361
loop_.native_handle(), result as i32).is_none());
416
362
// close
417
363
let result = fd.close_sync(loop_);
418
364
assert!(status_to_maybe_uv_error_with_loop(
419
365
loop_.native_handle(), result as i32).is_none());
420
366
// re-open
421
- let result = FileDescriptor::open_sync(loop_, Path(path_str), read_flags,0);
367
+ let result = FileDescriptor::open_sync(loop_, Path(path_str),
368
+ read_flags as int,0);
422
369
assert!(status_to_maybe_uv_error_with_loop(
423
370
loop_.native_handle(), result as i32).is_none());
424
371
let len = 1028;
425
372
let fd = FileDescriptor(result as i32);
426
373
// read
427
- let buf: ~[u8] = vec::from_elem(len, 0u8);
428
- let buf = vec_to_uv_buf(buf);
429
- let buf_ptr = buf.base as *c_void;
430
- let result = fd.read_sync(loop_, Some(buf_ptr), len, 0);
374
+ let read_mem: ~[u8] = vec::from_elem(len, 0u8);
375
+ let buf = slice_to_uv_buf(read_mem);
376
+ let result = fd.read_sync(loop_, buf, 0);
431
377
assert!(status_to_maybe_uv_error_with_loop(
432
378
loop_.native_handle(), result as i32).is_none());
433
379
let nread = result;
434
380
// nread == 0 would be EOF.. we know it's >= zero because otherwise
435
381
// the above assert would fail
436
382
if nread > 0 {
437
- let buf = vec_from_uv_buf(buf).take_unwrap();
438
383
let read_str = str::from_bytes(
439
- buf .slice(0, nread as uint));
384
+ read_mem .slice(0, nread as uint));
440
385
assert!(read_str == ~" hello");
441
386
// close
442
387
let result = fd.close_sync(loop_);
@@ -461,19 +406,18 @@ mod test {
461
406
file_test_full_simple_impl_sync();
462
407
}
463
408
464
- fn naive_print(loop_: Loop, input: ~ str) {
409
+ fn naive_print(loop_: Loop, input: & str) {
465
410
let stdout = FileDescriptor(STDOUT_FILENO);
466
- let msg = input.as_bytes().to_owned();
467
- do stdout.write(loop_, msg, -1) |_, uverr| {
468
- assert!(uverr.is_none());
469
- };
411
+ let write_val = input.as_bytes();
412
+ let write_buf = slice_to_uv_buf(write_val);
413
+ stdout.write_sync(loop_, write_buf, 0);
470
414
}
471
415
472
416
#[test]
473
417
fn file_test_write_to_stdout() {
474
418
do run_in_bare_thread {
475
419
let mut loop_ = Loop::new();
476
- naive_print(loop_, ~ " zanzibar!\n ") ;
420
+ naive_print(loop_, " zanzibar!\n ") ;
477
421
loop_. run ( ) ;
478
422
loop_. close ( ) ;
479
423
} ;
0 commit comments