summaryrefslogtreecommitdiff
path: root/src/dns-manager/nm-dns-manager.c
diff options
context:
space:
mode:
authorPavel Šimerda <psimerda@redhat.com>2014-11-18 18:12:16 +0100
committerPavel Šimerda <psimerda@redhat.com>2014-12-23 13:34:25 +0100
commit583568e12f9e580cd2903811637c9f9b7a2f1088 (patch)
tree74dc3421692ae352aed5da82304ced2c88fda3eb /src/dns-manager/nm-dns-manager.c
parent4805be2ed27b71a6099477d86dbc109adb41b819 (diff)
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>
Diffstat (limited to 'src/dns-manager/nm-dns-manager.c')
-rw-r--r--src/dns-manager/nm-dns-manager.c35
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,