@@ -119,6 +119,10 @@ static int dnssd_service_load(Manager *manager, const char *filename) {
119119
120120 service -> manager = manager ;
121121
122+ r = dnssd_update_rrs (service );
123+ if (r < 0 )
124+ return r ;
125+
122126 service = NULL ;
123127
124128 return 0 ;
@@ -192,6 +196,73 @@ int dnssd_load(Manager *manager) {
192196 return 0 ;
193197}
194198
199+ int dnssd_update_rrs (DnssdService * s ) {
200+ _cleanup_free_ char * n = NULL ;
201+ _cleanup_free_ char * service_name = NULL ;
202+ _cleanup_free_ char * full_name = NULL ;
203+ int r ;
204+
205+ assert (s );
206+ assert (s -> txt );
207+ assert (s -> manager );
208+
209+ s -> ptr_rr = dns_resource_record_unref (s -> ptr_rr );
210+ s -> srv_rr = dns_resource_record_unref (s -> srv_rr );
211+ s -> txt_rr = dns_resource_record_unref (s -> txt_rr );
212+
213+ r = dnssd_render_instance_name (s , & n );
214+ if (r < 0 )
215+ return r ;
216+
217+ r = dns_name_concat (s -> type , "local" , & service_name );
218+ if (r < 0 )
219+ return r ;
220+ r = dns_name_concat (n , service_name , & full_name );
221+ if (r < 0 )
222+ return r ;
223+
224+ s -> txt_rr = dns_resource_record_new_full (DNS_CLASS_IN , DNS_TYPE_TXT ,
225+ full_name );
226+ if (!s -> txt_rr )
227+ goto oom ;
228+
229+ s -> txt_rr -> ttl = MDNS_DEFAULT_TTL ;
230+ s -> txt_rr -> txt .items = dns_txt_item_copy (s -> txt );
231+ if (!s -> txt_rr -> txt .items )
232+ goto oom ;
233+
234+ s -> ptr_rr = dns_resource_record_new_full (DNS_CLASS_IN , DNS_TYPE_PTR ,
235+ service_name );
236+ if (!s -> ptr_rr )
237+ goto oom ;
238+
239+ s -> ptr_rr -> ttl = MDNS_DEFAULT_TTL ;
240+ s -> ptr_rr -> ptr .name = strdup (full_name );
241+ if (!s -> ptr_rr -> ptr .name )
242+ goto oom ;
243+
244+ s -> srv_rr = dns_resource_record_new_full (DNS_CLASS_IN , DNS_TYPE_SRV ,
245+ full_name );
246+ if (!s -> srv_rr )
247+ goto oom ;
248+
249+ s -> srv_rr -> ttl = MDNS_DEFAULT_TTL ;
250+ s -> srv_rr -> srv .priority = s -> priority ;
251+ s -> srv_rr -> srv .weight = s -> weight ;
252+ s -> srv_rr -> srv .port = s -> port ;
253+ s -> srv_rr -> srv .name = strdup (s -> manager -> mdns_hostname );
254+ if (!s -> srv_rr -> srv .name )
255+ goto oom ;
256+
257+ return 0 ;
258+
259+ oom :
260+ s -> txt_rr = dns_resource_record_unref (s -> txt_rr );
261+ s -> ptr_rr = dns_resource_record_unref (s -> ptr_rr );
262+ s -> srv_rr = dns_resource_record_unref (s -> srv_rr );
263+ return - ENOMEM ;
264+ }
265+
195266int dnssd_txt_item_new_from_string (const char * key , const char * value , DnsTxtItem * * ret_item ) {
196267 size_t length ;
197268 DnsTxtItem * i ;
0 commit comments