In daemon mode, stdout and stderr are saved in $WATCHER/log. Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com> --- Documentation/git-file-watcher.txt | 2 ++ cache.h | 1 + daemon.c | 30 ++++-------------------------- file-watcher.c | 17 +++++++++++++++++ setup.c | 25 +++++++++++++++++++++++++ 5 files changed, 49 insertions(+), 26 deletions(-)
diff --git a/Documentation/git-file-watcher.txt b/Documentation/git-file-watcher.txt index 625a389..ec81f18 100644 --- a/Documentation/git-file-watcher.txt +++ b/Documentation/git-file-watcher.txt @@ -18,6 +18,8 @@ lstat(2) to detect that itself. OPTIONS ------- +--detach:: + Run in background. SEE ALSO -------- diff --git a/cache.h b/cache.h index 939db46..7a836b1 100644 --- a/cache.h +++ b/cache.h @@ -434,6 +434,7 @@ extern int set_git_dir_init(const char *git_dir, const char *real_git_dir, int); extern int init_db(const char *template_dir, unsigned int flags); extern void sanitize_stdfds(void); +extern int daemonize(int *); #define alloc_nr(x) (((x)+16)*3/2) diff --git a/daemon.c b/daemon.c index 503e039..2650504 100644 --- a/daemon.c +++ b/daemon.c @@ -1056,11 +1056,6 @@ static void drop_privileges(struct credentials *cred) /* nothing */ } -static void daemonize(void) -{ - die("--detach not supported on this platform"); -} - static struct credentials *prepare_credentials(const char *user_name, const char *group_name) { @@ -1102,24 +1097,6 @@ static struct credentials *prepare_credentials(const char *user_name, return &c; } - -static void daemonize(void) -{ - switch (fork()) { - case 0: - break; - case -1: - die_errno("fork failed"); - default: - exit(0); - } - if (setsid() == -1) - die_errno("setsid failed"); - close(0); - close(1); - close(2); - sanitize_stdfds(); -} #endif static void store_pid(const char *path) @@ -1333,9 +1310,10 @@ int main(int argc, char **argv) if (inetd_mode || serve_mode) return execute(); - if (detach) - daemonize(); - else + if (detach) { + if (daemonize(NULL)) + die("--detach not supported on this platform"); + } else sanitize_stdfds(); if (pid_file) diff --git a/file-watcher.c b/file-watcher.c index 9c639ef..1e1ccad 100644 --- a/file-watcher.c +++ b/file-watcher.c @@ -111,7 +111,10 @@ int main(int argc, const char **argv) { struct strbuf sb = STRBUF_INIT; int i, new_nr, fd, quit = 0, nr_common; + int daemon = 0; struct option options[] = { + OPT_BOOL(0, "detach", &daemon, + N_("run in background")), OPT_END() }; @@ -135,6 +138,20 @@ int main(int argc, const char **argv) atexit(cleanup); sigchain_push_common(cleanup_on_signal); + if (daemon) { + int err; + strbuf_addf(&sb, "%s/log", socket_path); + err = open(sb.buf, O_CREAT | O_TRUNC | O_WRONLY, 0600); + adjust_shared_perm(sb.buf); + if (err == -1) + die_errno(_("unable to create %s"), sb.buf); + if (daemonize(&do_not_clean_up)) + die(_("--detach not supported on this platform")); + dup2(err, 1); + dup2(err, 2); + close(err); + } + nr_common = 1; pfd_alloc = pfd_nr = nr_common; pfd = xmalloc(sizeof(*pfd) * pfd_alloc); diff --git a/setup.c b/setup.c index 6c3f85f..757c45f 100644 --- a/setup.c +++ b/setup.c @@ -787,3 +787,28 @@ void sanitize_stdfds(void) if (fd > 2) close(fd); } + +int daemonize(int *flag) +{ +#ifndef NO_POSIX_GOODIES + switch (fork()) { + case 0: + break; + case -1: + die_errno("fork failed"); + default: + if (flag) + *flag = 1; + exit(0); + } + if (setsid() == -1) + die_errno("setsid failed"); + close(0); + close(1); + close(2); + sanitize_stdfds(); + return 0; +#else + return -1; +#endif +} -- 1.8.5.2.240.g8478abd -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html