X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fresolve%2Fresolved-manager.c;h=74f4ad5dba40c3494bf51675b03270724a678d6d;hp=63d7845387bb03c78fb39595dddd0d6ce8a1ac19;hb=a5a807e63a50314e190e9166d8a453cd8dd258e3;hpb=d5099efc47d4e6ac60816b5381a5f607ab03f06e diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 63d784538..74f4ad5db 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -34,6 +34,7 @@ #include "socket-util.h" #include "af-list.h" #include "utf8.h" +#include "fileio-label.h" #include "resolved-dns-domain.h" #include "resolved-conf.h" @@ -720,12 +721,44 @@ static void write_resolv_conf_search(const char *domain, FILE *f, (*count) ++; } +static int write_resolv_conf_contents(FILE *f, Set *dns, Set *domains) { + Iterator i; + + fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n" + "# Third party programs must not access this file directly, but\n" + "# only through the symlink at /etc/resolv.conf. To manage\n" + "# resolv.conf(5) in a different way, replace the symlink by a\n" + "# static file or a different symlink.\n\n", f); + + if (set_isempty(dns)) + fputs("# No DNS servers known.\n", f); + else { + DnsServer *s; + unsigned count = 0; + + SET_FOREACH(s, dns, i) + write_resolv_conf_server(s, f, &count); + } + + if (!set_isempty(domains)) { + unsigned length = 0, count = 0; + char *domain; + + fputs("search", f); + SET_FOREACH(domain, domains, i) + write_resolv_conf_search(domain, f, &count, &length); + fputs("\n", f); + } + + return fflush_and_check(f); +} + + int manager_write_resolv_conf(Manager *m) { static const char path[] = "/run/systemd/resolve/resolv.conf"; _cleanup_free_ char *temp_path = NULL; _cleanup_fclose_ FILE *f = NULL; _cleanup_set_free_ Set *dns = NULL, *domains = NULL; - unsigned count = 0; DnsServer *s; Iterator i; Link *l; @@ -789,38 +822,13 @@ int manager_write_resolv_conf(Manager *m) { } } - r = fopen_temporary(path, &f, &temp_path); + r = fopen_temporary_label(path, path, &f, &temp_path); if (r < 0) return r; fchmod(fileno(f), 0644); - fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n" - "# Third party programs must not access this file directly, but\n" - "# only through the symlink at /etc/resolv.conf. To manage\n" - "# resolv.conf(5) in a different way, replace the symlink by a\n" - "# static file or a different symlink.\n\n", f); - - if (set_isempty(dns)) - fputs("# No DNS servers known.\n", f); - else { - SET_FOREACH(s, dns, i) - write_resolv_conf_server(s, f, &count); - } - - if (!set_isempty(domains)) { - unsigned length = 0; - char *domain; - - count = 0; - - fputs("search", f); - SET_FOREACH(domain, domains, i) - write_resolv_conf_search(domain, f, &count, &length); - fputs("\n", f); - } - - r = fflush_and_check(f); + r = write_resolv_conf_contents(f, dns, domains); if (r < 0) goto fail;