xref: /openbsd/usr.bin/dig/lib/dns/rdata/ch_3/a_1.c (revision 09467b48)
1 /*
2  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14  * PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /* $Id: a_1.c,v 1.11 2020/02/26 18:47:58 florian Exp $ */
18 
19 /* by Bjorn.Victor@it.uu.se, 2005-05-07 */
20 /* Based on generic/soa_6.c and generic/mx_15.c */
21 
22 #ifndef RDATA_CH_3_A_1_C
23 #define RDATA_CH_3_A_1_C
24 
25 #include <isc/net.h>
26 
27 static inline isc_result_t
28 totext_ch_a(ARGS_TOTEXT) {
29 	isc_region_t region;
30 	dns_name_t name;
31 	dns_name_t prefix;
32 	isc_boolean_t sub;
33 	char buf[sizeof("0177777")];
34 	uint16_t addr;
35 
36 	REQUIRE(rdata->type == dns_rdatatype_a);
37 	REQUIRE(rdata->rdclass == dns_rdataclass_ch); /* 3 */
38 	REQUIRE(rdata->length != 0);
39 
40 	dns_name_init(&name, NULL);
41 	dns_name_init(&prefix, NULL);
42 
43 	dns_rdata_toregion(rdata, &region);
44 	dns_name_fromregion(&name, &region);
45 	isc_region_consume(&region, name_length(&name));
46 	addr = uint16_fromregion(&region);
47 
48 	sub = name_prefix(&name, tctx->origin, &prefix);
49 	RETERR(dns_name_totext(&prefix, sub, target));
50 
51 	snprintf(buf, sizeof(buf), "%o", addr); /* note octal */
52 	RETERR(isc_str_tobuffer(" ", target));
53 	return (isc_str_tobuffer(buf, target));
54 }
55 
56 static inline isc_result_t
57 fromwire_ch_a(ARGS_FROMWIRE) {
58 	isc_region_t sregion;
59 	isc_region_t tregion;
60 	dns_name_t name;
61 
62 	REQUIRE(type == dns_rdatatype_a);
63 	REQUIRE(rdclass == dns_rdataclass_ch);
64 
65 	UNUSED(type);
66 	UNUSED(rdclass);
67 
68 	dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
69 
70 	dns_name_init(&name, NULL);
71 
72 	RETERR(dns_name_fromwire(&name, source, dctx, options, target));
73 
74 	isc_buffer_activeregion(source, &sregion);
75 	isc_buffer_availableregion(target, &tregion);
76 	if (sregion.length < 2)
77 		return (ISC_R_UNEXPECTEDEND);
78 	if (tregion.length < 2)
79 		return (ISC_R_NOSPACE);
80 
81 	memmove(tregion.base, sregion.base, 2);
82 	isc_buffer_forward(source, 2);
83 	isc_buffer_add(target, 2);
84 
85 	return (ISC_R_SUCCESS);
86 }
87 
88 static inline isc_result_t
89 towire_ch_a(ARGS_TOWIRE) {
90 	dns_name_t name;
91 	dns_offsets_t offsets;
92 	isc_region_t sregion;
93 	isc_region_t tregion;
94 
95 	REQUIRE(rdata->type == dns_rdatatype_a);
96 	REQUIRE(rdata->rdclass == dns_rdataclass_ch);
97 	REQUIRE(rdata->length != 0);
98 
99 	dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
100 
101 	dns_name_init(&name, offsets);
102 
103 	dns_rdata_toregion(rdata, &sregion);
104 
105 	dns_name_fromregion(&name, &sregion);
106 	isc_region_consume(&sregion, name_length(&name));
107 	RETERR(dns_name_towire(&name, cctx, target));
108 
109 	isc_buffer_availableregion(target, &tregion);
110 	if (tregion.length < 2)
111 		return (ISC_R_NOSPACE);
112 
113 	memmove(tregion.base, sregion.base, 2);
114 	isc_buffer_add(target, 2);
115 	return (ISC_R_SUCCESS);
116 }
117 
118 #endif	/* RDATA_CH_3_A_1_C */
119