@@ -22,6 +22,7 @@ use nix::pty::openpty;
22
22
use nix:: unistd:: { self , Gid , Pid , Uid } ;
23
23
#[ cfg( unix) ]
24
24
use std:: os:: unix:: io:: RawFd ;
25
+ use uname;
25
26
26
27
use super :: errno:: errors;
27
28
use crate :: exceptions:: PyBaseExceptionRef ;
@@ -1154,6 +1155,36 @@ fn os_urandom(size: usize, vm: &VirtualMachine) -> PyResult<Vec<u8>> {
1154
1155
}
1155
1156
}
1156
1157
1158
+ #[ pystruct_sequence( name = "os.uname_result" ) ]
1159
+ #[ derive( Debug ) ]
1160
+ struct UnameResult {
1161
+ sysname : String ,
1162
+ nodename : String ,
1163
+ release : String ,
1164
+ version : String ,
1165
+ machine : String ,
1166
+ }
1167
+
1168
+ impl UnameResult {
1169
+ fn into_obj ( self , vm : & VirtualMachine ) -> PyObjectRef {
1170
+ self . into_struct_sequence ( vm, vm. class ( "_os" , "uname_result" ) )
1171
+ . unwrap ( )
1172
+ . into_object ( )
1173
+ }
1174
+ }
1175
+
1176
+ fn os_uname ( vm : & VirtualMachine ) -> PyResult {
1177
+ let info = uname:: uname ( ) . map_err ( |err| convert_io_error ( vm, err) ) ?;
1178
+ Ok ( UnameResult {
1179
+ sysname : info. sysname ,
1180
+ nodename : info. nodename ,
1181
+ release : info. release ,
1182
+ version : info. version ,
1183
+ machine : info. machine ,
1184
+ }
1185
+ . into_obj ( vm) )
1186
+ }
1187
+
1157
1188
// this is basically what CPython has for Py_off_t; windows uses long long
1158
1189
// for offsets, other platforms just use off_t
1159
1190
#[ cfg( not( windows) ) ]
@@ -1243,6 +1274,7 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
1243
1274
} ) ;
1244
1275
1245
1276
let stat_result = StatResult :: make_class ( ctx) ;
1277
+ let uname_result = UnameResult :: make_class ( ctx) ;
1246
1278
1247
1279
struct SupportFunc < ' a > {
1248
1280
name : & ' a str ,
@@ -1331,6 +1363,8 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
1331
1363
"urandom" => ctx. new_function( os_urandom) ,
1332
1364
"isatty" => ctx. new_function( os_isatty) ,
1333
1365
"lseek" => ctx. new_function( os_lseek) ,
1366
+ "uname" => ctx. new_function( os_uname) ,
1367
+ "uname_result" => uname_result,
1334
1368
1335
1369
"O_RDONLY" => ctx. new_int( libc:: O_RDONLY ) ,
1336
1370
"O_WRONLY" => ctx. new_int( libc:: O_WRONLY ) ,
0 commit comments