Add daemon() helper function

diff --git a/include/unistd.h b/include/unistd.h
index c5ded91..d80ddbf 100644
--- a/include/unistd.h
+++ b/include/unistd.h
@@ -129,6 +129,8 @@
   return __page_shift;
 }
 
+__extern int daemon(int, int);
+
 /* Standard file descriptor numbers. */
 #define STDIN_FILENO	0
 #define STDOUT_FILENO	1
diff --git a/klibc/Makefile b/klibc/Makefile
index 9238a22..f9a4032 100644
--- a/klibc/Makefile
+++ b/klibc/Makefile
@@ -18,6 +18,7 @@
 	  globals.o exitc.o atexit.o onexit.o \
 	  execl.o execle.o execv.o execvpe.o execvp.o execlp.o execlpe.o \
 	  fork.o wait.o wait3.o waitpid.o system.o setpgrp.o getpgrp.o \
+	  daemon.o \
 	  printf.o vprintf.o fprintf.o vfprintf.o perror.o \
 	  statfs.o fstatfs.o \
 	  open.o fopen.o fread.o fread2.o fgetc.o fgets.o \
diff --git a/klibc/daemon.c b/klibc/daemon.c
new file mode 100644
index 0000000..7510b84
--- /dev/null
+++ b/klibc/daemon.c
@@ -0,0 +1,37 @@
+/*
+ * daemon.c - "daemonize" a process
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+int daemon(int nochdir, int noclose)
+{
+  int nullfd;
+  pid_t f;
+
+  if ( !nochdir ) {
+    if ( chdir("/") )
+      return -1;
+  }
+
+  if ( !noclose ) {
+    if ( (nullfd = open("/dev/null", O_RDWR)) < 0 ||
+	 dup2(nullfd, 0) ||
+	 dup2(nullfd, 1) ||
+	 dup2(nullfd, 2) )
+      return -1;
+  }
+  
+  f = fork();
+  if ( f < 0 )
+    return -1;
+  else if ( f > 0 )
+    _exit(0);
+
+
+  return setsid();
+}
+
+  
diff --git a/klibc/include/unistd.h b/klibc/include/unistd.h
index c5ded91..d80ddbf 100644
--- a/klibc/include/unistd.h
+++ b/klibc/include/unistd.h
@@ -129,6 +129,8 @@
   return __page_shift;
 }
 
+__extern int daemon(int, int);
+
 /* Standard file descriptor numbers. */
 #define STDIN_FILENO	0
 #define STDOUT_FILENO	1