--- beanstalkd-1.5/main.c	2012-01-28 15:10:39.000000000 +0800
+++ beanstalkd-1.5-edited/main.c	2012-02-04 13:49:23.000000000 +0800
@@ -12,6 +12,18 @@
 static char *user = NULL;
 static char *port = "11300";
 static char *host_addr;
+static int detach = 0;
+
+static void
+nullfd(int fd, int flags)
+{
+    int r;
+
+    close(fd);
+    r = open("/dev/null", flags);
+    if (r != fd) twarn("open(\"/dev/null\")"), exit(1);
+}
+
 
 static void
 su(const char *user) {
@@ -30,6 +42,32 @@
     if (r == -1) twarn("setuid(%d \"%s\")", pwent->pw_uid, user), exit(34);
 }
 
+static void
+dfork()
+{
+    pid_t p;
+
+    p = fork();
+    if (p == -1) exit(1);
+    if (p) exit(0);
+}
+
+static void
+daemonize()
+{
+    int r;
+
+    r = chdir("/");
+    if (r) return twarn("chdir");
+
+    nullfd(0, O_RDONLY);
+    nullfd(1, O_WRONLY);
+    nullfd(2, O_WRONLY);
+    umask(0);
+    dfork();
+    setsid();
+    dfork();
+}
 
 static void
 set_sig_handlers()
@@ -57,6 +95,7 @@
     fprintf(stderr, "Use: %s [OPTIONS]\n"
             "\n"
             "Options:\n"
+            " -d       detach\n"
             " -b DIR   wal directory (must be absolute path if used with -d)\n"
             " -f MS    fsync at most once every MS milliseconds"
                        " (use -f 0 for \"always fsync\")\n"
@@ -112,6 +151,9 @@
         if (argv[i][0] != '-') usage("unknown option", argv[i]);
         if (argv[i][1] == 0 || argv[i][2] != 0) usage("unknown option",argv[i]);
         switch (argv[i][1]) {
+            case 'd':
+                detach = 1;
+                break;
             case 'p':
                 port = require_arg("-p", argv[++i]);
                 warn_systemd_ignored_option("-p", argv[i]);
@@ -200,6 +242,8 @@
         prot_replay(&s, &list);
     }
 
+    if (detach) daemonize();
+
     srv(&s);
     return 0;
 }
