---
Hi,
it is very annoying when connman clears /etc/resolv.conf and
removes users own settings there. This patch remembers user
settings (if dnsproxy is not in use i.e., -r option is being
used) and does not remove them unnecessarily.
Jukka
src/resolver.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 53 insertions(+), 7 deletions(-)
diff --git a/src/resolver.c b/src/resolver.c
index 7d15c14..22d2f98 100644
--- a/src/resolver.c
+++ b/src/resolver.c
@@ -24,6 +24,7 @@
#endif
#include <stdio.h>
+#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
@@ -75,10 +76,15 @@ static void resolvfile_remove_entries(GList *entries)
static int resolvfile_export(void)
{
GList *list;
- GString *content;
+ GString *content = NULL;
+ GString *existing_content = NULL;
int fd, err;
unsigned int count;
mode_t old_umask;
+ FILE *fp;
+ char *line = NULL;
+ size_t len = 0;
+ ssize_t read;
content = g_string_new("# Generated by Connection Manager\n");
@@ -104,7 +110,7 @@ static int resolvfile_export(void)
}
if (count)
- g_string_append_printf(content, "\n");
+ g_string_append_printf(content, " # by Connection Manager\n");
for (count = 0, list = g_list_last(resolvfile_list);
list && (count < MAXNS);
@@ -114,11 +120,36 @@ static int resolvfile_export(void)
if (!entry->server)
continue;
- g_string_append_printf(content, "nameserver %s\n",
+ g_string_append_printf(content, "nameserver %s # by Connection
Manager\n",
entry->server);
count++;
}
+ /*
+ * Read existing entries from resolv.conf and do not overwrite them
+ * when dnsproxy is not in use.
+ */
+ if (dnsproxy_enabled == FALSE) {
+ fp = fopen("/etc/resolv.conf", "r");
+ if (fp) {
+ while ((read = getline(&line, &len, fp)) != -1) {
+ if (g_str_has_suffix(line,
+ "by Connection Manager\n"))
+ continue;
+
+ if (existing_content == NULL)
+ existing_content = g_string_new(line);
+ else
+ g_string_append(existing_content,
+ line);
+ }
+ if (line)
+ free(line);
+
+ fclose(fp);
+ }
+ }
+
old_umask = umask(022);
fd = open("/etc/resolv.conf", O_RDWR | O_CREAT,
@@ -135,14 +166,25 @@ static int resolvfile_export(void)
err = 0;
- if (write(fd, content->str, content->len) < 0)
- err = -errno;
+ /* Do not save the plain header */
+ if (dnsproxy_enabled || g_strcmp0(content->str,
+ "# Generated by Connection Manager\n"))
+ if (write(fd, content->str, content->len) < 0)
+ err = -errno;
+
+ if (existing_content && write(fd, existing_content->str,
+ existing_content->len) < 0)
+ connman_warn("Cannot copy old DNS entries back to "
+ "/etc/resolv.conf");
failed:
close(fd);
done:
g_string_free(content, TRUE);
+ if (existing_content)
+ g_string_free(existing_content, TRUE);
+
umask(old_umask);
return err;
@@ -467,13 +509,14 @@ int __connman_resolver_init(connman_bool_t dnsproxy)
if (dnsproxy == FALSE)
return 0;
+ dnsproxy_enabled = TRUE;
+
if (__connman_dnsproxy_init() < 0) {
/* Fall back to resolv.conf */
+ dnsproxy_enabled = FALSE;
return 0;
}
- dnsproxy_enabled = TRUE;
-
return 0;
}
@@ -496,5 +539,8 @@ void __connman_resolver_cleanup(void)
free_entry(slist->data);
g_slist_free(entry_list);
entry_list = NULL;
+
+ /* Clear connman entries from /etc/resolv.conf */
+ resolvfile_export();
}
}
--
1.7.1
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman