Release 1.9.0
[gpgme.git] / src / passphrase.c
index 7e5508e..74d235c 100644 (file)
@@ -41,6 +41,7 @@ typedef struct
   char *uid_hint;
   char *passphrase_info;
   int bad_passphrase;
+  char *maxlen;
 } *op_data_t;
 
 
@@ -53,6 +54,7 @@ release_op_data (void *hook)
     free (opd->passphrase_info);
   if (opd->uid_hint)
     free (opd->uid_hint);
+  free (opd->maxlen);
 }
 
 \f
@@ -73,11 +75,16 @@ _gpgme_passphrase_status_handler (void *priv, gpgme_status_code_t code,
 
   switch (code)
     {
+    case GPGME_STATUS_INQUIRE_MAXLEN:
+      free (opd->maxlen);
+      if (!(opd->maxlen = strdup (args)))
+        return gpg_error_from_syserror ();
+      break;
     case GPGME_STATUS_USERID_HINT:
       if (opd->uid_hint)
        free (opd->uid_hint);
       if (!(opd->uid_hint = strdup (args)))
-      return gpg_error_from_errno (errno);
+        return gpg_error_from_syserror ();
       break;
 
     case GPGME_STATUS_BAD_PASSPHRASE:
@@ -97,7 +104,7 @@ _gpgme_passphrase_status_handler (void *priv, gpgme_status_code_t code,
        free (opd->passphrase_info);
       opd->passphrase_info = strdup (args);
       if (!opd->passphrase_info)
-       return gpg_error_from_errno (errno);
+       return gpg_error_from_syserror ();
       break;
 
     case GPGME_STATUS_MISSING_PASSPHRASE:
@@ -109,6 +116,29 @@ _gpgme_passphrase_status_handler (void *priv, gpgme_status_code_t code,
        return gpg_error (GPG_ERR_BAD_PASSPHRASE);
       break;
 
+    case GPGME_STATUS_ERROR:
+      /* We abuse this status handler to forward ERROR status codes to
+         the caller.  */
+      if (ctx->status_cb && !ctx->full_status)
+        {
+          err = ctx->status_cb (ctx->status_cb_value, "ERROR", args);
+          if (err)
+            return err;
+        }
+      break;
+
+    case GPGME_STATUS_FAILURE:
+      /* We abuse this status handler to forward FAILURE status codes
+         to the caller.  */
+      if (ctx->status_cb && !ctx->full_status)
+        {
+          err = ctx->status_cb (ctx->status_cb_value, "FAILURE", args);
+          if (err)
+            return err;
+        }
+      break;
+
+
     default:
       /* Ignore all other codes.  */
       break;
@@ -141,9 +171,15 @@ _gpgme_passphrase_command_handler (void *priv, gpgme_status_code_t code,
       if (processed)
        *processed = 1;
 
-      err = ctx->passphrase_cb (ctx->passphrase_cb_value,
-                               opd->uid_hint, opd->passphrase_info,
-                               opd->bad_passphrase, fd);
+      /* Fake a status line to to convey the MAXLEN info.  */
+      if (ctx->status_cb && opd->maxlen)
+        err = ctx->status_cb (ctx->status_cb_value, "INQUIRE_MAXLEN",
+                              opd->maxlen);
+
+      if (!err)
+        err = ctx->passphrase_cb (ctx->passphrase_cb_value,
+                                  opd->uid_hint, opd->passphrase_info,
+                                  opd->bad_passphrase, fd);
 
       /* Reset bad passphrase flag, in case it is correct now.  */
       opd->bad_passphrase = 0;