diff --git a/libraries/liblutil/detach.c b/libraries/liblutil/detach.c index 022c2dbd78..3692a46de0 100644 --- a/libraries/liblutil/detach.c +++ b/libraries/liblutil/detach.c @@ -72,22 +72,27 @@ lutil_detach( int debug, int do_close ) break; } - if ( (sd = open( "/dev/null", O_RDWR )) == -1 ) { + if ( (sd = open( "/dev/null", O_RDWR )) == -1 && + (sd = open( "/dev/null", O_RDONLY )) == -1 && + /* Panic -- open *something* */ + (sd = open( "/", O_RDONLY )) == -1 ) { perror("/dev/null"); + } else { + /* redirect stdin, stdout, stderr to /dev/null */ + dup2( sd, STDIN_FILENO ); + dup2( sd, STDOUT_FILENO ); + dup2( sd, STDERR_FILENO ); + + switch( sd ) { + default: + close( sd ); + case STDIN_FILENO: + case STDOUT_FILENO: + case STDERR_FILENO: + break; + } } - /* close stdin, stdout, stderr */ - close( STDIN_FILENO ); - close( STDOUT_FILENO ); - close( STDERR_FILENO ); - - /* redirect stdin, stdout, stderr to /dev/null */ - dup2( sd, STDIN_FILENO ); - dup2( sd, STDOUT_FILENO ); - dup2( sd, STDERR_FILENO ); - - close( sd ); - if ( do_close ) { /* close everything else */ for ( i = 0; i < nbits; i++ ) {