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"
2015-04-07 17:30:30 +03:00
# if HAVE_LIBSYSTEMD_DAEMON
2014-03-25 14:53:04 +04:00
# include <systemd/sd-daemon.h>
# endif
2014-07-31 13:40:04 +04:00
# include "lib/util/close_low_fd.h"
2007-04-19 19:56:44 +04:00
/*******************************************************************
Close the low 3 fd ' s and open dev / null in their place .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-21 02:10:21 +03:00
2012-03-02 12:32:56 +04:00
_PUBLIC_ void close_low_fds ( bool stdin_too , bool stdout_too , bool stderr_too )
2007-04-19 19:56:44 +04:00
{
2014-07-29 22:42:18 +04:00
if ( stdin_too ) {
int ret = close_low_fd ( 0 ) ;
if ( ret ! = 0 ) {
DEBUG ( 0 , ( " %s: close_low_fd(0) failed: %s \n " ,
__func__ , strerror ( ret ) ) ) ;
2007-04-19 19:56:44 +04:00
}
2014-07-29 22:42:18 +04:00
}
if ( stdout_too ) {
int ret = close_low_fd ( 1 ) ;
if ( ret ! = 0 ) {
DEBUG ( 0 , ( " %s: close_low_fd(1) failed: %s \n " ,
__func__ , strerror ( ret ) ) ) ;
}
}
if ( stderr_too ) {
int ret = close_low_fd ( 2 ) ;
if ( ret ! = 0 ) {
DEBUG ( 0 , ( " %s: close_low_fd(2) failed: %s \n " ,
__func__ , strerror ( ret ) ) ) ;
2007-04-19 19:56:44 +04:00
}
}
}
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
2010-03-26 13:17:37 +03:00
_PUBLIC_ void become_daemon ( bool do_fork , bool no_process_group , bool log_stdout )
2007-04-19 19:56:44 +04:00
{
2014-03-25 14:53:04 +04:00
pid_t newpid ;
2009-02-24 07:46:11 +03:00
if ( do_fork ) {
2014-03-25 14:53:04 +04:00
newpid = fork ( ) ;
if ( newpid ) {
2015-04-07 17:30:30 +03:00
# if HAVE_LIBSYSTEMD_DAEMON
2014-03-25 14:53:04 +04:00
sd_notifyf ( 0 , " READY=0 \n STATUS=Starting process... \n MAINPID=%lu " , ( unsigned long ) newpid ) ;
2015-04-07 17:30:30 +03:00
# endif /* HAVE_LIBSYSTEMD_DAEMON */
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 ) {
2012-03-28 05:48:00 +04:00
int i = 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 */
2012-03-02 12:32:56 +04:00
/* Close fd's 0,1,2 as appropriate. Needed if started by rsh. */
/* stdin must be open if we do not fork, for monitoring for
* close . stdout must be open if we are logging there , and we
* never close stderr ( but debug might dup it onto a log file ) */
close_low_fds ( do_fork , ! log_stdout , false ) ;
2007-04-19 19:56:44 +04:00
}
2014-03-25 14:53:04 +04:00
_PUBLIC_ void exit_daemon ( const char * msg , int error )
{
2015-04-07 17:30:30 +03:00
# ifdef HAVE_LIBSYSTEMD_DAEMON
2014-03-25 14:53:04 +04:00
if ( msg = = NULL ) {
msg = strerror ( error ) ;
}
sd_notifyf ( 0 , " STATUS=daemon failed to start: %s \n "
" ERRNO=%i " ,
msg ,
error ) ;
# endif
DEBUG ( 0 , ( " STATUS=daemon failed to start: %s, error code %d \n " , msg , error ) ) ;
exit ( 1 ) ;
}
2014-05-12 16:36:57 +04:00
_PUBLIC_ void daemon_ready ( const char * name )
2014-03-25 14:53:04 +04:00
{
2014-05-12 16:36:57 +04:00
if ( name = = NULL ) {
name = " Samba " ;
2014-03-25 14:53:04 +04:00
}
2015-04-07 17:30:30 +03:00
# ifdef HAVE_LIBSYSTEMD_DAEMON
2014-05-12 16:36:57 +04:00
sd_notifyf ( 0 , " READY=1 \n STATUS=%s: ready to serve connections... " , name ) ;
2014-03-25 14:53:04 +04:00
# endif
2014-05-22 10:48:32 +04:00
DEBUG ( 0 , ( " STATUS=daemon '%s' finished starting up and ready to serve "
" connections \n " , name ) ) ;
2014-03-25 14:53:04 +04:00
}
2014-09-16 20:02:30 +04:00
_PUBLIC_ void daemon_status ( const char * name , const char * msg )
{
if ( name = = NULL ) {
name = " Samba " ;
}
2015-04-07 17:30:30 +03:00
# ifdef HAVE_LIBSYSTEMD_DAEMON
2014-09-16 20:02:30 +04:00
sd_notifyf ( 0 , " \n STATUS=%s: %s " , name , msg ) ;
# endif
DEBUG ( 0 , ( " STATUS=daemon '%s' : %s " , name , msg ) ) ;
}