X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblutil%2Fdetach.c;h=022c2dbd787e825e58a2de47ba124e095ec0233e;hb=7be4d566d7ee36d0c06acc6023518f7e4221ba8e;hp=682410d42191a5caab45efdb44b02ee62e83ef2b;hpb=b9109a9f203c4f5be78253139783112ffbac5163;p=openldap diff --git a/libraries/liblutil/detach.c b/libraries/liblutil/detach.c index 682410d421..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. @@ -14,6 +15,7 @@ #include +#include #include #include #include @@ -65,26 +67,42 @@ lutil_detach( int debug, int do_close ) break; default: - _exit( 0 ); + _exit( EXIT_SUCCESS ); } 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( 1 ); + 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();