rp_17.c 6.31 KB
Newer Older
Mark Andrews's avatar
Mark Andrews committed
1
/*
Bob Halley's avatar
Bob Halley committed
2
 * Copyright (C) 1999, 2000  Internet Software Consortium.
3
 *
Mark Andrews's avatar
Mark Andrews committed
4 5 6
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
7
 *
8 9 10 11 12 13 14 15
 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
 * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
 * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Mark Andrews's avatar
Mark Andrews committed
16 17
 */

18
/* $Id: rp_17.c,v 1.30 2000/12/01 01:40:39 gson Exp $ */
Mark Andrews's avatar
Mark Andrews committed
19

20
/* RFC 1183 */
Mark Andrews's avatar
Mark Andrews committed
21

22 23
#ifndef RDATA_GENERIC_RP_17_C
#define RDATA_GENERIC_RP_17_C
Mark Andrews's avatar
Mark Andrews committed
24

25 26
#define RRTYPE_RP_ATTRIBUTES (0)

27
static inline isc_result_t
David Lawrence's avatar
David Lawrence committed
28
fromtext_rp(ARGS_FROMTEXT) {
Mark Andrews's avatar
Mark Andrews committed
29 30 31 32 33
	isc_token_t token;
	dns_name_t name;
	isc_buffer_t buffer;
	int i;

Michael Graff's avatar
Michael Graff committed
34 35
	UNUSED(rdclass);

Mark Andrews's avatar
Mark Andrews committed
36 37
	REQUIRE(type == 17);

Michael Graff's avatar
Michael Graff committed
38 39
	origin = (origin != NULL) ? origin : dns_rootname;

Mark Andrews's avatar
Mark Andrews committed
40
	for (i = 0; i < 2 ; i++) {
41 42 43
		RETERR(isc_lex_getmastertoken(lexer, &token,
					      isc_tokentype_string,
					      ISC_FALSE));
Mark Andrews's avatar
Mark Andrews committed
44
		dns_name_init(&name, NULL);
45
		buffer_fromregion(&buffer, &token.value.as_region);
Mark Andrews's avatar
Mark Andrews committed
46 47 48
		RETERR(dns_name_fromtext(&name, &buffer, origin,
					 downcase, target));
	}
49
	return (ISC_R_SUCCESS);
Mark Andrews's avatar
Mark Andrews committed
50 51
}

52
static inline isc_result_t
David Lawrence's avatar
David Lawrence committed
53
totext_rp(ARGS_TOTEXT) {
Mark Andrews's avatar
Mark Andrews committed
54 55 56 57 58 59 60
	isc_region_t region;
	dns_name_t rmail;
	dns_name_t email;
	dns_name_t prefix;
	isc_boolean_t sub;

	REQUIRE(rdata->type == 17);
61
	REQUIRE(rdata->length != 0);
Mark Andrews's avatar
Mark Andrews committed
62 63 64 65 66 67 68 69 70 71 72 73 74

	dns_name_init(&rmail, NULL);
	dns_name_init(&email, NULL);
	dns_name_init(&prefix, NULL);

	dns_rdata_toregion(rdata, &region);

	dns_name_fromregion(&rmail, &region);
	isc_region_consume(&region, rmail.length);

	dns_name_fromregion(&email, &region);
	isc_region_consume(&region, email.length);

75
	sub = name_prefix(&rmail, tctx->origin, &prefix);
Mark Andrews's avatar
Mark Andrews committed
76 77 78 79
	RETERR(dns_name_totext(&prefix, sub, target));

	RETERR(str_totext(" ", target));

80
	sub = name_prefix(&email, tctx->origin, &prefix);
Mark Andrews's avatar
Mark Andrews committed
81 82 83
	return (dns_name_totext(&prefix, sub, target));
}

84
static inline isc_result_t
David Lawrence's avatar
David Lawrence committed
85
fromwire_rp(ARGS_FROMWIRE) {
Mark Andrews's avatar
Mark Andrews committed
86 87
        dns_name_t rmail;
        dns_name_t email;
Michael Graff's avatar
Michael Graff committed
88 89

	UNUSED(rdclass);
90

Mark Andrews's avatar
Mark Andrews committed
91 92
	REQUIRE(type == 17);

93
	dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
Mark Andrews's avatar
Mark Andrews committed
94

Mark Andrews's avatar
Mark Andrews committed
95 96 97 98 99 100 101
        dns_name_init(&rmail, NULL);
        dns_name_init(&email, NULL);

        RETERR(dns_name_fromwire(&rmail, source, dctx, downcase, target));
        return (dns_name_fromwire(&email, source, dctx, downcase, target));
}

102
static inline isc_result_t
David Lawrence's avatar
David Lawrence committed
103
towire_rp(ARGS_TOWIRE) {
Mark Andrews's avatar
Mark Andrews committed
104 105 106 107 108
	isc_region_t region;
	dns_name_t rmail;
	dns_name_t email;

	REQUIRE(rdata->type == 17);
109
	REQUIRE(rdata->length != 0);
Mark Andrews's avatar
Mark Andrews committed
110

111
	dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
Mark Andrews's avatar
Mark Andrews committed
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
	dns_name_init(&rmail, NULL);
	dns_name_init(&email, NULL);

	dns_rdata_toregion(rdata, &region);

	dns_name_fromregion(&rmail, &region);
	isc_region_consume(&region, rmail.length);

	RETERR(dns_name_towire(&rmail, cctx, target));

	dns_name_fromregion(&rmail, &region);
	isc_region_consume(&region, rmail.length);

	return (dns_name_towire(&rmail, cctx, target));
}

128
static inline int
David Lawrence's avatar
David Lawrence committed
129
compare_rp(ARGS_COMPARE) {
Mark Andrews's avatar
Mark Andrews committed
130 131 132 133
	isc_region_t region1;
	isc_region_t region2;
	dns_name_t name1;
	dns_name_t name2;
134
	int order;
Mark Andrews's avatar
Mark Andrews committed
135 136

	REQUIRE(rdata1->type == rdata2->type);
137
	REQUIRE(rdata1->rdclass == rdata2->rdclass);
Mark Andrews's avatar
Mark Andrews committed
138
	REQUIRE(rdata1->type == 17);
139 140
	REQUIRE(rdata1->length != 0);
	REQUIRE(rdata2->length != 0);
Mark Andrews's avatar
Mark Andrews committed
141 142 143 144 145 146 147 148 149 150

	dns_name_init(&name1, NULL);
	dns_name_init(&name2, NULL);

	dns_rdata_toregion(rdata1, &region1);
	dns_rdata_toregion(rdata2, &region2);

	dns_name_fromregion(&name1, &region1);
	dns_name_fromregion(&name2, &region2);

151 152 153
	order = dns_name_rdatacompare(&name1, &name2);
	if (order != 0)
		return (order);
Mark Andrews's avatar
Mark Andrews committed
154 155 156 157 158 159 160 161 162 163

	isc_region_consume(&region1, name_length(&name1));
	isc_region_consume(&region2, name_length(&name2));

	dns_name_init(&name1, NULL);
	dns_name_init(&name2, NULL);

	dns_name_fromregion(&name1, &region1);
	dns_name_fromregion(&name2, &region2);

164
	return (dns_name_rdatacompare(&name1, &name2));
Mark Andrews's avatar
Mark Andrews committed
165 166
}

167
static inline isc_result_t
David Lawrence's avatar
David Lawrence committed
168
fromstruct_rp(ARGS_FROMSTRUCT) {
169 170
	dns_rdata_rp_t *rp = source;
	isc_region_t region;
Mark Andrews's avatar
Mark Andrews committed
171 172

	REQUIRE(type == 17);
173 174 175 176
	REQUIRE(source != NULL);
	REQUIRE(rp->common.rdtype == type);
	REQUIRE(rp->common.rdclass == rdclass);

177 178
	UNUSED(rdclass);

179 180 181 182
	dns_name_toregion(&rp->mail, &region);
	RETERR(isc_buffer_copyregion(target, &region));
	dns_name_toregion(&rp->text, &region);
	return (isc_buffer_copyregion(target, &region));
Mark Andrews's avatar
Mark Andrews committed
183 184
}

185
static inline isc_result_t
David Lawrence's avatar
David Lawrence committed
186
tostruct_rp(ARGS_TOSTRUCT) {
187 188 189 190 191
	isc_result_t result;
	isc_region_t region;
	dns_rdata_rp_t *rp = target;
	dns_name_t name;

192
	REQUIRE(rdata->type == 17);
193
	REQUIRE(target != NULL);
194
	REQUIRE(rdata->length != 0);
195

196 197 198
	rp->common.rdclass = rdata->rdclass;
	rp->common.rdtype = rdata->type;
	ISC_LINK_INIT(&rp->common, link);
Mark Andrews's avatar
Mark Andrews committed
199

200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
	dns_name_init(&name, NULL);
	dns_rdata_toregion(rdata, &region);
	dns_name_fromregion(&name, &region);
	dns_name_init(&rp->mail, NULL);
	RETERR(name_duporclone(&name, mctx, &rp->mail));
	isc_region_consume(&region, name_length(&name));
	dns_name_fromregion(&name, &region);
	dns_name_init(&rp->text, NULL);
	result = name_duporclone(&name, mctx, &rp->text);
	if (result != ISC_R_SUCCESS)
		goto cleanup;

	rp->mctx = mctx;
	return (ISC_R_SUCCESS);

 cleanup:
	if (mctx != NULL)
		dns_name_free(&rp->mail, mctx);
	return (ISC_R_NOMEMORY);
Mark Andrews's avatar
Mark Andrews committed
219
}
220

221
static inline void
David Lawrence's avatar
David Lawrence committed
222
freestruct_rp(ARGS_FREESTRUCT) {
223 224
	dns_rdata_rp_t *rp = source;

225
	REQUIRE(source != NULL);
226
	REQUIRE(rp->common.rdtype == 17);
227

228 229 230 231 232 233
	if (rp->mctx == NULL)
		return;

	dns_name_free(&rp->mail, rp->mctx);
	dns_name_free(&rp->text, rp->mctx);
	rp->mctx = NULL;
234
}
235

236
static inline isc_result_t
David Lawrence's avatar
David Lawrence committed
237
additionaldata_rp(ARGS_ADDLDATA) {
238 239 240
	REQUIRE(rdata->type == 17);

	UNUSED(rdata);
Michael Graff's avatar
Michael Graff committed
241 242
	UNUSED(add);
	UNUSED(arg);
243

244
	return (ISC_R_SUCCESS);
245 246
}

247
static inline isc_result_t
David Lawrence's avatar
David Lawrence committed
248
digest_rp(ARGS_DIGEST) {
Bob Halley's avatar
Bob Halley committed
249 250 251 252 253 254 255
	isc_region_t r;
	dns_name_t name;

	REQUIRE(rdata->type == 17);

	dns_rdata_toregion(rdata, &r);
	dns_name_init(&name, NULL);
Michael Graff's avatar
Michael Graff committed
256

Bob Halley's avatar
Bob Halley committed
257
	dns_name_fromregion(&name, &r);
Michael Graff's avatar
Michael Graff committed
258
	RETERR(dns_name_digest(&name, digest, arg));
Bob Halley's avatar
Bob Halley committed
259
	isc_region_consume(&r, name_length(&name));
Michael Graff's avatar
Michael Graff committed
260

Bob Halley's avatar
Bob Halley committed
261 262 263 264 265 266
	dns_name_init(&name, NULL);
	dns_name_fromregion(&name, &r);

	return (dns_name_digest(&name, digest, arg));
}

267
#endif	/* RDATA_GENERIC_RP_17_C */