]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/resolve/resolved.c
resolved: when there's already somebody listening on the LLMNR ports, simple disable...
[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"
091a364c 26
39d8db04 27#include "resolved-manager.h"
4e945a6f
LP
28#include "resolved-conf.h"
29
091a364c 30int main(int argc, char *argv[]) {
74b2466e 31 _cleanup_(manager_freep) Manager *m = NULL;
682265d5
TG
32 const char *user = "systemd-resolve";
33 uid_t uid;
34 gid_t gid;
091a364c
TG
35 int r;
36
37 log_set_target(LOG_TARGET_AUTO);
38 log_parse_environment();
39 log_open();
40
41 umask(0022);
42
43 if (argc != 1) {
44 log_error("This program takes no arguments.");
45 r = -EINVAL;
74b2466e 46 goto finish;
091a364c
TG
47 }
48
682265d5
TG
49 r = get_user_creds(&user, &uid, &gid, NULL, NULL);
50 if (r < 0) {
51 log_error("Cannot resolve user name %s: %s", user, strerror(-r));
74b2466e 52 goto finish;
682265d5
TG
53 }
54
091a364c 55 /* Always create the directory where resolv.conf will live */
682265d5
TG
56 r = mkdir_safe_label("/run/systemd/resolve", 0755, uid, gid);
57 if (r < 0) {
4e945a6f 58 log_error("Could not create runtime directory: %s", strerror(-r));
74b2466e 59 goto finish;
682265d5
TG
60 }
61
62 r = drop_privileges(uid, gid, 0);
63 if (r < 0)
74b2466e 64 goto finish;
091a364c 65
b9e7a9d8
LP
66 assert_se(sigprocmask_many(SIG_BLOCK, SIGTERM, SIGINT, -1) == 0);
67
091a364c
TG
68 r = manager_new(&m);
69 if (r < 0) {
70 log_error("Could not create manager: %s", strerror(-r));
74b2466e 71 goto finish;
091a364c
TG
72 }
73
74b2466e
LP
74 r = manager_parse_config_file(m);
75 if (r < 0)
4e945a6f 76 log_warning("Failed to parse configuration file: %s", strerror(-r));
091a364c 77
edc501d4
LP
78 r = manager_start(m);
79 if (r < 0) {
80 log_error("Failed to start manager: %s", strerror(-r));
81 goto finish;
82 }
83
4e945a6f 84 /* Write finish default resolv.conf to avoid a dangling
74b2466e
LP
85 * symlink */
86 r = manager_write_resolv_conf(m);
4e945a6f
LP
87 if (r < 0)
88 log_warning("Could not create resolv.conf: %s", strerror(-r));
091a364c
TG
89
90 sd_notify(false,
91 "READY=1\n"
92 "STATUS=Processing requests...");
93
94 r = sd_event_loop(m->event);
95 if (r < 0) {
96 log_error("Event loop failed: %s", strerror(-r));
74b2466e 97 goto finish;
091a364c
TG
98 }
99
74b2466e
LP
100finish:
101 sd_notify(false, "STATUS=Shutting down...");
091a364c
TG
102
103 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
104}