1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
23 /* All Rights Reserved */
24
25
26 #pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 2. */
27 #include "mail.h"
28 /*
29 * Remove an entry from its linked list and free any malloc'd memory..
30 */
poplist(hdrtype,where)31 void poplist (hdrtype, where)
32 register int hdrtype;
33 register int where;
34 {
35 struct hdrs *hdr2rm, *cont2rm, *nextcont;
36
37 /* Remove first/last entry from list */
38
39 hdr2rm = (where == HEAD ?
40 hdrlines[hdrtype].head : hdrlines[hdrtype].tail);
41
42 if (hdr2rm == (struct hdrs *)NULL) {
43 return;
44 }
45 if (where == HEAD) {
46 if (hdr2rm->next == (struct hdrs *)NULL) {
47 /* Only 1 entry in list */
48 hdrlines[hdrtype].head = hdrlines[hdrtype].tail =
49 (struct hdrs *)NULL;
50 } else {
51 hdrlines[hdrtype].head = hdr2rm->next;
52 hdr2rm->next->prev = (struct hdrs *)NULL;
53 }
54 } else {
55 if (hdr2rm->prev == (struct hdrs *)NULL) {
56 /* Only 1 entry in list */
57 hdrlines[hdrtype].head = hdrlines[hdrtype].tail =
58 (struct hdrs *)NULL;
59 } else {
60 hdrlines[hdrtype].tail = hdr2rm->prev;
61 hdr2rm->prev->next = (struct hdrs *)NULL;
62 }
63 }
64 /* Keep track of total bytes added to message due to */
65 /* selected lines in case non-delivery */
66 /* notification needs to be sent. (See also copylet()) */
67 if (hdrtype == H_AFWDFROM) {
68 affbytecnt -=
69 (strlen(header[H_AFWDFROM].tag) + strlen(hdr2rm->value) + 2);
70 affcnt--;
71 }
72 if (hdrtype == H_RECEIVED) {
73 rcvbytecnt -=
74 (strlen(header[H_RECEIVED].tag) + strlen(hdr2rm->value) + 2);
75 }
76
77 cont2rm = hdr2rm->cont;
78 while (cont2rm != (struct hdrs *)NULL) {
79 nextcont = cont2rm->next;
80 if (hdrtype == H_AFWDFROM) {
81 affbytecnt -= (strlen(cont2rm->value) + 1);
82 affcnt--;
83 }
84 if (hdrtype == H_RECEIVED) {
85 rcvbytecnt -= (strlen(cont2rm->value) + 1);
86 }
87 free ((char *)cont2rm);
88 cont2rm = nextcont;
89 }
90 free ((char *)hdr2rm);
91 }
92