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