00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <ldns/config.h>
00017
00018 #include <ldns/ldns.h>
00019
00020 #include <limits.h>
00021 #include <strings.h>
00022
00030 static ldns_rdf *
00031 ldns_rr_function(ldns_rr_type type, const ldns_rr *rr, size_t pos)
00032 {
00033 if (!rr || ldns_rr_get_type(rr) != type) {
00034 return NULL;
00035 }
00036 return ldns_rr_rdf(rr, pos);
00037 }
00038
00047 static bool
00048 ldns_rr_set_function(ldns_rr_type type, ldns_rr *rr, ldns_rdf *rdf, size_t pos)
00049 {
00050 ldns_rdf *pop;
00051 if (!rr || ldns_rr_get_type(rr) != type) {
00052 return false;
00053 }
00054 pop = ldns_rr_set_rdf(rr, rdf, pos);
00055 if (pop) {
00056 LDNS_FREE(pop);
00057 return true;
00058 } else {
00059 return true;
00060 }
00061 }
00062
00063
00064 ldns_rdf *
00065 ldns_rr_a_address(const ldns_rr *r)
00066 {
00067
00068 if (!r || (ldns_rr_get_type(r) != LDNS_RR_TYPE_A &&
00069 ldns_rr_get_type(r) != LDNS_RR_TYPE_AAAA)) {
00070 return NULL;
00071 }
00072 return ldns_rr_rdf(r, 0);
00073 }
00074
00075 bool
00076 ldns_rr_a_set_address(ldns_rr *r, ldns_rdf *f)
00077 {
00078
00079 ldns_rdf *pop;
00080 if (!r || (ldns_rr_get_type(r) != LDNS_RR_TYPE_A &&
00081 ldns_rr_get_type(r) != LDNS_RR_TYPE_AAAA)) {
00082 return false;
00083 }
00084 pop = ldns_rr_set_rdf(r, f, 0);
00085 if (pop) {
00086 LDNS_FREE(pop);
00087 return true;
00088 } else {
00089 return false;
00090 }
00091 }
00092
00093
00094 ldns_rdf *
00095 ldns_rr_ns_nsdname(const ldns_rr *r)
00096 {
00097 return ldns_rr_function(LDNS_RR_TYPE_NS, r, 0);
00098 }
00099
00100
00101 ldns_rdf *
00102 ldns_rr_mx_preference(const ldns_rr *r)
00103 {
00104 return ldns_rr_function(LDNS_RR_TYPE_MX, r, 0);
00105 }
00106
00107 ldns_rdf *
00108 ldns_rr_mx_exchange(const ldns_rr *r)
00109 {
00110 return ldns_rr_function(LDNS_RR_TYPE_MX, r, 1);
00111 }
00112
00113
00114 ldns_rdf *
00115 ldns_rr_rrsig_typecovered(const ldns_rr *r)
00116 {
00117 return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 0);
00118 }
00119
00120 bool
00121 ldns_rr_rrsig_set_typecovered(ldns_rr *r, ldns_rdf *f)
00122 {
00123 return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 0);
00124 }
00125
00126 ldns_rdf *
00127 ldns_rr_rrsig_algorithm(const ldns_rr *r)
00128 {
00129 return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 1);
00130 }
00131
00132 bool
00133 ldns_rr_rrsig_set_algorithm(ldns_rr *r, ldns_rdf *f)
00134 {
00135 return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 1);
00136 }
00137
00138 ldns_rdf *
00139 ldns_rr_rrsig_labels(const ldns_rr *r)
00140 {
00141 return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 2);
00142 }
00143
00144 bool
00145 ldns_rr_rrsig_set_labels(ldns_rr *r, ldns_rdf *f)
00146 {
00147 return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 2);
00148 }
00149
00150 ldns_rdf *
00151 ldns_rr_rrsig_origttl(const ldns_rr *r)
00152 {
00153 return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 3);
00154 }
00155
00156 bool
00157 ldns_rr_rrsig_set_origttl(ldns_rr *r, ldns_rdf *f)
00158 {
00159 return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 3);
00160 }
00161
00162 ldns_rdf *
00163 ldns_rr_rrsig_expiration(const ldns_rr *r)
00164 {
00165 return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 4);
00166 }
00167
00168 bool
00169 ldns_rr_rrsig_set_expiration(ldns_rr *r, ldns_rdf *f)
00170 {
00171 return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 4);
00172 }
00173
00174 ldns_rdf *
00175 ldns_rr_rrsig_inception(const ldns_rr *r)
00176 {
00177 return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 5);
00178 }
00179
00180 bool
00181 ldns_rr_rrsig_set_inception(ldns_rr *r, ldns_rdf *f)
00182 {
00183 return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 5);
00184 }
00185
00186 ldns_rdf *
00187 ldns_rr_rrsig_keytag(const ldns_rr *r)
00188 {
00189 return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 6);
00190 }
00191
00192 bool
00193 ldns_rr_rrsig_set_keytag(ldns_rr *r, ldns_rdf *f)
00194 {
00195 return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 6);
00196 }
00197
00198 ldns_rdf *
00199 ldns_rr_rrsig_signame(const ldns_rr *r)
00200 {
00201 return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 7);
00202 }
00203
00204 bool
00205 ldns_rr_rrsig_set_signame(ldns_rr *r, ldns_rdf *f)
00206 {
00207 return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 7);
00208 }
00209
00210 ldns_rdf *
00211 ldns_rr_rrsig_sig(const ldns_rr *r)
00212 {
00213 return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 8);
00214 }
00215
00216 bool
00217 ldns_rr_rrsig_set_sig(ldns_rr *r, ldns_rdf *f)
00218 {
00219 return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 8);
00220 }
00221
00222
00223 ldns_rdf *
00224 ldns_rr_dnskey_flags(const ldns_rr *r)
00225 {
00226 return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 0);
00227 }
00228
00229 bool
00230 ldns_rr_dnskey_set_flags(ldns_rr *r, ldns_rdf *f)
00231 {
00232 return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 0);
00233 }
00234
00235 ldns_rdf *
00236 ldns_rr_dnskey_protocol(const ldns_rr *r)
00237 {
00238 return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 1);
00239 }
00240
00241 bool
00242 ldns_rr_dnskey_set_protocol(ldns_rr *r, ldns_rdf *f)
00243 {
00244 return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 1);
00245 }
00246
00247 ldns_rdf *
00248 ldns_rr_dnskey_algorithm(const ldns_rr *r)
00249 {
00250 return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 2);
00251 }
00252
00253 bool
00254 ldns_rr_dnskey_set_algorithm(ldns_rr *r, ldns_rdf *f)
00255 {
00256 return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 2);
00257 }
00258
00259 ldns_rdf *
00260 ldns_rr_dnskey_key(const ldns_rr *r)
00261 {
00262 return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 3);
00263 }
00264
00265 bool
00266 ldns_rr_dnskey_set_key(ldns_rr *r, ldns_rdf *f)
00267 {
00268 return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 3);
00269 }
00270
00271 uint16_t
00272 ldns_rr_dnskey_key_size(const ldns_rr *key)
00273 {
00274
00275 ldns_rdf *keydata;
00276 uint16_t length;
00277
00278 keydata = ldns_rr_dnskey_key(key);
00279
00280 length = ldns_rdf_size(keydata);
00281
00282 length = (length - 2) * 8;
00283
00284 return length;
00285 }