summaryrefslogtreecommitdiff
path: root/cscmd/daemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'cscmd/daemon.c')
-rw-r--r--cscmd/daemon.c39
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 );
+}