Skip to content
Newer
Older
100644 124 lines (106 sloc) 2.91 KB
e277097 @peff credentials: add "cache" helper
peff authored Dec 10, 2011
1 #include "cache.h"
2 #include "credential.h"
3 #include "string-list.h"
4 #include "parse-options.h"
5 #include "unix-socket.h"
6 #include "run-command.h"
7
8 #define FLAG_SPAWN 0x1
9 #define FLAG_RELAY 0x2
10
11 static int send_request(const char *socket, const struct strbuf *out)
12 {
13 int got_data = 0;
14 int fd = unix_stream_connect(socket);
15
16 if (fd < 0)
17 return -1;
18
19 if (write_in_full(fd, out->buf, out->len) < 0)
20 die_errno("unable to write to cache daemon");
21 shutdown(fd, SHUT_WR);
22
23 while (1) {
24 char in[1024];
25 int r;
26
27 r = read_in_full(fd, in, sizeof(in));
28 if (r == 0)
29 break;
30 if (r < 0)
31 die_errno("read error from cache daemon");
32 write_or_die(1, in, r);
33 got_data = 1;
34 }
9c60d9f @stefanbeller credential-cache, send_request: close fd when done
stefanbeller authored Mar 31, 2016
35 close(fd);
e277097 @peff credentials: add "cache" helper
peff authored Dec 10, 2011
36 return got_data;
37 }
38
39 static void spawn_daemon(const char *socket)
40 {
d318027 run-command: introduce CHILD_PROCESS_INIT
René Scharfe authored Aug 19, 2014
41 struct child_process daemon = CHILD_PROCESS_INIT;
e277097 @peff credentials: add "cache" helper
peff authored Dec 10, 2011
42 const char *argv[] = { NULL, NULL, NULL };
43 char buf[128];
44 int r;
45
46 argv[0] = "git-credential-cache--daemon";
47 argv[1] = socket;
48 daemon.argv = argv;
49 daemon.no_stdin = 1;
50 daemon.out = -1;
51
52 if (start_command(&daemon))
53 die_errno("unable to start cache daemon");
54 r = read_in_full(daemon.out, buf, sizeof(buf));
55 if (r < 0)
56 die_errno("unable to read result code from cache daemon");
57 if (r != 3 || memcmp(buf, "ok\n", 3))
58 die("cache daemon did not start: %.*s", r, buf);
59 close(daemon.out);
60 }
61
62 static void do_cache(const char *socket, const char *action, int timeout,
63 int flags)
64 {
65 struct strbuf buf = STRBUF_INIT;
66
67 strbuf_addf(&buf, "action=%s\n", action);
68 strbuf_addf(&buf, "timeout=%d\n", timeout);
69 if (flags & FLAG_RELAY) {
70 if (strbuf_read(&buf, 0, 0) < 0)
71 die_errno("unable to relay credential");
72 }
73
8ec6c8d @peff credential-cache: report more daemon connection errors
peff authored Jan 9, 2012
74 if (send_request(socket, &buf) < 0) {
35a71f1 @peff credential-cache: ignore "connection refused" errors
peff authored Jan 17, 2012
75 if (errno != ENOENT && errno != ECONNREFUSED)
98c2924 @drizzd credentials: unable to connect to cache daemon
drizzd authored Jan 7, 2012
76 die_errno("unable to connect to cache daemon");
8ec6c8d @peff credential-cache: report more daemon connection errors
peff authored Jan 10, 2012
77 if (flags & FLAG_SPAWN) {
78 spawn_daemon(socket);
79 if (send_request(socket, &buf) < 0)
80 die_errno("unable to connect to cache daemon");
81 }
e277097 @peff credentials: add "cache" helper
peff authored Dec 10, 2011
82 }
83 strbuf_release(&buf);
84 }
85
86 int main(int argc, const char **argv)
87 {
88 char *socket_path = NULL;
89 int timeout = 900;
90 const char *op;
91 const char * const usage[] = {
d96a031 @ralfth am, credential-cache: add angle brackets to usage string
ralfth authored Oct 16, 2015
92 "git credential-cache [<options>] <action>",
e277097 @peff credentials: add "cache" helper
peff authored Dec 10, 2011
93 NULL
94 };
95 struct option options[] = {
96 OPT_INTEGER(0, "timeout", &timeout,
97 "number of seconds to cache credentials"),
98 OPT_STRING(0, "socket", &socket_path, "path",
99 "path of cache-daemon socket"),
100 OPT_END()
101 };
102
103 argc = parse_options(argc, argv, NULL, options, usage, 0);
104 if (!argc)
105 usage_with_options(usage, options);
106 op = argv[0];
107
108 if (!socket_path)
109 socket_path = expand_user_path("~/.git-credential-cache/socket");
110 if (!socket_path)
111 die("unable to find a suitable socket path; use --socket");
112
113 if (!strcmp(op, "exit"))
114 do_cache(socket_path, op, timeout, 0);
115 else if (!strcmp(op, "get") || !strcmp(op, "erase"))
116 do_cache(socket_path, op, timeout, FLAG_RELAY);
117 else if (!strcmp(op, "store"))
118 do_cache(socket_path, op, timeout, FLAG_RELAY|FLAG_SPAWN);
119 else
120 ; /* ignore unknown operation */
121
122 return 0;
123 }
Something went wrong with that request. Please try again.