mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-22 23:09:34 +01:00
resolve: systemd set DNS names
This commit is contained in:
parent
c1a1828872
commit
25ec69b358
100
src/resolve.c
100
src/resolve.c
@ -25,6 +25,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
#include <ell/ell.h>
|
#include <ell/ell.h>
|
||||||
|
|
||||||
@ -48,16 +49,68 @@ struct resolve_method {
|
|||||||
static struct resolve_method method;
|
static struct resolve_method method;
|
||||||
|
|
||||||
#define SYSTEMD_RESOLVED_SERVICE "org.freedesktop.resolve1"
|
#define SYSTEMD_RESOLVED_SERVICE "org.freedesktop.resolve1"
|
||||||
|
#define SYSTEMD_RESOLVED_MANAGER_PATH "/org/freedesktop/resolve1"
|
||||||
|
#define SYSTEMD_RESOLVED_MANAGER_INTERFACE "org.freedesktop.resolve1.Manager"
|
||||||
|
|
||||||
struct systemd_state {
|
struct systemd_state {
|
||||||
uint32_t service_watch;
|
uint32_t service_watch;
|
||||||
bool is_ready:1;
|
bool is_ready:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void resolve_systemd_add_dns(uint32_t ifindex, char **dns_list,
|
static void systemd_link_dns_reply(struct l_dbus_message *message,
|
||||||
void *data)
|
void *user_data)
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
const char *text;
|
||||||
|
|
||||||
|
if (!l_dbus_message_is_error(message))
|
||||||
|
return;
|
||||||
|
|
||||||
|
l_dbus_message_get_error(message, &name, &text);
|
||||||
|
|
||||||
|
l_error("resolve-systemd: Failed to modify the DNS entries. %s: %s",
|
||||||
|
name, text);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool systemd_builder_add_dns(struct l_dbus_message_builder *builder,
|
||||||
|
uint8_t type, const char *dns)
|
||||||
|
{
|
||||||
|
uint8_t buf[16];
|
||||||
|
uint8_t buf_size;
|
||||||
|
uint8_t i;
|
||||||
|
int t = (int) type;
|
||||||
|
|
||||||
|
l_debug("installing DNS: %s %u", dns, type);
|
||||||
|
|
||||||
|
l_dbus_message_builder_append_basic(builder, 'i', &t);
|
||||||
|
l_dbus_message_builder_enter_array(builder, "y");
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case AF_INET:
|
||||||
|
if (inet_pton(AF_INET, dns, buf) < 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
buf_size = 4;
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < buf_size; i++)
|
||||||
|
l_dbus_message_builder_append_basic(builder, 'y', &buf[i]);
|
||||||
|
|
||||||
|
l_dbus_message_builder_leave_array(builder);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void resolve_systemd_add_dns(uint32_t ifindex, uint8_t type,
|
||||||
|
char **dns_list, void *data)
|
||||||
{
|
{
|
||||||
struct systemd_state *state = data;
|
struct systemd_state *state = data;
|
||||||
|
struct l_dbus_message_builder *builder;
|
||||||
|
struct l_dbus_message *message;
|
||||||
|
|
||||||
l_debug("ifindex: %u", ifindex);
|
l_debug("ifindex: %u", ifindex);
|
||||||
|
|
||||||
@ -68,7 +121,48 @@ static void resolve_systemd_add_dns(uint32_t ifindex, char **dns_list,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO */
|
message =
|
||||||
|
l_dbus_message_new_method_call(dbus_get_bus(),
|
||||||
|
SYSTEMD_RESOLVED_SERVICE,
|
||||||
|
SYSTEMD_RESOLVED_MANAGER_PATH,
|
||||||
|
SYSTEMD_RESOLVED_MANAGER_INTERFACE,
|
||||||
|
"SetLinkDNS");
|
||||||
|
|
||||||
|
if (!message)
|
||||||
|
return;
|
||||||
|
|
||||||
|
builder = l_dbus_message_builder_new(message);
|
||||||
|
if (!builder) {
|
||||||
|
l_dbus_message_unref(message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
l_dbus_message_builder_append_basic(builder, 'i', &ifindex);
|
||||||
|
|
||||||
|
l_dbus_message_builder_enter_array(builder, "(iay)");
|
||||||
|
|
||||||
|
for (; *dns_list; dns_list++) {
|
||||||
|
l_dbus_message_builder_enter_struct(builder, "iay");
|
||||||
|
|
||||||
|
if (systemd_builder_add_dns(builder, type, *dns_list)) {
|
||||||
|
l_dbus_message_builder_leave_struct(builder);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
l_dbus_message_builder_destroy(builder);
|
||||||
|
l_dbus_message_unref(message);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
l_dbus_message_builder_leave_array(builder);
|
||||||
|
|
||||||
|
l_dbus_message_builder_finalize(builder);
|
||||||
|
l_dbus_message_builder_destroy(builder);
|
||||||
|
|
||||||
|
l_dbus_send_with_reply(dbus_get_bus(), message, systemd_link_dns_reply,
|
||||||
|
state, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void resolve_systemd_remove(uint32_t ifindex, void *data)
|
static void resolve_systemd_remove(uint32_t ifindex, void *data)
|
||||||
|
Loading…
Reference in New Issue
Block a user