]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/resolve/resolved-dnssd.c
resolve: fix log message
[thirdparty/systemd.git] / src / resolve / resolved-dnssd.c
index 6d0ab39a9dab8efe2888e5e9e658a6d830ac6410..c724f8a9b7da7341168fa99f88f41f64c0ff2c95 100644 (file)
@@ -1,20 +1,5 @@
 /***
-  This file is part of systemd.
-
-  Copyright 2017 Dmitry Rozhkov
-
-  systemd is free software; you can redistribute it and/or modify it
-  under the terms of the GNU Lesser General Public License as published by
-  the Free Software Foundation; either version 2.1 of the License, or
-  (at your option) any later version.
-
-  systemd is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  Lesser General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public License
-  along with systemd; If not, see <http://www.gnu.org/licenses/>.
+  Copyright © 2017 Dmitry Rozhkov
 ***/
 
 #include "conf-files.h"
@@ -35,6 +20,29 @@ const char* const dnssd_service_dirs[] = {
     NULL
 };
 
+DnssdTxtData *dnssd_txtdata_free(DnssdTxtData *txt_data) {
+        if (!txt_data)
+                return NULL;
+
+        dns_resource_record_unref(txt_data->rr);
+        dns_txt_item_free_all(txt_data->txt);
+
+        return mfree(txt_data);
+}
+
+DnssdTxtData *dnssd_txtdata_free_all(DnssdTxtData *txt_data) {
+        DnssdTxtData *next;
+
+        if (!txt_data)
+                return NULL;
+
+        next = txt_data->items_next;
+
+        dnssd_txtdata_free(txt_data);
+
+        return dnssd_txtdata_free_all(next);
+}
+
 DnssdService *dnssd_service_free(DnssdService *service) {
         if (!service)
                 return NULL;
@@ -44,19 +52,20 @@ DnssdService *dnssd_service_free(DnssdService *service) {
 
         dns_resource_record_unref(service->ptr_rr);
         dns_resource_record_unref(service->srv_rr);
-        dns_resource_record_unref(service->txt_rr);
+
+        dnssd_txtdata_free_all(service->txt_data_items);
 
         free(service->filename);
         free(service->name);
         free(service->type);
         free(service->name_template);
-        dns_txt_item_free_all(service->txt);
 
         return mfree(service);
 }
 
 static int dnssd_service_load(Manager *manager, const char *filename) {
         _cleanup_(dnssd_service_freep) DnssdService *service = NULL;
+        _cleanup_(dnssd_txtdata_freep) DnssdTxtData *txt_data = NULL;
         char *d;
         const char *dropin_dirname;
         int r;
@@ -103,10 +112,17 @@ static int dnssd_service_load(Manager *manager, const char *filename) {
                 return -EINVAL;
         }
 
-        if (!service->txt) {
-                r = dns_txt_item_new_empty(&service->txt);
+        if (LIST_IS_EMPTY(service->txt_data_items)) {
+                txt_data = new0(DnssdTxtData, 1);
+                if (!txt_data)
+                        return log_oom();
+
+                r = dns_txt_item_new_empty(&txt_data->txt);
                 if (r < 0)
                         return r;
+
+                LIST_PREPEND(items, service->txt_data_items, txt_data);
+                txt_data = NULL;
         }
 
         r = hashmap_ensure_allocated(&manager->dnssd_services, &string_hash_ops);
@@ -148,7 +164,7 @@ int dnssd_render_instance_name(DnssdService *s, char **ret_name) {
         static const Specifier specifier_table[] = {
                 { 'b', specifier_boot_id,         NULL },
                 { 'H', specifier_dnssd_host_name, NULL },
-                { 'm', specifier_machine_id, NULL },
+                { 'm', specifier_machine_id,      NULL },
                 { 'v', specifier_kernel_release,  NULL },
                 {}
         };
@@ -167,8 +183,7 @@ int dnssd_render_instance_name(DnssdService *s, char **ret_name) {
                 return -EINVAL;
         }
 
-        *ret_name = name;
-        name = NULL;
+        *ret_name = TAKE_PTR(name);
 
         return 0;
 }
@@ -200,15 +215,17 @@ int dnssd_update_rrs(DnssdService *s) {
         _cleanup_free_ char *n = NULL;
         _cleanup_free_ char *service_name = NULL;
         _cleanup_free_ char *full_name = NULL;
+        DnssdTxtData *txt_data;
         int r;
 
         assert(s);
-        assert(s->txt);
+        assert(s->txt_data_items);
         assert(s->manager);
 
         s->ptr_rr = dns_resource_record_unref(s->ptr_rr);
         s->srv_rr = dns_resource_record_unref(s->srv_rr);
-        s->txt_rr = dns_resource_record_unref(s->txt_rr);
+        LIST_FOREACH(items, txt_data, s->txt_data_items)
+                txt_data->rr = dns_resource_record_unref(txt_data->rr);
 
         r = dnssd_render_instance_name(s, &n);
         if (r < 0)
@@ -221,15 +238,17 @@ int dnssd_update_rrs(DnssdService *s) {
         if (r < 0)
                 return r;
 
-        s->txt_rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_TXT,
-                                                 full_name);
-        if (!s->txt_rr)
-                goto oom;
+        LIST_FOREACH(items, txt_data, s->txt_data_items) {
+                txt_data->rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_TXT,
+                                                            full_name);
+                if (!txt_data->rr)
+                        goto oom;
 
-        s->txt_rr->ttl = MDNS_DEFAULT_TTL;
-        s->txt_rr->txt.items = dns_txt_item_copy(s->txt);
-        if (!s->txt_rr->txt.items)
-                goto oom;
+                txt_data->rr->ttl = MDNS_DEFAULT_TTL;
+                txt_data->rr->txt.items = dns_txt_item_copy(txt_data->txt);
+                if (!txt_data->rr->txt.items)
+                        goto oom;
+        }
 
         s->ptr_rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_PTR,
                                                  service_name);
@@ -257,7 +276,8 @@ int dnssd_update_rrs(DnssdService *s) {
         return 0;
 
 oom:
-        s->txt_rr = dns_resource_record_unref(s->txt_rr);
+        LIST_FOREACH(items, txt_data, s->txt_data_items)
+                txt_data->rr = dns_resource_record_unref(txt_data->rr);
         s->ptr_rr = dns_resource_record_unref(s->ptr_rr);
         s->srv_rr = dns_resource_record_unref(s->srv_rr);
         return -ENOMEM;
@@ -283,8 +303,7 @@ int dnssd_txt_item_new_from_string(const char *key, const char *value, DnsTxtIte
         }
         i->length = length;
 
-        *ret_item = i;
-        i = NULL;
+        *ret_item = TAKE_PTR(i);
 
         return 0;
 }
@@ -309,8 +328,7 @@ int dnssd_txt_item_new_from_data(const char *key, const void *data, const size_t
         }
         i->length = length;
 
-        *ret_item = i;
-        i = NULL;
+        *ret_item = TAKE_PTR(i);
 
         return 0;
 }