resolved.c revision 430f0182b72373145c839dbfe99d2382855cb8f8
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering/***
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering This file is part of systemd.
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering Copyright 2014 Tom Gundersen <teg@jklm.no>
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering systemd is free software; you can redistribute it and/or modify it
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering under the terms of the GNU Lesser General Public License as published by
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering (at your option) any later version.
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering systemd is distributed in the hope that it will be useful, but
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering Lesser General Public License for more details.
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering You should have received a copy of the GNU Lesser General Public License
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering***/
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering#include "sd-daemon.h"
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering#include "sd-event.h"
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b5efdb8af40ea759a1ea584c1bc44ecc81dd00ceLennart Poettering#include "capability-util.h"
e929bee09ab8000e87b7e825ed3a78d73ecdd7f0Lennart Poettering#include "mkdir.h"
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering#include "resolved-conf.h"
6bedfcbb2970e06a4d3280c8fb62083d252ede73Lennart Poettering#include "resolved-manager.h"
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering#include "selinux-util.h"
6bedfcbb2970e06a4d3280c8fb62083d252ede73Lennart Poettering#include "signal-util.h"
6bedfcbb2970e06a4d3280c8fb62083d252ede73Lennart Poettering#include "user-util.h"
6bedfcbb2970e06a4d3280c8fb62083d252ede73Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poetteringint main(int argc, char *argv[]) {
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering _cleanup_(manager_freep) Manager *m = NULL;
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering const char *user = "systemd-resolve";
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering uid_t uid;
b1d5277372a26e5a5b9980174652e1e287ba6b14Lennart Poettering gid_t gid;
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering int r;
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering log_set_target(LOG_TARGET_AUTO);
b1d5277372a26e5a5b9980174652e1e287ba6b14Lennart Poettering log_parse_environment();
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering log_open();
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering if (argc != 1) {
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering log_error("This program takes no arguments.");
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering r = -EINVAL;
b1d5277372a26e5a5b9980174652e1e287ba6b14Lennart Poettering goto finish;
b1d5277372a26e5a5b9980174652e1e287ba6b14Lennart Poettering }
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering umask(0022);
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering r = mac_selinux_init(NULL);
b1d5277372a26e5a5b9980174652e1e287ba6b14Lennart Poettering if (r < 0) {
b1d5277372a26e5a5b9980174652e1e287ba6b14Lennart Poettering log_error_errno(r, "SELinux setup failed: %m");
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering goto finish;
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering }
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering r = get_user_creds(&user, &uid, &gid, NULL, NULL);
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering if (r < 0) {
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering log_error_errno(r, "Cannot resolve user name %s: %m", user);
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering goto finish;
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering }
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d5277372a26e5a5b9980174652e1e287ba6b14Lennart Poettering /* Always create the directory where resolv.conf will live */
b1d5277372a26e5a5b9980174652e1e287ba6b14Lennart Poettering r = mkdir_safe_label("/run/systemd/resolve", 0755, uid, gid);
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering if (r < 0) {
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering log_error_errno(r, "Could not create runtime directory: %m");
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering goto finish;
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering }
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering r = drop_privileges(uid, gid, 0);
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering if (r < 0)
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering goto finish;
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGUSR1, -1) >= 0);
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering r = manager_new(&m);
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering if (r < 0) {
d02608170e599b1ffbc7c9a22062bae2579d6e36Lennart Poettering log_error_errno(r, "Could not create manager: %m");
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering goto finish;
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering }
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering r = manager_parse_config_file(m);
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering if (r < 0)
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering log_warning_errno(r, "Failed to parse configuration file: %m");
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering r = manager_start(m);
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering if (r < 0) {
d02608170e599b1ffbc7c9a22062bae2579d6e36Lennart Poettering log_error_errno(r, "Failed to start manager: %m");
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering goto finish;
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering }
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering /* Write finish default resolv.conf to avoid a dangling
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering * symlink */
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering r = manager_write_resolv_conf(m);
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering if (r < 0)
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering log_warning_errno(r, "Could not create resolv.conf: %m");
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering sd_notify(false,
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering "READY=1\n"
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering "STATUS=Processing requests...");
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering r = sd_event_loop(m->event);
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering if (r < 0) {
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering log_error_errno(r, "Event loop failed: %m");
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering goto finish;
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering }
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering sd_event_get_exit_code(m->event, &r);
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poetteringfinish:
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering sd_notify(false,
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering "STOPPING=1\n"
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering "STATUS=Shutting down...");
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering}
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering