X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=libraries%2Fliblutil%2Fdetach.c;h=742e253a3b12ac1b0d0f562eb5e88650d34d43ba;hb=34249c08a5c15ebf15f78570ca61e6acad94dc22;hp=cd9f0e0f3ab9de1e845d9d0a728475a57f295107;hpb=df8f7cbb9b79be3be9205d116d1dd0b263d6861a;p=openldap diff --git a/libraries/liblutil/detach.c b/libraries/liblutil/detach.c index cd9f0e0f3a..742e253a3b 100644 --- a/libraries/liblutil/detach.c +++ b/libraries/liblutil/detach.c @@ -1,3 +1,18 @@ +/* detach.c -- routines to daemonize a process */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2010 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ /* * Copyright (c) 1990, 1994 Regents of the University of Michigan. * All rights reserved. @@ -9,11 +24,15 @@ * software without specific prior written permission. This software * is provided ``as is'' without express or implied warranty. */ +/* This work was originally developed by the University of Michigan + * and distributed as part of U-MICH LDAP. + */ #include "portable.h" #include +#include #include #include #include @@ -37,7 +56,7 @@ lutil_detach( int debug, int do_close ) #ifdef HAVE_SYSCONF nbits = sysconf( _SC_OPEN_MAX ); -#elif HAVE_GETDTABLESIZE +#elif defined(HAVE_GETDTABLESIZE) nbits = getdtablesize(); #else nbits = FD_SETSIZE; @@ -51,7 +70,7 @@ lutil_detach( int debug, int do_close ) if ( debug == 0 ) { for ( i = 0; i < 5; i++ ) { -#if HAVE_THR +#ifdef HAVE_THR switch ( fork1() ) #else switch ( fork() ) @@ -70,21 +89,42 @@ 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 && + (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; + } + } - if ( (sd = open( "/dev/null", O_RDWR )) == -1 ) { - perror( "/dev/null" ); - exit( EXIT_FAILURE ); + if ( do_close ) { + /* close everything else */ + for ( i = 0; i < nbits; i++ ) { + if( i != STDIN_FILENO && + i != STDOUT_FILENO && + i != STDERR_FILENO ) + { + close( i ); + } + } } - for ( i = 0; i < 3; i++ ) - if ( sd != i && isatty( i ) ) - (void) dup2( sd, i ); - if ( sd > 2 ) - close( sd ); + +#ifdef CHDIR_TO_ROOT + (void) chdir( "/" ); +#endif #ifdef HAVE_SETSID (void) setsid();