]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/networkd.c
DHCP DUID, IAID configuration options
[thirdparty/systemd.git] / src / network / networkd.c
1 /***
2 This file is part of systemd.
3
4 Copyright 2013 Tom Gundersen <teg@jklm.no>
5
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
10
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
18 ***/
19
20 #include "sd-daemon.h"
21
22 #include "capability-util.h"
23 #include "networkd.h"
24 #include "networkd-conf.h"
25 #include "signal-util.h"
26 #include "user-util.h"
27
28 int main(int argc, char *argv[]) {
29 _cleanup_manager_free_ Manager *m = NULL;
30 const char *user = "systemd-network";
31 uid_t uid;
32 gid_t gid;
33 int r;
34
35 log_set_target(LOG_TARGET_AUTO);
36 log_parse_environment();
37 log_open();
38
39 umask(0022);
40
41 if (argc != 1) {
42 log_error("This program takes no arguments.");
43 r = -EINVAL;
44 goto out;
45 }
46
47 r = get_user_creds(&user, &uid, &gid, NULL, NULL);
48 if (r < 0) {
49 log_error_errno(r, "Cannot resolve user name %s: %m", user);
50 goto out;
51 }
52
53 /* Always create the directories people can create inotify
54 * watches in. */
55 r = mkdir_safe_label("/run/systemd/netif", 0755, uid, gid);
56 if (r < 0)
57 log_warning_errno(r, "Could not create runtime directory: %m");
58
59 r = mkdir_safe_label("/run/systemd/netif/links", 0755, uid, gid);
60 if (r < 0)
61 log_warning_errno(r, "Could not create runtime directory 'links': %m");
62
63 r = mkdir_safe_label("/run/systemd/netif/leases", 0755, uid, gid);
64 if (r < 0)
65 log_warning_errno(r, "Could not create runtime directory 'leases': %m");
66
67 r = mkdir_safe_label("/run/systemd/netif/lldp", 0755, uid, gid);
68 if (r < 0)
69 log_warning_errno(r, "Could not create runtime directory 'lldp': %m");
70
71 r = drop_privileges(uid, gid,
72 (1ULL << CAP_NET_ADMIN) |
73 (1ULL << CAP_NET_BIND_SERVICE) |
74 (1ULL << CAP_NET_BROADCAST) |
75 (1ULL << CAP_NET_RAW));
76 if (r < 0)
77 goto out;
78
79 assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
80
81 r = manager_new(&m);
82 if (r < 0) {
83 log_error_errno(r, "Could not create manager: %m");
84 goto out;
85 }
86
87 r = manager_connect_bus(m);
88 if (r < 0) {
89 log_error_errno(r, "Could not connect to bus: %m");
90 goto out;
91 }
92
93 r = manager_parse_config_file(m);
94 if (r < 0)
95 log_warning_errno(r, "Failed to parse configuration file: %m");
96
97 r = manager_load_config(m);
98 if (r < 0) {
99 log_error_errno(r, "Could not load configuration files: %m");
100 goto out;
101 }
102
103 r = manager_rtnl_enumerate_links(m);
104 if (r < 0) {
105 log_error_errno(r, "Could not enumerate links: %m");
106 goto out;
107 }
108
109 r = manager_rtnl_enumerate_addresses(m);
110 if (r < 0) {
111 log_error_errno(r, "Could not enumerate addresses: %m");
112 goto out;
113 }
114
115 r = manager_rtnl_enumerate_routes(m);
116 if (r < 0) {
117 log_error_errno(r, "Could not enumerate routes: %m");
118 goto out;
119 }
120
121 log_info("Enumeration completed");
122
123 sd_notify(false,
124 "READY=1\n"
125 "STATUS=Processing requests...");
126
127 r = manager_run(m);
128 if (r < 0) {
129 log_error_errno(r, "Event loop failed: %m");
130 goto out;
131 }
132
133 out:
134 sd_notify(false,
135 "STOPPING=1\n"
136 "STATUS=Shutting down...");
137
138 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
139 }