diff options
Diffstat (limited to 'cscmd/daemon.c')
-rw-r--r-- | cscmd/daemon.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/cscmd/daemon.c b/cscmd/daemon.c new file mode 100644 index 0000000..80ad4ed --- /dev/null +++ b/cscmd/daemon.c @@ -0,0 +1,39 @@ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <fcntl.h> +#include <paths.h> +#include <unistd.h> + +#include <daemon.h> + +int daemon( int nochdir, int noclose ) +{ + int fd; + + switch( fork() ) + { + case -1: + return( -1 ); + case 0: + break; + default: + _exit( 0 ); /* direct use kernel exit */ + } + + if( setsid() == -1 ) return( -1 ); + if( !nochdir ) chdir( "/" ); + if( noclose ) return( 0 ); + + fd = open( _PATH_DEVNULL, O_RDWR, 0 ); + if( fd != -1 ) + { + dup2( fd, STDIN_FILENO ); + dup2( fd, STDOUT_FILENO ); + dup2( fd, STDERR_FILENO ); + if( fd > 2 ) close( fd ); + } + return( 0 ); +} |