sysctl.c revision 384c5b44fe9bc95333af2e6bdbe86bd5d58d046b
7640a5de1b3ffe6547200ad204d14e4f067caf4fLennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
7640a5de1b3ffe6547200ad204d14e4f067caf4fLennart Poettering This file is part of systemd.
7640a5de1b3ffe6547200ad204d14e4f067caf4fLennart Poettering Copyright 2010 Lennart Poettering
7640a5de1b3ffe6547200ad204d14e4f067caf4fLennart Poettering systemd is free software; you can redistribute it and/or modify it
7640a5de1b3ffe6547200ad204d14e4f067caf4fLennart Poettering under the terms of the GNU Lesser General Public License as published by
7640a5de1b3ffe6547200ad204d14e4f067caf4fLennart Poettering the Free Software Foundation; either version 2.1 of the License, or
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering (at your option) any later version.
7640a5de1b3ffe6547200ad204d14e4f067caf4fLennart Poettering systemd is distributed in the hope that it will be useful, but
7640a5de1b3ffe6547200ad204d14e4f067caf4fLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
7640a5de1b3ffe6547200ad204d14e4f067caf4fLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
7640a5de1b3ffe6547200ad204d14e4f067caf4fLennart Poettering Lesser General Public License for more details.
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering You should have received a copy of the GNU Lesser General Public License
7640a5de1b3ffe6547200ad204d14e4f067caf4fLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic char **arg_prefixes = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic const char conf_file_dirs[] = CONF_DIRS_NULSTR("sysctl");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int apply_all(Hashmap *sysctl_options) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek HASHMAP_FOREACH_KEY(value, property, sysctl_options, i) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek k = sysctl_write(property, value);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_full_errno(k == -ENOENT ? LOG_INFO : LOG_WARNING, k,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "Couldn't write '%s' to '%s', ignoring: %m", value, property);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (r == 0 && k != -ENOENT)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int parse_file(Hashmap *sysctl_options, const char *path, bool ignore_enoent) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek _cleanup_fclose_ FILE *f = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = search_and_fopen_nulstr(path, "re", NULL, conf_file_dirs, &f);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (ignore_enoent && r == -ENOENT)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return log_error_errno(r, "Failed to open file '%s', ignoring: %m", path);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek char l[LINE_MAX], *p, *value, *new_value, *property, *existing;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!fgets(l, sizeof(l), f)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error_errno(errno, "Failed to read file '%s', ignoring: %m", path);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Line is not an assignment in file '%s': %s", path, value);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek p = sysctl_normalize(strstrip(p));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!strv_isempty(arg_prefixes)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek t = path_startswith(*i, "/proc/sys/");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek existing = hashmap_get2(sysctl_options, p, &v);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_debug("Overwriting earlier assignment of %s in file '%s'.", p, path);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek free(hashmap_remove(sysctl_options, p));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek k = hashmap_put(sysctl_options, property, new_value);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error_errno(k, "Failed to add sysctl variable %s to hashmap: %m", property);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic void help(void) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n"
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "Applies kernel sysctl settings.\n\n"
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek " -h --help Show this help\n"
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek " --version Show package version\n"
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek " --prefix=PATH Only apply rules with the specified prefix\n"
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek , program_invocation_short_name);
799298d6513e7d40125c19d46578bb870d047db4Jóhann B. Guðmundssonstatic int parse_argv(int argc, char *argv[]) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek static const struct option options[] = {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek { "help", no_argument, NULL, 'h' },
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek { "version", no_argument, NULL, ARG_VERSION },
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek { "prefix", required_argument, NULL, ARG_PREFIX },
help();
case ARG_VERSION:
case ARG_PREFIX: {
return log_oom();
return log_oom();
return -EINVAL;
log_open();
if (!sysctl_options) {
r = log_oom();
goto finish;
goto finish;