* gnome3/pinentry-gnome3.c (gcr_system_prompt_available): new function tests whether it is possible to create a GcrSystemPrompt; (main): use gcr_system_prompt_available() to decide whether to fall back to curses or not.
Debian-bug-id: 842015 Signed-off-by: Daniel Kahn Gillmor <d...@fifthhorseman.net> --- gnome3/pinentry-gnome3.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/gnome3/pinentry-gnome3.c b/gnome3/pinentry-gnome3.c index d6d7d16..37c7a44 100644 --- a/gnome3/pinentry-gnome3.c +++ b/gnome3/pinentry-gnome3.c @@ -258,6 +258,39 @@ gnome3_cmd_handler (pinentry_t pe) pinentry_cmd_handler_t pinentry_cmd_handler = gnome3_cmd_handler; + +/* test whether we can create a system prompt or not. This briefly + does create a system prompt, which blocks other tools from making + the same concurrent request, so we just create it to test if it is + available, and quickly close it. +*/ +int gcr_system_prompt_available () +{ + GcrSystemPrompt *prompt; + GError *error = NULL; + int ret = 0; + + prompt = gcr_system_prompt_open (0, NULL, &error); + if (prompt) + { + ret = 1; + if (!gcr_system_prompt_close (prompt, NULL, &error)) + fprintf (stderr, "failed to close test Gcr System Prompt (%d): %s\n", + error ? error->code : -1, error ? error->message : "<no GError>"); + g_clear_object (&prompt); + } + else + /* This one particular failure is OK; we're clearly capable of + making a system prompt, even though someone else has the + system prompter right now: */ + if (error && error->code == GCR_SYSTEM_PROMPT_IN_PROGRESS) + ret = 1; + + if (error) + g_error_free (error); + return ret; +} + int main (int argc, char *argv[]) { @@ -270,6 +303,12 @@ main (int argc, char *argv[]) " falling back to curses\n"); pinentry_cmd_handler = curses_cmd_handler; } + else if (!gcr_system_prompt_available ()) + { + fprintf (stderr, "No Gcr System Prompter available," + " falling back to curses\n"); + pinentry_cmd_handler = curses_cmd_handler; + } #endif pinentry_parse_opts (argc, argv); -- 2.10.1