33// general purpose, but it hasn't been tested elsewhere.
44
55use super :: mystd:: fs:: File ;
6- use super :: mystd:: io:: Read ;
6+ use super :: mystd:: io:: { self , BufRead , BufReader , ErrorKind } ;
77use super :: mystd:: str:: FromStr ;
8- use super :: { OsString , String , Vec } ;
8+ use super :: OsString ;
99
1010#[ derive( PartialEq , Eq , Debug ) ]
1111pub ( super ) struct MapsEntry {
@@ -53,19 +53,17 @@ pub(super) struct MapsEntry {
5353 pathname : OsString ,
5454}
5555
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+ )
6967}
7068
7169impl MapsEntry {
@@ -81,15 +79,15 @@ impl MapsEntry {
8179}
8280
8381impl FromStr for MapsEntry {
84- type Err = & ' static str ;
82+ type Err = io :: ErrorKind ;
8583
8684 // Format: address perms offset dev inode pathname
8785 // e.g.: "ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]"
8886 // e.g.: "7f5985f46000-7f5985f48000 rw-p 00039000 103:06 76021795 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2"
8987 // e.g.: "35b1a21000-35b1a22000 rw-p 00000000 00:00 0"
9088 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 ;
9391 let mut parts = s. split_ascii_whitespace ( ) ;
9492 let range_str = parts. next ( ) . ok_or ( missing_field) ?;
9593 let perms_str = parts. next ( ) . ok_or ( missing_field) ?;
0 commit comments