Imported Upstream version 1.42
[platform/upstream/connman.git] / src / resolver.c
index 618353f..4ab51d6 100644 (file)
@@ -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;