home *** CD-ROM | disk | FTP | other *** search
/ ftp.eterna.com.au / 2014.06.ftp.eterna.com.au.tar / ftp.eterna.com.au / netbsd / mh-6.8.3-diff < prev    next >
Text File  |  1996-03-18  |  5KB  |  174 lines

  1. These diffs to MH 6.8.3 fix two problems: the define of si_value in one
  2. of the system .h files makes the compiler bail out on mhn.
  3.  
  4. The second is an added feature ``CONTENT_LENGTH''.  All changes related
  5. to this feature are isolated with #ifdef CONTENT_LENGTH.  If you wish
  6. to use this feature, you have to add ``options CONTENT_LENGTH''
  7. to your MH config file.
  8.  
  9. This additional feature will try to use the Content-Length: header generated
  10. by the SVR4 mail deliverer.  This Header gives the length in bytes of the
  11. of an e-mail message, minus the headers and the line seperating header
  12. and body.  This feature is used to do out-of-band message boundary
  13. detection, making escaping "From " lines unnecessary.
  14.  
  15. Casper
  16.  
  17. *** mh-6.8.3/uip/mhn.c.org    Wed Dec  1 05:01:36 1993
  18. --- mh-6.8.3/uip/mhn.c    Fri Jun  3 12:38:04 1994
  19. ***************
  20. *** 1014,1019 ****
  21. --- 1014,1020 ----
  22.   #include "../h/mhn.h"
  23.   
  24.   
  25. + #undef si_value
  26.   struct str2init {
  27.       char   *si_key;
  28.       int        si_value;
  29. *** mh-6.8.3/sbr/m_getfld.c.org    Wed Dec  1 05:01:24 1993
  30. --- mh-6.8.3/sbr/m_getfld.c    Tue Jun  7 10:54:14 1994
  31. ***************
  32. *** 169,174 ****
  33. --- 169,179 ----
  34.   static unsigned char *edelim;
  35.   static int  edelimlen;
  36.   
  37. + #ifdef CONTENT_LENGTH
  38. + static int content_length = -1;
  39. + static long end_of_contents = -1;
  40. + #endif
  41.   static int  (*eom_action) () = NULL;
  42.   
  43.   #ifdef _FSTDIO
  44. ***************
  45. *** 195,200 ****
  46. --- 200,216 ----
  47.       register int    i;
  48.       register int    j;
  49.   
  50. + #ifdef CONTENT_LENGTH
  51. +     /*
  52. +      * When starting to read from a new file, we have to reset the state,
  53. +      * but only if the state wasn't reset.  That may save us a number of
  54. +      * lseeks.
  55. +      */
  56. +     if (state == FLD &&
  57. +     (content_length != -1 || end_of_contents != -1) &&
  58. +     ftell(iob) == 0)
  59. +         end_of_contents = content_length = -1;
  60. + #endif
  61.       if ((c = Getc(iob)) < 0) {
  62.       msg_count = 0;
  63.       *buf = 0;
  64. ***************
  65. *** 222,227 ****
  66. --- 238,276 ----
  67.           while (c != '\n' && (c = Getc(iob)) >= 0)
  68.               ;
  69.   
  70. + #ifdef CONTENT_LENGTH
  71. +         /*
  72. +          * When we've found a content-length header, we're
  73. +          * going to use it to tell where the message boundary
  74. +          * is, if it is a valid mesage boundary.
  75. +          * There can be a number of cases:
  76. +          * - no bytes after <content-length> bytes: the usual format
  77. +          *   of a message in an MH folder.
  78. +          * - only a newline - last message in mail drop.
  79. +          * - "\nFrom "    - beginning of next message
  80. +          * - other - ignore Content-Length header, but issue warning
  81. +          */
  82. +         if (content_length != -1) {
  83. +             long here = ftell(iob);
  84. +             static char delim[] = "\nFrom ";
  85. +             char buf[sizeof(delim)-1];
  86. +             int cnt;
  87. +             /* compute position of character after file */
  88. +             end_of_contents = here + content_length + 1;
  89. +             content_length = -1;
  90. +             /* And see whether this is a From header or eof. */
  91. +             fseek(iob, end_of_contents - 1, 0);
  92. +             cnt = fread(buf, sizeof(char), sizeof(buf), iob);
  93. +             if (cnt != 0 && (cnt != 1 || buf[0] != '\n') &&
  94. +             (cnt != sizeof(buf) ||
  95. +               strncmp(buf,delim, sizeof(buf)) != 0)) {
  96. +                 advise (NULLCP, "invalid Content-Length: header\n");
  97. +                 end_of_contents = -1;
  98. +             }
  99. +             fseek(iob, here, 0);
  100. +         }
  101. + #endif
  102.           if (c < 0 || (c = Getc(iob)) < 0 || eom (c, iob)) {
  103.               if (! eom_action) {
  104.               /* flush null messages */
  105. ***************
  106. *** 425,430 ****
  107. --- 474,489 ----
  108.   finish:;
  109.       *cp = 0;
  110.       msg_count = cp - buf;
  111. + #ifdef CONTENT_LENGTH
  112. +     /* Check whether this was a Content-Length header */
  113. +     if (state == FLD &&
  114. +         strcasecmp((char*)"content-length", (char*) name) == 0) {
  115. +     content_length = atoi(buf);
  116. +     /* This value is computed when end-of-headers is detected */
  117. +     end_of_contents = -1;
  118. +     }
  119. + #endif
  120.       return (state);
  121.   }
  122.   
  123. ***************
  124. *** 544,549 ****
  125. --- 603,626 ----
  126.   #endif /* RPATHS */
  127.   
  128.       pos = ftell (iob);
  129. + #ifdef CONTENT_LENGTH
  130. +     if (end_of_contents != -1) {
  131. +     if (end_of_contents == pos) {
  132. +         end_of_contents = -1;
  133. +         return 1;
  134. +     }
  135. +     /* we've read past the end of a message, this should never happen
  136. +      * because of the other checks we do */
  137. +     if (end_of_contents < pos) {
  138. +         end_of_contents = -1;
  139. +         adios(NULLCP,
  140. +             "Content-Length: header broken, can't read mailbox\n");
  141. +     }
  142. +     return 0;
  143. +     }
  144. + #endif
  145. +     
  146.       if ((i = fread (text, sizeof *text, edelimlen, iob)) != edelimlen
  147.           || strncmp (text, (char *)edelim, edelimlen)) {
  148.       if (i == 0 && msg_style == MS_UUCP)
  149. ***************
  150. *** 560,565 ****
  151. --- 637,654 ----
  152.   #endif /* !notdef */
  153.       return 0;
  154.       }
  155. + #ifdef CONTENT_LENGTH
  156. +     /* There's one extra special case to be considered here:
  157. +      * content_length > 0.  That we got here is because the
  158. +      * message body starts with "From "
  159. +      */
  160. +     if (content_length > 0) {
  161. +     (void) fseek (iob, (long)(pos-1), 0);
  162. +     (void) getc (iob);        /* should be OK */
  163. +     return 0;
  164. +     }
  165. + #endif
  166.   
  167.       if (msg_style == MS_UUCP) {
  168.   #ifndef    RPATHS
  169.