gpgconf: Add access to --list-dirs for non-default engine.
[gpgme.git] / src / engine-g13.c
index 75154ca..f8f3178 100644 (file)
@@ -212,7 +212,8 @@ g13_release (void *engine)
 
 
 static gpgme_error_t
-g13_new (void **engine, const char *file_name, const char *home_dir)
+g13_new (void **engine, const char *file_name, const char *home_dir,
+         const char *version)
 {
   gpgme_error_t err = 0;
   engine_g13_t g13;
@@ -221,9 +222,12 @@ g13_new (void **engine, const char *file_name, const char *home_dir)
   const char *argv[5];
   char *dft_display = NULL;
   char dft_ttyname[64];
+  char *env_tty = NULL;
   char *dft_ttytype = NULL;
   char *optstr;
 
+  (void)version; /* Not yet used.  */
+
   g13 = calloc (1, sizeof *g13);
   if (!g13)
     return gpg_error_from_syserror ();
@@ -266,7 +270,7 @@ g13_new (void **engine, const char *file_name, const char *home_dir)
     goto leave;
   if (dft_display)
     {
-      if (asprintf (&optstr, "OPTION display=%s", dft_display) < 0)
+      if (gpgrt_asprintf (&optstr, "OPTION display=%s", dft_display) < 0)
         {
          free (dft_display);
          err = gpg_error_from_syserror ();
@@ -276,31 +280,38 @@ g13_new (void **engine, const char *file_name, const char *home_dir)
 
       err = assuan_transact (g13->assuan_ctx, optstr, NULL, NULL, NULL,
                             NULL, NULL, NULL);
-      free (optstr);
+      gpgrt_free (optstr);
       if (err)
        goto leave;
     }
 
-  if (isatty (1))
+  err = _gpgme_getenv ("GPG_TTY", &env_tty);
+  if (isatty (1) || env_tty || err)
     {
-      int rc;
+      int rc = 0;
 
-      rc = ttyname_r (1, dft_ttyname, sizeof (dft_ttyname));
-      if (rc)
-       {
-         err = gpg_error_from_errno (rc);
-         goto leave;
-       }
+      if (err)
+        goto leave;
+      else if (env_tty)
+        {
+          snprintf (dft_ttyname, sizeof (dft_ttyname), "%s", env_tty);
+          free (env_tty);
+        }
       else
+        rc = ttyname_r (1, dft_ttyname, sizeof (dft_ttyname));
+
+      /* Even though isatty() returns 1, ttyname_r() may fail in many
+        ways, e.g., when /dev/pts is not accessible under chroot.  */
+      if (!rc)
        {
-         if (asprintf (&optstr, "OPTION ttyname=%s", dft_ttyname) < 0)
+         if (gpgrt_asprintf (&optstr, "OPTION ttyname=%s", dft_ttyname) < 0)
            {
              err = gpg_error_from_syserror ();
              goto leave;
            }
          err = assuan_transact (g13->assuan_ctx, optstr, NULL, NULL, NULL,
                                 NULL, NULL, NULL);
-         free (optstr);
+         gpgrt_free (optstr);
          if (err)
            goto leave;
 
@@ -309,7 +320,7 @@ g13_new (void **engine, const char *file_name, const char *home_dir)
            goto leave;
          if (dft_ttytype)
            {
-             if (asprintf (&optstr, "OPTION ttytype=%s", dft_ttytype) < 0)
+             if (gpgrt_asprintf (&optstr, "OPTION ttytype=%s", dft_ttytype)< 0)
                {
                  free (dft_ttytype);
                  err = gpg_error_from_syserror ();
@@ -319,7 +330,7 @@ g13_new (void **engine, const char *file_name, const char *home_dir)
 
              err = assuan_transact (g13->assuan_ctx, optstr, NULL, NULL,
                                     NULL, NULL, NULL, NULL);
-             free (optstr);
+             gpgrt_free (optstr);
              if (err)
                goto leave;
            }
@@ -355,7 +366,7 @@ g13_set_locale (void *engine, int category, const char *value)
   engine_g13_t g13 = engine;
   gpgme_error_t err;
   char *optstr;
-  char *catstr;
+  const char *catstr;
 
   /* FIXME: If value is NULL, we need to reset the option to default.
      But we can't do this.  So we error out here.  G13 needs support
@@ -389,13 +400,13 @@ g13_set_locale (void *engine, int category, const char *value)
   if (!value)
     return 0;
 
-  if (asprintf (&optstr, "OPTION %s=%s", catstr, value) < 0)
+  if (gpgrt_asprintf (&optstr, "OPTION %s=%s", catstr, value) < 0)
     err = gpg_error_from_syserror ();
   else
     {
       err = assuan_transact (g13->assuan_ctx, optstr, NULL, NULL,
                             NULL, NULL, NULL, NULL);
-      free (optstr);
+      gpgrt_free (optstr);
     }
 
   return err;
@@ -404,7 +415,7 @@ g13_set_locale (void *engine, int category, const char *value)
 
 #if USE_DESCRIPTOR_PASSING
 static gpgme_error_t
-g13_assuan_simple_command (assuan_context_t ctx, char *cmd,
+g13_assuan_simple_command (assuan_context_t ctx, const char *cmd,
                           engine_status_handler_t status_fnc,
                           void *status_fnc_value)
 {
@@ -412,6 +423,9 @@ g13_assuan_simple_command (assuan_context_t ctx, char *cmd,
   char *line;
   size_t linelen;
 
+  (void)status_fnc;
+  (void)status_fnc_value;
+
   err = assuan_write_line (ctx, cmd);
   if (err)
     return err;
@@ -770,13 +784,13 @@ struct engine_ops _gpgme_engine_ops_g13 =
 #else
     NULL,                      /* reset */
 #endif
+    NULL,               /* set_status_cb */
     NULL,               /* set_status_handler */
     NULL,              /* set_command_handler */
     NULL,               /* set_colon_line_handler */
     g13_set_locale,
     NULL,              /* set_protocol */
     NULL,               /* decrypt */
-    NULL,               /* decrypt_verify */
     NULL,               /* delete */
     NULL,              /* edit */
     NULL,               /* encrypt */
@@ -787,6 +801,9 @@ struct engine_ops _gpgme_engine_ops_g13 =
     NULL,               /* import */
     NULL,               /* keylist */
     NULL,               /* keylist_ext */
+    NULL,               /* keylist_data */
+    NULL,               /* keysign */
+    NULL,               /* tofu_policy */
     NULL,               /* sign */
     NULL,              /* trustlist */
     NULL,               /* verify */
@@ -794,10 +811,13 @@ struct engine_ops _gpgme_engine_ops_g13 =
     g13_transact,
     NULL,              /* conf_load */
     NULL,              /* conf_save */
+    NULL,              /* conf_dir */
+    NULL,               /* query_swdb */
     g13_set_io_cbs,
     g13_io_event,
     g13_cancel,
     g13_cancel_op,
     NULL,               /* passwd */
-    NULL                /* set_pinentry_mode */
+    NULL,               /* set_pinentry_mode */
+    NULL                /* opspawn */
   };