summaryrefslogtreecommitdiff
path: root/src/resolver.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/resolver.c')
-rw-r--r--src/resolver.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/src/resolver.c b/src/resolver.c
index 618353fd..4ab51d6b 100644
--- a/src/resolver.c
+++ b/src/resolver.c
@@ -103,6 +103,7 @@ static int resolvfile_export(void)
int fd, err;
unsigned int count;
mode_t old_umask;
+ const char *resolv_conf;
content = g_string_new("# Generated by Connection Manager\n");
@@ -161,15 +162,33 @@ static int resolvfile_export(void)
old_umask = umask(022);
- fd = open(RESOLV_CONF_STATEDIR, O_RDWR | O_CREAT | O_CLOEXEC,
- S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
- if (fd < 0) {
- connman_warn_once("Cannot create "RESOLV_CONF_STATEDIR" "
- "falling back to "RESOLV_CONF_ETC);
+ resolv_conf = connman_setting_get_string("ResolvConf");
+ /*
+ * TODO: This is mainly for backward compatibility. In some future version,
+ * "ResolvConf" setting should default to RESOLV_CONF_STATEDIR or
+ * RESOLV_CONF_ETC and this branch can be removed.
+ */
+ if (resolv_conf == NULL) {
+ fd = open(RESOLV_CONF_STATEDIR, O_RDWR | O_CREAT | O_CLOEXEC,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ if (fd < 0) {
+ connman_warn_once("Cannot create "RESOLV_CONF_STATEDIR" "
+ "falling back to "RESOLV_CONF_ETC);
- fd = open(RESOLV_CONF_ETC, O_RDWR | O_CREAT | O_CLOEXEC,
- S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ fd = open(RESOLV_CONF_ETC, O_RDWR | O_CREAT | O_CLOEXEC,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ if (fd < 0) {
+ err = -errno;
+ goto done;
+ }
+ }
+ } else if (resolv_conf[0] == '\0' || strcmp(resolv_conf, "/dev/null") == 0) {
+ err = 0;
+ goto done;
+ } else {
+ fd = open(resolv_conf, O_RDWR | O_CREAT | O_CLOEXEC,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (fd < 0) {
err = -errno;
goto done;