X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblutil%2Fdetach.c;h=022c2dbd787e825e58a2de47ba124e095ec0233e;hb=7be4d566d7ee36d0c06acc6023518f7e4221ba8e;hp=a398ed356a3fc9ef41f7f73e15bfa58e406b4391;hpb=59c8a88c2fd6e76012b77514c0231b2227752841;p=openldap diff --git a/libraries/liblutil/detach.c b/libraries/liblutil/detach.c index a398ed356a..022c2dbd78 100644 --- a/libraries/liblutil/detach.c +++ b/libraries/liblutil/detach.c @@ -1,3 +1,4 @@ +/* $OpenLDAP$ */ /* * Copyright (c) 1990, 1994 Regents of the University of Michigan. * All rights reserved. @@ -71,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();