@@ -114,7 +114,7 @@ int bus_link_method_set_ntp_servers(sd_bus_message *message, void *userdata, sd_
114114 return sd_bus_reply_method_return (message , NULL );
115115}
116116
117- int bus_link_method_set_dns_servers (sd_bus_message * message , void * userdata , sd_bus_error * error ) {
117+ static int bus_link_method_set_dns_servers_internal (sd_bus_message * message , void * userdata , sd_bus_error * error , bool extended ) {
118118 struct in_addr_full * * dns = NULL ;
119119 size_t allocated = 0 , n = 0 ;
120120 Link * l = userdata ;
@@ -127,19 +127,21 @@ int bus_link_method_set_dns_servers(sd_bus_message *message, void *userdata, sd_
127127 if (r < 0 )
128128 return r ;
129129
130- r = sd_bus_message_enter_container (message , 'a' , "(iay)" );
130+ r = sd_bus_message_enter_container (message , 'a' , extended ? "(iayqs)" : "(iay)" );
131131 if (r < 0 )
132132 return r ;
133133
134134 for (;;) {
135+ const char * server_name = NULL ;
135136 union in_addr_union a ;
137+ uint16_t port = 0 ;
138+ const void * d ;
136139 int family ;
137140 size_t sz ;
138- const void * d ;
139141
140142 assert_cc (sizeof (int ) == sizeof (int32_t ));
141143
142- r = sd_bus_message_enter_container (message , 'r' , "iay" );
144+ r = sd_bus_message_enter_container (message , 'r' , extended ? "iayqs" : "iay" );
143145 if (r < 0 )
144146 goto finalize ;
145147 if (r == 0 )
@@ -167,6 +169,19 @@ int bus_link_method_set_dns_servers(sd_bus_message *message, void *userdata, sd_
167169 goto finalize ;
168170 }
169171
172+ if (extended ) {
173+ r = sd_bus_message_read (message , "q" , & port );
174+ if (r < 0 )
175+ goto finalize ;
176+
177+ if (IN_SET (port , 53 , 853 ))
178+ port = 0 ;
179+
180+ r = sd_bus_message_read (message , "s" , & server_name );
181+ if (r < 0 )
182+ goto finalize ;
183+ }
184+
170185 r = sd_bus_message_exit_container (message );
171186 if (r < 0 )
172187 goto finalize ;
@@ -177,7 +192,7 @@ int bus_link_method_set_dns_servers(sd_bus_message *message, void *userdata, sd_
177192 }
178193
179194 memcpy (& a , d , sz );
180- r = in_addr_full_new (family , & a , 0 , 0 , NULL , dns + n );
195+ r = in_addr_full_new (family , & a , port , 0 , server_name , dns + n );
181196 if (r < 0 )
182197 goto finalize ;
183198
@@ -218,6 +233,14 @@ int bus_link_method_set_dns_servers(sd_bus_message *message, void *userdata, sd_
218233 return r ;
219234}
220235
236+ int bus_link_method_set_dns_servers (sd_bus_message * message , void * userdata , sd_bus_error * error ) {
237+ return bus_link_method_set_dns_servers_internal (message , userdata , error , false);
238+ }
239+
240+ int bus_link_method_set_dns_servers_ex (sd_bus_message * message , void * userdata , sd_bus_error * error ) {
241+ return bus_link_method_set_dns_servers_internal (message , userdata , error , true);
242+ }
243+
221244int bus_link_method_set_domains (sd_bus_message * message , void * userdata , sd_bus_error * error ) {
222245 _cleanup_ (ordered_set_freep ) OrderedSet * search_domains = NULL , * route_domains = NULL ;
223246 Link * l = userdata ;
@@ -696,6 +719,7 @@ const sd_bus_vtable link_vtable[] = {
696719
697720 SD_BUS_METHOD ("SetNTP" , "as" , NULL , bus_link_method_set_ntp_servers , SD_BUS_VTABLE_UNPRIVILEGED ),
698721 SD_BUS_METHOD ("SetDNS" , "a(iay)" , NULL , bus_link_method_set_dns_servers , SD_BUS_VTABLE_UNPRIVILEGED ),
722+ SD_BUS_METHOD ("SetDNSEx" , "a(iayqs)" , NULL , bus_link_method_set_dns_servers_ex , SD_BUS_VTABLE_UNPRIVILEGED ),
699723 SD_BUS_METHOD ("SetDomains" , "a(sb)" , NULL , bus_link_method_set_domains , SD_BUS_VTABLE_UNPRIVILEGED ),
700724 SD_BUS_METHOD ("SetDefaultRoute" , "b" , NULL , bus_link_method_set_default_route , SD_BUS_VTABLE_UNPRIVILEGED ),
701725 SD_BUS_METHOD ("SetLLMNR" , "s" , NULL , bus_link_method_set_llmnr , SD_BUS_VTABLE_UNPRIVILEGED ),
0 commit comments