1
1
//! Get system identification
2
2
use std:: mem;
3
- use libc:: { self , c_char} ;
4
- use std:: ffi:: CStr ;
5
- use std:: str:: from_utf8_unchecked;
3
+ use libc:: c_char;
6
4
use crate :: Errno ;
7
5
8
6
/// Describes the running system. Return type of [`uname`].
@@ -11,29 +9,29 @@ use crate::Errno;
11
9
pub struct UtsName ( libc:: utsname ) ;
12
10
13
11
impl UtsName {
14
- /// Name of the operating system implementation
15
- pub fn sysname ( & self ) -> & str {
16
- to_str ( & ( & self . 0 . sysname as * const c_char ) as * const * const c_char )
12
+ /// Name of the operating system implementation.
13
+ pub fn sysname ( & self ) -> & [ u8 ] {
14
+ cast_and_trim ( & self . 0 . sysname )
17
15
}
18
16
19
17
/// Network name of this machine.
20
- pub fn nodename ( & self ) -> & str {
21
- to_str ( & ( & self . 0 . nodename as * const c_char ) as * const * const c_char )
18
+ pub fn nodename ( & self ) -> & [ u8 ] {
19
+ cast_and_trim ( & self . 0 . nodename )
22
20
}
23
21
24
22
/// Release level of the operating system.
25
- pub fn release ( & self ) -> & str {
26
- to_str ( & ( & self . 0 . release as * const c_char ) as * const * const c_char )
23
+ pub fn release ( & self ) -> & [ u8 ] {
24
+ cast_and_trim ( & self . 0 . release )
27
25
}
28
26
29
27
/// Version level of the operating system.
30
- pub fn version ( & self ) -> & str {
31
- to_str ( & ( & self . 0 . version as * const c_char ) as * const * const c_char )
28
+ pub fn version ( & self ) -> & [ u8 ] {
29
+ cast_and_trim ( & self . 0 . version )
32
30
}
33
31
34
32
/// Machine hardware platform.
35
- pub fn machine ( & self ) -> & str {
36
- to_str ( & ( & self . 0 . machine as * const c_char ) as * const * const c_char )
33
+ pub fn machine ( & self ) -> & [ u8 ] {
34
+ cast_and_trim ( & self . 0 . machine )
37
35
}
38
36
}
39
37
@@ -46,11 +44,10 @@ pub fn uname() -> Result<UtsName, Errno> {
46
44
}
47
45
}
48
46
49
- # [ inline ]
50
- fn to_str < ' a > ( s : * const * const c_char ) -> & ' a str {
47
+ fn cast_and_trim ( slice : & [ c_char ] ) -> & [ u8 ] {
48
+ let length = slice . iter ( ) . position ( | & byte| byte == 0 ) . unwrap_or ( slice . len ( ) ) ;
51
49
unsafe {
52
- let res = CStr :: from_ptr ( * s) . to_bytes ( ) ;
53
- from_utf8_unchecked ( res)
50
+ std:: slice:: from_raw_parts ( slice. as_ptr ( ) . cast ( ) , length)
54
51
}
55
52
}
56
53
@@ -59,18 +56,18 @@ mod test {
59
56
#[ cfg( target_os = "linux" ) ]
60
57
#[ test]
61
58
pub fn test_uname_linux ( ) {
62
- assert_eq ! ( super :: uname( ) . unwrap( ) . sysname( ) , "Linux" ) ;
59
+ assert_eq ! ( super :: uname( ) . unwrap( ) . sysname( ) , b "Linux") ;
63
60
}
64
61
65
62
#[ cfg( any( target_os = "macos" , target_os = "ios" ) ) ]
66
63
#[ test]
67
64
pub fn test_uname_darwin ( ) {
68
- assert_eq ! ( super :: uname( ) . unwrap( ) . sysname( ) , "Darwin" ) ;
65
+ assert_eq ! ( super :: uname( ) . unwrap( ) . sysname( ) , b "Darwin") ;
69
66
}
70
67
71
68
#[ cfg( target_os = "freebsd" ) ]
72
69
#[ test]
73
70
pub fn test_uname_freebsd ( ) {
74
- assert_eq ! ( super :: uname( ) . unwrap( ) . sysname( ) , "FreeBSD" ) ;
71
+ assert_eq ! ( super :: uname( ) . unwrap( ) . sysname( ) , b "FreeBSD") ;
75
72
}
76
73
}
0 commit comments