diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml
index ee9b5679f3..ea0573fa5f 100644
--- a/man/NetworkManager.conf.xml
+++ b/man/NetworkManager.conf.xml
@@ -324,7 +324,9 @@ no-auto-default=*
/etc/resolv.conf to its private
resolv.conf file in the runtime state directory.
file: NetworkManager will write
- /etc/resolv.conf as file.
+ /etc/resolv.conf as file. If it finds
+ a symlink, it will follow the symlink and update the target
+ instead.
resolvconf: NetworkManager will run
resolvconf to update the DNS configuration.
netconfig: NetworkManager will run
diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c
index dfeece6240..8134f2f4a4 100644
--- a/src/dns-manager/nm-dns-manager.c
+++ b/src/dns-manager/nm-dns-manager.c
@@ -674,6 +674,8 @@ update_resolv_conf (NMDnsManager *self,
gs_free char *content = NULL;
SpawnResult write_file_result = SR_SUCCESS;
int errsv;
+ const char *rc_path = _PATH_RESCONF;
+ nm_auto_free char *rc_path_real = NULL;
/* If we are not managing /etc/resolv.conf and it points to
* MY_RESOLV_CONF, don't write the private DNS configuration to
@@ -697,18 +699,22 @@ update_resolv_conf (NMDnsManager *self,
if (rc_manager == NM_DNS_MANAGER_RESOLV_CONF_MAN_FILE) {
GError *local = NULL;
+ rc_path_real = realpath (rc_path, NULL);
+ if (rc_path_real)
+ rc_path = rc_path_real;
+
/* we first write to /etc/resolv.conf directly. If that fails,
* we still continue to write to runstatedir but remember the
* error. */
- if (!g_file_set_contents (_PATH_RESCONF, content, -1, &local)) {
+ if (!g_file_set_contents (rc_path, content, -1, &local)) {
_LOGT ("update-resolv-conf: write to %s failed (rc-manager=%s, %s)",
- _PATH_RESCONF, _rc_manager_to_string (rc_manager), local->message);
+ rc_path, _rc_manager_to_string (rc_manager), local->message);
write_file_result = SR_ERROR;
g_propagate_error (error, local);
error = NULL;
} else {
_LOGT ("update-resolv-conf: write to %s succeeded (rc-manager=%s)",
- _PATH_RESCONF, _rc_manager_to_string (rc_manager));
+ rc_path, _rc_manager_to_string (rc_manager));
}
}
@@ -766,7 +772,7 @@ update_resolv_conf (NMDnsManager *self,
if (rc_manager == NM_DNS_MANAGER_RESOLV_CONF_MAN_FILE) {
_LOGT ("update-resolv-conf: write internal file %s succeeded (rc-manager=%s)",
- _PATH_RESCONF, _rc_manager_to_string (rc_manager));
+ rc_path, _rc_manager_to_string (rc_manager));
return write_file_result;
}