2
2
* I/O core tools.
3
3
*/
4
4
5
+ //library imports
5
6
use std:: collections:: HashSet ;
6
-
7
- use std:: io:: prelude:: * ;
8
- use std:: os:: unix:: io:: { FromRawFd , IntoRawFd } ;
9
-
10
7
use std:: fs:: File ;
8
+ use std:: io:: prelude:: * ;
11
9
use std:: io:: BufReader ;
12
10
11
+ //3rd party imports
12
+ use num_bigint:: ToBigInt ;
13
+ use num_traits:: ToPrimitive ;
14
+
15
+ //custom imports
13
16
use super :: super :: obj:: objbytes;
14
17
use super :: super :: obj:: objint;
15
18
use super :: super :: obj:: objstr;
16
19
use super :: super :: obj:: objtype;
17
20
use super :: os;
18
21
19
- use num_bigint:: ToBigInt ;
20
- use num_traits:: ToPrimitive ;
21
-
22
22
use super :: super :: pyobject:: {
23
23
AttributeProtocol , BufferProtocol , PyContext , PyFuncArgs , PyObjectPayload , PyObjectRef ,
24
24
PyResult , TypeProtocol ,
@@ -117,6 +117,9 @@ fn file_io_init(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
117
117
118
118
vm. ctx . set_attr ( & file_io, "name" , name. clone ( ) ) ;
119
119
vm. ctx . set_attr ( & file_io, "fileno" , file_no) ;
120
+ vm. ctx . set_attr ( & file_io, "closefd" , vm. new_bool ( false ) ) ;
121
+ vm. ctx . set_attr ( & file_io, "closed" , vm. new_bool ( false ) ) ;
122
+
120
123
Ok ( vm. get_none ( ) )
121
124
}
122
125
None => Err ( vm. new_type_error ( format ! ( "invalid mode {}" , rust_mode) ) ) ,
@@ -164,10 +167,8 @@ fn file_io_readinto(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
164
167
let file_no = file_io. get_attr ( "fileno" ) . unwrap ( ) ;
165
168
let raw_fd = objint:: get_value ( & file_no) . to_i32 ( ) . unwrap ( ) ;
166
169
167
- //unsafe block - creates file handle from the UNIX file descriptor
168
- //raw_fd is supported on UNIX only. This will need to be extended
169
- //to support windows - i.e. raw file_handles
170
- let handle = unsafe { File :: from_raw_fd ( raw_fd) } ;
170
+ //extract unix file descriptor.
171
+ let handle = os:: rust_file ( raw_fd) ;
171
172
172
173
let mut f = handle. take ( length) ;
173
174
match obj. borrow_mut ( ) . payload {
@@ -182,9 +183,9 @@ fn file_io_readinto(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
182
183
_ => { }
183
184
} ;
184
185
185
- let new_handle = f. into_inner ( ) . into_raw_fd ( ) . to_bigint ( ) ;
186
+ let updated = os :: raw_file_number ( f. into_inner ( ) ) . to_bigint ( ) ;
186
187
vm. ctx
187
- . set_attr ( & file_io, "fileno" , vm. ctx . new_int ( new_handle . unwrap ( ) ) ) ;
188
+ . set_attr ( & file_io, "fileno" , vm. ctx . new_int ( updated . unwrap ( ) ) ) ;
188
189
Ok ( vm. get_none ( ) )
189
190
}
190
191
@@ -201,16 +202,16 @@ fn file_io_write(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
201
202
//unsafe block - creates file handle from the UNIX file descriptor
202
203
//raw_fd is supported on UNIX only. This will need to be extended
203
204
//to support windows - i.e. raw file_handles
204
- let mut handle = unsafe { File :: from_raw_fd ( raw_fd) } ;
205
+ let mut handle = os :: rust_file ( raw_fd) ;
205
206
206
207
match obj. borrow_mut ( ) . payload {
207
208
PyObjectPayload :: Bytes { ref mut value } => {
208
209
match handle. write ( & value[ ..] ) {
209
210
Ok ( len) => {
210
211
//reset raw fd on the FileIO object
211
- let new_handle = handle . into_raw_fd ( ) . to_bigint ( ) ;
212
+ let updated = os :: raw_file_number ( handle ) . to_bigint ( ) ;
212
213
vm. ctx
213
- . set_attr ( & file_io, "fileno" , vm. ctx . new_int ( new_handle . unwrap ( ) ) ) ;
214
+ . set_attr ( & file_io, "fileno" , vm. ctx . new_int ( updated . unwrap ( ) ) ) ;
214
215
215
216
//return number of bytes written
216
217
Ok ( vm. ctx . new_int ( len. to_bigint ( ) . unwrap ( ) ) )
@@ -279,7 +280,7 @@ pub fn io_open(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
279
280
280
281
let mut raw_modes = HashSet :: new ( ) ;
281
282
282
- // Add some books.
283
+ //add raw modes
283
284
raw_modes. insert ( "a" . to_string ( ) ) ;
284
285
raw_modes. insert ( "r" . to_string ( ) ) ;
285
286
raw_modes. insert ( "x" . to_string ( ) ) ;
0 commit comments