/* * Usenet header definitions (see ARPA Internet RFCs 1036 nee 850 & 822; * for a second opinion, see The Hideous Name by Pike & Weinberger). * * Headers are parsed and modified and copied in one pass. * Nevertheless, the code is in pieces: hdrdefs.c, hdrparse.c, hdrmunge.c. */ #include #include #include /* must define offsetof */ #include #include "libc.h" #include "news.h" #include "headers.h" #include "hdrint.h" /* required headers */ static char msgnm[] = "Message-ID:"; /* rejection of dup.s */ static char ngsnm[] = "Newsgroups:"; /* filing, clone for Xref */ static char pathnm[] = "Path:"; /* rejection, extend (damn) */ static char subjnm[] = "Subject:"; /* for ctl. msgs. */ static char datenm[] = "Date:"; /* rejection of stale art.s */ static char fromnm[] = "From:"; /* only required; no use */ /* optional headers */ static char appnm[] = "Approved:"; /* mod. groups */ static char ctlnm[] = "Control:"; /* ctl. msg.; NCMP */ static char etctlnm[] = "Also-Control:"; /* hybrid ctl. msg.; NCMP */ static char expnm[] = "Expires:"; /* history */ static char distrnm[] = "Distribution:"; /* transmission */ static char sendnm[] = "Sender:"; /* mod. groups */ static char xrefnm[] = "Xref:"; /* to *replace* (damn!)*/ /* obsolete "useful" headers */ static char artnm[] = "Article-I.D.:"; /* obs. Message-ID: */ /* obsolete useless headers: delete them all on contact */ static char datercvnm[] = "Date-Received:"; static char rcvnm[] = "Received:"; /* obsolete Date-Received: */ static char postnm[] = "Posted:"; /* obsolete Date: */ static char postversnm[] = "Posting-Version:"; static char rlyversnm[] = "Relay-Version:"; static char illobnm[] = "Illegal-Object:"; /* zmailer bitching */ static struct hdrdef msghdr = { msgnm, STRLEN(msgnm), offsetof(struct headers, h_msgid) }; static struct hdrdef ngshdr = { ngsnm, STRLEN(ngsnm), offsetof(struct headers, h_ngs) }; struct hdrdef pathhdr = { pathnm, STRLEN(pathnm), offsetof(struct headers, h_path) }; static struct hdrdef subjhdr = { subjnm, STRLEN(subjnm), offsetof(struct headers, h_subj) }; static struct hdrdef datehdr = { datenm, STRLEN(datenm), offsetof(struct headers, h_date) }; static struct hdrdef fromhdr = { fromnm, STRLEN(fromnm), offsetof(struct headers, h_from) }; static struct hdrdef apphdr = { appnm, STRLEN(appnm), offsetof(struct headers, h_approved) }; static struct hdrdef ctlhdr = { /* NCMP */ ctlnm, STRLEN(ctlnm), offsetof(struct headers, h_ctlcmd) }; /* NCMP */ static struct hdrdef etctlhdr = { /* NCMP */ etctlnm, STRLEN(etctlnm), offsetof(struct headers, h_etctlcmd) }; /* NCMP */ static struct hdrdef exphdr = { expnm, STRLEN(expnm), offsetof(struct headers, h_expiry) }; static struct hdrdef distrhdr = { distrnm, STRLEN(distrnm), offsetof(struct headers, h_distr) }; static struct hdrdef sendhdr = { sendnm, STRLEN(sendnm), offsetof(struct headers, h_sender) }; struct hdrdef xrefhdr = { xrefnm, STRLEN(xrefnm), offsetof(struct headers, h_xref) }; static struct hdrdef arthdr = { artnm, STRLEN(artnm), offsetof(struct headers, h_artid) }; static struct hdrdef datrcvhdr = { datercvnm, STRLEN(datercvnm), -1 }; static struct hdrdef rcvhdr = { rcvnm, STRLEN(rcvnm), -1 }; static struct hdrdef psthdr = { postnm, STRLEN(postnm), -1 }; static struct hdrdef pstvrshdr = { postversnm, STRLEN(postversnm), -1 }; static struct hdrdef rlyvrshdr = { rlyversnm, STRLEN(rlyversnm), -1 }; static struct hdrdef illobjhdr = { illobnm, STRLEN(illobnm), -1 }; /* these are parsed into a struct headers */ hdrlist reqdhdrs = { &msghdr, &ngshdr, &pathhdr, /* modified by hdrmunge.c (emithdr()) */ &subjhdr, &datehdr, &fromhdr, NULL }; hdrlist opthdrs = { &arthdr, /* obsolete */ &apphdr, &ctlhdr, /* NCMP */ &etctlhdr, /* NCMP */ &distrhdr, &exphdr, &sendhdr, &xrefhdr, /* for -b only */ NULL }; /* * the following noxious headers are deleted on contact because neighbours * still send them and they are big. in an ideal world, they wouldn't be * sent and thus we wouldn't need to delete them. * It is tempting to delete Article-I.D.: too, but it may be too soon for that. */ hdrlist hdrvilest = { &xrefhdr, /* regenerated by fileart() if needed */ &datrcvhdr, &rcvhdr, &psthdr, &pstvrshdr, &rlyvrshdr, &illobjhdr, NULL, }; boolean headdebug = NO; void hdrdebug(state) int state; { headdebug = state; } void hdrinit(hdrs) /* zero all elements of hdrs */ register struct headers *hdrs; { hdrs->h_subj = NULL; hdrs->h_ngs = NULL; hdrs->h_distr = NULL; hdrs->h_ctlcmd = NULL; /* NCMP */ hdrs->h_etctlcmd = NULL; /* NCMP */ hdrs->h_approved = NULL; hdrs->h_msgid = NULL; hdrs->h_artid = NULL; hdrs->h_expiry = NULL; hdrs->h_path = NULL; hdrs->h_sender = NULL; hdrs->h_from = NULL; hdrs->h_date = NULL; hdrs->h_xref = NULL; } void freeheaders(hdrs) /* free (assumed) malloced storage */ register struct headers *hdrs; { nnfree(&hdrs->h_subj); nnfree(&hdrs->h_ngs); nnfree(&hdrs->h_distr); nnfree(&hdrs->h_ctlcmd); /* NCMP */ nnfree(&hdrs->h_etctlcmd); /* NCMP */ nnfree(&hdrs->h_approved); nnfree(&hdrs->h_msgid); nnfree(&hdrs->h_artid); nnfree(&hdrs->h_expiry); nnfree(&hdrs->h_path); nnfree(&hdrs->h_sender); nnfree(&hdrs->h_from); nnfree(&hdrs->h_date); nnfree(&hdrs->h_xref); }