From 89b7b67a13ebb7965cc7f13ad0595e2194a2d34c Mon Sep 17 00:00:00 2001 From: Jannis Hoffmann Date: Wed, 3 Jul 2024 15:48:04 +0200 Subject: add sqmail-4.2.29a --- src/headerbody.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/headerbody.c (limited to 'src/headerbody.c') diff --git a/src/headerbody.c b/src/headerbody.c new file mode 100644 index 0000000..82c5684 --- /dev/null +++ b/src/headerbody.c @@ -0,0 +1,78 @@ +#include "stralloc.h" +#include "buffer.h" +#include "getln.h" +#include "hfield.h" +#include "headerbody.h" + +static int getsa(buffer *b,stralloc *sa,int *match) +{ + if (!*match) return 0; + if (getln(b,sa,match,'\n') == -1) return -1; + if (*match) return 1; + if (!sa->len) return 0; + if (!stralloc_append(sa,"\n")) return -1; + + return 1; +} + +static stralloc line = {0}; +static stralloc nextline = {0}; + +int headerbody(b,dohf,hdone,dobl) +buffer *b; +void (*dohf)(); +void (*hdone)(); +void (*dobl)(); +{ + int match; + int flaglineok; + match = 1; + flaglineok = 0; + + for (;;) { + switch (getsa(b,&nextline,&match)) { + case -1: + return -1; + case 0: + if (flaglineok) dohf(&line); + hdone(); + /* no message body; could insert blank line here */ + return 0; + } + + if (flaglineok) { + if ((nextline.s[0] == ' ') || (nextline.s[0] == '\t')) { + if (!stralloc_cat(&line,&nextline)) return -1; + continue; + } + dohf(&line); + } + + if (nextline.len == 1) { + hdone(); + dobl(&nextline); + break; + } + + if (stralloc_starts(&nextline,"From ")) { + if (!stralloc_copys(&line,"MBOX-Line: ")) return -1; + if (!stralloc_cat(&line,&nextline)) return -1; + } else if (hfield_valid(nextline.s,nextline.len)) { + if (!stralloc_copy(&line,&nextline)) return -1; + } else { + hdone(); + if (!stralloc_copys(&line,"\n")) return -1; + dobl(&line); + dobl(&nextline); + break; + } + flaglineok = 1; + } + + for (;;) + switch (getsa(b,&nextline,&match)) { + case -1: return -1; + case 0: return 0; + case 1: dobl(&nextline); + } +} -- cgit v1.2.3