]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/resolve/resolved.c
resolved: add code to map DNSSEC digest types to strings and back
[thirdparty/systemd.git] / src / resolve / resolved.c
CommitLineData
091a364c
TG
1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3/***
4 This file is part of systemd.
5
6 Copyright 2014 Tom Gundersen <teg@jklm.no>
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
091a364c 22#include "sd-daemon.h"
b1d4f8e1
LP
23#include "sd-event.h"
24
430f0182 25#include "capability-util.h"
b1d4f8e1
LP
26#include "mkdir.h"
27#include "resolved-conf.h"
28#include "resolved-manager.h"
f8dc7e34 29#include "resolved-resolv-conf.h"
d7b8eec7 30#include "selinux-util.h"
24882e06 31#include "signal-util.h"
b1d4f8e1 32#include "user-util.h"
4e945a6f 33
091a364c 34int main(int argc, char *argv[]) {
74b2466e 35 _cleanup_(manager_freep) Manager *m = NULL;
682265d5
TG
36 const char *user = "systemd-resolve";
37 uid_t uid;
38 gid_t gid;
091a364c
TG
39 int r;
40
41 log_set_target(LOG_TARGET_AUTO);
42 log_parse_environment();
43 log_open();
44
091a364c
TG
45 if (argc != 1) {
46 log_error("This program takes no arguments.");
47 r = -EINVAL;
74b2466e 48 goto finish;
091a364c
TG
49 }
50
a5a807e6
ZJS
51 umask(0022);
52
cc56fafe 53 r = mac_selinux_init(NULL);
a5a807e6 54 if (r < 0) {
da927ba9 55 log_error_errno(r, "SELinux setup failed: %m");
a5a807e6
ZJS
56 goto finish;
57 }
58
682265d5
TG
59 r = get_user_creds(&user, &uid, &gid, NULL, NULL);
60 if (r < 0) {
da927ba9 61 log_error_errno(r, "Cannot resolve user name %s: %m", user);
74b2466e 62 goto finish;
682265d5
TG
63 }
64
091a364c 65 /* Always create the directory where resolv.conf will live */
682265d5
TG
66 r = mkdir_safe_label("/run/systemd/resolve", 0755, uid, gid);
67 if (r < 0) {
da927ba9 68 log_error_errno(r, "Could not create runtime directory: %m");
74b2466e 69 goto finish;
682265d5
TG
70 }
71
72 r = drop_privileges(uid, gid, 0);
73 if (r < 0)
74b2466e 74 goto finish;
091a364c 75
4d506d6b 76 assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGUSR1, -1) >= 0);
b9e7a9d8 77
091a364c
TG
78 r = manager_new(&m);
79 if (r < 0) {
da927ba9 80 log_error_errno(r, "Could not create manager: %m");
74b2466e 81 goto finish;
091a364c
TG
82 }
83
74b2466e 84 r = manager_parse_config_file(m);
00fa60ae
LP
85 if (r < 0) {
86 log_error_errno(r, "Failed to parse configuration file: %m");
87 goto finish;
88 }
091a364c 89
edc501d4
LP
90 r = manager_start(m);
91 if (r < 0) {
da927ba9 92 log_error_errno(r, "Failed to start manager: %m");
edc501d4
LP
93 goto finish;
94 }
95
4e945a6f 96 /* Write finish default resolv.conf to avoid a dangling
74b2466e
LP
97 * symlink */
98 r = manager_write_resolv_conf(m);
4e945a6f 99 if (r < 0)
da927ba9 100 log_warning_errno(r, "Could not create resolv.conf: %m");
091a364c
TG
101
102 sd_notify(false,
103 "READY=1\n"
104 "STATUS=Processing requests...");
105
106 r = sd_event_loop(m->event);
107 if (r < 0) {
da927ba9 108 log_error_errno(r, "Event loop failed: %m");
74b2466e 109 goto finish;
091a364c
TG
110 }
111
96e6e394
LP
112 sd_event_get_exit_code(m->event, &r);
113
74b2466e 114finish:
af4ec430 115 sd_notify(false,
b37d45c9 116 "STOPPING=1\n"
af4ec430 117 "STATUS=Shutting down...");
091a364c
TG
118
119 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
120}