Use file descriptor instead of path for mutt_decode_save_attachment()
authorJulien Danjou <julien@danjou.info>
Wed, 13 Dec 2006 11:42:11 +0000 (12:42 +0100)
committerPierre Habouzit <madcoder@debian.org>
Wed, 13 Dec 2006 13:12:19 +0000 (14:12 +0100)
Signed-off-by: Julien Danjou <julien@danjou.info>
Signed-off-by: Pierre Habouzit <madcoder@debian.org>
attach.c
attach.h
lib-crypt/crypt-gpgme.c
lib-crypt/pgp.c
recvattach.c

index 2b9fb0f..7bc9c43 100644 (file)
--- a/attach.c
+++ b/attach.c
@@ -515,7 +515,7 @@ int mutt_view_attachment (FILE * fp, BODY * a, int flag, HEADER * hdr,
       /* Use built-in handler */
       set_option (OPTVIEWATTACH);       /* disable the "use 'v' to view this part"
                                          * message in case of error */
-      if (mutt_decode_save_attachment (fp, a, pagerfile, M_DISPLAY, 0)) {
+      if (mutt_decode_save_attachment (fp, a, pagerfd, M_DISPLAY)) {
         unset_option (OPTVIEWATTACH);
         goto return_error;
       }
@@ -765,8 +765,8 @@ int mutt_save_attachment (FILE * fp, BODY * m, char *path, int flags,
 }
 
 /* returns 0 on success, -1 on error */
-int mutt_decode_save_attachment (FILE * fp, BODY * m, char *path,
-                                 int displaying, int flags)
+int mutt_decode_save_attachment (FILE * fp, BODY * m, int pathfd,
+                                 int displaying)
 {
   STATE s;
   unsigned int saved_encoding = 0;
@@ -776,10 +776,7 @@ int mutt_decode_save_attachment (FILE * fp, BODY * m, char *path,
   p_clear(&s, 1);
   s.flags = displaying;
 
-  if (flags == M_SAVE_APPEND)
-    s.fpout = fopen (path, "a");
-  else
-    s.fpout = safe_fopen (path, "w");
+  s.fpout = fdopen (pathfd, "w");
 
   if (s.fpout == NULL) {
     mutt_perror ("fopen");
@@ -931,14 +928,15 @@ int mutt_print_attachment (FILE * fp, BODY * a)
     /* decode and print */
 
     int rc = 0;
+    int newfile_fd = 0;
 
     ifp = NULL;
     fpout = NULL;
 
-    mutt_mktemp (newfile);
-    if (mutt_decode_save_attachment (fp, a, newfile, M_PRINTING, 0) == 0) {
+    newfile_fd = m_tempfd(newfile, sizeof(newfile), NONULL(Tempdir), NULL);
+    if (mutt_decode_save_attachment (fp, a, newfile_fd, M_PRINTING) == 0) {
 
-      if ((ifp = fopen (newfile, "r")) == NULL) {
+      if ((ifp = fdopen (newfile_fd, "r")) == NULL) {
         mutt_perror ("fopen");
         goto bail0;
       }
@@ -952,7 +950,7 @@ int mutt_print_attachment (FILE * fp, BODY * a)
       }
 
       mutt_copy_stream (ifp, fpout);
-
+      
       m_fclose(&fpout);
       m_fclose(&ifp);
 
index c5cdb71..75fcc19 100644 (file)
--- a/attach.h
+++ b/attach.h
@@ -26,7 +26,7 @@ void mutt_attach_forward (FILE *, HEADER *, ATTACHPTR **, short, BODY *, int);
 void mutt_attach_reply (FILE *, HEADER *, ATTACHPTR **, short, BODY *, int);
 
 int mutt_print_attachment (FILE *, BODY *);
-int mutt_decode_save_attachment (FILE *, BODY *, char *, int, int);
+int mutt_decode_save_attachment (FILE *, BODY *, int, int);
 int mutt_save_attachment (FILE *, BODY *, char *, int, HEADER *);
 int mutt_pipe_attachment (FILE *, BODY *, const char *, char *);
 int mutt_view_attachment (FILE *, BODY *, int, HEADER *, ATTACHPTR **, short);
index ec828bb..72dd3ab 100644 (file)
@@ -1614,6 +1614,7 @@ static int pgp_check_traditional_one_body (FILE * fp, BODY * b,
   char tempfile[_POSIX_PATH_MAX];
   char buf[HUGE_STRING];
   FILE *tfp;
+  int tempfd;
 
   short sgn = 0;
   short enc = 0;
@@ -1624,13 +1625,13 @@ static int pgp_check_traditional_one_body (FILE * fp, BODY * b,
   if (tagged_only && !b->tagged)
     return 0;
 
-  mutt_mktemp (tempfile);
-  if (mutt_decode_save_attachment (fp, b, tempfile, 0, 0) != 0) {
+  tempfd = m_tempfd(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+  if (mutt_decode_save_attachment (fp, b, tempfd, 0) != 0) {
     unlink (tempfile);
     return 0;
   }
 
-  if ((tfp = fopen (tempfile, "r")) == NULL) {
+  if ((tfp = fdopen (tempfd, "r")) == NULL) {
     unlink (tempfile);
     return 0;
   }
index 08b8509..3dd37d5 100644 (file)
@@ -454,6 +454,7 @@ static int pgp_check_traditional_one_body (FILE * fp, BODY * b,
   char tempfile[_POSIX_PATH_MAX];
   char buf[HUGE_STRING];
   FILE *tfp;
+  int tempfd;
 
   short sgn = 0;
   short enc = 0;
@@ -465,13 +466,14 @@ static int pgp_check_traditional_one_body (FILE * fp, BODY * b,
   if (tagged_only && !b->tagged)
     return 0;
 
-  mutt_mktemp (tempfile);
-  if (mutt_decode_save_attachment (fp, b, tempfile, 0, 0) != 0) {
+  tempfd = m_tempfd(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+
+  if (mutt_decode_save_attachment (fp, b, tempfd, 0) != 0) {
     unlink (tempfile);
     return 0;
   }
 
-  if ((tfp = fopen (tempfile, "r")) == NULL) {
+  if ((tfp = fdopen (tempfd, "r")) == NULL) {
     unlink (tempfile);
     return 0;
   }
index 301b12e..6c7956a 100644 (file)
@@ -633,10 +633,10 @@ static void print_attachment_list (FILE * fp, int tag, BODY * top,
 
           char newfile[_POSIX_PATH_MAX] = "";
           FILE *ifp;
+          int newfile_fd;
 
-          mutt_mktemp (newfile);
-          if (mutt_decode_save_attachment (fp, top, newfile, M_PRINTING, 0) ==
-              0) {
+          newfile_fd = m_tempfd(newfile, sizeof(newfile), NONULL(Tempdir), NULL);
+          if (mutt_decode_save_attachment (fp, top, newfile_fd, M_PRINTING) == 0) {
             if ((ifp = fopen (newfile, "r")) != NULL) {
               mutt_copy_stream (ifp, state->fpout);
               m_fclose(&ifp);