sysctl.c revision cc3d61683d877791e6b2ce0b17940d4d77cd6550
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering This file is part of systemd.
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering Copyright 2010 Lennart 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 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 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/>.
db73295accbec0c6513817f0a64a92018592bb26Lennart Poetteringstatic const char conf_file_dirs[] =
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic char *normalize_sysctl(char *s) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering for (n = s; *n; n++)
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (*n == '.')
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic int apply_sysctl(const char *property, const char *value) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering log_debug("Setting '%s' to '%s'", property, value);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering p = new(char, sizeof("/proc/sys/") + strlen(property));
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 if (k != -ENOENT && r == 0)
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poetteringstatic int apply_all(Hashmap *sysctl_options) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering HASHMAP_FOREACH_KEY(value, property, sysctl_options, i) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering if (k < 0 && r == 0)
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poetteringstatic int parse_file(Hashmap *sysctl_options, const char *path, bool ignore_enoent) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering r = search_and_fopen_nulstr(path, "re", conf_file_dirs, &f);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering log_error("Failed to open file '%s', ignoring: %s", path, strerror(-r));
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering char l[LINE_MAX], *p, *value, *new_value, *property, *existing;
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering if (!fgets(l, sizeof(l), f)) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering log_error("Failed to read file '%s', ignoring: %m", path);
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering log_error("Line is not an assignment in file '%s': %s", path, value);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering existing = hashmap_get2(sysctl_options, p, &v);
d57c365bf8f09fbcc649e00f7060ff30809f67c2Lennart Poettering log_info("Overwriting earlier assignment of %s in file '%s'.", p, path);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering k = hashmap_put(sysctl_options, property, new_value);
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering log_error("Failed to add sysctl variable %s to hashmap: %s", property, strerror(-k));
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poetteringstatic int help(void) {
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 Poetteringstatic int parse_argv(int argc, char *argv[]) {
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering { "version", no_argument, NULL, ARG_VERSION },
6d0c65ffb4f82e8c6dceb453919b3db54343fc27Lennart Poettering { "prefix", required_argument, NULL, ARG_PREFIX },
d6731e4c7964ee2860d4f5abdb0b52acd7a66960Tom Gundersen while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0) {
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering for (p = optarg; *p; p++)
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (*p == '.')
ee8c45689526ca973407cbb77bce7b96a062c40bLennart Poettering if (strv_extend(&arg_prefixes, optarg) < 0)
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen int r = 0, k;
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen sysctl_options = hashmap_new(string_hash_func, string_compare_func);
69fb1176c403e437c4fba763ba242b540c73898fLennart Poettering k = parse_file(sysctl_options, argv[i], false);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen if (k < 0 && r == 0)
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen r = conf_files_list_nulstr(&files, ".conf", NULL, conf_file_dirs);
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen log_error("Failed to enumerate sysctl.d files: %s", strerror(-r));
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen if (k < 0 && r == 0)
c09da72900b03fcddade06643f24c6357f3e0482Tom Gundersen if (k < 0 && r == 0)