2007-04-19 19:56:44 +04:00
/*
Unix SMB / CIFS implementation .
Samba utility functions
Copyright ( C ) Andrew Tridgell 1992 - 1998
Copyright ( C ) Jeremy Allison 2001 - 2002
Copyright ( C ) Simo Sorce 2001
Copyright ( C ) Jim McDonough ( jmcd @ us . ibm . com ) 2003.
Copyright ( C ) James J Myers 2003
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-10 06:07:03 +04:00
the Free Software Foundation ; either version 3 of the License , or
2007-04-19 19:56:44 +04:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
2007-07-10 06:07:03 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2007-04-19 19:56:44 +04:00
*/
# include "includes.h"
# include "system/filesys.h"
# include "system/locale.h"
/*******************************************************************
Close the low 3 fd ' s and open dev / null in their place .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-21 02:10:21 +03:00
_PUBLIC_ void close_low_fds ( bool stderr_too )
2007-04-19 19:56:44 +04:00
{
# ifndef VALGRIND
int fd ;
int i ;
close ( 0 ) ;
2009-02-21 02:10:21 +03:00
close ( 1 ) ;
2007-04-19 19:56:44 +04:00
if ( stderr_too )
close ( 2 ) ;
/* try and use up these file descriptors, so silly
library routines writing to stdout etc won ' t cause havoc */
for ( i = 0 ; i < 3 ; i + + ) {
if ( i = = 2 & & ! stderr_too )
continue ;
fd = open ( " /dev/null " , O_RDWR , 0 ) ;
if ( fd < 0 )
fd = open ( " /dev/null " , O_WRONLY , 0 ) ;
if ( fd < 0 ) {
DEBUG ( 0 , ( " Can't open /dev/null \n " ) ) ;
return ;
}
if ( fd ! = i ) {
DEBUG ( 0 , ( " Didn't get file descriptor %d \n " , i ) ) ;
return ;
}
}
# endif
}
2009-02-21 02:10:21 +03:00
/****************************************************************************
2007-04-19 19:56:44 +04:00
Become a daemon , discarding the controlling terminal .
2009-02-21 02:10:21 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-04-19 19:56:44 +04:00
2009-02-24 07:46:11 +03:00
_PUBLIC_ void become_daemon ( bool do_fork , bool no_process_group )
2007-04-19 19:56:44 +04:00
{
2009-02-24 07:46:11 +03:00
if ( do_fork ) {
if ( sys_fork ( ) ) {
2007-04-19 19:56:44 +04:00
_exit ( 0 ) ;
}
}
2009-02-21 02:10:21 +03:00
/* detach from the terminal */
2007-04-19 19:56:44 +04:00
# ifdef HAVE_SETSID
2009-02-21 02:10:21 +03:00
if ( ! no_process_group ) setsid ( ) ;
2007-04-19 19:56:44 +04:00
# elif defined(TIOCNOTTY)
2009-02-21 02:10:21 +03:00
if ( ! no_process_group ) {
int i = sys_open ( " /dev/tty " , O_RDWR , 0 ) ;
2007-04-19 19:56:44 +04:00
if ( i ! = - 1 ) {
2009-02-21 02:10:21 +03:00
ioctl ( i , ( int ) TIOCNOTTY , ( char * ) 0 ) ;
2007-04-19 19:56:44 +04:00
close ( i ) ;
}
}
# endif /* HAVE_SETSID */
/* Close fd's 0,1,2. Needed if started by rsh */
2007-08-26 19:16:40 +04:00
close_low_fds ( false ) ; /* Don't close stderr, let the debug system
2007-04-19 19:56:44 +04:00
attach it to the logfile */
}