]> granicus.if.org Git - neomutt/commitdiff
Change autoview_handler() to use struct Buffer
authorKevin McCarthy <kevin@8t8.us>
Mon, 8 Apr 2019 16:51:34 +0000 (09:51 -0700)
committerRichard Russon <rich@flatcap.org>
Tue, 30 Apr 2019 16:45:37 +0000 (17:45 +0100)
This will allow the full conversion of rfc1524_expand_filename(), and
thereafter mutt_adv_mktemp() too.

Co-authored-by: Richard Russon <rich@flatcap.org>
handler.c
rfc1524.c
rfc1524.h

index 29002c41fbe49e29c5687a2d8d589b311e11baa5..8a7ec223dbe67a641b897f05012d3f14b20e836f 100644 (file)
--- a/handler.c
+++ b/handler.c
@@ -530,8 +530,8 @@ static int autoview_handler(struct Body *a, struct State *s)
   struct Rfc1524MailcapEntry *entry = rfc1524_new_entry();
   char buf[1024];
   char type[256];
-  char cmd[STR_COMMAND];
-  char tempfile[PATH_MAX] = "";
+  struct Buffer *cmd = mutt_buffer_pool_get();
+  struct Buffer *tempfile = mutt_buffer_pool_get();
   char *fname = NULL;
   FILE *fp_in = NULL;
   FILE *fp_out = NULL;
@@ -545,29 +545,30 @@ static int autoview_handler(struct Body *a, struct State *s)
 
   fname = mutt_str_strdup(a->filename);
   mutt_file_sanitize_filename(fname, true);
-  rfc1524_expand_filename(entry->nametemplate, fname, tempfile, sizeof(tempfile));
+  mutt_buffer_rfc1524_expand_filename(entry->nametemplate, fname, tempfile);
   FREE(&fname);
 
   if (entry->command)
   {
-    mutt_str_strfcpy(cmd, entry->command, sizeof(cmd));
+    mutt_buffer_strcpy(cmd, entry->command);
 
     /* rfc1524_expand_command returns 0 if the file is required */
-    piped = rfc1524_expand_command(a, tempfile, type, cmd, sizeof(cmd));
+    piped = mutt_buffer_rfc1524_expand_command(a, mutt_b2s(tempfile), type, cmd);
 
     if (s->flags & MUTT_DISPLAY)
     {
       state_mark_attach(s);
-      state_printf(s, _("[-- Autoview using %s --]\n"), cmd);
-      mutt_message(_("Invoking autoview command: %s"), cmd);
+      state_printf(s, _("[-- Autoview using %s --]\n"), mutt_b2s(cmd));
+      mutt_message(_("Invoking autoview command: %s"), mutt_b2s(cmd));
     }
 
-    fp_in = mutt_file_fopen(tempfile, "w+");
+    fp_in = mutt_file_fopen(mutt_b2s(tempfile), "w+");
     if (!fp_in)
     {
       mutt_perror("fopen");
       rfc1524_free_entry(&entry);
-      return -1;
+      rc = -1;
+      goto cleanup;
     }
 
     mutt_file_copy_bytes(s->fp_in, fp_in, a->length);
@@ -575,14 +576,15 @@ static int autoview_handler(struct Body *a, struct State *s)
     if (!piped)
     {
       mutt_file_fclose(&fp_in);
-      pid = mutt_create_filter(cmd, NULL, &fp_out, &fp_err);
+      pid = mutt_create_filter(mutt_b2s(cmd), NULL, &fp_out, &fp_err);
     }
     else
     {
-      unlink(tempfile);
+      unlink(mutt_b2s(tempfile));
       fflush(fp_in);
       rewind(fp_in);
-      pid = mutt_create_filter_fd(cmd, NULL, &fp_out, &fp_err, fileno(fp_in), -1, -1);
+      pid = mutt_create_filter_fd(mutt_b2s(cmd), NULL, &fp_out, &fp_err,
+                                  fileno(fp_in), -1, -1);
     }
 
     if (pid < 0)
@@ -591,7 +593,7 @@ static int autoview_handler(struct Body *a, struct State *s)
       if (s->flags & MUTT_DISPLAY)
       {
         state_mark_attach(s);
-        state_printf(s, _("[-- Can't run %s. --]\n"), cmd);
+        state_printf(s, _("[-- Can't run %s. --]\n"), mutt_b2s(cmd));
       }
       rc = -1;
       goto bail;
@@ -610,7 +612,7 @@ static int autoview_handler(struct Body *a, struct State *s)
         if (s->flags & MUTT_DISPLAY)
         {
           state_mark_attach(s);
-          state_printf(s, _("[-- Autoview stderr of %s --]\n"), cmd);
+          state_printf(s, _("[-- Autoview stderr of %s --]\n"), mutt_b2s(cmd));
         }
 
         state_puts(s->prefix, s);
@@ -631,7 +633,7 @@ static int autoview_handler(struct Body *a, struct State *s)
         if (s->flags & MUTT_DISPLAY)
         {
           state_mark_attach(s);
-          state_printf(s, _("[-- Autoview stderr of %s --]\n"), cmd);
+          state_printf(s, _("[-- Autoview stderr of %s --]\n"), mutt_b2s(cmd));
         }
 
         state_puts(buf, s);
@@ -647,13 +649,18 @@ static int autoview_handler(struct Body *a, struct State *s)
     if (piped)
       mutt_file_fclose(&fp_in);
     else
-      mutt_file_unlink(tempfile);
+      mutt_file_unlink(mutt_b2s(tempfile));
 
     if (s->flags & MUTT_DISPLAY)
       mutt_clear_error();
   }
+
+cleanup:
   rfc1524_free_entry(&entry);
 
+  mutt_buffer_pool_release(&cmd);
+  mutt_buffer_pool_release(&tempfile);
+
   return rc;
 }
 
index da3f5c76129811472ca38709b8eab928a046cbeb..5d7b19b75e16d2e6d63c790bc8a3c9ed2e884de5 100644 (file)
--- a/rfc1524.c
+++ b/rfc1524.c
@@ -137,6 +137,25 @@ int rfc1524_expand_command(struct Body *a, const char *filename,
   return needspipe;
 }
 
+/**
+ * rfc1524_expand_command - Expand expandos in a command
+ * @param a        Email Body
+ * @param filename File containing the email text
+ * @param type     Type, e.g. "text/plain"
+ * @param command  Buffer containing command
+ * @retval 0 Command works on a file
+ * @retval 1 Command works on a pipe
+ */
+int mutt_buffer_rfc1524_expand_command(struct Body *a, const char *filename,
+                                       const char *type, struct Buffer *command)
+{
+  mutt_buffer_increase_size(command, PATH_MAX);
+  int rc = rfc1524_expand_command(a, filename, type, command->data, command->dsize);
+  mutt_buffer_fix_dptr(command);
+
+  return rc;
+}
+
 /**
  * get_field - NUL terminate a RFC1524 field
  * @param s String to alter
@@ -614,3 +633,21 @@ int rfc1524_expand_filename(const char *nametemplate, const char *oldfile,
   else
     return 1;
 }
+
+/**
+ * mutt_buffer_rfc1524_expand_filename - Expand a new filename from a template or existing filename
+ * @param nametemplate Template
+ * @param oldfile      Original filename
+ * @param newfile      Buffer for new filename
+ * @retval 0 if the left and right components of the oldfile and newfile match
+ * @retval 1 otherwise
+ */
+int mutt_buffer_rfc1524_expand_filename(const char *nametemplate,
+                                        const char *oldfile, struct Buffer *newfile)
+{
+  mutt_buffer_increase_size(newfile, PATH_MAX);
+  int rc = rfc1524_expand_filename(nametemplate, oldfile, newfile->data, newfile->dsize);
+  mutt_buffer_fix_dptr(newfile);
+
+  return rc;
+}
index 95acd5cbb9e70f0490150e7a2fdf2e818c1f5be9..8b8a8cb81d683a7ab18552c62782263b6ded4f73 100644 (file)
--- a/rfc1524.h
+++ b/rfc1524.h
@@ -67,4 +67,7 @@ int rfc1524_expand_command(struct Body *a, const char *filename, const char *typ
 int rfc1524_expand_filename(const char *nametemplate, const char *oldfile, char *newfile, size_t nflen);
 bool rfc1524_mailcap_lookup(struct Body *a, char *type, struct Rfc1524MailcapEntry *entry, enum MailcapLookup opt);
 
+int mutt_buffer_rfc1524_expand_command(struct Body *a, const char *filename, const char *type, struct Buffer *command);
+int mutt_buffer_rfc1524_expand_filename(const char *nametemplate, const char *oldfile, struct Buffer *newfile);
+
 #endif /* MUTT_RFC1524_H */