@@ -61,27 +61,30 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
6161    } 
6262
6363    unsafe  fn  sanitize_standard_fds ( )  { 
64-         let  mut  opened_devnull = -1 ; 
65-         let  mut  open_devnull = || { 
66-             #[ cfg( not( all( target_os = "linux" ,  target_env = "gnu" ) ) ) ]  
67-             use  libc:: open as  open64; 
68-             #[ cfg( all( target_os = "linux" ,  target_env = "gnu" ) ) ]  
69-             use  libc:: open64; 
70- 
71-             if  opened_devnull != -1  { 
72-                 if  libc:: dup ( opened_devnull)  != -1  { 
73-                     return ; 
64+         macro_rules!  open_devnull { 
65+             ( $opened_devnull: expr)  => { 
66+                 ' od:  { 
67+                     #[ cfg( not( all( target_os = "linux" ,  target_env = "gnu" ) ) ) ] 
68+                     use  libc:: open as  open64; 
69+                     #[ cfg( all( target_os = "linux" ,  target_env = "gnu" ) ) ] 
70+                     use  libc:: open64; 
71+ 
72+                     if  $opened_devnull != -1  { 
73+                         if  libc:: dup( $opened_devnull)  != -1  { 
74+                             break  ' od; 
75+                         } 
76+                     } 
77+                     $opened_devnull = open64( c"/dev/null" . as_ptr( ) ,  libc:: O_RDWR ,  0 ) ; 
78+                     if  $opened_devnull == -1  { 
79+                         // If the stream is closed but we failed to reopen it, abort the 
80+                         // process. Otherwise we wouldn't preserve the safety of 
81+                         // operations on the corresponding Rust object Stdin, Stdout, or 
82+                         // Stderr. 
83+                         libc:: abort( ) ; 
84+                     } 
7485                } 
75-             } 
76-             opened_devnull = open64 ( c"/dev/null" . as_ptr ( ) ,  libc:: O_RDWR ,  0 ) ; 
77-             if  opened_devnull == -1  { 
78-                 // If the stream is closed but we failed to reopen it, abort the 
79-                 // process. Otherwise we wouldn't preserve the safety of 
80-                 // operations on the corresponding Rust object Stdin, Stdout, or 
81-                 // Stderr. 
82-                 libc:: abort ( ) ; 
83-             } 
84-         } ; 
86+             } ; 
87+         } 
8588
8689        // fast path with a single syscall for systems with poll() 
8790        #[ cfg( not( any(  
@@ -99,6 +102,7 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
99102        ) ) ) ]  
100103        ' poll:  { 
101104            use  crate :: sys:: os:: errno; 
105+             let  mut  opened_devnull = -1 ; 
102106            let  pfds:  & mut  [ _ ]  = & mut  [ 
103107                libc:: pollfd  {  fd :  0 ,  events :  0 ,  revents :  0  } , 
104108                libc:: pollfd  {  fd :  1 ,  events :  0 ,  revents :  0  } , 
@@ -125,7 +129,7 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
125129                if  pfd. revents  &  libc:: POLLNVAL  == 0  { 
126130                    continue ; 
127131                } 
128-                 open_devnull ( ) ; 
132+                 open_devnull ! ( opened_devnull ) ; 
129133            } 
130134            return ; 
131135        } 
@@ -143,9 +147,10 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
143147        ) ) ) ]  
144148        { 
145149            use  crate :: sys:: os:: errno; 
150+             let  mut  opened_devnull = -1 ; 
146151            for  fd in  0 ..3  { 
147152                if  libc:: fcntl ( fd,  libc:: F_GETFD )  == -1  && errno ( )  == libc:: EBADF  { 
148-                     open_devnull ( ) ; 
153+                     open_devnull ! ( opened_devnull ) ; 
149154                } 
150155            } 
151156        } 
0 commit comments