diff options
author | Marcus Brinkmann <[email protected]> | 2002-04-24 21:52:47 +0000 |
---|---|---|
committer | Marcus Brinkmann <[email protected]> | 2002-04-24 21:52:47 +0000 |
commit | ee6bb32a8bf9adb3d0a48b0d527cda594e49355a (patch) | |
tree | ff9c1c7939f01bd1cc8b0116b87c07235956200f /sm | |
parent | * certreqgen.c (gpgsm_genkey): Write status output on success. (diff) | |
download | gnupg-ee6bb32a8bf9adb3d0a48b0d527cda594e49355a.tar.gz gnupg-ee6bb32a8bf9adb3d0a48b0d527cda594e49355a.zip |
2002-04-24 Marcus Brinkmann <[email protected]>
* configure.ac: Check for locale.h.
agent/
2002-04-24 Marcus Brinkmann <[email protected]>
* agent.h (struct opt): Add members display, ttyname, ttytype,
lc_ctype, and lc_messages.
* gpg-agent.c (enum cmd_and_opt_values): Add oDisplay, oTTYname,
oTTYtype, oLCctype, and LCmessages.
(main): Handle these options.
* command.c (option_handler): New function.
(register_commands): Register option handler.
* query.c (start_pinentry): Pass the various display and tty
options to the pinentry.
sm/
2002-04-24 Marcus Brinkmann <[email protected]>
* gpgsm.h (struct opt): New members display, ttyname, ttytype,
lc_ctype, lc_messages.
* gpgsm.c (enum cmd_and_opt_values): New members oDisplay,
oTTYname, oTTYtype, oLCctype, oLCmessages.
(opts): New entries for these options.
(main): Handle these new options.
* call-agent.c (start_agent): Set the various display and tty
parameter after resetting.
Diffstat (limited to 'sm')
-rw-r--r-- | sm/ChangeLog | 11 | ||||
-rw-r--r-- | sm/call-agent.c | 99 | ||||
-rw-r--r-- | sm/gpgsm.c | 17 | ||||
-rw-r--r-- | sm/gpgsm.h | 6 |
4 files changed, 129 insertions, 4 deletions
diff --git a/sm/ChangeLog b/sm/ChangeLog index 240f18a16..69deb671f 100644 --- a/sm/ChangeLog +++ b/sm/ChangeLog @@ -1,3 +1,14 @@ +2002-04-24 Marcus Brinkmann <[email protected]> + + * gpgsm.h (struct opt): New members display, ttyname, ttytype, + lc_ctype, lc_messages. + * gpgsm.c (enum cmd_and_opt_values): New members oDisplay, + oTTYname, oTTYtype, oLCctype, oLCmessages. + (opts): New entries for these options. + (main): Handle these new options. + * call-agent.c (start_agent): Set the various display and tty + parameter after resetting. + 2002-04-18 Werner Koch <[email protected]> * certreqgen.c (gpgsm_genkey): Write status output on success. diff --git a/sm/call-agent.c b/sm/call-agent.c index a7e7a315b..0e0c60923 100644 --- a/sm/call-agent.c +++ b/sm/call-agent.c @@ -26,8 +26,10 @@ #include <unistd.h> #include <time.h> #include <assert.h> - #include <gcrypt.h> +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif #include "gpgsm.h" #include "../assuan/assuan.h" @@ -133,6 +135,11 @@ start_agent (void) int rc; char *infostr, *p; ASSUAN_CONTEXT ctx; + char *dft_display = NULL; + char *dft_ttyname = NULL; + char *dft_ttytype = NULL; + char *old_lc = NULL; + char *dft_lc = NULL; if (agent_ctx) return 0; /* fixme: We need a context for each thread or serialize @@ -144,9 +151,8 @@ start_agent (void) { const char *pgmname; const char *argv[3]; - log_info (_("no running gpg-agent - starting one\n")); - + if (fflush (NULL)) { log_error ("error flushing pending output: %s\n", strerror (errno)); @@ -204,7 +210,6 @@ start_agent (void) } } - if (rc) { log_error ("can't connect to the agent: %s\n", assuan_strerror (rc)); @@ -214,6 +219,92 @@ start_agent (void) if (DBG_AGENT) log_debug ("connection to agent established\n"); + + rc = assuan_transact (agent_ctx, "RESET", NULL, NULL, NULL, NULL, NULL, NULL); + if (rc) + return map_assuan_err (rc); + + dft_display = getenv ("DISPLAY"); + if (opt.display || dft_display) + { + char *optstr; + if (asprintf (&optstr, "OPTION display=%s", + opt.display ? opt.display : dft_display) < 0) + return GNUPG_Out_Of_Core; + rc = assuan_transact (agent_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + free (optstr); + if (rc) + return map_assuan_err (rc); + } + if (!opt.ttyname && ttyname (1)) + dft_ttyname = ttyname (1); + if (opt.ttyname || dft_ttyname) + { + char *optstr; + if (asprintf (&optstr, "OPTION ttyname=%s", + opt.ttyname ? opt.ttyname : dft_ttyname) < 0) + return GNUPG_Out_Of_Core; + rc = assuan_transact (agent_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + free (optstr); + if (rc) + return map_assuan_err (rc); + } + dft_ttytype = getenv ("TERM"); + if (!rc && (opt.ttytype || (dft_ttyname && dft_ttytype))) + { + char *optstr; + if (asprintf (&optstr, "OPTION ttytype=%s", + opt.ttyname ? opt.ttytype : dft_ttytype) < 0) + return GNUPG_Out_Of_Core; + rc = assuan_transact (agent_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + free (optstr); + if (rc) + return map_assuan_err (rc); + } +#ifdef LC_CTYPE + old_lc = setlocale (LC_CTYPE, NULL); + dft_lc = setlocale (LC_CTYPE, ""); +#endif + if (!rc && (opt.lc_ctype || (dft_ttyname && dft_lc))) + { + char *optstr; + if (asprintf (&optstr, "OPTION lc-ctype=%s", + opt.lc_ctype ? opt.lc_ctype : dft_lc) < 0) + return GNUPG_Out_Of_Core; + rc = assuan_transact (agent_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + free (optstr); + if (rc) + return map_assuan_err (rc); + } +#ifdef LC_CTYPE + if (old_lc) + setlocale (LC_CTYPE, old_lc); +#endif +#ifdef LC_MESSAGES + old_lc = setlocale (LC_MESSAGES, NULL); + dft_lc = setlocale (LC_MESSAGES, ""); +#endif + if (!rc && (opt.lc_messages || (dft_ttyname && dft_lc))) + { + char *optstr; + if (asprintf (&optstr, "OPTION lc-messages=%s", + opt.lc_messages ? opt.lc_messages : dft_lc) < 0) + return GNUPG_Out_Of_Core; + rc = assuan_transact (agent_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + free (optstr); + if (rc) + return map_assuan_err (rc); + } +#ifdef LC_MESSAGES + if (old_lc) + setlocale (LC_MESSAGES, old_lc); +#endif + return 0; } diff --git a/sm/gpgsm.c b/sm/gpgsm.c index 7d21f1c09..f755c02c7 100644 --- a/sm/gpgsm.c +++ b/sm/gpgsm.c @@ -83,7 +83,14 @@ enum cmd_and_opt_values { oDebugWait, oEnableSpecialFilenames, + oAgentProgram, + oDisplay, + oTTYname, + oTTYtype, + oLCctype, + oLCmessages, + oDirmngrProgram, @@ -340,6 +347,11 @@ static ARGPARSE_OPTS opts[] = { { oNoOptions, "no-options", 0, "@" }, /* shortcut for --options /dev/null */ { oHomedir, "homedir", 2, "@" }, /* defaults to "~/.gnupg" */ { oAgentProgram, "agent-program", 2 , "@" }, + { oDisplay, "display", 2, "@" }, + { oTTYname, "ttyname", 2, "@" }, + { oTTYtype, "ttytype", 2, "@" }, + { oLCctype, "lc-ctype", 2, "@" }, + { oLCmessages, "lc-messages", 2, "@" }, { oDirmngrProgram, "dirmngr-program", 2 , "@" }, { oNoBatch, "no-batch", 0, "@" }, @@ -842,6 +854,11 @@ main ( int argc, char **argv) case oNoOptions: break; /* no-options */ case oHomedir: opt.homedir = pargs.r.ret_str; break; case oAgentProgram: opt.agent_program = pargs.r.ret_str; break; + case oDisplay: opt.display = pargs.r.ret_str; break; + case oTTYname: opt.ttyname = pargs.r.ret_str; break; + case oTTYtype: opt.ttytype = pargs.r.ret_str; break; + case oLCctype: opt.lc_ctype = pargs.r.ret_str; break; + case oLCmessages: opt.lc_messages = pargs.r.ret_str; break; case oDirmngrProgram: opt.dirmngr_program = pargs.r.ret_str; break; case oNoDefKeyring: default_keyring = 0; break; diff --git a/sm/gpgsm.h b/sm/gpgsm.h index 9cba457dd..09a633d4c 100644 --- a/sm/gpgsm.h +++ b/sm/gpgsm.h @@ -39,6 +39,12 @@ struct { const char *homedir; /* configuration directory name */ const char *agent_program; + const char *display; + const char *ttyname; + const char *ttytype; + const char *lc_ctype; + const char *lc_messages; + const char *dirmngr_program; char *outfile; /* name of output file */ |