pushlist.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
#pragma ident "%Z%%M% %I% %E% SMI"
#include "mail.h"
/*
* link new entry into list of headerlines encountered of this type.
* If contflg == TRUE, link this line to the end of the continuation lines
* for the headerline specified (head or tail of type hdrtype).
*/
void pushlist(hdrtype, where, s, contflg)
register int hdrtype;
register int where;
register char *s;
{
static char pn[] = "pushlist";
char *p;
struct hdrs *nhp, *ohp, *nextcont;
/* Keep track of total bytes added to message due to */
/* certain lines in case non-delivery */
/* notification needs to be sent. (See also copylet()) */
if (hdrtype == H_AFWDFROM) {
affbytecnt += (strlen(s) + ((contflg == TRUE) ?
1 :
(strlen(header[H_AFWDFROM].tag) + 2)) );
if (contflg == FALSE) {
affcnt++;
}
}
if (hdrtype == H_RECEIVED) {
rcvbytecnt += (strlen(s) + ((contflg == TRUE) ?
1 :
(strlen(header[H_RECEIVED].tag) + 2)) );
}
if ((p = malloc(sizeof(struct hdrs))) == (char *)NULL) {
errmsg(E_MEM,"malloc failed in pushlist()");
done(1);
}
memset(p, 0, sizeof(struct hdrs));
ohp = (where == HEAD ? hdrlines[hdrtype].head : hdrlines[hdrtype].tail);
nhp = (struct hdrs *)p;
(void) strlcpy(nhp->value, s, sizeof (nhp->value));
Dout(pn, 0, "hdrtype = %d/%s, contflg = %d, saved value = '%s'\n",
hdrtype, header[hdrtype].tag, contflg, s);
if (contflg) {
if (ohp == (struct hdrs *)NULL) {
/* This shouldn't happen.....? */
/* No headline of this type found so far. How */
/* did we think this is a continuation of something? */
if (debug > 0) {
Dout(pn, 0, "H_CONT with no hdr yet\n");
abort();
}
/* Throw it on the floor... (!) */
/**/
/* Subtract anything that might have been added above */
if (hdrtype == H_AFWDFROM) {
affbytecnt -= (strlen(s) + ((contflg == TRUE) ?
1 :
(strlen(header[H_AFWDFROM].tag) + 2)) );
}
if (hdrtype == H_RECEIVED) {
rcvbytecnt -= (strlen(s) + ((contflg == TRUE) ?
1 :
(strlen(header[H_RECEIVED].tag) + 2)) );
}
free ((char *)nhp);
return;
}
/* Since we ONLY walk down 'cont' chains, */
/* we only need forward links */
nextcont = ohp;
while (nextcont->cont != (struct hdrs *)NULL) {
nextcont = nextcont->cont;
}
/* Add this one to end of list... */
nextcont->cont = nhp;
return;
}
/* link value from this header line to end of list for */
/* all header lines of the same type */
if (ohp == (struct hdrs *)NULL) {
/* Empty list so far. New element goes first */
hdrlines[hdrtype].head = hdrlines[hdrtype].tail = nhp;
} else {
if (where == HEAD) {
/* Add new element to head of list */
nhp->next = ohp;
hdrlines[hdrtype].head = ohp->prev = nhp;
} else {
/* Add new element to tail of list */
nhp->prev = ohp;
hdrlines[hdrtype].tail = ohp->next = nhp;
}
}
}