* m_getfld.c -- read/parse a message
*
* $Id$
+ *
+ * This code is Copyright (c) 2002, by the authors of nmh. See the
+ * COPYRIGHT file in the root directory of the nmh distribution for
+ * complete copyright information.
*/
#include <h/mh.h>
-#include <zotnet/mts/mts.h>
+#include <h/mts.h>
+#include <h/utils.h>
/* This module has a long and checkered history. First, it didn't burst
maildrops correctly because it considered two CTRL-A:s in a row to be
static unsigned char *edelim;
static int edelimlen;
-static int (*eom_action)() = NULL;
+static int (*eom_action)(int) = NULL;
#ifdef _FSTDIO
# define _ptr _p /* Gag */
# define _cnt _r /* Retch */
# define _filbuf __srget /* Puke */
+# define DEFINED__FILBUF_TO_SOMETHING_SPECIFIC
#endif
#ifdef SCO_5_STDIO
# define _cnt __cnt
# define _base __base
# define _filbuf(fp) ((fp)->__cnt = 0, __filbuf(fp))
+# define DEFINED__FILBUF_TO_SOMETHING_SPECIFIC
+#endif
+
+#ifndef DEFINED__FILBUF_TO_SOMETHING_SPECIFIC
+extern int _filbuf(FILE*);
#endif
bp = sp = (unsigned char *) iob->_IO_read_ptr - 1;
j = (cnt = ((long) iob->_IO_read_end -
(long) iob->_IO_read_ptr) + 1) < i ? cnt : i;
+#elif defined(__DragonFly__)
+ bp = sp = (unsigned char *) ((struct __FILE_public *)iob)->_p - 1;
+ j = (cnt = ((struct __FILE_public *)iob)->_r+1) < i ? cnt : i;
#else
bp = sp = (unsigned char *) iob->_ptr - 1;
j = (cnt = iob->_cnt+1) < i ? cnt : i;
#ifdef LINUX_STDIO
iob->_IO_read_ptr = iob->_IO_read_end;
if (__underflow(iob) == EOF) {
+#elif defined(__DragonFly__)
+ if (__srget(iob) == EOF) {
#else
if (_filbuf(iob) == EOF) {
#endif
} else {
#ifdef LINUX_STDIO
iob->_IO_read_ptr = bp + 1;
+#elif defined(__DragonFly__)
+ ((struct __FILE_public *)iob)->_p = bp + 1;
+ ((struct __FILE_public *)iob)->_r = cnt - 1;
#else
iob->_ptr = bp + 1;
iob->_cnt = cnt - 1;
* . hit the end of the buffer. (loop)
*/
if (c == '\n') {
- *cp = *buf = 0;
- advise (NULL, "eol encountered in field \"%s\"", name);
- state = FMTERR;
- goto finish;
+ /* We hit the end of the line without seeing ':' to
+ * terminate the field name. This is usually (always?)
+ * spam. But, blowing up is lame, especially when
+ * scan(1)ing a folder with such messages. Pretend such
+ * lines are the first of the body (at least mutt also
+ * handles it this way). */
+
+ /* See if buf can hold this line, since we were assuming
+ * we had a buffer of NAMESZ, not bufsz. */
+ /* + 1 for the newline */
+ if (bufsz < j + 1) {
+ /* No, it can't. Oh well, guess we'll blow up. */
+ *cp = *buf = 0;
+ advise (NULL, "eol encountered in field \"%s\"", name);
+ state = FMTERR;
+ goto finish;
+ }
+ memcpy (buf, name, j - 1);
+ buf[j - 1] = '\n';
+ buf[j] = '\0';
+ /* mhparse.c:get_content wants to find the position of the
+ * body start, but it thinks there's a blank line between
+ * the header and the body (naturally!), so seek back so
+ * that things line up even though we don't have that
+ * blank line in this case. Simpler parsers (e.g. mhl)
+ * get extra newlines, but that should be harmless enough,
+ * right? This is a corrupt message anyway. */
+ fseek (iob, ftell (iob) - 2, SEEK_SET);
+ return BODY;
}
if ((i -= j) <= 0) {
*cp = *buf = 0;
#ifdef LINUX_STDIO
cnt = (long) iob->_IO_read_end - (long) iob->_IO_read_ptr;
bp = (unsigned char *) --iob->_IO_read_ptr;
+#elif defined(__DragonFly__)
+ cnt = ((struct __FILE_public *)iob)->_r++;
+ bp = (unsigned char *) --((struct __FILE_public *)iob)->_p;
#else
cnt = iob->_cnt++;
bp = (unsigned char *) --iob->_ptr;
j = ep - (unsigned char *) iob->_IO_read_ptr;
memcpy (cp, iob->_IO_read_ptr, j);
iob->_IO_read_ptr = ep;
+#elif defined(__DragonFly__)
+ j = ep - (unsigned char *) ((struct __FILE_public *)iob)->_p;
+ memcpy (cp, ((struct __FILE_public *)iob)->_p, j);
+ ((struct __FILE_public *)iob)->_p = ep;
+ ((struct __FILE_public *)iob)->_r -= j;
#else
j = ep - (unsigned char *) iob->_ptr;
memcpy (cp, iob->_ptr, j);
#ifdef LINUX_STDIO
c += bp - (unsigned char *) iob->_IO_read_ptr;
memcpy( cp, iob->_IO_read_ptr, c);
+#elif defined(__DragonFly__)
+ c += bp - (unsigned char *) ((struct __FILE_public *)iob)->_p;
+ memcpy( cp, ((struct __FILE_public *)iob)->_p, c);
#else
c += bp - (unsigned char *) iob->_ptr;
memcpy( cp, iob->_ptr, c);
/* the dest buffer is full */
#ifdef LINUX_STDIO
iob->_IO_read_ptr += c;
+#elif defined(__DragonFly__)
+ ((struct __FILE_public *)iob)->_r -= c;
+ ((struct __FILE_public *)iob)->_p += c;
#else
iob->_cnt -= c;
iob->_ptr += c;
iob->_IO_read_ptr = iob->_IO_read_end;
c = __underflow(iob);
iob->_IO_read_ptr++; /* NOT automatic! */
+#elif defined(__DragonFly__)
+ *cp++ =j = *(((struct __FILE_public *)iob)->_p + c);
+ c = __srget(iob);
#else
*cp++ = j = *(iob->_ptr + c);
c = _filbuf(iob);
if (c != EOF) {
#ifdef LINUX_STDIO
--iob->_IO_read_ptr;
+#elif defined(__DragonFly__)
+ --((struct __FILE_public *)iob)->_p;
+ ++((struct __FILE_public *)iob)->_r;
#else
--iob->_ptr;
++iob->_cnt;
#ifdef LINUX_STDIO
bp = (unsigned char *) --iob->_IO_read_ptr;
cnt = (long) iob->_IO_read_end - (long) iob->_IO_read_ptr;
+#elif defined(__DragonFly__)
+ bp = (unsigned char *) --((struct __FILE_public *)iob)->_p;
+ cnt = ++((struct __FILE_public *)iob)->_r;
#else
bp = (unsigned char *) --iob->_ptr;
cnt = ++iob->_cnt;
memcpy( buf, bp, c );
#ifdef LINUX_STDIO
iob->_IO_read_ptr += c;
+#elif defined(__DragonFly__)
+ ((struct __FILE_public *)iob)->_r -= c;
+ ((struct __FILE_public *)iob)->_p += c;
#else
iob->_cnt -= c;
iob->_ptr += c;
msg_style = MS_MMDF;
}
c = strlen (delimstr);
- fdelim = (unsigned char *) malloc((size_t) (c + 3));
+ fdelim = (unsigned char *) mh_xmalloc((size_t) (c + 3));
*fdelim++ = '\0';
*fdelim = '\n';
msg_delim = (char *)fdelim+1;
pat_map = (unsigned char **) calloc (256, sizeof(unsigned char *));
for (cp = (char *) fdelim + 1; cp < (char *) delimend; cp++ )
- pat_map[*cp] = (unsigned char *) cp;
+ pat_map[(unsigned char)*cp] = (unsigned char *) cp;
if (msg_style == MS_MMDF) {
/* flush extra msg hdrs */
void
-m_eomsbr (int (*action)())
+m_eomsbr (int (*action)(int))
{
if ((eom_action = action)) {
msg_style = MS_MSH;
if (cp) {
/* return path for UUCP style addressing */
dp = strchr (++cp, '\n');
- snprintf (rp, rplen, "%.*s!%.*s\n", dp - cp, cp, bp - ap, ap);
+ snprintf (rp, rplen, "%.*s!%.*s\n", (int)(dp - cp), cp, (int)(bp - ap), ap);
} else {
/* return path for standard domain addressing */
- snprintf (rp, rplen, "%.*s\n", bp - ap, ap);
+ snprintf (rp, rplen, "%.*s\n", (int)(bp - ap), ap);
}
/*
while (pc != *str++)
if (str > es)
return 0;
-
+ if (str > es+1)
+ return 0;
sp = str; pp = pat;
while (pp < ep && *sp++ == *pp)
pp++;