(parse_message): Add a kludge to allow parsing
authorwerner <werner>
Wed, 13 Jul 2005 13:25:32 +0000 (13:25 +0000)
committerwerner <werner>
Wed, 13 Jul 2005 13:25:32 +0000 (13:25 +0000)
Exim generated bounces.

ChangeLog
addrutil.c
mkdiff
scrutmime.c

index 968a2c5..3fd3c0e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2005-07-13  Werner Koch  <wk@g10code.com>
+
+       * scrutmime.c (parse_message): Add a kludge to allow parsing
+       Exim generated bounces.
+
+2005-01-07  Werner Koch  <wk@g10code.com>
+
+       * addrutil.c (FinishRecord): Fixed change according to CVS done
+       back in May.
+
 2004-12-09  Werner Koch  <wk@g10code.com>
 
        * sha1sum.c: New based on SHA1- code from gnupg and out md5sum.
index 3f2ec89..0e3f4cb 100644 (file)
@@ -17,7 +17,7 @@
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  */
 
-/* $Id: addrutil.c,v 1.4 2004-05-10 12:00:57 werner Exp $ */
+/* $Id: addrutil.c,v 1.5 2005-07-13 13:25:32 werner Exp $ */
 
 /* How to use:
 
@@ -1221,13 +1221,11 @@ FinishRecord()
                                 else
                                   putchar (*s);
                               }
+                            any = 1;
+                            need_tab = 1;
                           }
-                        else if (need_tab)
-                          putchar ('\t');
-                       else if( any )
+                       else if( any && !need_tab )
                           putchar(':');
-                       any = 1;
-                        need_tab = 1;
                    }
                }
                else {
diff --git a/mkdiff b/mkdiff
index f1fb56f..d1778b9 100644 (file)
--- a/mkdiff
+++ b/mkdiff
@@ -1,6 +1,13 @@
 #!/bin/sh
 
 opt_sign=yes
+ext=bz2
+extz=j
+if [ "$1" == "--gzip-source" ]; then
+  ext=gz
+  extz=z
+  shift
+fi
 if [ "$1" == "--no-sign" ]; then
   opt_sign=no
   shift
@@ -19,13 +26,13 @@ fi
 
 set -e
 
-curr_ver=$(ls $pack-${vprf}*.tar.gz 2>/dev/null | sed "s/^$pack-\(.*\)\.tar\.gz/\1/"\
+curr_ver=$(ls $pack-${vprf}*.tar.${ext} 2>/dev/null | sed "s/^$pack-\(.*\)\.tar\.${ext}/\1/"\
           | sort -r -t '.' -n +0 -1 +1 -2 +2 | head -1 )
-if [ ! -f $pack-$curr_ver.tar.gz ]; then
+if [ ! -f $pack-$curr_ver.tar.$ext ]; then
     echo "mkdiff: no current version of package $pack found" >&2
     exit 1
 fi
-prev_ver=$(ls $pack-${vprf}*.tar.gz 2>/dev/null | sed "s/^$pack-\(.*\)\.tar\.gz/\1/"\
+prev_ver=$(ls $pack-${vprf}*.tar.${ext} 2>/dev/null | sed "s/^$pack-\(.*\)\.tar\.${ext}/\1/"\
           | sort -r -t '.' -n +0 -1 +1 -2 +2 | head -2 | tail -1 )
 if [ "$prev_ver" = "$curr_ver"  ]; then
     echo "mkdiff: no previous version of package $pack found" >&2
@@ -42,8 +49,8 @@ echo "Removing old directories"
 
 echo "Unpacking previous and current tar"
 
-tar xzf "$pack-$curr_ver.tar.gz"
-tar xzf "$pack-$prev_ver.tar.gz"
+tar x${extz}f "$pack-$curr_ver.tar.$ext"
+tar x${extz}f "$pack-$prev_ver.tar.$ext"
 # We remove some files from the directories because we assume
 # that they are either binary or can be build using the proper tools:
 #  .tlb - Windows  Type Library
index 3762176..ded63df 100644 (file)
@@ -69,6 +69,7 @@ struct parse_info_s {
   enum transfer_encodings transfer_encoding;
   int test_base64; /* Set if we should decode and test base64 data. */
   int got_probe;
+  int no_mime;    /* Set if this is not a MIME message. */
 };
 
 
@@ -298,6 +299,7 @@ message_cb (void *opaque, rfc822parse_event_t event, rfc822parse_t msg)
       info->transfer_encoding = TE_NONE;
       info->test_base64 = 0;
       info->got_probe = 0;
+      info->no_mime = 0;
       ctx = rfc822parse_parse_field (msg, "Content-Type", -1);
       if (ctx)
         {
@@ -321,6 +323,14 @@ message_cb (void *opaque, rfc822parse_event_t event, rfc822parse_t msg)
 
           rfc822parse_release_field (ctx);
         }
+      else
+        {
+          p = rfc822parse_get_field (msg, "MIME-Version", -1, NULL);
+          if (p)
+            free (p);
+          else
+            info->no_mime = 1;
+        }
 
       p = rfc822parse_get_field (msg, "Content-Transfer-Encoding", -1, &off);
       if (p)
@@ -374,7 +384,10 @@ parse_message (FILE *fp)
   unsigned int lineno = 0;
   int no_cr_reported = 0;
   struct parse_info_s info;
+  int body_lines = 0;
+  int skip_leading_empty_lines = 0;
 
+ restart:
   memset (&info, 0, sizeof info);
 
   msg = rfc822parse_open (message_cb, &info);
@@ -402,8 +415,31 @@ parse_message (FILE *fp)
           no_cr_reported = 1;
         }
 
+      if (skip_leading_empty_lines)
+        {
+          if (!length)
+            continue;
+          skip_leading_empty_lines = 0;
+        }
+
       if (rfc822parse_insert (msg, line, length))
        die ("parser failed: %s", strerror (errno));
+
+      if (info.no_mime && body_lines < 50)
+        {
+          body_lines++;
+          if (!strncmp (line, "------ This is a copy of the message, "
+                        "including all the headers.", 64))
+            {
+              /* This may be followed by empty lines, thus we set a
+                 flag to skip them. */
+              skip_leading_empty_lines = 1;
+              body_lines = 500; /* Avoid going here a second time. */
+              rfc822parse_close (msg);
+              goto restart;
+            }
+        }
+
       
       if (info.got_probe && buflen)
         {