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