summaryrefslogtreecommitdiff
path: root/daemon.c
diff options
context:
space:
mode:
authorMatthias Lederhofer <matled@gmx.net>2006-07-13 16:47:13 (GMT)
committerJunio C Hamano <junkio@cox.net>2006-07-14 04:50:46 (GMT)
commita5262768e1e4af96bbca60ee712e97105f80de24 (patch)
tree2ee5ef7bb6e3ed9783b913ae5dd3014dea725502 /daemon.c
parent45ed5d7f4cf641d1f64a83613f5a29b31268f8e8 (diff)
downloadgit-a5262768e1e4af96bbca60ee712e97105f80de24.zip
git-a5262768e1e4af96bbca60ee712e97105f80de24.tar.gz
git-a5262768e1e4af96bbca60ee712e97105f80de24.tar.bz2
daemon: new option --detach to run git-daemon in background
Signed-off-by: Matthias Lederhofer <matled@gmx.net> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'daemon.c')
-rw-r--r--daemon.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/daemon.c b/daemon.c
index cdc4266..e4ec676 100644
--- a/daemon.c
+++ b/daemon.c
@@ -674,6 +674,24 @@ static void sanitize_stdfds(void)
close(fd);
}
+static void daemonize(void)
+{
+ switch (fork()) {
+ case 0:
+ break;
+ case -1:
+ die("fork failed: %s", strerror(errno));
+ default:
+ exit(0);
+ }
+ if (setsid() == -1)
+ die("setsid failed: %s", strerror(errno));
+ close(0);
+ close(1);
+ close(2);
+ sanitize_stdfds();
+}
+
static void store_pid(const char *path)
{
FILE *f = fopen(path, "w");
@@ -699,6 +717,7 @@ int main(int argc, char **argv)
int port = DEFAULT_GIT_PORT;
int inetd_mode = 0;
const char *pid_file = NULL;
+ int detach = 0;
int i;
/* Without this we cannot rely on waitpid() to tell
@@ -767,6 +786,11 @@ int main(int argc, char **argv)
pid_file = arg + 11;
continue;
}
+ if (!strcmp(arg, "--detach")) {
+ detach = 1;
+ log_syslog = 1;
+ continue;
+ }
if (!strcmp(arg, "--")) {
ok_paths = &argv[i+1];
break;
@@ -799,7 +823,10 @@ int main(int argc, char **argv)
return execute(peer);
}
- sanitize_stdfds();
+ if (detach)
+ daemonize();
+ else
+ sanitize_stdfds();
if (pid_file)
store_pid(pid_file);