* command.c (cmd_updatestartuptty): New.
[gnupg.git] / agent / query.c
index cdf6ff2..d3b42a4 100644 (file)
@@ -51,7 +51,7 @@
 
 static ASSUAN_CONTEXT entry_ctx = NULL;
 #ifdef USE_GNU_PTH
-static pth_mutex_t entry_lock = PTH_MUTEX_INIT;
+static pth_mutex_t entry_lock;
 #endif
 
 /* data to be passed to our callbacks */
@@ -64,10 +64,29 @@ struct entry_parm_s {
 
 
 \f
+/* This function must be called once to initialize this module.  This
+   has to be done before a second thread is spawned.  We can't do the
+   static initialization because Pth emulation code might not be able
+   to do a static init; in particualr, it is not possible for W32. */
+void
+initialize_module_query (void)
+{
+#ifdef USE_GNU_PTH
+  static int initialized;
+
+  if (!initialized)
+    if (pth_mutex_init (&entry_lock))
+      initialized = 1;
+#endif /*USE_GNU_PTH*/
+}
+
+
+
+
 /* Unlock the pinentry so that another thread can start one and
    disconnect that pinentry - we do this after the unlock so that a
    stalled pinentry does not block other threads.  Fixme: We should
-   have a timeout in Assuan for the disconnetc operation. */
+   have a timeout in Assuan for the disconnect operation. */
 static int 
 unlock_pinentry (int rc)
 {
@@ -152,7 +171,7 @@ start_pinentry (CTRL ctrl)
     pgmname++;
 
   argv[0] = pgmname;
-  if (ctrl && ctrl->display && !opt.keep_display)
+  if (ctrl->display && !opt.keep_display)
     {
       argv[1] = "--display";
       argv[2] = ctrl->display;
@@ -189,7 +208,7 @@ start_pinentry (CTRL ctrl)
                         NULL, NULL, NULL, NULL, NULL, NULL);
   if (rc)
     return unlock_pinentry (map_assuan_err (rc));
-  if (ctrl && ctrl->ttyname)
+  if (ctrl->ttyname)
     {
       char *optstr;
       if (asprintf (&optstr, "OPTION ttyname=%s", ctrl->ttyname) < 0 )
@@ -200,7 +219,7 @@ start_pinentry (CTRL ctrl)
       if (rc)
        return unlock_pinentry (map_assuan_err (rc));
     }
-  if (ctrl && ctrl->ttytype)
+  if (ctrl->ttytype)
     {
       char *optstr;
       if (asprintf (&optstr, "OPTION ttytype=%s", ctrl->ttytype) < 0 )
@@ -210,7 +229,7 @@ start_pinentry (CTRL ctrl)
       if (rc)
        return unlock_pinentry (map_assuan_err (rc));
     }
-  if (ctrl && ctrl->lc_ctype)
+  if (ctrl->lc_ctype)
     {
       char *optstr;
       if (asprintf (&optstr, "OPTION lc-ctype=%s", ctrl->lc_ctype) < 0 )
@@ -220,7 +239,7 @@ start_pinentry (CTRL ctrl)
       if (rc)
        return unlock_pinentry (map_assuan_err (rc));
     }
-  if (ctrl && ctrl->lc_messages)
+  if (ctrl->lc_messages)
     {
       char *optstr;
       if (asprintf (&optstr, "OPTION lc-messages=%s", ctrl->lc_messages) < 0 )
@@ -269,8 +288,9 @@ all_digitsp( const char *s)
    number here and repeat it as long as we have invalid formed
    numbers. */
 int
-agent_askpin (CTRL ctrl,
-              const char *desc_text, const char *initial_errtext,
+agent_askpin (ctrl_t ctrl,
+              const char *desc_text, const char *prompt_text,
+              const char *initial_errtext,
               struct pin_entry_info_s *pininfo)
 {
   int rc;
@@ -291,7 +311,10 @@ agent_askpin (CTRL ctrl,
     desc_text = _("Please enter your passphrase, so that the secret key "
                   "can be unlocked for this session");
 
-  is_pin = desc_text && strstr (desc_text, "PIN");
+  if (prompt_text)
+    is_pin = !!strstr (prompt_text, "PIN");
+  else
+    is_pin = desc_text && strstr (desc_text, "PIN");
 
   rc = start_pinentry (ctrl);
   if (rc)
@@ -303,10 +326,10 @@ agent_askpin (CTRL ctrl,
   if (rc)
     return unlock_pinentry (map_assuan_err (rc));
 
-  rc = assuan_transact (entry_ctx,
-                        is_pin? "SETPROMPT PIN:"
-                              : "SETPROMPT Passphrase:",
-                        NULL, NULL, NULL, NULL, NULL, NULL);
+  snprintf (line, DIM(line)-1, "SETPROMPT %s",
+            prompt_text? prompt_text : is_pin? "PIN:" : "Passphrase:");
+  line[DIM(line)-1] = 0;
+  rc = assuan_transact (entry_ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
   if (rc)
     return unlock_pinentry (map_assuan_err (rc));