From 1fb42bf957a6b00315ee0f2905cada07adc2ba8a Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Tue, 11 Jan 2000 02:20:01 +0000 Subject: [PATCH] Revamp detach code to ensure stdin, stdout, stderr get closed. --- libraries/liblutil/detach.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/libraries/liblutil/detach.c b/libraries/liblutil/detach.c index 90cb984118..c3081ef1f6 100644 --- a/libraries/liblutil/detach.c +++ b/libraries/liblutil/detach.c @@ -72,21 +72,35 @@ lutil_detach( int debug, int do_close ) break; } - if ( do_close ) - for ( i = 3; i < nbits; i++ ) + if ( do_close ) { + if ( (sd = open( "/dev/null", O_RDWR )) != -1 ) { + perror("/dev/null"); + } + + for ( i = 0; i < nbits; i++ ) { + if( i == sd ) continue; + close( i ); - (void) chdir( "/" ); + if( i == STDIN_FILENO || + i == STDOUT_FILENO || + i == STDERR_FILENO ) + { + /* attach /dev/null */ + dup2( sd, i ); + } + } - if ( (sd = open( "/dev/null", O_RDWR )) == -1 ) { - perror( "/dev/null" ); - exit( EXIT_FAILURE ); + if( sd != STDIN_FILENO && + sd != STDOUT_FILENO && + sd != STDERR_FILENO ) + { + /* unless stdin, stdout, or stderr, close /dev/null */ + close( sd ); + } } - for ( i = 0; i < 3; i++ ) - if ( sd != i ) - (void) dup2( sd, i ); - if ( sd > 2 ) - close( sd ); + + (void) chdir( "/" ); #ifdef HAVE_SETSID (void) setsid(); -- 2.39.5