diff options
author | Pavel Šimerda <psimerda@redhat.com> | 2014-11-18 18:12:16 +0100 |
---|---|---|
committer | Pavel Šimerda <psimerda@redhat.com> | 2014-12-23 13:34:25 +0100 |
commit | 583568e12f9e580cd2903811637c9f9b7a2f1088 (patch) | |
tree | 74dc3421692ae352aed5da82304ced2c88fda3eb | |
parent | 4805be2ed27b71a6099477d86dbc109adb41b819 (diff) | |
download | NetworkManager-583568e12f9e580cd2903811637c9f9b7a2f1088.tar.gz |
dns-manager: don't replace /etc/resolv.conf installed by other tools
Resolves:
* https://bugzilla.gnome.org/show_bug.cgi?id=732941
* https://bugzilla.redhat.com/show_bug.cgi?id=1116999
Acked-By: Dan Williams <dcbw@redhat.com>
Acked-By: Thomas Haller <thaller@redhat.com>
-rw-r--r-- | src/dns-manager/nm-dns-manager.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c index f4de57773c..9af921bedf 100644 --- a/src/dns-manager/nm-dns-manager.c +++ b/src/dns-manager/nm-dns-manager.c @@ -27,6 +27,7 @@ #include <fcntl.h> #include <resolv.h> #include <stdlib.h> +#include <sys/stat.h> #include <sys/ioctl.h> #include <unistd.h> @@ -446,6 +447,7 @@ update_resolv_conf (char **searches, GError **error) { FILE *f; + struct stat st; g_return_val_if_fail (error != NULL, FALSE); @@ -488,6 +490,39 @@ update_resolv_conf (char **searches, return FALSE; } + /* Don't overwrite a symbolic link unless it points to MY_RESOLV_CONF. */ + if (lstat (_PATH_RESCONF, &st) != -1) { + /* Don't overwrite a symbolic link. */ + if (S_ISLNK (st.st_mode)) { + if (stat (_PATH_RESCONF, &st) != -1) { + char *path = g_file_read_link (_PATH_RESCONF, NULL); + gboolean not_ours = g_strcmp0 (path, MY_RESOLV_CONF) != 0; + + g_free (path); + if (not_ours) + return TRUE; + } else { + if (errno != ENOENT) + return TRUE; + g_set_error (error, + NM_MANAGER_ERROR, + NM_MANAGER_ERROR_FAILED, + "Could not stat %s: %s\n", + _PATH_RESCONF, + g_strerror (errno)); + return FALSE; + } + } + } else if (errno != ENOENT) { + g_set_error (error, + NM_MANAGER_ERROR, + NM_MANAGER_ERROR_FAILED, + "Could not lstat %s: %s\n", + _PATH_RESCONF, + g_strerror (errno)); + return FALSE; + } + if (unlink (RESOLV_CONF_TMP) == -1 && errno != ENOENT) { g_set_error (error, NM_MANAGER_ERROR, |