1
0
mirror of https://github.com/systemd/systemd synced 2025-11-21 09:44:44 +01:00

Compare commits

..

No commits in common. "9bb47f9ce9e3fa33754724ece00d3a682b28e5d8" and "f28fb7836f005b68fe4721dab84149025d36ea3b" have entirely different histories.

13 changed files with 169 additions and 218 deletions

View File

@ -21,7 +21,6 @@ Include any other files from the [documentation](../docs) in the context as need
- Frame comments as questions - Frame comments as questions
- Always consider you may be wrong - Always consider you may be wrong
- Do not argue with contributors, assume they are right unless you are very confident in your deduction - Do not argue with contributors, assume they are right unless you are very confident in your deduction
- Be extremely thorough. Every single separate coding style violation should be reported
## Testing Expectations ## Testing Expectations

View File

@ -37,8 +37,7 @@ SPDX-License-Identifier: LGPL-2.1-or-later
int a, b, c; int a, b, c;
``` ```
(i.e. use double indentation — 16 spaces — for the parameter list and leave a (i.e. use double indentation — 16 spaces — for the parameter list.)
newline between the function declaration and the first variable declaration.)
- Try to write this: - Try to write this:

View File

@ -42,12 +42,8 @@
<para>When invoked with no arguments, <command>/usr/lib/systemd/systemd-sysctl</command> applies <para>When invoked with no arguments, <command>/usr/lib/systemd/systemd-sysctl</command> applies
all directives from configuration files listed in all directives from configuration files listed in
<citerefentry><refentrytitle>sysctl.d</refentrytitle><manvolnum>5</manvolnum></citerefentry>. <citerefentry><refentrytitle>sysctl.d</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
When invoked with positional arguments, the configuration specified by the command line arguments is If one or more filenames are passed on the command line, only the directives in these files are
executed. If the string <literal>-</literal> is specified instead of a filename, the configuration is applied.</para>
read from standard input. If the argument is a file name (without any slashes), all configuration
directories are searched for a matching file and the file found that has the highest priority is
executed. If the argument is a path, that file is used directly without searching the configuration
directories for any other matching file.</para>
<para>In addition, <option>--prefix=</option> option may be used to limit which sysctl <para>In addition, <option>--prefix=</option> option may be used to limit which sysctl
settings are applied.</para> settings are applied.</para>
@ -81,14 +77,6 @@
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><option>--inline</option></term>
<listitem><para>Treat each positional argument as a separate configuration line instead of a file
name.</para>
<xi:include href="version-info.xml" xpointer="v259"/></listitem>
</varlistentry>
<xi:include href="standard-options.xml" xpointer="cat-config" /> <xi:include href="standard-options.xml" xpointer="cat-config" />
<xi:include href="standard-options.xml" xpointer="tldr" /> <xi:include href="standard-options.xml" xpointer="tldr" />
<xi:include href="standard-options.xml" xpointer="no-pager" /> <xi:include href="standard-options.xml" xpointer="no-pager" />

View File

@ -886,16 +886,16 @@ static int bus_socket_inotify_setup(sd_bus *b) {
} }
wd = inotify_add_watch(b->inotify_fd, prefix, IN_DELETE_SELF|IN_MOVE_SELF|IN_ATTRIB|IN_CREATE|IN_MOVED_TO|IN_DONT_FOLLOW); wd = inotify_add_watch(b->inotify_fd, prefix, IN_DELETE_SELF|IN_MOVE_SELF|IN_ATTRIB|IN_CREATE|IN_MOVED_TO|IN_DONT_FOLLOW);
log_debug("Added inotify watch for %s on bus %s: %i", prefix, strna(b->description), wd);
if (wd < 0) { if (wd < 0) {
if (IN_SET(errno, ENOENT, ELOOP)) if (IN_SET(errno, ENOENT, ELOOP))
break; /* This component doesn't exist yet, or the path contains a cyclic symlink right now */ break; /* This component doesn't exist yet, or the path contains a cyclic symlink right now */
r = log_debug_errno(errno, "Failed to add inotify watch on %s: %m", empty_to_root(prefix)); r = log_debug_errno(errno, "Failed to add inotify watch on %s: %m", empty_to_root(prefix));
goto fail; goto fail;
} else { } else
log_debug("Added inotify watch %i for %s on bus %s.", wd, prefix, strna(b->description));
new_watches[n++] = wd; new_watches[n++] = wd;
}
/* Check if this is possibly a symlink. If so, let's follow it and watch it too. */ /* Check if this is possibly a symlink. If so, let's follow it and watch it too. */
r = readlink_malloc(prefix, &destination); r = readlink_malloc(prefix, &destination);

View File

@ -72,7 +72,7 @@ static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0); assert(argc >= 0);
assert(argv); assert(argv);
while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0) { while ((c = getopt_long(argc, argv, "hq", options, NULL)) >= 0) {
switch (c) { switch (c) {

View File

@ -94,7 +94,6 @@ static void boot_entry_free(BootEntry *entry) {
free(entry->kernel); free(entry->kernel);
free(entry->efi); free(entry->efi);
free(entry->uki); free(entry->uki);
free(entry->uki_url);
strv_free(entry->initrd); strv_free(entry->initrd);
free(entry->device_tree); free(entry->device_tree);
strv_free(entry->device_tree_overlay); strv_free(entry->device_tree_overlay);
@ -407,8 +406,6 @@ static int boot_entry_load_type1(
r = parse_path_one(tmp.path, line, field, &tmp.efi, p); r = parse_path_one(tmp.path, line, field, &tmp.efi, p);
else if (streq(field, "uki")) else if (streq(field, "uki"))
r = parse_path_one(tmp.path, line, field, &tmp.uki, p); r = parse_path_one(tmp.path, line, field, &tmp.uki, p);
else if (streq(field, "uki-url"))
r = free_and_strdup(&tmp.uki_url, p);
else if (streq(field, "profile")) else if (streq(field, "profile"))
r = safe_atou_full(p, 10, &tmp.profile); r = safe_atou_full(p, 10, &tmp.profile);
else if (streq(field, "initrd")) else if (streq(field, "initrd"))
@ -1908,8 +1905,6 @@ int show_boot_entry(
boot_entry_file_list("efi", e->root, e->efi, &status); boot_entry_file_list("efi", e->root, e->efi, &status);
if (e->uki) if (e->uki)
boot_entry_file_list("uki", e->root, e->uki, &status); boot_entry_file_list("uki", e->root, e->uki, &status);
if (e->uki_url)
printf(" uki-url: %s\n", e->uki_url);
if (e->profile != UINT_MAX) if (e->profile != UINT_MAX)
printf(" profile: %u\n", e->profile); printf(" profile: %u\n", e->profile);
@ -1974,7 +1969,6 @@ int boot_entry_to_json(const BootConfig *c, size_t i, sd_json_variant **ret) {
SD_JSON_BUILD_PAIR_CONDITION(!!e->kernel, "linux", SD_JSON_BUILD_STRING(e->kernel)), SD_JSON_BUILD_PAIR_CONDITION(!!e->kernel, "linux", SD_JSON_BUILD_STRING(e->kernel)),
SD_JSON_BUILD_PAIR_CONDITION(!!e->efi, "efi", SD_JSON_BUILD_STRING(e->efi)), SD_JSON_BUILD_PAIR_CONDITION(!!e->efi, "efi", SD_JSON_BUILD_STRING(e->efi)),
SD_JSON_BUILD_PAIR_CONDITION(!!e->uki, "uki", SD_JSON_BUILD_STRING(e->uki)), SD_JSON_BUILD_PAIR_CONDITION(!!e->uki, "uki", SD_JSON_BUILD_STRING(e->uki)),
SD_JSON_BUILD_PAIR_CONDITION(!!e->uki_url, "ukiUrl", SD_JSON_BUILD_STRING(e->uki_url)),
SD_JSON_BUILD_PAIR_CONDITION(e->profile != UINT_MAX, "profile", SD_JSON_BUILD_UNSIGNED(e->profile)), SD_JSON_BUILD_PAIR_CONDITION(e->profile != UINT_MAX, "profile", SD_JSON_BUILD_UNSIGNED(e->profile)),
SD_JSON_BUILD_PAIR_CONDITION(!strv_isempty(e->initrd), "initrd", SD_JSON_BUILD_STRV(e->initrd))); SD_JSON_BUILD_PAIR_CONDITION(!strv_isempty(e->initrd), "initrd", SD_JSON_BUILD_STRV(e->initrd)));
if (r < 0) if (r < 0)

View File

@ -51,7 +51,6 @@ typedef struct BootEntry {
char *kernel; /* linux is #defined to 1, yikes! */ char *kernel; /* linux is #defined to 1, yikes! */
char *efi; char *efi;
char *uki; char *uki;
char *uki_url;
char **initrd; char **initrd;
char *device_tree; char *device_tree;
char **device_tree_overlay; char **device_tree_overlay;

View File

@ -26,7 +26,6 @@
static char **arg_prefixes = NULL; static char **arg_prefixes = NULL;
static CatFlags arg_cat_flags = CAT_CONFIG_OFF; static CatFlags arg_cat_flags = CAT_CONFIG_OFF;
static bool arg_strict = false; static bool arg_strict = false;
static bool arg_inline = false;
static PagerFlags arg_pager_flags = 0; static PagerFlags arg_pager_flags = 0;
STATIC_DESTRUCTOR_REGISTER(arg_prefixes, strv_freep); STATIC_DESTRUCTOR_REGISTER(arg_prefixes, strv_freep);
@ -37,7 +36,7 @@ typedef struct Option {
bool ignore_failure; bool ignore_failure;
} Option; } Option;
static Option* option_free(Option *o) { static Option *option_free(Option *o) {
if (!o) if (!o)
return NULL; return NULL;
@ -48,10 +47,7 @@ static Option* option_free(Option *o) {
} }
DEFINE_TRIVIAL_CLEANUP_FUNC(Option*, option_free); DEFINE_TRIVIAL_CLEANUP_FUNC(Option*, option_free);
DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR( DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR(option_hash_ops, char, string_hash_func, string_compare_func, Option, option_free);
option_hash_ops,
char, string_hash_func, string_compare_func,
Option, option_free);
static bool test_prefix(const char *p) { static bool test_prefix(const char *p) {
if (strv_isempty(arg_prefixes)) if (strv_isempty(arg_prefixes))
@ -60,7 +56,7 @@ static bool test_prefix(const char *p) {
return path_startswith_strv(p, arg_prefixes); return path_startswith_strv(p, arg_prefixes);
} }
static Option* option_new( static Option *option_new(
const char *key, const char *key,
const char *value, const char *value,
bool ignore_failure) { bool ignore_failure) {
@ -159,13 +155,14 @@ static int apply_glob_option_with_prefix(OrderedHashmap *sysctl_options, Option
if (option->ignore_failure || ERRNO_IS_PRIVILEGE(r)) { if (option->ignore_failure || ERRNO_IS_PRIVILEGE(r)) {
log_debug_errno(r, "Failed to resolve glob '%s', ignoring: %m", option->key); log_debug_errno(r, "Failed to resolve glob '%s', ignoring: %m", option->key);
return 0; return 0;
} } else
return log_error_errno(r, "Couldn't resolve glob '%s': %m", option->key);
return log_error_errno(r, "Couldn't resolve glob '%s': %m", option->key);
} }
STRV_FOREACH(s, paths) { STRV_FOREACH(s, paths) {
const char *key = ASSERT_SE_PTR(path_startswith(*s, "/proc/sys")); const char *key;
assert_se(key = path_startswith(*s, "/proc/sys"));
if (ordered_hashmap_contains(sysctl_options, key)) { if (ordered_hashmap_contains(sysctl_options, key)) {
log_debug("Not setting %s (explicit setting exists).", key); log_debug("Not setting %s (explicit setting exists).", key);
@ -215,79 +212,100 @@ static int apply_all(OrderedHashmap *sysctl_options) {
return r; return r;
} }
static int parse_line(const char *fname, unsigned line, const char *buffer, bool *invalid_config, void *userdata) { static int parse_file(OrderedHashmap **sysctl_options, const char *path, bool ignore_enoent) {
OrderedHashmap **sysctl_options = ASSERT_PTR(userdata); _cleanup_fclose_ FILE *f = NULL;
_cleanup_free_ char *k = NULL, *v = NULL; _cleanup_free_ char *pp = NULL;
bool ignore_failure = false; unsigned c = 0;
int r; int r;
const char *eq = strchr(buffer, '='); assert(path);
if (eq) {
if (buffer[0] == '-') {
ignore_failure = true;
buffer++;
}
k = strndup(buffer, eq - buffer); r = search_and_fopen(path, "re", NULL, (const char**) CONF_PATHS_STRV("sysctl.d"), &f, &pp);
if (!k) if (r < 0) {
return log_oom(); if (ignore_enoent && r == -ENOENT)
v = strdup(eq + 1);
if (!v)
return log_oom();
} else {
if (buffer[0] == '-')
/* We have a "negative match" option. Let's continue with value==NULL. */
buffer++;
else
return log_syntax(NULL, LOG_WARNING, fname, line, SYNTHETIC_ERRNO(EINVAL),
"Line is not an assignment, ignoring: %s", buffer);
k = strdup(buffer);
if (!k)
return log_oom();
}
const char *key = sysctl_normalize(strstrip(k)), *value = strstrip(v);
/* We can't filter out globs at this point, we'll need to do that later. */
if (!string_is_glob(key) && !test_prefix(key))
return 0;
Option *existing = ordered_hashmap_get(*sysctl_options, key);
if (existing) {
if (streq_ptr(value, existing->value)) {
existing->ignore_failure = existing->ignore_failure || ignore_failure;
return 0; return 0;
}
log_syntax(NULL, LOG_DEBUG, fname, line, 0, return log_error_errno(r, "Failed to open file '%s', ignoring: %m", path);
"Overwriting earlier assignment of '%s'.", key);
option_free(ordered_hashmap_remove(*sysctl_options, key));
} }
_cleanup_(option_freep) Option *option = option_new(key, value, ignore_failure); log_debug("Parsing %s", pp);
if (!option) for (;;) {
return log_oom(); _cleanup_(option_freep) Option *new_option = NULL;
_cleanup_free_ char *l = NULL;
bool ignore_failure = false;
Option *existing;
char *value;
int k;
r = ordered_hashmap_ensure_put(sysctl_options, &option_hash_ops, option->key, option); k = read_stripped_line(f, LONG_LINE_MAX, &l);
if (r < 0) if (k == 0)
return log_error_errno(r, "Failed to add sysctl variable '%s' to hashmap: %m", key); break;
if (k < 0)
return log_error_errno(k, "Failed to read file '%s', ignoring: %m", pp);
TAKE_PTR(option); c++;
return 0;
}
static int parse_file(OrderedHashmap **sysctl_options, const char *path, bool ignore_enoent) { if (isempty(l))
return conf_file_read( continue;
/* root = */ NULL, if (strchr(COMMENTS, l[0]))
(const char**) CONF_PATHS_STRV("sysctl.d"), continue;
path,
parse_line, char *p = l;
sysctl_options, value = strchr(p, '=');
ignore_enoent, if (value) {
/* invalid_config = */ NULL); if (p[0] == '-') {
ignore_failure = true;
p++;
}
*value = 0;
value++;
value = strstrip(value);
} else {
if (p[0] == '-')
/* We have a "negative match" option. Let's continue with value==NULL. */
p++;
else {
log_syntax(NULL, LOG_WARNING, pp, c, 0,
"Line is not an assignment, ignoring: %s", p);
if (r == 0)
r = -EINVAL;
continue;
}
}
p = strstrip(p);
p = sysctl_normalize(p);
/* We can't filter out globs at this point, we'll need to do that later. */
if (!string_is_glob(p) &&
!test_prefix(p))
continue;
existing = ordered_hashmap_get(*sysctl_options, p);
if (existing) {
if (streq_ptr(value, existing->value)) {
existing->ignore_failure = existing->ignore_failure || ignore_failure;
continue;
}
log_debug("Overwriting earlier assignment of %s at '%s:%u'.", p, pp, c);
option_free(ordered_hashmap_remove(*sysctl_options, p));
}
new_option = option_new(p, value, ignore_failure);
if (!new_option)
return log_oom();
k = ordered_hashmap_ensure_put(sysctl_options, &option_hash_ops, new_option->key, new_option);
if (k < 0)
return log_error_errno(k, "Failed to add sysctl variable %s to hashmap: %m", p);
TAKE_PTR(new_option);
}
return r;
} }
static int read_credential_lines(OrderedHashmap **sysctl_options) { static int read_credential_lines(OrderedHashmap **sysctl_options) {
@ -305,7 +323,8 @@ static int read_credential_lines(OrderedHashmap **sysctl_options) {
if (!j) if (!j)
return log_oom(); return log_oom();
return parse_file(sysctl_options, j, /* ignore_enoent= */ true); (void) parse_file(sysctl_options, j, /* ignore_enoent= */ true);
return 0;
} }
static int cat_config(char **files) { static int cat_config(char **files) {
@ -322,23 +341,16 @@ static int help(void) {
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
printf("%1$s [OPTIONS...] [CONFIGURATION FILE...]\n" printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n"
"\n%2$sApplies kernel sysctl settings.%4$s\n" "Applies kernel sysctl settings.\n\n"
"\n%3$sCommands:%4$s\n"
" --cat-config Show configuration files\n"
" --tldr Show non-comment parts of configuration\n"
" -h --help Show this help\n" " -h --help Show this help\n"
" --version Show package version\n" " --version Show package version\n"
"\n%3$sOptions:%4$s\n" " --cat-config Show configuration files\n"
" --tldr Show non-comment parts of configuration\n"
" --prefix=PATH Only apply rules with the specified prefix\n" " --prefix=PATH Only apply rules with the specified prefix\n"
" --no-pager Do not pipe output into a pager\n" " --no-pager Do not pipe output into a pager\n"
" --strict Fail on any kind of failures\n" "\nSee the %s for details.\n",
" --inline Treat arguments as configuration lines\n"
"\nSee the %5$s for details.\n",
program_invocation_short_name, program_invocation_short_name,
ansi_highlight(),
ansi_underline(),
ansi_normal(),
link); link);
return 0; return 0;
@ -353,7 +365,6 @@ static int parse_argv(int argc, char *argv[]) {
ARG_PREFIX, ARG_PREFIX,
ARG_NO_PAGER, ARG_NO_PAGER,
ARG_STRICT, ARG_STRICT,
ARG_INLINE,
}; };
static const struct option options[] = { static const struct option options[] = {
@ -364,7 +375,6 @@ static int parse_argv(int argc, char *argv[]) {
{ "prefix", required_argument, NULL, ARG_PREFIX }, { "prefix", required_argument, NULL, ARG_PREFIX },
{ "no-pager", no_argument, NULL, ARG_NO_PAGER }, { "no-pager", no_argument, NULL, ARG_NO_PAGER },
{ "strict", no_argument, NULL, ARG_STRICT }, { "strict", no_argument, NULL, ARG_STRICT },
{ "inline", no_argument, NULL, ARG_INLINE },
{} {}
}; };
@ -420,10 +430,6 @@ static int parse_argv(int argc, char *argv[]) {
arg_strict = true; arg_strict = true;
break; break;
case ARG_INLINE:
arg_inline = true;
break;
case '?': case '?':
return -EINVAL; return -EINVAL;
@ -451,15 +457,11 @@ static int run(int argc, char *argv[]) {
umask(0022); umask(0022);
if (argc > optind) { if (argc > optind) {
unsigned pos = 0; r = 0;
for (int i = optind; i < argc; i++)
RET_GATHER(r, parse_file(&sysctl_options, argv[i], false));
STRV_FOREACH(arg, strv_skip(argv, optind)) {
if (arg_inline)
/* Use (argument):n, where n==1 for the first positional arg */
RET_GATHER(r, parse_line("(argument)", ++pos, *arg, /* invalid_config = */ NULL, &sysctl_options));
else
RET_GATHER(r, parse_file(&sysctl_options, *arg, false));
}
} else { } else {
_cleanup_strv_free_ char **files = NULL; _cleanup_strv_free_ char **files = NULL;
@ -476,7 +478,9 @@ static int run(int argc, char *argv[]) {
RET_GATHER(r, read_credential_lines(&sysctl_options)); RET_GATHER(r, read_credential_lines(&sysctl_options));
} }
return RET_GATHER(r, apply_all(sysctl_options)); RET_GATHER(r, apply_all(sysctl_options));
return r;
} }
DEFINE_MAIN_FUNCTION(run); DEFINE_MAIN_FUNCTION(run);

View File

@ -911,7 +911,7 @@ void manager_disconnect(Manager *m) {
(void) sd_notify(false, "STATUS=Idle."); (void) sd_notify(false, "STATUS=Idle.");
} }
void manager_flush_server_names(Manager *m, ServerType t) { void manager_flush_server_names(Manager *m, ServerType t) {
assert(m); assert(m);
if (t == SERVER_SYSTEM) if (t == SERVER_SYSTEM)
@ -966,19 +966,19 @@ Manager* manager_free(Manager *m) {
return mfree(m); return mfree(m);
} }
static bool manager_network_read_link_servers(Manager *m) { static int manager_network_read_link_servers(Manager *m) {
_cleanup_strv_free_ char **ntp = NULL; _cleanup_strv_free_ char **ntp = NULL;
bool changed = false; bool changed = false;
int r; int r;
assert(m); assert(m);
bool existing = m->link_servers;
r = sd_network_get_ntp(&ntp); r = sd_network_get_ntp(&ntp);
if (r < 0) { if (r < 0 && r != -ENODATA) {
if (!IN_SET(r, -ENOENT, -ENODATA)) if (r == -ENOMEM)
log_error_errno(r, "Failed to get link NTP servers: %m"); log_oom();
else
log_debug_errno(r, "Failed to get link NTP servers: %m");
goto clear; goto clear;
} }
@ -1025,7 +1025,7 @@ static bool manager_network_read_link_servers(Manager *m) {
clear: clear:
manager_flush_server_names(m, SERVER_LINK); manager_flush_server_names(m, SERVER_LINK);
return existing; /* return true if there were existing servers. */ return r;
} }
static bool manager_is_connected(Manager *m) { static bool manager_is_connected(Manager *m) {
@ -1043,6 +1043,7 @@ static int manager_network_event_handler(sd_event_source *s, int fd, uint32_t re
sd_network_monitor_flush(m->network_monitor); sd_network_monitor_flush(m->network_monitor);
/* When manager_network_read_link_servers() failed, we assume that the servers are changed. */
changed = manager_network_read_link_servers(m); changed = manager_network_read_link_servers(m);
/* check if the machine is online */ /* check if the machine is online */

View File

@ -0,0 +1,7 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
integration_tests += [
integration_test_template + {
'name' : fs.name(meson.current_source_dir()),
},
]

View File

@ -90,6 +90,7 @@ foreach dirname : [
'TEST-73-LOCALE', 'TEST-73-LOCALE',
'TEST-74-AUX-UTILS', 'TEST-74-AUX-UTILS',
'TEST-75-RESOLVED', 'TEST-75-RESOLVED',
'TEST-76-SYSCTL',
'TEST-78-SIGQUEUE', 'TEST-78-SIGQUEUE',
'TEST-79-MEMPRESS', 'TEST-79-MEMPRESS',
'TEST-80-NOTIFYACCESS', 'TEST-80-NOTIFYACCESS',

39
test/units/TEST-76-SYSCTL.sh Executable file
View File

@ -0,0 +1,39 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later
set -eux
set -o pipefail
# shellcheck source=test/units/util.sh
. "$(dirname "$0")"/util.sh
export SYSTEMD_LOG_LEVEL=debug
echo "foo.bar=42" >/tmp/foo.conf
assert_rc 0 /usr/lib/systemd/systemd-sysctl /tmp/foo.conf
assert_rc 1 /usr/lib/systemd/systemd-sysctl --strict /tmp/foo.conf
echo "-foo.foo=42" >/tmp/foo.conf
assert_rc 0 /usr/lib/systemd/systemd-sysctl /tmp/foo.conf
assert_rc 0 /usr/lib/systemd/systemd-sysctl --strict /tmp/foo.conf
if ! systemd-detect-virt --quiet --container; then
ip link add hoge type dummy
udevadm wait --timeout=30 /sys/class/net/hoge
cat >/tmp/foo.conf <<EOF
net.ipv4.conf.*.drop_gratuitous_arp=1
net.ipv4.*.*.bootp_relay=1
net.ipv4.aaa.*.disable_policy=1
EOF
echo 0 >/proc/sys/net/ipv4/conf/hoge/drop_gratuitous_arp
echo 0 >/proc/sys/net/ipv4/conf/hoge/bootp_relay
echo 0 >/proc/sys/net/ipv4/conf/hoge/disable_policy
assert_rc 0 /usr/lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/hoge /tmp/foo.conf
assert_eq "$(cat /proc/sys/net/ipv4/conf/hoge/drop_gratuitous_arp)" "1"
assert_eq "$(cat /proc/sys/net/ipv4/conf/hoge/bootp_relay)" "1"
assert_eq "$(cat /proc/sys/net/ipv4/conf/hoge/disable_policy)" "0"
fi
touch /testok

View File

@ -1,80 +0,0 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later
set -eux
set -o pipefail
# shellcheck source=test/units/util.sh
. "$(dirname "$0")"/util.sh
export SYSTEMD_LOG_LEVEL=debug
echo "foo.bar=42" >/tmp/foo.conf
assert_rc 0 /usr/lib/systemd/systemd-sysctl /tmp/foo.conf
assert_rc 1 /usr/lib/systemd/systemd-sysctl --strict /tmp/foo.conf
echo "-foo.foo=42" >/tmp/foo.conf
assert_rc 0 /usr/lib/systemd/systemd-sysctl /tmp/foo.conf
assert_rc 0 /usr/lib/systemd/systemd-sysctl --strict /tmp/foo.conf
assert_rc 0 /usr/lib/systemd/systemd-sysctl --inline "foo.bar=42"
assert_rc 1 /usr/lib/systemd/systemd-sysctl --inline --strict "foo.bar=42"
assert_rc 0 /usr/lib/systemd/systemd-sysctl --inline -- "-foo.bar=42"
assert_rc 0 /usr/lib/systemd/systemd-sysctl --inline --strict -- "-foo.bar=42"
/usr/lib/systemd/systemd-sysctl - <<EOF
foo.bar=42
EOF
(! /usr/lib/systemd/systemd-sysctl --strict - <<EOF
foo.bar=42
EOF
)
/usr/lib/systemd/systemd-sysctl - <<EOF
-foo.bar=42
EOF
/usr/lib/systemd/systemd-sysctl --strict - <<EOF
-foo.bar=42
EOF
ip link add hoge type dummy
trap 'ip link del hoge' EXIT
udevadm wait --timeout=30 /sys/class/net/hoge
cat >/tmp/foo.conf <<EOF
net.ipv4.conf.*.drop_gratuitous_arp=1
net.ipv4.*.*.bootp_relay=1
net.ipv4.aaa.*.disable_policy=1
EOF
echo 0 >/proc/sys/net/ipv4/conf/hoge/drop_gratuitous_arp
echo 0 >/proc/sys/net/ipv4/conf/hoge/bootp_relay
echo 0 >/proc/sys/net/ipv4/conf/hoge/disable_policy
assert_rc 0 /usr/lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/hoge /tmp/foo.conf
assert_eq "$(cat /proc/sys/net/ipv4/conf/hoge/drop_gratuitous_arp)" "1"
assert_eq "$(cat /proc/sys/net/ipv4/conf/hoge/bootp_relay)" "1"
assert_eq "$(cat /proc/sys/net/ipv4/conf/hoge/disable_policy)" "0"
echo 0 >/proc/sys/net/ipv4/conf/hoge/drop_gratuitous_arp
echo 0 >/proc/sys/net/ipv4/conf/hoge/bootp_relay
echo 0 >/proc/sys/net/ipv4/conf/hoge/disable_policy
assert_rc 0 /usr/lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/hoge --inline \
'net.ipv4.conf.*.drop_gratuitous_arp=1' \
'net.ipv4.*.*.bootp_relay=1' \
'net.ipv4.aaa.*.disable_policy=1'
assert_eq "$(cat /proc/sys/net/ipv4/conf/hoge/drop_gratuitous_arp)" "1"
assert_eq "$(cat /proc/sys/net/ipv4/conf/hoge/bootp_relay)" "1"
assert_eq "$(cat /proc/sys/net/ipv4/conf/hoge/disable_policy)" "0"
echo 0 >/proc/sys/net/ipv4/conf/hoge/drop_gratuitous_arp
echo 0 >/proc/sys/net/ipv4/conf/hoge/bootp_relay
echo 0 >/proc/sys/net/ipv4/conf/hoge/disable_policy
/usr/lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/hoge - <<EOF
net.ipv4.conf.*.drop_gratuitous_arp=1
net.ipv4.*.*.bootp_relay=1
net.ipv4.aaa.*.disable_policy=1
EOF
assert_eq "$(cat /proc/sys/net/ipv4/conf/hoge/drop_gratuitous_arp)" "1"
assert_eq "$(cat /proc/sys/net/ipv4/conf/hoge/bootp_relay)" "1"
assert_eq "$(cat /proc/sys/net/ipv4/conf/hoge/disable_policy)" "0"