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