summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2022-11-09 16:17:56 +0100
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-11-16 13:55:10 -0800
commite2b2b1675f310023862319ea10ffd205a75cc0cb (patch)
tree0c767817aaccd89be71411d7e94db70bfa5cd5c3 /plugins
parente515f4b6e25c971c47ab79e9cbdfa17119bbde23 (diff)
downloadbluez-e2b2b1675f310023862319ea10ffd205a75cc0cb.tar.gz
hostname: Fallback to transient hostname
After pretty hostname, and static hostname, also support transient hostname as a last resort before 'BlueZ X.XX'. This happens on Fedora's Workstation installation as it calls "hostnamectl set-hostname" on startup. In Fedora Silverblue, the default hostname is set as fedora in /etc/os-release. In both cases, we should fall back to that transient hostname, as bad as it could be. Note that the transient hostname needs to be monitored through the kernel directly, as explained in: https://www.freedesktop.org/software/systemd/man/org.freedesktop.hostname1.html
Diffstat (limited to 'plugins')
-rw-r--r--plugins/hostname.c57
1 files changed, 55 insertions, 2 deletions
diff --git a/plugins/hostname.c b/plugins/hostname.c
index 14b6450b5..51707f07d 100644
--- a/plugins/hostname.c
+++ b/plugins/hostname.c
@@ -16,6 +16,8 @@
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
+#include <fcntl.h>
+#include <sys/utsname.h>
#include "lib/bluetooth.h"
#include "lib/sdp.h"
@@ -44,8 +46,10 @@
static uint8_t major_class = MAJOR_CLASS_MISCELLANEOUS;
static uint8_t minor_class = MINOR_CLASS_UNCATEGORIZED;
-static char *pretty_hostname = NULL;
-static char *static_hostname = NULL;
+static char *pretty_hostname = NULL;
+static char *static_hostname = NULL;
+static char *transient_hostname = NULL;
+static guint hostname_id = 0;
/*
* Fallback to static hostname only if empty pretty hostname was already
@@ -60,6 +64,10 @@ static const char *get_hostname(void)
if (static_hostname &&
g_str_equal(static_hostname, "") == FALSE)
return static_hostname;
+
+ if (transient_hostname &&
+ g_str_equal(transient_hostname, "") == FALSE)
+ return transient_hostname;
}
return NULL;
@@ -181,6 +189,32 @@ static void property_changed(GDBusProxy *proxy, const char *name,
}
}
+static void read_transient_hostname(void)
+{
+ struct utsname u;
+
+ if (uname(&u) != 0) {
+ g_free(transient_hostname);
+ transient_hostname = NULL;
+ DBG("failed to read transient hostname");
+ return;
+ }
+
+ g_free(transient_hostname);
+ transient_hostname = g_strdup(u.nodename);
+
+ DBG("read transient hostname: '%s'", transient_hostname);
+}
+
+static gboolean hostname_cb(GIOChannel *io, GIOCondition cond,
+ gpointer user_data)
+{
+ DBG("transient hostname changed");
+ read_transient_hostname();
+ adapter_foreach(update_class, NULL);
+ return TRUE;
+}
+
static int hostname_probe(struct btd_adapter *adapter)
{
DBG("");
@@ -261,9 +295,11 @@ static GDBusProxy *hostname_proxy = NULL;
static int hostname_init(void)
{
DBusConnection *conn = btd_get_dbus_connection();
+ int fd;
int err;
read_dmi_fallback();
+ read_transient_hostname();
hostname_client = g_dbus_client_new(conn, "org.freedesktop.hostname1",
"/org/freedesktop/hostname1");
@@ -289,6 +325,17 @@ static int hostname_init(void)
hostname_client = NULL;
}
+ fd = open("/proc/sys/kernel/hostname", O_RDONLY);
+ if (fd < 0) {
+ error("open(/proc/sys/kernel/hostname): %s (%d)",
+ strerror(errno), errno);
+ } else {
+ GIOChannel *io = g_io_channel_unix_new(fd);
+
+ hostname_id = g_io_add_watch(io, G_IO_ERR, hostname_cb, NULL);
+ g_io_channel_unref(io);
+ }
+
return err;
}
@@ -306,8 +353,14 @@ static void hostname_exit(void)
hostname_client = NULL;
}
+ if (hostname_id != 0) {
+ g_source_remove(hostname_id);
+ hostname_id = 0;
+ }
+
g_free(pretty_hostname);
g_free(static_hostname);
+ g_free(transient_hostname);
}
BLUETOOTH_PLUGIN_DEFINE(hostname, VERSION, BLUETOOTH_PLUGIN_PRIORITY_DEFAULT,