networkd.c revision 49699bac94d24b444274f91f85c82e6fad04d029
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering/***
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering This file is part of systemd.
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering Copyright 2013 Tom Gundersen <teg@jklm.no>
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering systemd is free software; you can redistribute it and/or modify it
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering under the terms of the GNU Lesser General Public License as published by
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering (at your option) any later version.
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering systemd is distributed in the hope that it will be useful, but
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering Lesser General Public License for more details.
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering You should have received a copy of the GNU Lesser General Public License
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering***/
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering#include "capability.h"
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering#include "sd-event.h"
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering#include "sd-daemon.h"
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering#include "networkd.h"
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poetteringint main(int argc, char *argv[]) {
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering _cleanup_manager_free_ Manager *m = NULL;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering const char *user = "systemd-network";
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering uid_t uid;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering gid_t gid;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering int r;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_set_target(LOG_TARGET_AUTO);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_parse_environment();
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_open();
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering umask(0022);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (argc != 1) {
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_error("This program takes no arguments.");
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = -EINVAL;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering goto out;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering }
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = get_user_creds(&user, &uid, &gid, NULL, NULL);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (r < 0) {
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_error_errno(r, "Cannot resolve user name %s: %m", user);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering goto out;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering }
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering /* Always create the directories people can create inotify
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering * watches in. */
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = mkdir_safe_label("/run/systemd/netif", 0755, uid, gid);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (r < 0)
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_error_errno(r, "Could not create runtime directory: %m");
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = mkdir_safe_label("/run/systemd/netif/links", 0755, uid, gid);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (r < 0)
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_error_errno(r, "Could not create runtime directory 'links': %m");
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = mkdir_safe_label("/run/systemd/netif/leases", 0755, uid, gid);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (r < 0)
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_error_errno(r, "Could not create runtime directory 'leases': %m");
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = mkdir_safe_label("/run/systemd/netif/lldp", 0755, uid, gid);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (r < 0)
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_error("Could not create runtime directory 'lldp': %s",
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering strerror(-r));
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = drop_privileges(uid, gid,
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering (1ULL << CAP_NET_ADMIN) |
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering (1ULL << CAP_NET_BIND_SERVICE) |
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering (1ULL << CAP_NET_BROADCAST) |
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering (1ULL << CAP_NET_RAW));
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (r < 0)
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering goto out;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering assert_se(sigprocmask_many(SIG_BLOCK, SIGTERM, SIGINT, -1) == 0);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = manager_new(&m);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (r < 0) {
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_error_errno(r, "Could not create manager: %m");
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering goto out;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering }
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = manager_udev_listen(m);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (r < 0) {
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_error_errno(r, "Could not connect to udev: %m");
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering goto out;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering }
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = manager_rtnl_listen(m);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (r < 0) {
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_error_errno(r, "Could not connect to rtnl: %m");
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering goto out;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering }
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = manager_bus_listen(m);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (r < 0) {
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_error_errno(r, "Could not connect to system bus: %m");
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering goto out;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering }
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = manager_load_config(m);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (r < 0) {
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_error_errno(r, "Could not load configuration files: %m");
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering goto out;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering }
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = manager_rtnl_enumerate_links(m);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (r < 0) {
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_error_errno(r, "Could not enumerate links: %m");
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering goto out;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering }
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = manager_rtnl_enumerate_addresses(m);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (r < 0) {
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_error_errno(r, "Could not enumerate links: %m");
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering goto out;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering }
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering sd_notify(false,
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering "READY=1\n"
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering "STATUS=Processing requests...");
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering r = sd_event_loop(m->event);
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering if (r < 0) {
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering log_error_errno(r, "Event loop failed: %m");
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering goto out;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering }
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poetteringout:
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering sd_notify(false,
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering "STOPPING=1\n"
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering "STATUS=Shutting down...");
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering}
587fec427c80b6c34dcf1d7570f891fcb652a7c5Lennart Poettering