rr_functions.c

Go to the documentation of this file.
00001 /*
00002  * rr_function.c
00003  *
00004  * function that operate on specific rr types
00005  *
00006  * (c) NLnet Labs, 2004-2006
00007  * See the file LICENSE for the license
00008  */
00009 
00010 /*
00011  * These come strait from perldoc Net::DNS::RR::xxx
00012  * first the read variant, then the write. This is
00013  * not complete.
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 /* A/AAAA records */
00064 ldns_rdf *
00065 ldns_rr_a_address(const ldns_rr *r)
00066 {
00067         /* 2 types to check, cannot use the macro */
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         /* 2 types to check, cannot use the macro... */
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 /* NS record */
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 /* MX record */
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 /* RRSIG record */
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 /* DNSKEY record */
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         /* calc back to the bit size */
00282         length = (length - 2) * 8;
00283 
00284         return length;
00285 }

Generated on Fri Nov 23 00:48:29 2007 for ldns by  doxygen 1.5.3-20071008