diff options
author | Dan Williams <dan@ioncontrol.co> | 2024-12-02 09:39:21 -0600 |
---|---|---|
committer | Dan Williams <dan@bigw.org> | 2025-02-18 21:06:19 +0000 |
commit | 0a94b0138de65ae88e783143d2c4cab930303844 (patch) | |
tree | f2bcc5f229691ad72f48fdb7aa32c27dc4b2d25c /src/mm-port-net.c | |
parent | 029a8cd11a0d181403b600af9a9979ef5e1eea13 (diff) |
netlink: add RTM_GETLINK support to read MAC address
Since we're also now reading responses we need to check sender
credentials to make sure we're talking to the kernel, and not
some other process spoofing netlink.
Signed-off-by: Dan Williams <dan@ioncontrol.co>
Diffstat (limited to 'src/mm-port-net.c')
-rw-r--r-- | src/mm-port-net.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/mm-port-net.c b/src/mm-port-net.c index f1122ef6..a1fb4372 100644 --- a/src/mm-port-net.c +++ b/src/mm-port-net.c @@ -97,6 +97,59 @@ mm_port_net_link_setup (MMPortNet *self, /*****************************************************************************/ +GByteArray * +mm_port_net_get_hwaddress_finish (MMPortNet *self, + GAsyncResult *res, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (res), error); +} + +static void +netlink_get_hwaddress_ready (MMNetlink *netlink, + GAsyncResult *res, + GTask *task) +{ + GError *error = NULL; + GByteArray *hwaddr; + + hwaddr = mm_netlink_get_hwaddr_finish (netlink, res, &error); + if (!hwaddr) { + g_prefix_error (&error, "netlink operation failed: "); + g_task_return_error (task, error); + } else + g_task_return_pointer (task, hwaddr, (GDestroyNotify) g_byte_array_unref); + g_object_unref (task); +} + +void +mm_port_net_get_hwaddress (MMPortNet *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (self, cancellable, callback, user_data); + + ensure_ifindex (self); + if (!self->priv->ifindex) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "no valid interface index found for %s", + mm_port_get_device (MM_PORT (self))); + g_object_unref (task); + return; + } + + mm_netlink_get_hwaddr (mm_netlink_get (), /* singleton */ + self->priv->ifindex, + cancellable, + (GAsyncReadyCallback) netlink_get_hwaddress_ready, + task); +} + +/*****************************************************************************/ + MMPortNet * mm_port_net_new (const gchar *name) { |