12c7b1c5 (kx 2023-03-24 02:53:04 +0300 1)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 2) #ifdef HAVE_CONFIG_H
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 3) #include <config.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 4) #endif
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 5)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 6) #include <fcntl.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 7) #include <paths.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 8) #include <unistd.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 9)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 10) #include <daemon.h>
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 11)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 12) int daemon( int nochdir, int noclose )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 13) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 14) int fd;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 15)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 16) switch( fork() )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 17) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 18) case -1:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 19) return( -1 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 20) case 0:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 21) break;
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 22) default:
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 23) _exit( 0 ); /* direct use kernel exit */
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 24) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 25)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 26) if( setsid() == -1 ) return( -1 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 27) if( !nochdir ) chdir( "/" );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 28) if( noclose ) return( 0 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 29)
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 30) fd = open( _PATH_DEVNULL, O_RDWR, 0 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 31) if( fd != -1 )
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 32) {
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 33) dup2( fd, STDIN_FILENO );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 34) dup2( fd, STDOUT_FILENO );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 35) dup2( fd, STDERR_FILENO );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 36) if( fd > 2 ) close( fd );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 37) }
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 38) return( 0 );
12c7b1c5 (kx 2023-03-24 02:53:04 +0300 39) }