]> diplodocus.org Git - nmh/blobdiff - uip/mhfixmsg.c
Added context_find_prefix().
[nmh] / uip / mhfixmsg.c
index d5107c60228b44557a8c744b24c6db1ae3780315..d3c23767b8928c7a4ce822d2236a41b0423c7815 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * mhfixmsg.c -- rewrite a message with various tranformations
+ * mhfixmsg.c -- rewrite a message with various transformations
  *
  * This code is Copyright (c) 2002 and 2013, by the authors of nmh.
  * See the COPYRIGHT file in the root directory of the nmh
  *
  * This code is Copyright (c) 2002 and 2013, by the authors of nmh.
  * See the COPYRIGHT file in the root directory of the nmh
@@ -91,6 +91,7 @@ typedef struct fix_transformations {
 
 int mhfixmsgsbr (CT *, const fix_transformations *, char *);
 static int fix_boundary (CT *, int *);
 
 int mhfixmsgsbr (CT *, const fix_transformations *, char *);
 static int fix_boundary (CT *, int *);
+static int copy_input_to_output (const char *, const char *);
 static int get_multipart_boundary (CT, char **);
 static int replace_boundary (CT, char *, char *);
 static int fix_types (CT, svector_t, int *);
 static int get_multipart_boundary (CT, char **);
 static int replace_boundary (CT, char *, char *);
 static int fix_types (CT, svector_t, int *);
@@ -118,9 +119,9 @@ static int content_encoding (CT, const char **);
 static int strip_crs (CT, int *);
 static int convert_charsets (CT, char *, int *);
 static int fix_always (CT, int *);
 static int strip_crs (CT, int *);
 static int convert_charsets (CT, char *, int *);
 static int fix_always (CT, int *);
-static int write_content (CT, char *, char *, int, int);
+static int write_content (CT, const char *, char *, int, int);
 static void set_text_ctparams(CT, char *, int);
 static void set_text_ctparams(CT, char *, int);
-static int remove_file (char *);
+static int remove_file (const char *);
 static void report (char *, char *, char *, char *, ...);
 static void pipeser (int);
 
 static void report (char *, char *, char *, char *, ...);
 static void pipeser (int);
 
@@ -349,6 +350,19 @@ main (int argc, char **argv) {
         if ((ct = parse_mime (file))) {
             set_text_ctparams(ct, fx.decodetypes, fx.lf_line_endings);
             *ctp++ = ct;
         if ((ct = parse_mime (file))) {
             set_text_ctparams(ct, fx.decodetypes, fx.lf_line_endings);
             *ctp++ = ct;
+        } else {
+            advise (NULL, "unable to parse message from file %s", file);
+            status = NOTOK;
+
+            /* If there's an outfile, pass the input message unchanged, so the message won't
+               get dropped from a pipeline. */
+            if (outfile) {
+                /* Something went wrong.  Output might be expected, such as if this were run
+                   as a filter.  Just copy the input to the output. */
+                if (copy_input_to_output (file, outfile) != OK) {
+                    advise (NULL, "unable to copy message to %s, it might be lost\n", outfile);
+                }
+            }
         }
     } else {
         /*
         }
     } else {
         /*
@@ -393,6 +407,21 @@ main (int argc, char **argv) {
                 if ((ct = parse_mime (msgnam))) {
                     set_text_ctparams(ct, fx.decodetypes, fx.lf_line_endings);
                     *ctp++ = ct;
                 if ((ct = parse_mime (msgnam))) {
                     set_text_ctparams(ct, fx.decodetypes, fx.lf_line_endings);
                     *ctp++ = ct;
+                } else {
+                    advise (NULL, "unable to parse message %s", msgnam);
+                    status = NOTOK;
+
+                    /* If there's an outfile, pass the input message unchanged, so the message won't
+                       get dropped from a pipeline. */
+                    if (outfile) {
+                        /* Something went wrong.  Output might be expected, such as if this were run
+                           as a filter.  Just copy the input to the output. */
+                        const char *input_filename = path (msgnam, TFILE);
+
+                        if (copy_input_to_output (input_filename, outfile) != OK) {
+                            advise (NULL, "unable to copy message to %s, it might be lost\n", outfile);
+                        }
+                    }
                 }
             }
         }
                 }
             }
         }
@@ -500,19 +529,9 @@ mhfixmsgsbr (CT *ctp, const fix_transformations *fx, char *outfile) {
         /* Something went wrong.  Output might be expected, such
            as if this were run as a filter.  Just copy the input
            to the output. */
         /* Something went wrong.  Output might be expected, such
            as if this were run as a filter.  Just copy the input
            to the output. */
-        int in = open (input_filename, O_RDONLY);
-        int out = strcmp (outfile, "-")
-            ?  open (outfile, O_WRONLY | O_CREAT, m_gmprot ())
-            :  STDOUT_FILENO;
-
-        if (in != -1  &&  out != -1) {
-            cpydata (in, out, input_filename, outfile);
-        } else {
-            status = NOTOK;
+        if (copy_input_to_output (input_filename, outfile) != OK) {
+            advise (NULL, "unable to copy message to %s, it might be lost\n", outfile);
         }
         }
-
-        close (out);
-        close (in);
     }
 
     if (modify_inplace) {
     }
 
     if (modify_inplace) {
@@ -527,6 +546,29 @@ mhfixmsgsbr (CT *ctp, const fix_transformations *fx, char *outfile) {
 }
 
 
 }
 
 
+/* Copy input message to output.  Assumes not modifying in place, so this
+   might be running as part of a pipeline. */
+static int
+copy_input_to_output (const char *input_filename, const char *output_filename) {
+    int in = open (input_filename, O_RDONLY);
+    int out = strcmp (output_filename, "-")
+        ?  open (output_filename, O_WRONLY | O_CREAT, m_gmprot ())
+        :  STDOUT_FILENO;
+    int status = OK;
+
+    if (in != -1  &&  out != -1) {
+        cpydata (in, out, input_filename, output_filename);
+    } else {
+        status = NOTOK;
+    }
+
+    close (out);
+    close (in);
+
+    return status;
+}
+
+
 static int
 fix_boundary (CT *ct, int *message_mods) {
     struct multipart *mp;
 static int
 fix_boundary (CT *ct, int *message_mods) {
     struct multipart *mp;
@@ -583,7 +625,16 @@ fix_boundary (CT *ct, int *message_mods) {
                 }
 
                 free (part_boundary);
                 }
 
                 free (part_boundary);
+            } else {
+                /* Couldn't fix the boundary.  Report failure so that mhfixmsg
+                   doesn't modify the message. */
+                status = NOTOK;
             }
             }
+        } else {
+            /* No multipart struct, even though the content type is
+               CT_MULTIPART.  Report failure so that mhfixmsg doesn't modify
+               the message. */
+            status = NOTOK;
         }
     }
 
         }
     }
 
@@ -2266,7 +2317,7 @@ fix_always (CT ct, int *message_mods) {
 
 
 static int
 
 
 static int
-write_content (CT ct, char *input_filename, char *outfile, int modify_inplace,
+write_content (CT ct, const char *input_filename, char *outfile, int modify_inplace,
                int message_mods) {
     int status = OK;
 
                int message_mods) {
     int status = OK;
 
@@ -2382,7 +2433,7 @@ set_text_ctparams(CT ct, char *decodetypes, int lf_line_endings) {
  * use the standard MH backup file.
  */
 static int
  * use the standard MH backup file.
  */
 static int
-remove_file (char *file) {
+remove_file (const char *file) {
     if (rmmproc) {
         char *rmm_command = concat (rmmproc, " ", file, NULL);
         int status = system (rmm_command);
     if (rmmproc) {
         char *rmm_command = concat (rmmproc, " ", file, NULL);
         int status = system (rmm_command);