X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblutil%2Fdetach.c;h=022c2dbd787e825e58a2de47ba124e095ec0233e;hb=7be4d566d7ee36d0c06acc6023518f7e4221ba8e;hp=c4f2aa4478eb6db60d4ec83cb3c0b0b6fa85aa41;hpb=403f4479bc9f9a864122d4aeecf7284408918302;p=openldap diff --git a/libraries/liblutil/detach.c b/libraries/liblutil/detach.c index c4f2aa4478..022c2dbd78 100644 --- a/libraries/liblutil/detach.c +++ b/libraries/liblutil/detach.c @@ -72,21 +72,37 @@ lutil_detach( int debug, int do_close ) break; } - if ( do_close ) - for ( i = 3; i < nbits; i++ ) - close( i ); - - (void) chdir( "/" ); - if ( (sd = open( "/dev/null", O_RDWR )) == -1 ) { - perror( "/dev/null" ); - exit( EXIT_FAILURE ); + perror("/dev/null"); } - for ( i = 0; i < 3; i++ ) - if ( sd != i && isatty( i ) ) - (void) dup2( sd, i ); - if ( sd > 2 ) - close( sd ); + + /* 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++ ) { + if( i != STDIN_FILENO && + i != STDOUT_FILENO && + i != STDERR_FILENO ) + { + close( i ); + } + } + } + +#ifdef CHDIR_TO_ROOT + (void) chdir( "/" ); +#endif #ifdef HAVE_SETSID (void) setsid();