1
1
use std:: fs:: File ;
2
2
use std:: fs:: OpenOptions ;
3
- use std:: io:: { ErrorKind , Read } ;
3
+ use std:: io:: { ErrorKind , Read , Write } ;
4
4
5
5
use num_traits:: cast:: ToPrimitive ;
6
6
7
7
use crate :: function:: PyFuncArgs ;
8
+ use crate :: obj:: objbytes;
8
9
use crate :: obj:: objint;
9
10
use crate :: obj:: objstr;
10
11
use crate :: pyobject:: { PyObjectRef , PyResult , TypeProtocol } ;
@@ -132,6 +133,27 @@ fn os_read(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
132
133
Ok ( vm. ctx . new_bytes ( buffer) )
133
134
}
134
135
136
+ fn os_write ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
137
+ arg_check ! (
138
+ vm,
139
+ args,
140
+ required = [
141
+ ( fd, Some ( vm. ctx. int_type( ) ) ) ,
142
+ ( data, Some ( vm. ctx. bytes_type( ) ) )
143
+ ]
144
+ ) ;
145
+
146
+ let mut file = rust_file ( objint:: get_value ( fd) . to_i64 ( ) . unwrap ( ) ) ;
147
+ let written = match file. write ( & objbytes:: get_value ( & data) ) {
148
+ Ok ( written) => written,
149
+ Err ( s) => return Err ( vm. new_os_error ( s. to_string ( ) ) ) ,
150
+ } ;
151
+
152
+ // Avoid closing the fd
153
+ raw_file_number ( file) ;
154
+ Ok ( vm. ctx . new_int ( written) )
155
+ }
156
+
135
157
pub fn make_module ( vm : & VirtualMachine ) -> PyObjectRef {
136
158
let ctx = & vm. ctx ;
137
159
@@ -146,6 +168,7 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
146
168
"close" => ctx. new_rustfunc( os_close) ,
147
169
"error" => ctx. new_rustfunc( os_error) ,
148
170
"read" => ctx. new_rustfunc( os_read) ,
171
+ "write" => ctx. new_rustfunc( os_write) ,
149
172
"name" => ctx. new_str( os_name) ,
150
173
"O_RDONLY" => ctx. new_int( 0 ) ,
151
174
"O_WRONLY" => ctx. new_int( 1 ) ,
0 commit comments