+#define RESOLV_CONF "/etc/resolv.conf"
+
+static AvahiEntryGroup *dns_servers_entry_group = NULL;
+static AvahiEntryGroup *resolv_conf_entry_group = NULL;
+
+static gchar **resolv_conf = NULL;
+
+static DaemonConfig config;
+
+#define MAX_NAME_SERVERS 10
+
+static gint load_resolv_conf(const DaemonConfig *c) {
+ gint ret = -1;
+ FILE *f;
+ gint i = 0;
+
+ g_strfreev(resolv_conf);
+ resolv_conf = NULL;
+
+ if (!c->publish_resolv_conf)
+ return 0;
+
+ if (!(f = fopen(RESOLV_CONF, "r"))) {
+ avahi_log_warn("Failed to open "RESOLV_CONF".");
+ goto finish;
+ }
+
+ resolv_conf = g_new0(gchar*, MAX_NAME_SERVERS+1);
+
+ while (!feof(f) && i < MAX_NAME_SERVERS) {
+ char ln[128];
+ gchar *p;
+
+ if (!(fgets(ln, sizeof(ln), f)))
+ break;
+
+ ln[strcspn(ln, "\r\n#")] = 0;
+ p = ln + strspn(ln, "\t ");
+
+ if (g_str_has_prefix(p, "nameserver")) {
+ p += 10;
+ p += strspn(p, "\t ");
+ p[strcspn(p, "\t ")] = 0;
+ resolv_conf[i++] = strdup(p);
+ }
+ }
+
+ ret = 0;
+
+finish:
+
+ if (ret != 0) {
+ g_strfreev(resolv_conf);
+ resolv_conf = NULL;
+ }
+
+ if (f)
+ fclose(f);
+
+ return ret;
+}
+
+static AvahiEntryGroup* add_dns_servers(AvahiServer *s, AvahiEntryGroup* g, gchar **l) {
+ gchar **p;
+
+ g_assert(s);
+ g_assert(l);
+
+ if (!g)
+ g = avahi_entry_group_new(s, NULL, NULL);
+
+ g_assert(avahi_entry_group_is_empty(g));
+
+ for (p = l; *p; p++) {
+ AvahiAddress a;
+
+ if (!avahi_address_parse(*p, AF_UNSPEC, &a))
+ avahi_log_warn("Failed to parse address '%s', ignoring.", *p);
+ else
+ if (avahi_server_add_dns_server_address(s, g, -1, AF_UNSPEC, NULL, AVAHI_DNS_SERVER_RESOLVE, &a, 53) < 0) {
+ avahi_entry_group_free(g);
+ avahi_log_error("Failed to add DNS server address: %s", avahi_strerror(avahi_server_errno(s)));
+ return NULL;
+ }
+ }
+
+ avahi_entry_group_commit(g);
+
+ return g;
+}
+
+static void remove_dns_server_entry_groups(void) {
+
+ if (resolv_conf_entry_group)
+ avahi_entry_group_reset(resolv_conf_entry_group);
+
+ if (dns_servers_entry_group)
+ avahi_entry_group_reset(dns_servers_entry_group);
+}
+