+static int dispatch_hostname_change(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
+ Server *s = userdata;
+
+ assert(s);
+
+ server_cache_hostname(s);
+ return 0;
+}
+
+static int server_open_hostname(Server *s) {
+ int r;
+
+ assert(s);
+
+ s->hostname_fd = open("/proc/sys/kernel/hostname", O_RDONLY|O_CLOEXEC|O_NDELAY|O_NOCTTY);
+ if (s->hostname_fd < 0) {
+ log_error("Failed to open /proc/sys/kernel/hostname: %m");
+ return -errno;
+ }
+
+ r = sd_event_add_io(s->event, s->hostname_fd, 0, dispatch_hostname_change, s, &s->hostname_event_source);
+ if (r < 0) {
+ log_error("Failed to register hostname fd in event loop: %s", strerror(-r));
+ return r;
+ }
+
+ r = sd_event_source_set_priority(s->hostname_event_source, SD_EVENT_PRIORITY_IMPORTANT-10);
+ if (r < 0) {
+ log_error("Failed to adjust priority of host name event source: %s", strerror(-r));
+ return r;
+ }
+
+ return 0;
+}
+