gpg_interface: allow to request status return

Currently, verify_signed_buffer() returns the user facing output only. Allow callers to request the status output also. Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Michael J Gruber committed Feb 14, 2013 at 17:04 UTC 9cc4ac8ff1ae84f9435f2c7de3f7ab796103adba
6 files changed +13 -10
builtin/fmt-merge-msg.c
+1 -1
@@ -492,7 +492,7 @@ static void fmt_merge_msg_sigs(struct strbuf *out)
492
493 if (size == len)
494 ; /* merely annotated */
495 - else if (verify_signed_buffer(buf, len, buf + len, size - len, &sig)) {
495 + else if (verify_signed_buffer(buf, len, buf + len, size - len, &sig, NULL)) {
496 if (!sig.len)
497 strbuf_addstr(&sig, "gpg verification failed.\n");
498 }
builtin/verify-tag.c
+1 -1
@@ -29,7 +29,7 @@ static int run_gpg_verify(const char *buf, unsigned long size, int verbose)
29 if (size == len)
30 return error("no signature found");
31
32 - return verify_signed_buffer(buf, len, buf + len, size - len, NULL);
32 + return verify_signed_buffer(buf, len, buf + len, size - len, NULL, NULL);
33 }
34
35 static int verify_tag(const char *name, int verbose)
gpg-interface.c
+7 -4
@@ -100,13 +100,14 @@ int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *sig
100 */
101 int verify_signed_buffer(const char *payload, size_t payload_size,
102 const char *signature, size_t signature_size,
103 - struct strbuf *gpg_output)
103 + struct strbuf *gpg_output, struct strbuf *gpg_status)
104 {
105 struct child_process gpg;
106 const char *args_gpg[] = {NULL, "--status-fd=1", "--verify", "FILE", "-", NULL};
107 char path[PATH_MAX];
108 int fd, ret;
109 struct strbuf buf = STRBUF_INIT;
110 + struct strbuf *pbuf = &buf;
111
112 args_gpg[0] = gpg_program;
113 fd = git_mkstemp(path, PATH_MAX, ".git_vtag_tmpXXXXXX");
@@ -137,15 +138,17 @@ int verify_signed_buffer(const char *payload, size_t payload_size,
138 strbuf_read(gpg_output, gpg.err, 0);
139 close(gpg.err);
140 }
140 - strbuf_read(&buf, gpg.out, 0);
141 + if (gpg_status)
142 + pbuf = gpg_status;
143 + strbuf_read(pbuf, gpg.out, 0);
144 close(gpg.out);
145
146 ret = finish_command(&gpg);
147
148 unlink_or_warn(path);
149
147 - ret |= !strstr(buf.buf, "\n[GNUPG:] GOODSIG ");
148 - strbuf_release(&buf);
150 + ret |= !strstr(pbuf->buf, "\n[GNUPG:] GOODSIG ");
151 + strbuf_release(&buf); /* no matter it was used or not */
152
153 return ret;
154 }
gpg-interface.h
+1 -1
@@ -2,7 +2,7 @@
2 #define GPG_INTERFACE_H
3
4 extern int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *signing_key);
5 -extern int verify_signed_buffer(const char *payload, size_t payload_size, const char *signature, size_t signature_size, struct strbuf *gpg_output);
5 +extern int verify_signed_buffer(const char *payload, size_t payload_size, const char *signature, size_t signature_size, struct strbuf *gpg_output, struct strbuf *gpg_status);
6 extern int git_gpg_config(const char *, const char *, void *);
7 extern void set_signing_key(const char *);
8 extern const char *get_signing_key(void);
log-tree.c
+2 -2
@@ -434,7 +434,7 @@ static void show_signature(struct rev_info *opt, struct commit *commit)
434
435 status = verify_signed_buffer(payload.buf, payload.len,
436 signature.buf, signature.len,
437 - &gpg_output);
437 + &gpg_output, NULL);
438 if (status && !gpg_output.len)
439 strbuf_addstr(&gpg_output, "No signature\n");
440
@@ -503,7 +503,7 @@ static void show_one_mergetag(struct rev_info *opt,
503 if (verify_signed_buffer(extra->value, payload_size,
504 extra->value + payload_size,
505 extra->len - payload_size,
506 - &verify_message)) {
506 + &verify_message, NULL)) {
507 if (verify_message.len <= gpg_message_offset)
508 strbuf_addstr(&verify_message, "No signature\n");
509 else
pretty.c
+1 -1
@@ -917,7 +917,7 @@ static void parse_commit_signature(struct format_commit_context *ctx)
917 goto out;
918 status = verify_signed_buffer(payload.buf, payload.len,
919 signature.buf, signature.len,
920 - &gpg_output);
920 + &gpg_output, NULL);
921 if (status && !gpg_output.len)
922 goto out;
923 ctx->signature.gpg_output = strbuf_detach(&gpg_output, NULL);