core: Make sure FD_SET is not used with an out of range fd.
[gpgme.git] / src / engine-g13.c
index b97e0b4..8f24f4c 100644 (file)
@@ -107,7 +107,7 @@ g13_get_version (const char *file_name)
 static const char *
 g13_get_req_version (void)
 {
-  return NEED_G13_VERSION;
+  return "2.1.0";
 }
 
 \f
@@ -216,6 +216,7 @@ g13_new (void **engine, const char *file_name, const char *home_dir)
 {
   gpgme_error_t err = 0;
   engine_g13_t g13;
+  const char *pgmname;
   int argc;
   const char *argv[5];
   char *dft_display = NULL;
@@ -232,8 +233,9 @@ g13_new (void **engine, const char *file_name, const char *home_dir)
   g13->status_cb.tag = 0;
   g13->status_cb.data = g13;
 
+  pgmname = file_name ? file_name : _gpgme_get_default_g13_name ();
   argc = 0;
-  argv[argc++] = "g13";
+  argv[argc++] = _gpgme_get_basename (pgmname);
   if (home_dir)
     {
       argv[argc++] = "--homedir";
@@ -250,13 +252,11 @@ g13_new (void **engine, const char *file_name, const char *home_dir)
   assuan_ctx_set_system_hooks (g13->assuan_ctx, &_gpgme_assuan_system_hooks);
 
 #if USE_DESCRIPTOR_PASSING
-  err = assuan_pipe_connect
-    (g13->assuan_ctx, file_name ? file_name : _gpgme_get_default_g13_name (),
-     argv, NULL, NULL, NULL, ASSUAN_PIPE_CONNECT_FDPASSING);
+  err = assuan_pipe_connect (g13->assuan_ctx, pgmname, argv,
+                             NULL, NULL, NULL, ASSUAN_PIPE_CONNECT_FDPASSING);
 #else
-  err = assuan_pipe_connect
-    (g13->assuan_ctx, file_name ? file_name : _gpgme_get_default_g13_name (),
-     argv, NULL, NULL, NULL, 0);
+  err = assuan_pipe_connect (g13->assuan_ctx, pgmname, argv,
+                             NULL, NULL, NULL, 0);
 #endif
   if (err)
     goto leave;
@@ -286,12 +286,10 @@ g13_new (void **engine, const char *file_name, const char *home_dir)
       int rc;
 
       rc = ttyname_r (1, dft_ttyname, sizeof (dft_ttyname));
-      if (rc)
-       {
-         err = gpg_error_from_errno (rc);
-         goto leave;
-       }
-      else
+
+      /* 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)
            {
@@ -770,6 +768,7 @@ 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 */
@@ -799,5 +798,6 @@ struct engine_ops _gpgme_engine_ops_g13 =
     g13_cancel,
     g13_cancel_op,
     NULL,               /* passwd */
-    NULL                /* set_pinentry_mode */
+    NULL,               /* set_pinentry_mode */
+    NULL                /* opspawn */
   };