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 74f73a9..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"
@@ -104,16 +106,13 @@ void pgp_forget_passphrase (void)
 }
 
 int pgp_use_gpg_agent (void) {
-  char *tty, *ttybuf;
+  char *tty;
 
   if (!option (OPTUSEGPGAGENT) || !getenv ("GPG_AGENT_INFO"))
     return 0;
 
-  if ((tty = ttyname(0)) && 
-      ((ttybuf = mem_malloc (sizeof("GPG_TTY") + strlen(tty) + 1)))) {
-      snprintf (ttybuf, sizeof (ttybuf), "GPG_TTY=%s", tty);
-      putenv (ttybuf);
-  }
+  if ((tty = ttyname(0)))
+    setenv ("GPG_TTY", tty, 0);
 
   return 1;
 }
@@ -164,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"));
@@ -236,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];
@@ -257,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;
 
@@ -302,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;
 
@@ -378,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;
         }
       }
 
@@ -428,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);
@@ -564,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);
 
@@ -746,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);
 
@@ -1135,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;
@@ -1152,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;