From b732a73bc773789894466b0e5320b2f1fe42c7e9 Mon Sep 17 00:00:00 2001 From: John Denker Date: Fri, 1 Jun 2012 18:58:45 -0700 Subject: original, as downloaded from http://www.qmail.org/netqmail-1.06.tar.gz --- hfield.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 hfield.c (limited to 'hfield.c') diff --git a/hfield.c b/hfield.c new file mode 100644 index 0000000..06de0be --- /dev/null +++ b/hfield.c @@ -0,0 +1,125 @@ +#include "hfield.h" + +static char *(hname[]) = { + "unknown-header" +, "sender" +, "from" +, "reply-to" +, "to" +, "cc" +, "bcc" +, "date" +, "message-id" +, "subject" +, "resent-sender" +, "resent-from" +, "resent-reply-to" +, "resent-to" +, "resent-cc" +, "resent-bcc" +, "resent-date" +, "resent-message-id" +, "return-receipt-to" +, "errors-to" +, "apparently-to" +, "received" +, "return-path" +, "delivered-to" +, "content-length" +, "content-type" +, "content-transfer-encoding" +, "notice-requested-upon-delivery-to" +, "mail-followup-to" +, 0 +}; + +static int hmatch(s,len,t) +char *s; +int len; +char *t; +{ + int i; + char ch; + + for (i = 0;ch = t[i];++i) + { + if (i >= len) return 0; + if (ch != s[i]) + { + if (ch == '-') return 0; + if (ch - 32 != s[i]) return 0; + } + } + for (;;) + { + if (i >= len) return 0; + ch = s[i]; + if (ch == ':') return 1; + if ((ch != ' ') && (ch != '\t')) return 0; + ++i; + } +} + +int hfield_known(s,len) +char *s; +int len; +{ + int i; + char *t; + + for (i = 1;t = hname[i];++i) + if (hmatch(s,len,t)) + return i; + return 0; +} + +int hfield_valid(s,len) +char *s; +int len; +{ + int i; + int j; + char ch; + + for (j = 0;j < len;++j) + if (s[j] == ':') + break; + if (j >= len) return 0; + while (j) + { + ch = s[j - 1]; + if ((ch != ' ') && (ch != '\t')) + break; + --j; + } + if (!j) return 0; + + for (i = 0;i < j;++i) + { + ch = s[i]; + if (ch <= 32) return 0; + if (ch >= 127) return 0; + } + return 1; +} + +unsigned int hfield_skipname(s,len) +char *s; +int len; +{ + int i; + char ch; + + for (i = 0;i < len;++i) + if (s[i] == ':') + break; + if (i < len) ++i; + while (i < len) + { + ch = s[i]; + if ((ch != '\t') && (ch != '\n') && (ch != '\r') && (ch != ' ')) + break; + ++i; + } + return i; +} -- cgit v1.2.3