@@ -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