sysctl.c revision cc3d61683d877791e6b2ce0b17940d4d77cd6550
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering/***
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering This file is part of systemd.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering Copyright 2010 Lennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering systemd is free software; you can redistribute it and/or modify it
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering under the terms of the GNU Lesser General Public License as published by
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering the Free Software Foundation; either version 2.1 of the License, or
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering (at your option) any later version.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering systemd is distributed in the hope that it will be useful, but
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering Lesser General Public License for more details.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering You should have received a copy of the GNU Lesser General Public License
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering***/
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#include <stdlib.h>
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#include <stdbool.h>
1693a943ca581aca2beebb4c812ec6c9f17b8164Lennart Poettering#include <errno.h>
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#include <string.h>
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#include <stdio.h>
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#include <limits.h>
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen#include <getopt.h>
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#include "log.h"
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen#include "strv.h"
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#include "util.h"
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#include "hashmap.h"
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#include "path-util.h"
49699bac94d24b444274f91f85c82e6fad04d029Susant Sahani#include "conf-files.h"
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#include "fileio.h"
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#include "build.h"
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic char **arg_prefixes = NULL;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
db73295accbec0c6513817f0a64a92018592bb26Lennart Poetteringstatic const char conf_file_dirs[] =
d8500c53789eafefe28d4ace088bf4b912280bf9Tom Gundersen "/etc/sysctl.d\0"
266b538958932e6fc27dfce4917336e70e17e29eTom Gundersen "/run/sysctl.d\0"
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering "/usr/local/lib/sysctl.d\0"
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering "/usr/lib/sysctl.d\0"
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#ifdef HAVE_SPLIT_USR
9085f64a6694f2928c79fcce365edb1dca6937d4Lennart Poettering "/lib/sysctl.d\0"
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering#endif
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering ;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic char *normalize_sysctl(char *s) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering char *n;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering for (n = s; *n; n++)
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (*n == '.')
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering *n = '/';
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering return s;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering}
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic int apply_sysctl(const char *property, const char *value) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering _cleanup_free_ char *p = NULL;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering char *n;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering int r = 0, k;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering log_debug("Setting '%s' to '%s'", property, value);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering p = new(char, sizeof("/proc/sys/") + strlen(property));
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (!p)
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering return log_oom();
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering n = stpcpy(p, "/proc/sys/");
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering strcpy(n, property);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (!strv_isempty(arg_prefixes)) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering char **i;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering bool good = false;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering STRV_FOREACH(i, arg_prefixes)
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (path_startswith(p, *i)) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering good = true;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering break;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering }
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (!good) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering log_debug("Skipping %s", p);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering return 0;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering }
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering }
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering k = write_string_file(p, value);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (k < 0) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering log_full(k == -ENOENT ? LOG_DEBUG : LOG_WARNING,
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering "Failed to write '%s' to '%s': %s", value, p, strerror(-k));
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (k != -ENOENT && r == 0)
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering r = k;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering }
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering return r;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering}
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poetteringstatic int apply_all(Hashmap *sysctl_options) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering int r = 0;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering char *property, *value;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering Iterator i;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering assert(sysctl_options);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering HASHMAP_FOREACH_KEY(value, property, sysctl_options, i) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering int k;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering k = apply_sysctl(property, value);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering if (k < 0 && r == 0)
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering r = k;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering }
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering return r;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering}
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poetteringstatic int parse_file(Hashmap *sysctl_options, const char *path, bool ignore_enoent) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering _cleanup_fclose_ FILE *f = NULL;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering int r;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering assert(path);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering r = search_and_fopen_nulstr(path, "re", conf_file_dirs, &f);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering if (r < 0) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering if (ignore_enoent && r == -ENOENT)
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering return 0;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering log_error("Failed to open file '%s', ignoring: %s", path, strerror(-r));
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering return r;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering }
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering log_debug("parse: %s", path);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering while (!feof(f)) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering char l[LINE_MAX], *p, *value, *new_value, *property, *existing;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering void *v;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering int k;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering if (!fgets(l, sizeof(l), f)) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering if (feof(f))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering break;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering log_error("Failed to read file '%s', ignoring: %m", path);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering return -errno;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering }
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering p = strstrip(l);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering if (!*p)
a6a4f528899b1dab47408733b4a423c66ea40f7aThomas Hindoe Paaboel Andersen continue;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering if (strchr(COMMENTS "\n", *p))
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering continue;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering value = strchr(p, '=');
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering if (!value) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering log_error("Line is not an assignment in file '%s': %s", path, value);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering if (r == 0)
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering r = -EINVAL;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering continue;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering }
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering *value = 0;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering value++;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering p = normalize_sysctl(strstrip(p));
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering value = strstrip(value);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering existing = hashmap_get2(sysctl_options, p, &v);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering if (existing) {
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering if (streq(value, existing))
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering continue;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering log_info("Overwriting earlier assignment of %s in file '%s'.", p, path);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering free(hashmap_remove(sysctl_options, p));
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering free(v);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering }
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering property = strdup(p);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering if (!property)
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering return log_oom();
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering new_value = strdup(value);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering if (!new_value) {
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering free(property);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering return log_oom();
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering }
266b538958932e6fc27dfce4917336e70e17e29eTom Gundersen
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering k = hashmap_put(sysctl_options, property, new_value);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (k < 0) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering log_error("Failed to add sysctl variable %s to hashmap: %s", property, strerror(-k));
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering free(property);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering free(new_value);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering return k;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering }
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering }
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt return r;
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt}
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic int help(void) {
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n"
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering "Applies kernel sysctl settings.\n\n"
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering " -h --help Show this help\n"
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering " --version Show package version\n"
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering " --prefix=PATH Only apply rules that apply to paths with the specified prefix\n",
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering program_invocation_short_name);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering return 0;
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering}
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic int parse_argv(int argc, char *argv[]) {
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt enum {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering ARG_VERSION = 0x100,
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering ARG_PREFIX
3e3db0ee860025ad663b13b0ace4e6d627611332Lennart Poettering };
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering static const struct option options[] = {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering { "help", no_argument, NULL, 'h' },
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering { "version", no_argument, NULL, ARG_VERSION },
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering { "prefix", required_argument, NULL, ARG_PREFIX },
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering {}
ab1525bc2d92780b4dc64bc5b9cdb52594e2df7dLennart Poettering };
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering int c;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
df3fb561b2df486a495a5f0bcc83168bd1860533Lennart Poettering assert(argc >= 0);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering assert(argv);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
d6731e4c7964ee2860d4f5abdb0b52acd7a66960Tom Gundersen while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0) {
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering switch (c) {
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering case 'h':
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering return help();
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering case ARG_VERSION:
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering puts(PACKAGE_STRING);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering puts(SYSTEMD_FEATURES);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering return 0;
3e3db0ee860025ad663b13b0ace4e6d627611332Lennart Poettering
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering case ARG_PREFIX: {
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering char *p;
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering for (p = optarg; *p; p++)
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (*p == '.')
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering *p = '/';
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (strv_extend(&arg_prefixes, optarg) < 0)
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering return log_oom();
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering break;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen }
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen case '?':
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen return -EINVAL;
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen default:
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen assert_not_reached("Unhandled option");
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen }
888943fc6246b2917168fff59380b58b678ba157Lennart Poettering }
888943fc6246b2917168fff59380b58b678ba157Lennart Poettering
888943fc6246b2917168fff59380b58b678ba157Lennart Poettering return 1;
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen}
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersenint main(int argc, char *argv[]) {
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen int r = 0, k;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen Hashmap *sysctl_options;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen r = parse_argv(argc, argv);
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen if (r <= 0)
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen log_set_target(LOG_TARGET_AUTO);
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen log_parse_environment();
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen log_open();
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen umask(0022);
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen sysctl_options = hashmap_new(string_hash_func, string_compare_func);
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen if (!sysctl_options) {
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen r = log_oom();
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen goto finish;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen }
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen
69fb1176c403e437c4fba763ba242b540c73898fLennart Poettering r = 0;
69fb1176c403e437c4fba763ba242b540c73898fLennart Poettering
81fd1dd3a2cf4cc90a6898d562c9bb0fb238cbd7Tom Gundersen if (argc > optind) {
69fb1176c403e437c4fba763ba242b540c73898fLennart Poettering int i;
69fb1176c403e437c4fba763ba242b540c73898fLennart Poettering
69fb1176c403e437c4fba763ba242b540c73898fLennart Poettering for (i = optind; i < argc; i++) {
69fb1176c403e437c4fba763ba242b540c73898fLennart Poettering k = parse_file(sysctl_options, argv[i], false);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen if (k < 0 && r == 0)
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen r = k;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen }
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen } else {
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen _cleanup_strv_free_ char **files = NULL;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen char **f;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen r = conf_files_list_nulstr(&files, ".conf", NULL, conf_file_dirs);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen if (r < 0) {
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen log_error("Failed to enumerate sysctl.d files: %s", strerror(-r));
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen goto finish;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen }
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen STRV_FOREACH(f, files) {
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen k = parse_file(sysctl_options, *f, true);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen if (k < 0 && r == 0)
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen r = k;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen }
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen }
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen k = apply_all(sysctl_options);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen if (k < 0 && r == 0)
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen r = k;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersenfinish:
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen hashmap_free_free_free(sysctl_options);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen strv_free(arg_prefixes);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen}
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen