1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include "bus-message-util.h"
5 #include "resolve-util.h"
7 int bus_message_read_ifindex(sd_bus_message
*message
, sd_bus_error
*error
, int *ret
) {
13 assert_cc(sizeof(int) == sizeof(int32_t));
15 r
= sd_bus_message_read(message
, "i", &ifindex
);
20 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid interface index");
27 int bus_message_read_family(sd_bus_message
*message
, sd_bus_error
*error
, int *ret
) {
33 assert_cc(sizeof(int) == sizeof(int32_t));
35 r
= sd_bus_message_read(message
, "i", &family
);
39 if (!IN_SET(family
, AF_INET
, AF_INET6
))
40 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Unknown address family %i", family
);
46 int bus_message_read_in_addr_auto(sd_bus_message
*message
, sd_bus_error
*error
, int *ret_family
, union in_addr_union
*ret_addr
) {
53 r
= sd_bus_message_read(message
, "i", &family
);
57 r
= sd_bus_message_read_array(message
, 'y', &d
, &sz
);
61 if (!IN_SET(family
, AF_INET
, AF_INET6
))
62 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Unknown address family %i", family
);
64 if (sz
!= FAMILY_ADDRESS_SIZE(family
))
65 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid address size");
70 memcpy(ret_addr
, d
, sz
);
74 static int bus_message_read_dns_one(
75 sd_bus_message
*message
,
79 union in_addr_union
*ret_address
,
81 const char **ret_server_name
) {
82 const char *server_name
= NULL
;
83 union in_addr_union a
;
91 assert(ret_server_name
);
93 r
= sd_bus_message_enter_container(message
, 'r', extended
? "iayqs" : "iay");
97 r
= bus_message_read_in_addr_auto(message
, error
, &family
, &a
);
101 if (!dns_server_address_valid(family
, &a
))
102 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid DNS server address");
105 r
= sd_bus_message_read(message
, "q", &port
);
109 if (IN_SET(port
, 53, 853))
112 r
= sd_bus_message_read(message
, "s", &server_name
);
117 r
= sd_bus_message_exit_container(message
);
121 *ret_family
= family
;
124 *ret_server_name
= server_name
;
129 int bus_message_read_dns_servers(
130 sd_bus_message
*message
,
133 struct in_addr_full
***ret_dns
,
136 struct in_addr_full
**dns
= NULL
;
137 size_t n
= 0, allocated
= 0;
144 r
= sd_bus_message_enter_container(message
, 'a', extended
? "(iayqs)" : "(iay)");
149 const char *server_name
;
150 union in_addr_union a
;
154 r
= bus_message_read_dns_one(message
, error
, extended
, &family
, &a
, &port
, &server_name
);
160 if (!GREEDY_REALLOC(dns
, allocated
, n
+1)) {
165 r
= in_addr_full_new(family
, &a
, port
, 0, server_name
, dns
+ n
);
172 *ret_dns
= TAKE_PTR(dns
);
177 for (size_t i
= 0; i
< n
; i
++)
178 in_addr_full_free(dns
[i
]);