Merge from vendor branch OPENSSL:
[dragonfly.git] / contrib / bind-9.2.4rc7 / lib / dns / rdatalist.c
1 /*
2  * Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC")
3  * Copyright (C) 1999-2001, 2003  Internet Software Consortium.
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15  * PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 /* $Id: rdatalist.c,v 1.25.2.3 2004/03/09 06:11:06 marka Exp $ */
19
20 #include <config.h>
21
22 #include <stddef.h>
23
24 #include <isc/util.h>
25
26 #include <dns/rdata.h>
27 #include <dns/rdatalist.h>
28 #include <dns/rdataset.h>
29
30 #include "rdatalist_p.h"
31
32 static dns_rdatasetmethods_t methods = {
33         isc__rdatalist_disassociate,
34         isc__rdatalist_first,
35         isc__rdatalist_next,
36         isc__rdatalist_current,
37         isc__rdatalist_clone,
38         isc__rdatalist_count
39 };
40
41 void
42 dns_rdatalist_init(dns_rdatalist_t *rdatalist) {
43
44         /*
45          * Initialize rdatalist.
46          */
47
48         rdatalist->rdclass = 0;
49         rdatalist->type = 0;
50         rdatalist->covers = 0;
51         rdatalist->ttl = 0;
52         ISC_LIST_INIT(rdatalist->rdata);
53         ISC_LINK_INIT(rdatalist, link);
54 }
55
56 isc_result_t
57 dns_rdatalist_tordataset(dns_rdatalist_t *rdatalist,
58                          dns_rdataset_t *rdataset) {
59
60         /*
61          * Make 'rdataset' refer to the rdata in 'rdatalist'.
62          */
63
64         REQUIRE(rdatalist != NULL);
65         REQUIRE(DNS_RDATASET_VALID(rdataset));
66         REQUIRE(! dns_rdataset_isassociated(rdataset));
67
68         rdataset->methods = &methods;
69         rdataset->rdclass = rdatalist->rdclass;
70         rdataset->type = rdatalist->type;
71         rdataset->covers = rdatalist->covers;
72         rdataset->ttl = rdatalist->ttl;
73         rdataset->trust = 0;
74         rdataset->private1 = rdatalist;
75         rdataset->private2 = NULL;
76         rdataset->private3 = NULL;
77         rdataset->privateuint4 = 0;
78         rdataset->private5 = NULL;
79
80         return (ISC_R_SUCCESS);
81 }
82
83 void
84 isc__rdatalist_disassociate(dns_rdataset_t *rdataset) {
85         UNUSED(rdataset);
86 }
87
88 isc_result_t
89 isc__rdatalist_first(dns_rdataset_t *rdataset) {
90         dns_rdatalist_t *rdatalist;
91
92         rdatalist = rdataset->private1;
93         rdataset->private2 = ISC_LIST_HEAD(rdatalist->rdata);
94
95         if (rdataset->private2 == NULL)
96                 return (ISC_R_NOMORE);
97
98         return (ISC_R_SUCCESS);
99 }
100
101 isc_result_t
102 isc__rdatalist_next(dns_rdataset_t *rdataset) {
103         dns_rdata_t *rdata;
104
105         rdata = rdataset->private2;
106         if (rdata == NULL)
107                 return (ISC_R_NOMORE);
108
109         rdataset->private2 = ISC_LIST_NEXT(rdata, link);
110
111         if (rdataset->private2 == NULL)
112                 return (ISC_R_NOMORE);
113
114         return (ISC_R_SUCCESS);
115 }
116
117 void
118 isc__rdatalist_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) {
119         dns_rdata_t *list_rdata;
120
121         list_rdata = rdataset->private2;
122         INSIST(list_rdata != NULL);
123
124         dns_rdata_clone(list_rdata, rdata);
125 }
126
127 void
128 isc__rdatalist_clone(dns_rdataset_t *source, dns_rdataset_t *target) {
129         *target = *source;
130
131         /*
132          * Reset iterator state.
133          */
134         target->private2 = NULL;
135 }
136
137 unsigned int
138 isc__rdatalist_count(dns_rdataset_t *rdataset) {
139         dns_rdatalist_t *rdatalist;
140         dns_rdata_t *rdata;
141         unsigned int count;
142
143         rdatalist = rdataset->private1;
144
145         count = 0;
146         for (rdata = ISC_LIST_HEAD(rdatalist->rdata);
147              rdata != NULL;
148              rdata = ISC_LIST_NEXT(rdata, link))
149                 count++;
150
151         return (count);
152 }