diff mbox series

[BlueZ,2/2] hostname: Fallback to transient hostname

Message ID 20221109151756.96673-2-hadess@hadess.net (mailing list archive)
State Deferred
Headers show
Series [BlueZ,1/2] hostname: Add '' around printed strings | expand

Checks

Context Check Description
tedd_an/pre-ci_am success Success
tedd_an/checkpatch fail [BlueZ,2/2] hostname: Fallback to transient hostname WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line) #57: https://www.freedesktop.org/software/systemd/man/org.freedesktop.hostname1.html ERROR:INITIALISED_STATIC: do not initialise statics to NULL #80: FILE: plugins/hostname.c:48: +static char *pretty_hostname = NULL; ERROR:INITIALISED_STATIC: do not initialise statics to NULL #81: FILE: plugins/hostname.c:49: +static char *static_hostname = NULL; ERROR:INITIALISED_STATIC: do not initialise statics to NULL #82: FILE: plugins/hostname.c:50: +static char *transient_hostname = NULL; ERROR:INITIALISED_STATIC: do not initialise statics to 0 #83: FILE: plugins/hostname.c:51: +static guint hostname_id = 0; WARNING:LONG_LINE: line length of 84 exceeds 80 columns #147: FILE: plugins/hostname.c:327: + hostname_io = g_io_channel_new_file("/proc/sys/kernel/hostname", "r", NULL); WARNING:LONG_LINE: line length of 87 exceeds 80 columns #149: FILE: plugins/hostname.c:329: + hostname_id = g_io_add_watch(hostname_io, G_IO_ERR, hostname_cb, NULL); /github/workspace/src/13037643.patch total: 4 errors, 3 warnings, 100 lines checked NOTE: For some of the reported defects, checkpatch may be able to mechanically convert to the typical style using --fix or --fix-inplace. /github/workspace/src/13037643.patch has style problems, please review. NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO NOTE: If any of the errors are false positives, please report them to the maintainer, see CHECKPATCH in MAINTAINERS.
tedd_an/gitlint success Gitlint PASS

Commit Message

Bastien Nocera Nov. 9, 2022, 3:17 p.m. UTC
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
---
 plugins/hostname.c | 53 ++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 51 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/plugins/hostname.c b/plugins/hostname.c
index 14b6450b5..a12afb282 100644
--- a/plugins/hostname.c
+++ b/plugins/hostname.c
@@ -16,6 +16,7 @@ 
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/utsname.h>
 
 #include "lib/bluetooth.h"
 #include "lib/sdp.h"
@@ -44,8 +45,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 +63,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 +188,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 +294,11 @@  static GDBusProxy *hostname_proxy = NULL;
 static int hostname_init(void)
 {
 	DBusConnection *conn = btd_get_dbus_connection();
+	GIOChannel *hostname_io;
 	int err;
 
 	read_dmi_fallback();
+	read_transient_hostname();
 
 	hostname_client = g_dbus_client_new(conn, "org.freedesktop.hostname1",
 						"/org/freedesktop/hostname1");
@@ -289,6 +324,14 @@  static int hostname_init(void)
 		hostname_client = NULL;
 	}
 
+	hostname_io = g_io_channel_new_file("/proc/sys/kernel/hostname", "r", NULL);
+	if (hostname_io) {
+		hostname_id = g_io_add_watch(hostname_io, G_IO_ERR, hostname_cb, NULL);
+		g_io_channel_unref(hostname_io);
+	} else {
+		DBG("failed to open /proc/sys/kernel/hostname");
+	}
+
 	return err;
 }
 
@@ -306,8 +349,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,