diff options
Diffstat (limited to 'credential-cache--daemon.c')
-rw-r--r-- | credential-cache--daemon.c | 60 |
1 files changed, 34 insertions, 26 deletions
diff --git a/credential-cache--daemon.c b/credential-cache--daemon.c index 390f194252..9365f2ce5c 100644 --- a/credential-cache--daemon.c +++ b/credential-cache--daemon.c @@ -1,22 +1,10 @@ #include "cache.h" +#include "tempfile.h" #include "credential.h" #include "unix-socket.h" -#include "sigchain.h" +#include "parse-options.h" -static const char *socket_path; - -static void cleanup_socket(void) -{ - if (socket_path) - unlink(socket_path); -} - -static void cleanup_socket_on_signal(int sig) -{ - cleanup_socket(); - sigchain_pop(sig); - raise(sig); -} +static struct tempfile socket_file; struct credential_cache_entry { struct credential item; @@ -109,14 +97,12 @@ static int read_request(FILE *fh, struct credential *c, const char *p; strbuf_getline(&item, fh, '\n'); - p = skip_prefix(item.buf, "action="); - if (!p) + if (!skip_prefix(item.buf, "action=", &p)) return error("client sent bogus action line: %s", item.buf); strbuf_addstr(action, p); strbuf_getline(&item, fh, '\n'); - p = skip_prefix(item.buf, "timeout="); - if (!p) + if (!skip_prefix(item.buf, "timeout=", &p)) return error("client sent bogus timeout line: %s", item.buf); *timeout = atoi(p); @@ -203,7 +189,7 @@ static int serve_cache_loop(int fd) return 1; } -static void serve_cache(const char *socket_path) +static void serve_cache(const char *socket_path, int debug) { int fd; @@ -213,12 +199,15 @@ static void serve_cache(const char *socket_path) printf("ok\n"); fclose(stdout); + if (!debug) { + if (!freopen("/dev/null", "w", stderr)) + die_errno("unable to point stderr to /dev/null"); + } while (serve_cache_loop(fd)) ; /* nothing */ close(fd); - unlink(socket_path); } static const char permissions_advice[] = @@ -254,16 +243,35 @@ static void check_socket_directory(const char *path) int main(int argc, const char **argv) { - socket_path = argv[1]; + const char *socket_path; + int ignore_sighup = 0; + static const char *usage[] = { + "git-credential-cache--daemon [opts] <socket_path>", + NULL + }; + int debug = 0; + const struct option options[] = { + OPT_BOOL(0, "debug", &debug, + N_("print debugging messages to stderr")), + OPT_END() + }; + + git_config_get_bool("credentialcache.ignoresighup", &ignore_sighup); + + argc = parse_options(argc, argv, NULL, options, usage, 0); + socket_path = argv[0]; if (!socket_path) - die("usage: git-credential-cache--daemon <socket_path>"); + usage_with_options(usage, options); + check_socket_directory(socket_path); + register_tempfile(&socket_file, socket_path); - atexit(cleanup_socket); - sigchain_push_common(cleanup_socket_on_signal); + if (ignore_sighup) + signal(SIGHUP, SIG_IGN); - serve_cache(socket_path); + serve_cache(socket_path, debug); + delete_tempfile(&socket_file); return 0; } |