summaryrefslogtreecommitdiff
path: root/plugins/hostname.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/hostname.c')
-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,