Browse Source
This is currently in connect.c, but really has nothing to do with the git protocol itself. Let's make a new source file all about prompting the user, which will make it cleaner to refactor. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
Jeff King
13 years ago
committed by
Junio C Hamano
7 changed files with 58 additions and 45 deletions
@ -0,0 +1,48 @@
@@ -0,0 +1,48 @@
|
||||
#include "cache.h" |
||||
#include "run-command.h" |
||||
#include "strbuf.h" |
||||
#include "prompt.h" |
||||
|
||||
char *git_getpass(const char *prompt) |
||||
{ |
||||
const char *askpass; |
||||
struct child_process pass; |
||||
const char *args[3]; |
||||
static struct strbuf buffer = STRBUF_INIT; |
||||
|
||||
askpass = getenv("GIT_ASKPASS"); |
||||
if (!askpass) |
||||
askpass = askpass_program; |
||||
if (!askpass) |
||||
askpass = getenv("SSH_ASKPASS"); |
||||
if (!askpass || !(*askpass)) { |
||||
char *result = getpass(prompt); |
||||
if (!result) |
||||
die_errno("Could not read password"); |
||||
return result; |
||||
} |
||||
|
||||
args[0] = askpass; |
||||
args[1] = prompt; |
||||
args[2] = NULL; |
||||
|
||||
memset(&pass, 0, sizeof(pass)); |
||||
pass.argv = args; |
||||
pass.out = -1; |
||||
|
||||
if (start_command(&pass)) |
||||
exit(1); |
||||
|
||||
strbuf_reset(&buffer); |
||||
if (strbuf_read(&buffer, pass.out, 20) < 0) |
||||
die("failed to read password from %s\n", askpass); |
||||
|
||||
close(pass.out); |
||||
|
||||
if (finish_command(&pass)) |
||||
exit(1); |
||||
|
||||
strbuf_setlen(&buffer, strcspn(buffer.buf, "\r\n")); |
||||
|
||||
return buffer.buf; |
||||
} |
Loading…
Reference in new issue