199ca880aSopenharmony_ci/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
299ca880aSopenharmony_ci
399ca880aSopenharmony_ci/***
499ca880aSopenharmony_ci  This file is part of systemd.
599ca880aSopenharmony_ci
699ca880aSopenharmony_ci  Copyright 2010 Lennart Poettering
799ca880aSopenharmony_ci
899ca880aSopenharmony_ci  systemd is free software; you can redistribute it and/or modify it
999ca880aSopenharmony_ci  under the terms of the GNU Lesser General Public License as published by
1099ca880aSopenharmony_ci  the Free Software Foundation; either version 2.1 of the License, or
1199ca880aSopenharmony_ci  (at your option) any later version.
1299ca880aSopenharmony_ci
1399ca880aSopenharmony_ci  systemd is distributed in the hope that it will be useful, but
1499ca880aSopenharmony_ci  WITHOUT ANY WARRANTY; without even the implied warranty of
1599ca880aSopenharmony_ci  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1699ca880aSopenharmony_ci  Lesser General Public License for more details.
1799ca880aSopenharmony_ci
1899ca880aSopenharmony_ci  You should have received a copy of the GNU Lesser General Public License
1999ca880aSopenharmony_ci  along with systemd; If not, see <http://www.gnu.org/licenses/>.
2099ca880aSopenharmony_ci***/
2199ca880aSopenharmony_ci
2299ca880aSopenharmony_ci#include <stdlib.h>
2399ca880aSopenharmony_ci#include <stdbool.h>
2499ca880aSopenharmony_ci#include <errno.h>
2599ca880aSopenharmony_ci#include <string.h>
2699ca880aSopenharmony_ci#include <stdio.h>
2799ca880aSopenharmony_ci#include <limits.h>
2899ca880aSopenharmony_ci#include <getopt.h>
2999ca880aSopenharmony_ci
3099ca880aSopenharmony_ci#include "log.h"
3199ca880aSopenharmony_ci#include "util.h"
3299ca880aSopenharmony_ci#include "fileio.h"
3399ca880aSopenharmony_ci#include "sysctl-util.h"
3499ca880aSopenharmony_ci
3599ca880aSopenharmony_cichar *sysctl_normalize(char *s) {
3699ca880aSopenharmony_ci        char *n;
3799ca880aSopenharmony_ci
3899ca880aSopenharmony_ci        n = strpbrk(s, "/.");
3999ca880aSopenharmony_ci        /* If the first separator is a slash, the path is
4099ca880aSopenharmony_ci         * assumed to be normalized and slashes remain slashes
4199ca880aSopenharmony_ci         * and dots remains dots. */
4299ca880aSopenharmony_ci        if (!n || *n == '/')
4399ca880aSopenharmony_ci                return s;
4499ca880aSopenharmony_ci
4599ca880aSopenharmony_ci        /* Otherwise, dots become slashes and slashes become
4699ca880aSopenharmony_ci         * dots. Fun. */
4799ca880aSopenharmony_ci        while (n) {
4899ca880aSopenharmony_ci                if (*n == '.')
4999ca880aSopenharmony_ci                        *n = '/';
5099ca880aSopenharmony_ci                else
5199ca880aSopenharmony_ci                        *n = '.';
5299ca880aSopenharmony_ci
5399ca880aSopenharmony_ci                n = strpbrk(n + 1, "/.");
5499ca880aSopenharmony_ci        }
5599ca880aSopenharmony_ci
5699ca880aSopenharmony_ci        return s;
5799ca880aSopenharmony_ci}
5899ca880aSopenharmony_ci
5999ca880aSopenharmony_ciint sysctl_write(const char *property, const char *value) {
6099ca880aSopenharmony_ci        char *p;
6199ca880aSopenharmony_ci
6299ca880aSopenharmony_ci        assert(property);
6399ca880aSopenharmony_ci        assert(value);
6499ca880aSopenharmony_ci
6599ca880aSopenharmony_ci        log_debug("Setting '%s' to '%s'", property, value);
6699ca880aSopenharmony_ci
6799ca880aSopenharmony_ci        p = strjoina("/proc/sys/", property);
6899ca880aSopenharmony_ci        return write_string_file(p, value);
6999ca880aSopenharmony_ci}
7099ca880aSopenharmony_ci
7199ca880aSopenharmony_ciint sysctl_read(const char *property, char **content) {
7299ca880aSopenharmony_ci        char *p;
7399ca880aSopenharmony_ci
7499ca880aSopenharmony_ci        assert(property);
7599ca880aSopenharmony_ci        assert(content);
7699ca880aSopenharmony_ci
7799ca880aSopenharmony_ci        p = strjoina("/proc/sys/", property);
7899ca880aSopenharmony_ci        return read_full_file(p, content, NULL);
7999ca880aSopenharmony_ci}
80