drop mem_alloc and mem_free, use my own hand crafted optmized macros that
[apps/madmutt.git] / pgp.c
diff --git a/pgp.c b/pgp.c
index 5580c69..4603a94 100644 (file)
--- a/pgp.c
+++ b/pgp.c
@@ -21,6 +21,8 @@
 # include "config.h"
 #endif
 
+#include <lib-lib/mem.h>
+
 #include "mutt.h"
 #include "enter.h"
 #include "ascii.h"
@@ -109,14 +111,8 @@ int pgp_use_gpg_agent (void) {
   if (!option (OPTUSEGPGAGENT) || !getenv ("GPG_AGENT_INFO"))
     return 0;
 
-  if ((tty = ttyname(0))) {
-    char tmp[SHORT_STRING];
-    snprintf (tmp, sizeof (tmp), "GPG_TTY=%s", tty);
-    putenv (tmp);
-#if 0
-    setenv("GPG_TTY", tty, 0);
-#endif
-  }
+  if ((tty = ttyname(0)))
+    setenv ("GPG_TTY", tty, 0);
 
   return 1;
 }
@@ -167,7 +163,7 @@ static int pgp_copy_checksig (FILE * fpin, FILE * fpout)
       fputs (line, fpout);
       fputc ('\n', fpout);
     }
-    mem_free (&line);
+    p_delete(&line);
   }
   else {
     debug_print (2, ("No pattern.\n"));
@@ -239,11 +235,13 @@ static void pgp_copy_clearsigned (FILE * fpin, STATE * s, char *charset)
 
 int pgp_application_pgp_handler (BODY * m, STATE * s)
 {
+  int could_not_decrypt = 0;
   int needpass = -1, pgp_keyblock = 0;
   int c = 1;
   int clearsign = 0, rv, rc;
   long start_pos = 0;
-  long bytes, last_pos, offset;
+  long bytes;
+  off_t last_pos, offset;
   char buf[HUGE_STRING];
   char outfile[_POSIX_PATH_MAX];
   char tmpfname[_POSIX_PATH_MAX];
@@ -260,14 +258,14 @@ int pgp_application_pgp_handler (BODY * m, STATE * s)
 
   rc = 0;                       /* silence false compiler warning if (s->flags & M_DISPLAY) */
 
-  fseek (s->fpin, m->offset, 0);
+  fseeko (s->fpin, m->offset, 0);
   last_pos = m->offset;
 
   for (bytes = m->length; bytes > 0;) {
     if (fgets (buf, sizeof (buf), s->fpin) == NULL)
       break;
 
-    offset = ftell (s->fpin);
+    offset = ftello (s->fpin);
     bytes -= (offset - last_pos);       /* don't rely on str_len(buf) */
     last_pos = offset;
 
@@ -305,7 +303,7 @@ int pgp_application_pgp_handler (BODY * m, STATE * s)
 
       fputs (buf, tmpfp);
       while (bytes > 0 && fgets (buf, sizeof (buf) - 1, s->fpin) != NULL) {
-        offset = ftell (s->fpin);
+        offset = ftello (s->fpin);
         bytes -= (offset - last_pos);   /* don't rely on str_len(buf) */
         last_pos = offset;
 
@@ -381,17 +379,22 @@ int pgp_application_pgp_handler (BODY * m, STATE * s)
         }
 
         /* treat empty result as sign of failure */
+        /* TODO: maybe on failure mutt should include the original undecoded text. */
         if (pgpout) {
           rewind (pgpout);
           c = fgetc (pgpout);
           ungetc (c, pgpout);
         }
         if (!clearsign && (!pgpout || c == EOF)) {
-            mutt_error _("Could not decrypt PGP message");
-            mutt_sleep (1);
-            pgp_void_passphrase ();
-            rc = -1;
-            goto out;
+          could_not_decrypt = 1;
+          pgp_void_passphrase ();
+        }
+
+        if (could_not_decrypt && !(s->flags & M_DISPLAY)) {
+          mutt_error _("Could not decrypt PGP message");
+          mutt_sleep (1);
+          rc = -1;
+          goto out;
         }
       }
 
@@ -431,7 +434,10 @@ int pgp_application_pgp_handler (BODY * m, STATE * s)
         state_putc ('\n', s);
         if (needpass) {
           state_attach_puts (_("[-- END PGP MESSAGE --]\n"), s);
-          mutt_message _("PGP message successfully decrypted.");
+          if (could_not_decrypt)
+            mutt_error _("Could not decrypt PGP message.");
+          else
+            mutt_message _("PGP message successfully decrypted.");
         }
         else if (pgp_keyblock)
           state_attach_puts (_("[-- END PGP PUBLIC KEY BLOCK --]\n"), s);
@@ -567,7 +573,7 @@ int pgp_verify_one (BODY * sigbdy, STATE * s, const char *tempfile)
     return -1;
   }
 
-  fseek (s->fpin, sigbdy->offset, 0);
+  fseeko (s->fpin, sigbdy->offset, 0);
   mutt_copy_bytes (s->fpin, fp, sigbdy->length);
   fclose (fp);
 
@@ -749,7 +755,7 @@ BODY *pgp_decrypt_part (BODY * a, STATE * s, FILE * fpout, BODY * p)
    * the temporary file.
    */
 
-  fseek (s->fpin, a->offset, 0);
+  fseeko (s->fpin, a->offset, 0);
   mutt_copy_bytes (s->fpin, pgptmp, a->length);
   fclose (pgptmp);
 
@@ -1138,7 +1144,7 @@ char *pgp_findKeys (ADDRESS * to, ADDRESS * cc, ADDRESS * bcc)
           k_info = pgp_getkeybystr (keyID, KEYFLAG_CANENCRYPT, PGP_PUBRING);
       }
       else if (r == -1) {
-        mem_free (&keylist);
+        p_delete(&keylist);
         rfc822_free_address (&tmp);
         rfc822_free_address (&addr);
         return NULL;
@@ -1155,7 +1161,7 @@ char *pgp_findKeys (ADDRESS * to, ADDRESS * cc, ADDRESS * bcc)
 
       if ((key = pgp_ask_for_key (buf, q->mailbox,
                                   KEYFLAG_CANENCRYPT, PGP_PUBRING)) == NULL) {
-        mem_free (&keylist);
+        p_delete(&keylist);
         rfc822_free_address (&tmp);
         rfc822_free_address (&addr);
         return NULL;