]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/resolve/resolved.c
hwdb: Update database of Bluetooth company identifiers
[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
22#include "sd-event.h"
23#include "sd-daemon.h"
091a364c 24#include "mkdir.h"
682265d5 25#include "capability.h"
d7b8eec7 26#include "selinux-util.h"
24882e06 27#include "signal-util.h"
091a364c 28
39d8db04 29#include "resolved-manager.h"
4e945a6f
LP
30#include "resolved-conf.h"
31
091a364c 32int main(int argc, char *argv[]) {
74b2466e 33 _cleanup_(manager_freep) Manager *m = NULL;
682265d5
TG
34 const char *user = "systemd-resolve";
35 uid_t uid;
36 gid_t gid;
091a364c
TG
37 int r;
38
39 log_set_target(LOG_TARGET_AUTO);
40 log_parse_environment();
41 log_open();
42
091a364c
TG
43 if (argc != 1) {
44 log_error("This program takes no arguments.");
45 r = -EINVAL;
74b2466e 46 goto finish;
091a364c
TG
47 }
48
a5a807e6
ZJS
49 umask(0022);
50
cc56fafe 51 r = mac_selinux_init(NULL);
a5a807e6 52 if (r < 0) {
da927ba9 53 log_error_errno(r, "SELinux setup failed: %m");
a5a807e6
ZJS
54 goto finish;
55 }
56
682265d5
TG
57 r = get_user_creds(&user, &uid, &gid, NULL, NULL);
58 if (r < 0) {
da927ba9 59 log_error_errno(r, "Cannot resolve user name %s: %m", user);
74b2466e 60 goto finish;
682265d5
TG
61 }
62
091a364c 63 /* Always create the directory where resolv.conf will live */
682265d5
TG
64 r = mkdir_safe_label("/run/systemd/resolve", 0755, uid, gid);
65 if (r < 0) {
da927ba9 66 log_error_errno(r, "Could not create runtime directory: %m");
74b2466e 67 goto finish;
682265d5
TG
68 }
69
70 r = drop_privileges(uid, gid, 0);
71 if (r < 0)
74b2466e 72 goto finish;
091a364c 73
72c0a2c2 74 assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
b9e7a9d8 75
091a364c
TG
76 r = manager_new(&m);
77 if (r < 0) {
da927ba9 78 log_error_errno(r, "Could not create manager: %m");
74b2466e 79 goto finish;
091a364c
TG
80 }
81
74b2466e
LP
82 r = manager_parse_config_file(m);
83 if (r < 0)
da927ba9 84 log_warning_errno(r, "Failed to parse configuration file: %m");
091a364c 85
edc501d4
LP
86 r = manager_start(m);
87 if (r < 0) {
da927ba9 88 log_error_errno(r, "Failed to start manager: %m");
edc501d4
LP
89 goto finish;
90 }
91
4e945a6f 92 /* Write finish default resolv.conf to avoid a dangling
74b2466e
LP
93 * symlink */
94 r = manager_write_resolv_conf(m);
4e945a6f 95 if (r < 0)
da927ba9 96 log_warning_errno(r, "Could not create resolv.conf: %m");
091a364c
TG
97
98 sd_notify(false,
99 "READY=1\n"
100 "STATUS=Processing requests...");
101
102 r = sd_event_loop(m->event);
103 if (r < 0) {
da927ba9 104 log_error_errno(r, "Event loop failed: %m");
74b2466e 105 goto finish;
091a364c
TG
106 }
107
96e6e394
LP
108 sd_event_get_exit_code(m->event, &r);
109
74b2466e 110finish:
af4ec430 111 sd_notify(false,
b37d45c9 112 "STOPPING=1\n"
af4ec430 113 "STATUS=Shutting down...");
091a364c
TG
114
115 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
116}