3
3
// general purpose, but it hasn't been tested elsewhere.
4
4
5
5
use super :: mystd:: fs:: File ;
6
- use super :: mystd:: io:: Read ;
6
+ use super :: mystd:: io:: { self , BufRead , BufReader , ErrorKind } ;
7
7
use super :: mystd:: str:: FromStr ;
8
- use super :: { OsString , String , Vec } ;
8
+ use super :: OsString ;
9
9
10
10
#[ derive( PartialEq , Eq , Debug ) ]
11
11
pub ( super ) struct MapsEntry {
@@ -53,19 +53,17 @@ pub(super) struct MapsEntry {
53
53
pathname : OsString ,
54
54
}
55
55
56
- pub ( super ) fn parse_maps ( ) -> Result < Vec < MapsEntry > , & ' static str > {
57
- let failed_io_err = "couldn't read /proc/self/maps" ;
58
- let mut v = Vec :: new ( ) ;
59
- let mut proc_self_maps = File :: open ( "/proc/self/maps" ) . map_err ( |_| failed_io_err) ?;
60
- let mut buf = String :: new ( ) ;
61
- let _bytes_read = proc_self_maps
62
- . read_to_string ( & mut buf)
63
- . map_err ( |_| failed_io_err) ?;
64
- for line in buf. lines ( ) {
65
- v. push ( line. parse ( ) ?) ;
66
- }
67
-
68
- Ok ( v)
56
+ pub ( super ) fn parse_maps ( ) -> Option < impl Iterator < Item = Result < MapsEntry , io:: Error > > > {
57
+ let proc_self_maps = match File :: open ( "/proc/self/maps" ) {
58
+ Ok ( f) => f,
59
+ Err ( _) => return None ,
60
+ } ;
61
+ let buf_read = BufReader :: new ( proc_self_maps) ;
62
+ Some (
63
+ buf_read
64
+ . lines ( )
65
+ . map ( |res| res. and_then ( |s| s. parse ( ) . map_err ( |e| io:: Error :: from ( e) ) ) ) ,
66
+ )
69
67
}
70
68
71
69
impl MapsEntry {
@@ -81,15 +79,15 @@ impl MapsEntry {
81
79
}
82
80
83
81
impl FromStr for MapsEntry {
84
- type Err = & ' static str ;
82
+ type Err = io :: ErrorKind ;
85
83
86
84
// Format: address perms offset dev inode pathname
87
85
// e.g.: "ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]"
88
86
// e.g.: "7f5985f46000-7f5985f48000 rw-p 00039000 103:06 76021795 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2"
89
87
// e.g.: "35b1a21000-35b1a22000 rw-p 00000000 00:00 0"
90
88
fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
91
- let missing_field = "failed to find all map fields" ;
92
- let parse_err = "failed to parse all map fields" ;
89
+ let missing_field = ErrorKind :: NotFound ;
90
+ let parse_err = ErrorKind :: InvalidData ;
93
91
let mut parts = s. split_ascii_whitespace ( ) ;
94
92
let range_str = parts. next ( ) . ok_or ( missing_field) ?;
95
93
let perms_str = parts. next ( ) . ok_or ( missing_field) ?;
0 commit comments