resolved-dns-rr.c revision 8db0d2f5c37e7e8f5bfce016cfdad7947a3ea939
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering This file is part of systemd.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering Copyright 2014 Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering systemd is free software; you can redistribute it and/or modify it
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering under the terms of the GNU Lesser General Public License as published by
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering (at your option) any later version.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering systemd is distributed in the hope that it will be useful, but
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering Lesser General Public License for more details.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering You should have received a copy of the GNU Lesser General Public License
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart PoetteringDnsResourceKey* dns_resource_key_new(uint16_t class, uint16_t type, const char *name) {
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering k = malloc0(sizeof(DnsResourceKey) + l + 1);
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering strcpy((char*) k + sizeof(DnsResourceKey), name);
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart PoetteringDnsResourceKey* dns_resource_key_new_consume(uint16_t class, uint16_t type, char *name) {
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart PoetteringDnsResourceKey* dns_resource_key_ref(DnsResourceKey *k) {
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart PoetteringDnsResourceKey* dns_resource_key_unref(DnsResourceKey *k) {
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringint dns_resource_key_equal(const DnsResourceKey *a, const DnsResourceKey *b) {
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering r = dns_name_equal(DNS_RESOURCE_KEY_NAME(a), DNS_RESOURCE_KEY_NAME(b));
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringint dns_resource_key_match_rr(const DnsResourceKey *key, const DnsResourceRecord *rr) {
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering if (rr->key->class != key->class && key->class != DNS_CLASS_ANY)
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering if (rr->key->type != key->type && key->type != DNS_TYPE_ANY)
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering return dns_name_equal(DNS_RESOURCE_KEY_NAME(rr->key), DNS_RESOURCE_KEY_NAME(key));
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringint dns_resource_key_match_cname(const DnsResourceKey *key, const DnsResourceRecord *rr) {
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering if (rr->key->class != key->class && key->class != DNS_CLASS_ANY)
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering return dns_name_equal(DNS_RESOURCE_KEY_NAME(rr->key), DNS_RESOURCE_KEY_NAME(key));
d5099efc47d4e6ac60816b5381a5f607ab03f06eMichal Schmidtunsigned long dns_resource_key_hash_func(const void *i, const uint8_t hash_key[HASH_KEY_SIZE]) {
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering unsigned long ul;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering ul = dns_name_hash_func(DNS_RESOURCE_KEY_NAME(k), hash_key);
d5099efc47d4e6ac60816b5381a5f607ab03f06eMichal Schmidtint dns_resource_key_compare_func(const void *a, const void *b) {
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering const DnsResourceKey *x = a, *y = b;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering ret = dns_name_compare_func(DNS_RESOURCE_KEY_NAME(x), DNS_RESOURCE_KEY_NAME(y));
d5099efc47d4e6ac60816b5381a5f607ab03f06eMichal Schmidtint dns_resource_key_to_string(const DnsResourceKey *key, char **ret) {
d5099efc47d4e6ac60816b5381a5f607ab03f06eMichal Schmidt char cbuf[DECIMAL_STR_MAX(uint16_t)], tbuf[DECIMAL_STR_MAX(uint16_t)];
d5099efc47d4e6ac60816b5381a5f607ab03f06eMichal Schmidt const char *c, *t;
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering if (asprintf(&s, "%s %s %-5s", DNS_RESOURCE_KEY_NAME(key), c, t) < 0)
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart PoetteringDnsResourceRecord* dns_resource_record_new(DnsResourceKey *key) {
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart PoetteringDnsResourceRecord* dns_resource_record_new_full(uint16_t class, uint16_t type, const char *name) {
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering key = dns_resource_key_new(class, type, name);
8bf52d3d17d364438191077d0750b8b80b5dc53aLennart PoetteringDnsResourceRecord* dns_resource_record_ref(DnsResourceRecord *rr) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart PoetteringDnsResourceRecord* dns_resource_record_unref(DnsResourceRecord *rr) {
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek dns_resource_key_unref(rr->key);
9de3e3294065e8697ff10130b53f274319cdcf6fZbigniew Jędrzejewski-Szmekint dns_resource_record_new_reverse(DnsResourceRecord **ret, int family, const union in_addr_union *address, const char *hostname) {
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering r = dns_name_reverse(family, address, &ptr);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering key = dns_resource_key_new_consume(DNS_CLASS_IN, DNS_TYPE_PTR, ptr);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poetteringint dns_resource_record_equal(const DnsResourceRecord *a, const DnsResourceRecord *b) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering r = dns_resource_key_equal(a->key, b->key);
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering switch (a->unparseable ? _DNS_TYPE_INVALID : a->key->type) {
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering r = dns_name_equal(a->srv.name, b->srv.name);
fd0b4602f6332c3f1660eb208c8f5c719709a009Lennart Poettering return a->srv.priority == b->srv.priority &&
9c92ce6d67f88beb31dd6555d12ae3f632218a39Lennart Poettering return dns_name_equal(a->ptr.name, b->ptr.name);
9c92ce6d67f88beb31dd6555d12ae3f632218a39Lennart Poettering return strcaseeq(a->hinfo.cpu, b->hinfo.cpu) &&
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering case DNS_TYPE_SPF: /* exactly the same as TXT */
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering for (i = 0; a->txt.strings[i] || b->txt.strings[i]; i++)
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering if (!streq_ptr(a->txt.strings[i], b->txt.strings[i]))
0f84a72e3c0f58d71cff2121e6df1611eaf9c9eaDavid Herrmann return memcmp(&a->a.in_addr, &b->a.in_addr, sizeof(struct in_addr)) == 0;
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering return memcmp(&a->aaaa.in6_addr, &b->aaaa.in6_addr, sizeof(struct in6_addr)) == 0;
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering r = dns_name_equal(a->soa.mname, b->soa.mname);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering r = dns_name_equal(a->soa.rname, b->soa.rname);
946c70944ebdf428ffeb9991a7449edbd4011461Zbigniew Jędrzejewski-Szmek return dns_name_equal(a->mx.exchange, b->mx.exchange);
946c70944ebdf428ffeb9991a7449edbd4011461Zbigniew Jędrzejewski-Szmek assert(a->loc.version == b->loc.version);
946c70944ebdf428ffeb9991a7449edbd4011461Zbigniew Jędrzejewski-Szmek return a->loc.size == b->loc.size &&
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek a->loc.horiz_pre == b->loc.horiz_pre &&
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek a->loc.vert_pre == b->loc.vert_pre &&
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek a->loc.latitude == b->loc.latitude &&
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek a->loc.longitude == b->loc.longitude &&
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek a->loc.altitude == b->loc.altitude;
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek return a->sshfp.algorithm == b->sshfp.algorithm &&
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek a->sshfp.fptype == b->sshfp.fptype &&
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek a->sshfp.key_size == b->sshfp.key_size &&
42cc2eebb01056beb7acd3ecfe8e533558237f84Lennart Poettering memcmp(a->sshfp.key, b->sshfp.key, a->sshfp.key_size) == 0;
42cc2eebb01056beb7acd3ecfe8e533558237f84Lennart Poettering return a->dnskey.zone_key_flag == b->dnskey.zone_key_flag &&
42cc2eebb01056beb7acd3ecfe8e533558237f84Lennart Poettering a->dnskey.sep_flag == b->dnskey.sep_flag &&
42cc2eebb01056beb7acd3ecfe8e533558237f84Lennart Poettering a->dnskey.algorithm == b->dnskey.algorithm &&
8db0d2f5c37e7e8f5bfce016cfdad7947a3ea939Zbigniew Jędrzejewski-Szmek a->dnskey.key_size == b->dnskey.key_size &&
8db0d2f5c37e7e8f5bfce016cfdad7947a3ea939Zbigniew Jędrzejewski-Szmek memcmp(a->dnskey.key, b->dnskey.key, a->dnskey.key_size) == 0;
8db0d2f5c37e7e8f5bfce016cfdad7947a3ea939Zbigniew Jędrzejewski-Szmek return a->generic.size == b->generic.size &&
8db0d2f5c37e7e8f5bfce016cfdad7947a3ea939Zbigniew Jędrzejewski-Szmek memcmp(a->generic.data, b->generic.data, a->generic.size) == 0;
03664a62914782dbd8f069bbcf8a0c8ca1df7010Lukas Nykrynstatic char* format_location(uint32_t latitude, uint32_t longitude, uint32_t altitude,
03664a62914782dbd8f069bbcf8a0c8ca1df7010Lukas Nykryn uint8_t size, uint8_t horiz_pre, uint8_t vert_pre) {
03664a62914782dbd8f069bbcf8a0c8ca1df7010Lukas Nykryn int lat = latitude >= 1U<<31 ? (int) (latitude - (1U<<31)) : (int) ((1U<<31) - latitude);
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek int lon = longitude >= 1U<<31 ? (int) (longitude - (1U<<31)) : (int) ((1U<<31) - longitude);
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek double alt = altitude >= 10000000u ? altitude - 10000000u : -(double)(10000000u - altitude);
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek double siz = (size >> 4) * exp10((double) (size & 0xF));
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek double hor = (horiz_pre >> 4) * exp10((double) (horiz_pre & 0xF));
151226ab4bf276d60d51864330a99f886b923697Zbigniew Jędrzejewski-Szmek double ver = (vert_pre >> 4) * exp10((double) (vert_pre & 0xF));
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering if (asprintf(&s, "%d %d %.3f %c %d %d %.3f %c %.2fm %.2fm %.2fm %.2fm",
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmekint dns_resource_record_to_string(const DnsResourceRecord *rr, char **ret) {
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek _cleanup_free_ char *k = NULL, *t = NULL;
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek r = dns_resource_key_to_string(rr->key, &k);
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek switch (rr->unparseable ? _DNS_TYPE_INVALID : rr->key->type) {
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek r = asprintf(&s, "%s %u %u %u %s",
9c92ce6d67f88beb31dd6555d12ae3f632218a39Lennart Poettering s = strjoin(k, " ", rr->hinfo.cpu, " ", rr->hinfo.os, NULL);
9c92ce6d67f88beb31dd6555d12ae3f632218a39Lennart Poettering case DNS_TYPE_SPF: /* exactly the same as TXT */
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering r = in_addr_to_string(AF_INET, (const union in_addr_union*) &rr->a.in_addr, &x);
2e276efc7b0398a3086629a52970bdd4ab7252f9Zbigniew Jędrzejewski-Szmek r = in_addr_to_string(AF_INET6, (const union in_addr_union*) &rr->aaaa.in6_addr, &t);
2d4c5cbc0ed3ccb09dc086a040088b454c22c644Lennart Poettering r = asprintf(&s, "%s %s %s %u %u %u %u %u",
946c70944ebdf428ffeb9991a7449edbd4011461Zbigniew Jędrzejewski-Szmek t = hexmem(rr->sshfp.key, rr->sshfp.key_size);
0dae31d468b1a0e22d98921f7b0dbd92fd217167Zbigniew Jędrzejewski-Szmek t = hexmem(rr->dnskey.key, rr->dnskey.key_size);
8db0d2f5c37e7e8f5bfce016cfdad7947a3ea939Zbigniew Jędrzejewski-Szmek r = asprintf(&s, "%s %u 3 %u %s",
42cc2eebb01056beb7acd3ecfe8e533558237f84Lennart Poettering t = hexmem(rr->generic.data, rr->generic.size);
8db0d2f5c37e7e8f5bfce016cfdad7947a3ea939Zbigniew Jędrzejewski-Szmekconst char *dns_class_to_string(uint16_t class) {