aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcus Brinkmann <[email protected]>2002-04-24 22:46:25 +0000
committerMarcus Brinkmann <[email protected]>2002-04-24 22:46:25 +0000
commitf5e05f759f7b61e43ce6354e5a2c030f360575e4 (patch)
tree650ef72b130fb427cec1b9437b5a2795f3407a89
parent2002-04-24 Marcus Brinkmann <[email protected]> (diff)
downloadgpgme-f5e05f759f7b61e43ce6354e5a2c030f360575e4.tar.gz
gpgme-f5e05f759f7b61e43ce6354e5a2c030f360575e4.zip
2002-04-25 Marcus Brinkmann <[email protected]>
* engine-gpgsm.c (_gpgme_gpgsm_new): Set the display, ttyname, ttytype, lc_ctype and lc_messages options in the server.
-rw-r--r--gpgme/ChangeLog5
-rw-r--r--gpgme/engine-gpgsm.c307
2 files changed, 211 insertions, 101 deletions
diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog
index 5517fd89..0761eced 100644
--- a/gpgme/ChangeLog
+++ b/gpgme/ChangeLog
@@ -1,3 +1,8 @@
+2002-04-25 Marcus Brinkmann <[email protected]>
+
+ * engine-gpgsm.c (_gpgme_gpgsm_new): Set the display, ttyname,
+ ttytype, lc_ctype and lc_messages options in the server.
+
2002-04-24 Marcus Brinkmann <[email protected]>
* engine-gpgsm.c (map_assuan_error): Add new error codes.
diff --git a/gpgme/engine-gpgsm.c b/gpgme/engine-gpgsm.c
index e97a8a59..f2584a08 100644
--- a/gpgme/engine-gpgsm.c
+++ b/gpgme/engine-gpgsm.c
@@ -34,6 +34,8 @@
#include <string.h>
#include <sys/types.h>
#include <assert.h>
+#include <unistd.h>
+#include <locale.h>
#include <fcntl.h> /* FIXME */
#include "rungpg.h"
@@ -130,14 +132,119 @@ close_notify_handler (int fd, void *opaque)
}
+static GpgmeError
+map_assuan_error (AssuanError err)
+{
+ switch (err)
+ {
+ case ASSUAN_No_Error:
+ return mk_error (No_Error);
+ case ASSUAN_General_Error:
+ return mk_error (General_Error);
+ case ASSUAN_Out_Of_Core:
+ return mk_error (Out_Of_Core);
+ case ASSUAN_Invalid_Value:
+ return mk_error (Invalid_Value);
+ case ASSUAN_Read_Error:
+ return mk_error (Read_Error);
+ case ASSUAN_Write_Error:
+ return mk_error (Write_Error);
+
+ case ASSUAN_Timeout:
+ case ASSUAN_Problem_Starting_Server:
+ case ASSUAN_Not_A_Server:
+ case ASSUAN_Not_A_Client:
+ case ASSUAN_Nested_Commands:
+ case ASSUAN_Invalid_Response:
+ case ASSUAN_No_Data_Callback:
+ case ASSUAN_No_Inquire_Callback:
+ case ASSUAN_Connect_Failed:
+ case ASSUAN_Accept_Failed:
+ return mk_error (General_Error);
+
+ /* The following error codes are meant as status codes. */
+ case ASSUAN_Not_Implemented:
+ return mk_error (Not_Implemented);
+ case ASSUAN_Canceled:
+ return mk_error (Canceled);
+ case ASSUAN_Unsupported_Algorithm:
+ return mk_error (Not_Implemented); /* XXX Argh. */
+
+ /* These are errors internal to GPGME. */
+ case ASSUAN_No_Data_Available:
+ case ASSUAN_No_Input:
+ case ASSUAN_No_Output:
+ case ASSUAN_Invalid_Command:
+ case ASSUAN_Unknown_Command:
+ case ASSUAN_Syntax_Error:
+ case ASSUAN_Parameter_Error:
+ case ASSUAN_Parameter_Conflict:
+ case ASSUAN_Line_Too_Long:
+ case ASSUAN_Line_Not_Terminated:
+ case ASSUAN_Invalid_Data:
+ case ASSUAN_Unexpected_Command:
+ case ASSUAN_Too_Much_Data:
+ case ASSUAN_Inquire_Unknown:
+ case ASSUAN_Inquire_Error:
+ case ASSUAN_Invalid_Option:
+ case ASSUAN_Invalid_Index:
+ case ASSUAN_Unexpected_Status:
+ case ASSUAN_Unexpected_Data:
+ case ASSUAN_Invalid_Status:
+ case ASSUAN_Not_Confirmed:
+ return mk_error (General_Error);
+
+ /* These are errors in the server. */
+ case ASSUAN_Server_Fault:
+ case ASSUAN_Server_Resource_Problem:
+ case ASSUAN_Server_IO_Error:
+ case ASSUAN_Server_Bug:
+ case ASSUAN_No_Agent:
+ case ASSUAN_Agent_Error:
+ return mk_error (Invalid_Engine); /* XXX: Need something more useful. */
+
+ case ASSUAN_Bad_Certificate:
+ case ASSUAN_Bad_Certificate_Path:
+ case ASSUAN_Missing_Certificate:
+ case ASSUAN_No_Public_Key:
+ case ASSUAN_No_Secret_Key:
+ case ASSUAN_Invalid_Name:
+ case ASSUAN_Card_Error: /* XXX: Oh well. */
+ case ASSUAN_Invalid_Card: /* XXX: Oh well. */
+ case ASSUAN_No_PKCS15_App: /* XXX: Oh well. */
+ case ASSUAN_Card_Not_Present: /* XXX: Oh well. */
+ case ASSUAN_Invalid_Id: /* XXX: Oh well. */
+ return mk_error (Invalid_Key);
+
+ case ASSUAN_Bad_Signature:
+ return mk_error (Invalid_Key); /* XXX: This is wrong. */
+
+ case ASSUAN_Cert_Revoked:
+ case ASSUAN_No_CRL_For_Cert:
+ case ASSUAN_CRL_Too_Old:
+ case ASSUAN_Not_Trusted:
+ return mk_error (Invalid_Key); /* XXX Some more details would be good. */
+
+ default:
+ return mk_error (General_Error);
+ }
+}
+
+
GpgmeError
_gpgme_gpgsm_new (GpgsmObject *r_gpgsm)
{
GpgmeError err = 0;
GpgsmObject gpgsm;
- char *argv[] = { "gpgsm", "--server", NULL };
+ char *argv[3];
int fds[2];
int child_fds[4];
+ char *dft_display = NULL;
+ char *dft_ttyname = NULL;
+ char *dft_ttytype = NULL;
+ char *old_lc = NULL;
+ char *dft_lc = NULL;
+ char *optstr;
*r_gpgsm = NULL;
gpgsm = xtrycalloc (1, sizeof *gpgsm);
@@ -188,9 +295,106 @@ _gpgme_gpgsm_new (GpgsmObject *r_gpgsm)
child_fds[1] = gpgsm->output_fd_server;
child_fds[2] = gpgsm->message_fd_server;
child_fds[3] = -1;
+
+ argv[0] = "gpgsm";
+ argv[1] = "--server";
+ argv[2] = NULL;
+
err = assuan_pipe_connect (&gpgsm->assuan_ctx,
_gpgme_get_gpgsm_path (), argv, child_fds);
+ dft_display = getenv ("DISPLAY");
+ if (dft_display)
+ {
+ if (asprintf (&optstr, "OPTION display=%s", dft_display) < 0)
+ {
+ err = mk_error (Out_Of_Core);
+ goto leave;
+ }
+ err = assuan_transact (gpgsm->assuan_ctx, optstr, NULL, NULL, NULL, NULL, NULL,
+ NULL);
+ free (optstr);
+ if (err)
+ {
+ err = map_assuan_error (err);
+ goto leave;
+ }
+ }
+ dft_ttyname = ttyname (1);
+ if (dft_ttyname)
+ {
+ if (asprintf (&optstr, "OPTION ttyname=%s", dft_ttyname) < 0)
+ {
+ err = mk_error (Out_Of_Core);
+ goto leave;
+ }
+ err = assuan_transact (gpgsm->assuan_ctx, optstr, NULL, NULL, NULL, NULL, NULL,
+ NULL);
+ free (optstr);
+ if (err)
+ {
+ err = map_assuan_error (err);
+ goto leave;
+ }
+
+ dft_ttytype = getenv ("TERM");
+ if (dft_ttytype)
+ {
+ if (asprintf (&optstr, "OPTION ttytype=%s", dft_ttytype) < 0)
+ {
+ err = mk_error (Out_Of_Core);
+ goto leave;
+ }
+ err = assuan_transact (gpgsm->assuan_ctx, optstr, NULL, NULL, NULL, NULL, NULL,
+ NULL);
+ free (optstr);
+ if (err)
+ {
+ err = map_assuan_error (err);
+ goto leave;
+ }
+ }
+ old_lc = setlocale (LC_CTYPE, NULL);
+ dft_lc = setlocale (LC_CTYPE, "");
+ if (dft_lc)
+ {
+ if (asprintf (&optstr, "OPTION lc-ctype=%s", dft_lc) < 0)
+ err = mk_error (Out_Of_Core);
+ else
+ {
+ err = assuan_transact (gpgsm->assuan_ctx, optstr, NULL, NULL, NULL, NULL, NULL,
+ NULL);
+ free (optstr);
+ if (err)
+ err = map_assuan_error (err);
+ }
+ }
+ if (old_lc)
+ setlocale (LC_CTYPE, old_lc);
+ if (err)
+ goto leave;
+
+ old_lc = setlocale (LC_MESSAGES, NULL);
+ dft_lc = setlocale (LC_MESSAGES, "");
+ if (dft_lc)
+ {
+ if (asprintf (&optstr, "OPTION lc-messages=%s", dft_lc) < 0)
+ err = mk_error (Out_Of_Core);
+ else
+ {
+ err = assuan_transact (gpgsm->assuan_ctx, optstr, NULL, NULL, NULL, NULL, NULL,
+ NULL);
+ free (optstr);
+ if (err)
+ err = map_assuan_error (err);
+ }
+ }
+ if (old_lc)
+ setlocale (LC_MESSAGES, old_lc);
+ if (err)
+ goto leave;
+ }
+
if (!err &&
(_gpgme_io_set_close_notify (gpgsm->input_fd,
close_notify_handler, gpgsm)
@@ -250,105 +454,6 @@ _gpgme_gpgsm_release (GpgsmObject gpgsm)
static GpgmeError
-map_assuan_error (AssuanError err)
-{
- switch (err)
- {
- case ASSUAN_No_Error:
- return mk_error (No_Error);
- case ASSUAN_General_Error:
- return mk_error (General_Error);
- case ASSUAN_Out_Of_Core:
- return mk_error (Out_Of_Core);
- case ASSUAN_Invalid_Value:
- return mk_error (Invalid_Value);
- case ASSUAN_Read_Error:
- return mk_error (Read_Error);
- case ASSUAN_Write_Error:
- return mk_error (Write_Error);
-
- case ASSUAN_Timeout:
- case ASSUAN_Problem_Starting_Server:
- case ASSUAN_Not_A_Server:
- case ASSUAN_Not_A_Client:
- case ASSUAN_Nested_Commands:
- case ASSUAN_Invalid_Response:
- case ASSUAN_No_Data_Callback:
- case ASSUAN_No_Inquire_Callback:
- case ASSUAN_Connect_Failed:
- case ASSUAN_Accept_Failed:
- return mk_error (General_Error);
-
- /* The following error codes are meant as status codes. */
- case ASSUAN_Not_Implemented:
- return mk_error (Not_Implemented);
- case ASSUAN_Canceled:
- return mk_error (Canceled);
- case ASSUAN_Unsupported_Algorithm:
- return mk_error (Not_Implemented); /* XXX Argh. */
-
- /* These are errors internal to GPGME. */
- case ASSUAN_No_Data_Available:
- case ASSUAN_No_Input:
- case ASSUAN_No_Output:
- case ASSUAN_Invalid_Command:
- case ASSUAN_Unknown_Command:
- case ASSUAN_Syntax_Error:
- case ASSUAN_Parameter_Error:
- case ASSUAN_Parameter_Conflict:
- case ASSUAN_Line_Too_Long:
- case ASSUAN_Line_Not_Terminated:
- case ASSUAN_Invalid_Data:
- case ASSUAN_Unexpected_Command:
- case ASSUAN_Too_Much_Data:
- case ASSUAN_Inquire_Unknown:
- case ASSUAN_Inquire_Error:
- case ASSUAN_Invalid_Option:
- case ASSUAN_Invalid_Index:
- case ASSUAN_Unexpected_Status:
- case ASSUAN_Unexpected_Data:
- case ASSUAN_Invalid_Status:
- case ASSUAN_Not_Confirmed:
- return mk_error (General_Error);
-
- /* These are errors in the server. */
- case ASSUAN_Server_Fault:
- case ASSUAN_Server_Resource_Problem:
- case ASSUAN_Server_IO_Error:
- case ASSUAN_Server_Bug:
- case ASSUAN_No_Agent:
- case ASSUAN_Agent_Error:
- return mk_error (Invalid_Engine); /* XXX: Need something more useful. */
-
- case ASSUAN_Bad_Certificate:
- case ASSUAN_Bad_Certificate_Path:
- case ASSUAN_Missing_Certificate:
- case ASSUAN_No_Public_Key:
- case ASSUAN_No_Secret_Key:
- case ASSUAN_Invalid_Name:
- case ASSUAN_Card_Error: /* XXX: Oh well. */
- case ASSUAN_Invalid_Card: /* XXX: Oh well. */
- case ASSUAN_No_PKCS15_App: /* XXX: Oh well. */
- case ASSUAN_Card_Not_Present: /* XXX: Oh well. */
- case ASSUAN_Invalid_Id: /* XXX: Oh well. */
- return mk_error(Invalid_Key);
-
- case ASSUAN_Bad_Signature:
- return mk_error(Invalid_Key); /* XXX: This is wrong. */
-
- case ASSUAN_Cert_Revoked:
- case ASSUAN_No_CRL_For_Cert:
- case ASSUAN_CRL_Too_Old:
- case ASSUAN_Not_Trusted:
- return mk_error(Invalid_Key); /* XXX Some more details would be good. */
-
- default:
- return mk_error (General_Error);
- }
-}
-
-
-static GpgmeError
gpgsm_assuan_simple_command (ASSUAN_CONTEXT ctx, char *cmd)
{
AssuanError err;
@@ -456,7 +561,7 @@ gpgsm_set_recipients (GpgsmObject gpgsm, GpgmeRecipients recp)
if (! newline)
{
xfree (line);
- return mk_error(Out_Of_Core);
+ return mk_error (Out_Of_Core);
}
line = newline;
linelen = newlen;