@@ -497,7 +497,13 @@ fn get_flags(pid: u64, fd: u64) -> u64 {
497
497
fn print_file ( pid : u64 , fd : u64 , sockets : & HashMap < u64 , SockInfo > ) {
498
498
let link_path_str = format ! ( "/proc/{}/fd/{}" , pid, fd) ;
499
499
let link_path = Path :: new ( & link_path_str) ;
500
- let stat_info = stat ( link_path) . unwrap ( ) ;
500
+ let stat_info = match stat ( link_path) {
501
+ Err ( e) => {
502
+ eprintln ! ( "failed to stat {}: {}" , & link_path_str, e) ;
503
+ return ;
504
+ } ,
505
+ Ok ( stat_info) => stat_info,
506
+ } ;
501
507
502
508
let file_type = file_type ( stat_info. st_mode , & link_path) ;
503
509
@@ -541,8 +547,10 @@ fn print_file(pid: u64, fd: u64, sockets: &HashMap<u64, SockInfo>) {
541
547
}
542
548
} ,
543
549
_ => {
544
- let path = fs:: read_link ( link_path) . unwrap ( ) ;
545
- print ! ( " {}\n " , path. to_str( ) . unwrap( ) ) ;
550
+ match fs:: read_link ( link_path) {
551
+ Ok ( path) => println ! ( " {}" , path. to_string_lossy( ) ) ,
552
+ Err ( e) => eprintln ! ( "failed to readlink {}: {}" , & link_path_str, e) ,
553
+ }
546
554
}
547
555
}
548
556
}
@@ -794,28 +802,41 @@ fn fetch_sock_info(pid: u64) -> Result<HashMap<u64, SockInfo>, Box<dyn Error>> {
794
802
* sockname: AF_INET6 :: port: 8341
795
803
*/
796
804
797
- fn print_files ( pid : u64 ) {
805
+ fn print_files ( pid : u64 ) -> bool {
806
+
807
+ let proc_dir = format ! ( "/proc/{}/" , pid) ;
808
+ if !Path :: new ( & proc_dir) . exists ( ) {
809
+ eprintln ! ( "No such directory {}" , & proc_dir) ;
810
+ return false ;
811
+ }
812
+
798
813
print_proc_summary ( pid) ;
799
814
800
815
// TODO print current rlimit
801
816
802
- // TODO BLOCKER handle permission errors by printing an error instead of just
803
- // not printing anything
804
-
805
817
let sockets = fetch_sock_info ( pid) . unwrap ( ) ;
806
818
807
- if let Ok ( entries) = fs:: read_dir ( format ! ( "/proc/{}/fd/" , pid) ) {
819
+ let fd_dir = format ! ( "/proc/{}/fd/" , pid) ;
820
+ let readdir_res = fs:: read_dir ( & fd_dir) . and_then ( |entries| {
808
821
for entry in entries {
809
- let entry = entry. unwrap ( ) ;
822
+ let entry = entry? ;
810
823
let filename = entry. file_name ( ) ;
811
- let filename = filename. to_str ( ) . unwrap ( ) ;
812
- if let Ok ( fd) = filename. parse :: < u64 > ( ) {
824
+ let filename = filename. to_string_lossy ( ) ;
825
+ if let Ok ( fd) = ( & filename) . parse :: < u64 > ( ) {
813
826
print_file ( pid, fd, & sockets) ;
814
827
} else {
815
- eprint ! ( "Unexpected file /proc/pid/fd/{} found" , filename) ;
828
+ eprint ! ( "Unexpected file /proc/[ pid] /fd/{} found" , & filename) ;
816
829
}
817
- }
830
+ } ;
831
+ Ok ( ( ) )
832
+ } ) ;
833
+
834
+ if let Err ( e) = readdir_res {
835
+ eprintln ! ( "Unable to read {}: {}" , & fd_dir, e) ;
836
+ return false ;
818
837
}
838
+
839
+ return true ;
819
840
}
820
841
821
842
pub fn pargs_main ( ) {
@@ -923,9 +944,14 @@ pub fn pfiles_main() {
923
944
usage_err ( program, opts) ;
924
945
}
925
946
947
+ let mut error = false ;
926
948
for arg in & matches. free {
927
949
let pid = arg. parse :: < u64 > ( ) . unwrap ( ) ;
928
- print_files ( pid) ;
950
+ error = error || !print_files ( pid) ;
951
+ }
952
+
953
+ if error {
954
+ exit ( 1 ) ;
929
955
}
930
956
}
931
957
0 commit comments