1
0
mirror of https://github.com/systemd/systemd synced 2025-12-28 20:04:45 +01:00

Compare commits

...

14 Commits

Author SHA1 Message Date
Yu Watanabe
83f0ff1eda
Merge pull request #18137 from keszybz/deprecate-blanket-import-environment
Deprecate blanket import-environment
2021-01-09 09:24:16 +09:00
Zbigniew Jędrzejewski-Szmek
a412ec5714 meson: fix git ls-files invocations during rebase
Normally ls-files prints the full path to files from the repo root. But when
$GIT_WORK_TREE is set, ls-files prints paths relative to the current
directory. When rebasing, $GIT_WORK_TREE is set in the commands executed from
'rebase -x'. This causes problems if meson config is touched and the meson
reconfigures itself. ($GIT_WORK_TREE shouldn't be relevant, since the paths that
ls-files reports don't depend on the work tree, but whatever.) Let's unset
GIT_WORK_TREE to avoid the issue.

$ (cd test; git --git-dir=$PWD/../.git ls-files ':/test/dmidecode-dumps/*.bin')
test/dmidecode-dumps/HP-Z600.bin
test/dmidecode-dumps/Lenovo-ThinkPad-X280.bin
test/dmidecode-dumps/Lenovo-Thinkcentre-m720s.bin

$ (cd test; GIT_WORK_TREE=$PWD/.. git --git-dir=$PWD/../.git ls-files ':/test/dmidecode-dumps/*.bin')
dmidecode-dumps/HP-Z600.bin
dmidecode-dumps/Lenovo-ThinkPad-X280.bin
dmidecode-dumps/Lenovo-Thinkcentre-m720s.bin

Fixes #18148.
2021-01-09 09:22:26 +09:00
Yu Watanabe
66bf4617b1
Merge pull request #18169 from OnkelUlla/can_bus_error_reporting
network: can: add support for bus error reporting
2021-01-09 09:21:54 +09:00
Yu Watanabe
608ac76367
Merge pull request #18168 from yuwata/network-cleanups
network: several follow-ups for recently merged PRs
2021-01-09 09:21:19 +09:00
Ulrich Ölmann
77b674049b network: can: add support for bus error reporting
Enhance systemd-networkd to be able to control a CAN device's berr-reporting
flag via the new boolean directive BusErrorReporting= to be used in network
files.
2021-01-08 20:23:12 +01:00
Ulrich Ölmann
3757912db4 network: can: pretty up debug messages
Do not construct the english words "Enabling"/"Disabling" but use one of the
smart helper functions here.
2021-01-08 20:21:59 +01:00
Zbigniew Jędrzejewski-Szmek
341992081b shell-completion: fix systemctl set/unset/import-environment
unset-environment is completed with variable names in the environment block.
set-environment the same, but suffixed with "=".
import-environment is completed with variable names in the client environment.
2021-01-08 20:01:40 +01:00
Zbigniew Jędrzejewski-Szmek
32854f7044 systemctl: deprecate blanket import-environment
Importing the full environment is convenient, but it doesn't work too well in
practice, because we get a metric ton of shell-specific crap that should never
end up in the global environment block:

$ systemctl --user show-environment
...
SHELL=/bin/zsh
AUTOJUMP_ERROR_PATH=/home/zbyszek/.local/share/autojump/errors.log
AUTOJUMP_SOURCED=1
CONDA_SHLVL=0
CVS_RSH=ssh
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DESKTOP_SESSION=gnome
DISPLAY=:0
FPATH=/usr/share/Modules/init/zsh-functions:/usr/local/share/zsh/site-functions:/usr/share/zsh/site-functions:/usr/share/zsh/5.8/functions
GDMSESSION=gnome
GDM_LANG=en_US.UTF-8
GNOME_SETUP_DISPLAY=:1
GUESTFISH_INIT=$'\\e[1;34m'
GUESTFISH_OUTPUT=$'\\e[0m'
GUESTFISH_PS1=$'\\[\\e[1;32m\\]><fs>\\[\\e[0;31m\\] '
GUESTFISH_RESTORE=$'\\e[0m'
HISTCONTROL=ignoredups
HISTSIZE=1000
LOADEDMODULES=
OLDPWD=/home/zbyszek
PWD=/home/zbyszek
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
QTLIB=/usr/lib64/qt-3.3/lib
QT_IM_MODULE=ibus
SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS=0
SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/2612,unix/unix:/tmp/.ICE-unix/2612
SHLVL=0
STEAM_FRAME_FORCE_CLOSE=1
TERM=xterm-256color
USERNAME=zbyszek
WISECONFIGDIR=/usr/share/wise2/
...

Plenty of shell-specific and terminal-specific stuff that have no global
significance.

Let's start warning when this is used to push people towards importing only
specific variables.

Putative NEWS entry:
  * systemctl import-environment will now emit a warning when called without
    any arguments (i.e. to import the full environment block of the called
    program). This command will usually be invoked from a shell, which means
    that it'll inherit a bunch of variables which are specific to that shell,
    and usually to the tty the shell is connected to, and don't have any
    meaning in the global context of the system or user service manager.
    Instead, only specific variables should be imported into the manager
    environment block.

    Similarly, programs which update the manager environment block by directly
    calling the D-Bus API of the manager, should also push specific variables,
    and not the full inherited environment.
2021-01-08 20:01:40 +01:00
Zbigniew Jędrzejewski-Szmek
82651d5b6b man: improve description of environment block creation
This adds a general description of "philosphy" of keeping the environemnt
block small and hints about systemd-run -P env.

The list of generated variables is split out to a subsection. Viewing
the patch with ignoring whitespace changes is recommended.

We don't ignore invalid assignments (except in import-environment to some
extent), previous description was wrong.

For https://bugzilla.redhat.com/show_bug.cgi?id=1912046#c17.
2021-01-08 20:01:40 +01:00
Ulrich Ölmann
6ed6c4780f network: can: simplify usage of booleans
Harmonize with what is done for TripleSampling, Termination & ListenOnly.
2021-01-08 18:42:34 +01:00
Yu Watanabe
f7d0ea5b6f network: refuse to set 0 for rx or tx queue
Man page says that the valid value is 1-4096.
2021-01-09 00:05:45 +09:00
Yu Watanabe
0b5dc24953 test-network: add tests for route advmss 2021-01-09 00:01:53 +09:00
Yu Watanabe
386e89083f network: read RTAX_ADVMSS in received route message 2021-01-08 23:56:13 +09:00
Yu Watanabe
78ebbf0286 network: add missing TAKE_PTR() 2021-01-08 23:25:20 +09:00
18 changed files with 476 additions and 402 deletions

View File

@ -1118,15 +1118,22 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
<varlistentry> <varlistentry>
<term> <term>
<command>import-environment</command> <command>import-environment</command>
<optional><replaceable>VARIABLE…</replaceable></optional> <replaceable>VARIABLE…</replaceable>
</term> </term>
<listitem> <listitem>
<para>Import all, one or more environment variables set on the client into the systemd manager <para>Import all, one or more environment variables set on the client into the systemd manager
environment block. If no arguments are passed, the entire environment block is imported. environment block. If a list of environment variable names is passed, client-side values are then
Otherwise, a list of one or more environment variable names should be passed, whose client-side imported into the manager's environment block. If any names are not valid environment variable
values are then imported into the manager's environment block. This command will silently ignore names or have invalid values according to the rules described above, an error is raised. If no
any assignments which do not conform to the rules listed above.</para> arguments are passed, the entire environment block inherited by the <command>systemctl</command>
process is imported. In this mode, any inherited invalid environment variables are quietly
ignored.</para>
<para>Importing of the full inherited environment block (calling this command without any
arguments) is deprecated. A shell will set dozens of variables which only make sense locally and
are only meant for processes which are descendants of the shell. Such variables in the global
environment block are confusing to other processes.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
</variablelist> </variablelist>

View File

@ -2304,10 +2304,10 @@ SystemCallErrorNumber=EPERM</programlisting>
set by the service manager itself (such as <varname>$NOTIFY_SOCKET</varname> and such), or set by a PAM module set by the service manager itself (such as <varname>$NOTIFY_SOCKET</varname> and such), or set by a PAM module
(in case <varname>PAMName=</varname> is used).</para> (in case <varname>PAMName=</varname> is used).</para>
<para> <para>See "Environment Variables in Spawned Processes" below for a description of how those
See <citerefentry settings combine to form the inherited environment. See <citerefentry
project='man-pages'><refentrytitle>environ</refentrytitle><manvolnum>7</manvolnum></citerefentry> for details project='man-pages'><refentrytitle>environ</refentrytitle><manvolnum>7</manvolnum></citerefentry> for general
about environment variables.</para></listitem> information about environment variables.</para></listitem>
</varlistentry> </varlistentry>
</variablelist> </variablelist>
@ -2809,7 +2809,7 @@ StandardInputData=SWNrIHNpdHplIGRhIHVuJyBlc3NlIEtsb3BzLAp1ZmYgZWVtYWwga2xvcHAncy
</refsect1> </refsect1>
<refsect1> <refsect1>
<title>Environment variables in spawned processes</title> <title>Environment Variables in Spawned Processes</title>
<para>Processes started by the service manager are executed with an environment variable block assembled from <para>Processes started by the service manager are executed with an environment variable block assembled from
multiple sources. Processes started by the system service manager generally do not inherit environment variables multiple sources. Processes started by the system service manager generally do not inherit environment variables
@ -2822,30 +2822,49 @@ StandardInputData=SWNrIHNpdHplIGRhIHVuJyBlc3NlIEtsb3BzLAp1ZmYgZWVtYWwga2xvcHAncy
<itemizedlist> <itemizedlist>
<listitem><para>Variables globally configured for the service manager, using the <listitem><para>Variables globally configured for the service manager, using the
<varname>DefaultEnvironment=</varname> setting in <varname>DefaultEnvironment=</varname> setting in
<citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>, the kernel command line option <varname>systemd.setenv=</varname> (see <citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>) or via the kernel command line option <varname>systemd.setenv=</varname> understood by
<command>systemctl set-environment</command> (see <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>).</para></listitem> <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>, or via
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
<command>set-environment</command> verb.</para></listitem>
<listitem><para>Variables defined by the service manager itself (see the list below)</para></listitem> <listitem><para>Variables defined by the service manager itself (see the list below).</para></listitem>
<listitem><para>Variables set in the service manager's own environment variable block (subject to <varname>PassEnvironment=</varname> for the system service manager)</para></listitem> <listitem><para>Variables set in the service manager's own environment variable block (subject to
<varname>PassEnvironment=</varname> for the system service manager).</para></listitem>
<listitem><para>Variables set via <varname>Environment=</varname> in the unit file</para></listitem> <listitem><para>Variables set via <varname>Environment=</varname> in the unit file.</para></listitem>
<listitem><para>Variables read from files specified via <varname>EnvironmentFile=</varname> in the unit file</para></listitem> <listitem><para>Variables read from files specified via <varname>EnvironmentFile=</varname> in the unit
file.</para></listitem>
<listitem><para>Variables set by any PAM modules in case <varname>PAMName=</varname> is in effect, <listitem><para>Variables set by any PAM modules in case <varname>PAMName=</varname> is in effect,
cf. <citerefentry cf. <citerefentry
project='man-pages'><refentrytitle>pam_env</refentrytitle><manvolnum>8</manvolnum></citerefentry></para></listitem> project='man-pages'><refentrytitle>pam_env</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
</para></listitem>
</itemizedlist> </itemizedlist>
<para>If the same environment variables are set by multiple of these sources, the later source — according to the <para>If the same environment variable is set by multiple of these sources, the later source — according
order of the list above — wins. Note that as final step all variables listed in to the order of the list above — wins. Note that as the final step all variables listed in
<varname>UnsetEnvironment=</varname> are removed again from the compiled environment variable list, immediately <varname>UnsetEnvironment=</varname> are removed from the compiled environment variable list, immediately
before it is passed to the executed process.</para> before it is passed to the executed process.</para>
<para>The following environment variables are set or propagated by the service manager for each invoked <para>The general philosophy is to expose a small curated list of environment variables to processes.
process:</para> Services started by the system manager (PID 1) will be started, without additional service-specific
configuration, with just a few environment variables. The user manager inherits environment variables as
any other system service, but in addition may receive additional environment variables from PAM, and,
typically, additional imported variables when the user starts a graphical session. It is recommended to
keep the environment blocks in both the system and user managers managers lean. Importing all variables
inherited by the graphical session or by one of the user shells is strongly discouraged.</para>
<para>Hint: <command>systemd-run -P env</command> and <command>systemd-run --user -P env</command> print
the effective system and user service environment blocks.</para>
<refsect2>
<title>Environment Variables Set or Propagated by the Service Manager</title>
<para>The following environment variables are propagated by the service manager or generated internally
for each invoked process:</para>
<variablelist class='environment-variables'> <variablelist class='environment-variables'>
<varlistentry> <varlistentry>
@ -2854,22 +2873,21 @@ StandardInputData=SWNrIHNpdHplIGRhIHVuJyBlc3NlIEtsb3BzLAp1ZmYgZWVtYWwga2xvcHAncy
<listitem><para>Colon-separated list of directories to use when launching <listitem><para>Colon-separated list of directories to use when launching
executables. <command>systemd</command> uses a fixed value of executables. <command>systemd</command> uses a fixed value of
<literal><filename>/usr/local/sbin</filename>:<filename>/usr/local/bin</filename>:<filename>/usr/sbin</filename>:<filename>/usr/bin</filename></literal> <literal><filename>/usr/local/sbin</filename>:<filename>/usr/local/bin</filename>:<filename>/usr/sbin</filename>:<filename>/usr/bin</filename></literal>
in the system manager. When compiled for systems with "unmerged /usr" (<filename>/bin</filename> is in the system manager. When compiled for systems with "unmerged <filename>/usr/</filename>"
not a symlink to <filename>/usr/bin</filename>), (<filename>/bin</filename> is not a symlink to <filename>/usr/bin</filename>),
<literal>:<filename>/sbin</filename>:<filename>/bin</filename></literal> is appended. In case of the <literal>:<filename>/sbin</filename>:<filename>/bin</filename></literal> is appended. In case of
the user manager, a different path may be configured by the distribution. It is recommended to not the the user manager, a different path may be configured by the distribution. It is recommended to
rely on the order of entries, and have only one program with a given name in not rely on the order of entries, and have only one program with a given name in
<varname>$PATH</varname>.</para></listitem> <varname>$PATH</varname>.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><varname>$LANG</varname></term> <term><varname>$LANG</varname></term>
<listitem><para>Locale. Can be set in <listitem><para>Locale. Can be set in <citerefentry
<citerefentry project='man-pages'><refentrytitle>locale.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry> project='man-pages'><refentrytitle>locale.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>
or on the kernel command line (see or on the kernel command line (see
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry> <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry> and
and
<citerefentry><refentrytitle>kernel-command-line</refentrytitle><manvolnum>7</manvolnum></citerefentry>). <citerefentry><refentrytitle>kernel-command-line</refentrytitle><manvolnum>7</manvolnum></citerefentry>).
</para></listitem> </para></listitem>
</varlistentry> </varlistentry>
@ -3200,16 +3218,14 @@ StandardInputData=SWNrIHNpdHplIGRhIHVuJyBlc3NlIEtsb3BzLAp1ZmYgZWVtYWwga2xvcHAncy
</row> </row>
</tbody> </tbody>
</tgroup> </tgroup>
</table> </table></listitem>
</listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><varname>$PIDFILE</varname></term> <term><varname>$PIDFILE</varname></term>
<listitem><para>The path to the configured PID file, in case the process is forked off on behalf of a <listitem><para>The path to the configured PID file, in case the process is forked off on behalf of
service that uses the <varname>PIDFile=</varname> setting, see a service that uses the <varname>PIDFile=</varname> setting, see
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry> <citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
for details. Service code may use this environment variable to automatically generate a PID file at for details. Service code may use this environment variable to automatically generate a PID file at
the location configured in the unit file. This field is set to an absolute path in the file the location configured in the unit file. This field is set to an absolute path in the file
@ -3222,10 +3238,12 @@ StandardInputData=SWNrIHNpdHplIGRhIHVuJyBlc3NlIEtsb3BzLAp1ZmYgZWVtYWwga2xvcHAncy
of the selected PAM stack, additional environment variables defined by systemd may be set for of the selected PAM stack, additional environment variables defined by systemd may be set for
services. Specifically, these are <varname>$XDG_SEAT</varname>, <varname>$XDG_VTNR</varname>, see services. Specifically, these are <varname>$XDG_SEAT</varname>, <varname>$XDG_VTNR</varname>, see
<citerefentry><refentrytitle>pam_systemd</refentrytitle><manvolnum>8</manvolnum></citerefentry> for details.</para> <citerefentry><refentrytitle>pam_systemd</refentrytitle><manvolnum>8</manvolnum></citerefentry> for details.</para>
</refsect2>
</refsect1> </refsect1>
<refsect1> <refsect1>
<title>Process exit codes</title> <title>Process Exit Codes</title>
<para>When invoking a unit process the service manager possibly fails to apply the execution parameters configured <para>When invoking a unit process the service manager possibly fails to apply the execution parameters configured
with the settings above. In that case the already created service process will exit with a non-zero exit code with the settings above. In that case the already created service process will exit with a non-zero exit code

View File

@ -2750,6 +2750,16 @@ IPv6Token=prefixstable:2002:da8:1::</programlisting></para>
the value of a received bit by majority rule. When unset, the kernel's default will be used.</para> the value of a received bit by majority rule. When unset, the kernel's default will be used.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><varname>BusErrorReporting=</varname></term>
<listitem>
<para>Takes a boolean. When <literal>yes</literal>, reporting of CAN bus errors is activated
(those include single bit, frame format, and bit stuffing errors, unable to send dominant bit,
unable to send recessive bit, bus overload, active error announcement, error occurred on
transmission). When unset, the kernel's default will be used. Note: in case of a CAN bus with a
single CAN device, sending a CAN frame may result in a huge number of CAN bus errors.</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><varname>ListenOnly=</varname></term> <term><varname>ListenOnly=</varname></term>
<listitem> <listitem>

View File

@ -3651,10 +3651,11 @@ endforeach
if git.found() if git.found()
all_files = run_command( all_files = run_command(
'env', '-u', 'GIT_WORK_TREE',
git, git,
['--git-dir=@0@/.git'.format(project_source_root), '--git-dir=@0@/.git'.format(project_source_root),
'ls-files', 'ls-files', ':/*.[ch]')
':/*.[ch]'])
all_files = files(all_files.stdout().split()) all_files = files(all_files.stdout().split())
custom_target( custom_target(

View File

@ -320,11 +320,20 @@ _systemctl () {
elif __contains_word "$verb" ${VERBS[JOBS]}; then elif __contains_word "$verb" ${VERBS[JOBS]}; then
comps=$( __systemctl $mode list-jobs | { while read -r a b; do echo " $a"; done; } ) comps=$( __systemctl $mode list-jobs | { while read -r a b; do echo " $a"; done; } )
elif __contains_word "$verb" ${VERBS[ENVS]}; then elif [ "$verb" = 'unset-environment' ]; then
comps=$( __systemctl $mode show-environment \
| while read -r line; do echo " ${line%%=*}"; done )
compopt -o nospace
elif [ "$verb" = 'set-environment' ]; then
comps=$( __systemctl $mode show-environment \ comps=$( __systemctl $mode show-environment \
| while read -r line; do echo " ${line%%=*}="; done ) | while read -r line; do echo " ${line%%=*}="; done )
compopt -o nospace compopt -o nospace
elif [ "$verb" = 'import-environment' ]; then
COMPREPLY=( $(compgen -A variable -- "$cur_orig") )
return 0
elif __contains_word "$verb" ${VERBS[FILE]}; then elif __contains_word "$verb" ${VERBS[FILE]}; then
comps=$( compgen -A file -- "$cur" ) comps=$( compgen -A file -- "$cur" )
compopt -o filenames compopt -o filenames

View File

@ -365,6 +365,11 @@ for fun in set-environment unset-environment ; do
} }
done done
(( $+functions[_systemctl_import-environment] )) || _systemctl_import-environment()
{
_parameters
}
(( $+functions[_systemctl_link] )) || _systemctl_link() { (( $+functions[_systemctl_link] )) || _systemctl_link() {
_sd_unit_files _sd_unit_files
} }

View File

@ -174,14 +174,14 @@ static int link_set_can(Link *link) {
if (link->network->can_fd_mode >= 0) { if (link->network->can_fd_mode >= 0) {
cm.mask |= CAN_CTRLMODE_FD; cm.mask |= CAN_CTRLMODE_FD;
SET_FLAG(cm.flags, CAN_CTRLMODE_FD, link->network->can_fd_mode > 0); SET_FLAG(cm.flags, CAN_CTRLMODE_FD, link->network->can_fd_mode);
log_link_debug(link, "%sabling FD mode", link->network->can_fd_mode > 0 ? "En" : "Dis"); log_link_debug(link, "Setting FD mode to '%s'.", yes_no(link->network->can_fd_mode));
} }
if (link->network->can_non_iso >= 0) { if (link->network->can_non_iso >= 0) {
cm.mask |= CAN_CTRLMODE_FD_NON_ISO; cm.mask |= CAN_CTRLMODE_FD_NON_ISO;
SET_FLAG(cm.flags, CAN_CTRLMODE_FD_NON_ISO, link->network->can_non_iso > 0); SET_FLAG(cm.flags, CAN_CTRLMODE_FD_NON_ISO, link->network->can_non_iso);
log_link_debug(link, "%sabling FD non-ISO mode", link->network->can_non_iso > 0 ? "En" : "Dis"); log_link_debug(link, "Setting FD non-ISO mode to '%s'.", yes_no(link->network->can_non_iso));
} }
if (link->network->can_restart_us > 0) { if (link->network->can_restart_us > 0) {
@ -208,13 +208,19 @@ static int link_set_can(Link *link) {
if (link->network->can_triple_sampling >= 0) { if (link->network->can_triple_sampling >= 0) {
cm.mask |= CAN_CTRLMODE_3_SAMPLES; cm.mask |= CAN_CTRLMODE_3_SAMPLES;
SET_FLAG(cm.flags, CAN_CTRLMODE_3_SAMPLES, link->network->can_triple_sampling); SET_FLAG(cm.flags, CAN_CTRLMODE_3_SAMPLES, link->network->can_triple_sampling);
log_link_debug(link, "%sabling triple-sampling", link->network->can_triple_sampling ? "En" : "Dis"); log_link_debug(link, "Setting triple-sampling to '%s'.", yes_no(link->network->can_triple_sampling));
}
if (link->network->can_berr_reporting >= 0) {
cm.mask |= CAN_CTRLMODE_BERR_REPORTING;
SET_FLAG(cm.flags, CAN_CTRLMODE_BERR_REPORTING, link->network->can_berr_reporting);
log_link_debug(link, "Setting bus error reporting to '%s'.", yes_no(link->network->can_berr_reporting));
} }
if (link->network->can_listen_only >= 0) { if (link->network->can_listen_only >= 0) {
cm.mask |= CAN_CTRLMODE_LISTENONLY; cm.mask |= CAN_CTRLMODE_LISTENONLY;
SET_FLAG(cm.flags, CAN_CTRLMODE_LISTENONLY, link->network->can_listen_only); SET_FLAG(cm.flags, CAN_CTRLMODE_LISTENONLY, link->network->can_listen_only);
log_link_debug(link, "%sabling listen-only mode", link->network->can_listen_only ? "En" : "Dis"); log_link_debug(link, "Setting listen-only mode to '%s'.", yes_no(link->network->can_listen_only));
} }
if (cm.mask != 0) { if (cm.mask != 0) {
@ -225,7 +231,7 @@ static int link_set_can(Link *link) {
if (link->network->can_termination >= 0) { if (link->network->can_termination >= 0) {
log_link_debug(link, "%sabling can-termination", link->network->can_termination ? "En" : "Dis"); log_link_debug(link, "Setting can-termination to '%s'.", yes_no(link->network->can_termination));
r = sd_netlink_message_append_u16(m, IFLA_CAN_TERMINATION, r = sd_netlink_message_append_u16(m, IFLA_CAN_TERMINATION,
link->network->can_termination ? CAN_TERMINATION_OHM_VALUE : 0); link->network->can_termination ? CAN_TERMINATION_OHM_VALUE : 0);

View File

@ -321,6 +321,7 @@ CAN.FDMode, config_parse_tristate,
CAN.FDNonISO, config_parse_tristate, 0, offsetof(Network, can_non_iso) CAN.FDNonISO, config_parse_tristate, 0, offsetof(Network, can_non_iso)
CAN.RestartSec, config_parse_sec, 0, offsetof(Network, can_restart_us) CAN.RestartSec, config_parse_sec, 0, offsetof(Network, can_restart_us)
CAN.TripleSampling, config_parse_tristate, 0, offsetof(Network, can_triple_sampling) CAN.TripleSampling, config_parse_tristate, 0, offsetof(Network, can_triple_sampling)
CAN.BusErrorReporting, config_parse_tristate, 0, offsetof(Network, can_berr_reporting)
CAN.Termination, config_parse_tristate, 0, offsetof(Network, can_termination) CAN.Termination, config_parse_tristate, 0, offsetof(Network, can_termination)
CAN.ListenOnly, config_parse_tristate, 0, offsetof(Network, can_listen_only) CAN.ListenOnly, config_parse_tristate, 0, offsetof(Network, can_listen_only)
QDisc.Parent, config_parse_qdisc_parent, _QDISC_KIND_INVALID, 0 QDisc.Parent, config_parse_qdisc_parent, _QDISC_KIND_INVALID, 0

View File

@ -415,6 +415,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
.ipv6_accept_ra_start_dhcp6_client = IPV6_ACCEPT_RA_START_DHCP6_CLIENT_YES, .ipv6_accept_ra_start_dhcp6_client = IPV6_ACCEPT_RA_START_DHCP6_CLIENT_YES,
.can_triple_sampling = -1, .can_triple_sampling = -1,
.can_berr_reporting = -1,
.can_termination = -1, .can_termination = -1,
.can_listen_only = -1, .can_listen_only = -1,
.can_fd_mode = -1, .can_fd_mode = -1,
@ -1221,7 +1222,7 @@ int config_parse_rx_tx_queues(
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to parse %s=, ignoring assignment: %s.", lvalue, rvalue); log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to parse %s=, ignoring assignment: %s.", lvalue, rvalue);
return 0; return 0;
} }
if (k > 4096) { if (k == 0 || k > 4096) {
log_syntax(unit, LOG_WARNING, filename, line, 0, "Invalid %s=, ignoring assignment: %s.", lvalue, rvalue); log_syntax(unit, LOG_WARNING, filename, line, 0, "Invalid %s=, ignoring assignment: %s.", lvalue, rvalue);
return 0; return 0;
} }

View File

@ -231,6 +231,7 @@ struct Network {
unsigned can_data_sample_point; unsigned can_data_sample_point;
usec_t can_restart_us; usec_t can_restart_us;
int can_triple_sampling; int can_triple_sampling;
int can_berr_reporting;
int can_termination; int can_termination;
int can_listen_only; int can_listen_only;
int can_fd_mode; int can_fd_mode;

View File

@ -1497,6 +1497,12 @@ int manager_rtnl_process_route(sd_netlink *rtnl, sd_netlink_message *message, Ma
return 0; return 0;
} }
r = sd_netlink_message_read_u32(message, RTAX_ADVMSS, &tmp->advmss);
if (r < 0 && r != -ENODATA) {
log_link_warning_errno(link, r, "rtnl: received route message with invalid advmss, ignoring: %m");
return 0;
}
r = sd_netlink_message_exit_container(message); r = sd_netlink_message_exit_container(message);
if (r < 0) { if (r < 0) {
log_link_error_errno(link, r, "rtnl: Could not exit from RTA_METRICS container: %m"); log_link_error_errno(link, r, "rtnl: Could not exit from RTA_METRICS container: %m");
@ -2121,6 +2127,7 @@ int config_parse_tcp_advmss(
if (isempty(rvalue)) { if (isempty(rvalue)) {
n->advmss = 0; n->advmss = 0;
TAKE_PTR(n);
return 0; return 0;
} }

View File

@ -119,9 +119,9 @@ int import_environment(int argc, char *argv[], void *userdata) {
return bus_log_create_error(r); return bus_log_create_error(r);
if (argc < 2) { if (argc < 2) {
_cleanup_strv_free_ char **copy = NULL; log_warning("Calling import-environment without a list of variable names is deprecated.");
copy = strv_copy(environ); _cleanup_strv_free_ char **copy = strv_copy(environ);
if (!copy) if (!copy)
return log_oom(); return log_oom();

View File

@ -193,7 +193,7 @@ static int systemctl_help(void) {
" show-environment Dump environment\n" " show-environment Dump environment\n"
" set-environment VARIABLE=VALUE... Set one or more environment variables\n" " set-environment VARIABLE=VALUE... Set one or more environment variables\n"
" unset-environment VARIABLE... Unset one or more environment variables\n" " unset-environment VARIABLE... Unset one or more environment variables\n"
" import-environment [VARIABLE...] Import all or some environment variables\n" " import-environment VARIABLE... Import all or some environment variables\n"
"\n%3$sManager State Commands:%4$s\n" "\n%3$sManager State Commands:%4$s\n"
" daemon-reload Reload systemd manager configuration\n" " daemon-reload Reload systemd manager configuration\n"
" daemon-reexec Reexecute systemd manager\n" " daemon-reexec Reexecute systemd manager\n"

View File

@ -247,6 +247,7 @@ FDMode=
FDNonISO= FDNonISO=
RestartSec= RestartSec=
TripleSampling= TripleSampling=
BusErrorReporting=
Termination= Termination=
ListenOnly= ListenOnly=
[Address] [Address]

View File

@ -23,6 +23,7 @@ sanitizers = [['address,undefined', sanitize_address_undefined]]
if git.found() if git.found()
out = run_command( out = run_command(
'env', '-u', 'GIT_WORK_TREE',
git, git,
'--git-dir=@0@/.git'.format(project_source_root), '--git-dir=@0@/.git'.format(project_source_root),
'ls-files', ':/test/fuzz/*/*') 'ls-files', ':/test/fuzz/*/*')

View File

@ -142,6 +142,7 @@ if want_tests != 'false' and dmi_arches.contains(host_machine.cpu_family())
if git.found() if git.found()
out = run_command( out = run_command(
'env', '-u', 'GIT_WORK_TREE',
git, git,
'--git-dir=@0@/.git'.format(project_source_root), '--git-dir=@0@/.git'.format(project_source_root),
'ls-files', ':/test/dmidecode-dumps/*.bin') 'ls-files', ':/test/dmidecode-dumps/*.bin')

View File

@ -36,6 +36,10 @@ InitialCongestionWindow=20
Destination=192.168.1.2 Destination=192.168.1.2
InitialAdvertisedReceiveWindow=30 InitialAdvertisedReceiveWindow=30
[Route]
Destination=192.168.1.3
TCPAdvertisedMaximumSegmentSize=30
[Route] [Route]
Type=blackhole Type=blackhole
Destination=202.54.1.2 Destination=202.54.1.2

View File

@ -2197,53 +2197,54 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
print('### ip -6 route show dev dummy98') print('### ip -6 route show dev dummy98')
output = check_output('ip -6 route show dev dummy98') output = check_output('ip -6 route show dev dummy98')
print(output) print(output)
self.assertRegex(output, '2001:1234:5:8fff:ff:ff:ff:ff proto static') self.assertIn('2001:1234:5:8fff:ff:ff:ff:ff proto static', output)
self.assertRegex(output, '2001:1234:5:8f63::1 proto kernel') self.assertIn('2001:1234:5:8f63::1 proto kernel', output)
print('### ip -6 route show default') print('### ip -6 route show default')
output = check_output('ip -6 route show default') output = check_output('ip -6 route show default')
print(output) print(output)
self.assertRegex(output, 'default') self.assertIn('default', output)
self.assertRegex(output, 'via 2001:1234:5:8fff:ff:ff:ff:ff') self.assertIn('via 2001:1234:5:8fff:ff:ff:ff:ff', output)
print('### ip -4 route show dev dummy98') print('### ip -4 route show dev dummy98')
output = check_output('ip -4 route show dev dummy98') output = check_output('ip -4 route show dev dummy98')
print(output) print(output)
self.assertRegex(output, '149.10.124.48/28 proto kernel scope link src 149.10.124.58') self.assertIn('149.10.124.48/28 proto kernel scope link src 149.10.124.58', output)
self.assertRegex(output, '149.10.124.64 proto static scope link') self.assertIn('149.10.124.64 proto static scope link', output)
self.assertRegex(output, '169.254.0.0/16 proto static scope link metric 2048') self.assertIn('169.254.0.0/16 proto static scope link metric 2048', output)
self.assertRegex(output, '192.168.1.1 proto static initcwnd 20') self.assertIn('192.168.1.1 proto static initcwnd 20', output)
self.assertRegex(output, '192.168.1.2 proto static initrwnd 30') self.assertIn('192.168.1.2 proto static initrwnd 30', output)
self.assertRegex(output, 'multicast 149.10.123.4 proto static') self.assertIn('192.168.1.3 proto static advmss 30', output)
self.assertIn('multicast 149.10.123.4 proto static', output)
print('### ip -4 route show dev dummy98 default') print('### ip -4 route show dev dummy98 default')
output = check_output('ip -4 route show dev dummy98 default') output = check_output('ip -4 route show dev dummy98 default')
print(output) print(output)
self.assertRegex(output, 'default via 149.10.125.65 proto static onlink') self.assertIn('default via 149.10.125.65 proto static onlink', output)
self.assertRegex(output, 'default via 149.10.124.64 proto static') self.assertIn('default via 149.10.124.64 proto static', output)
self.assertRegex(output, 'default proto static') self.assertIn('default proto static', output)
print('### ip -4 route show table local dev dummy98') print('### ip -4 route show table local dev dummy98')
output = check_output('ip -4 route show table local dev dummy98') output = check_output('ip -4 route show table local dev dummy98')
print(output) print(output)
self.assertRegex(output, 'local 149.10.123.1 proto static scope host') self.assertIn('local 149.10.123.1 proto static scope host', output)
self.assertRegex(output, 'anycast 149.10.123.2 proto static scope link') self.assertIn('anycast 149.10.123.2 proto static scope link', output)
self.assertRegex(output, 'broadcast 149.10.123.3 proto static scope link') self.assertIn('broadcast 149.10.123.3 proto static scope link', output)
print('### ip route show type blackhole') print('### ip route show type blackhole')
output = check_output('ip route show type blackhole') output = check_output('ip route show type blackhole')
print(output) print(output)
self.assertRegex(output, 'blackhole 202.54.1.2 proto static') self.assertIn('blackhole 202.54.1.2 proto static', output)
print('### ip route show type unreachable') print('### ip route show type unreachable')
output = check_output('ip route show type unreachable') output = check_output('ip route show type unreachable')
print(output) print(output)
self.assertRegex(output, 'unreachable 202.54.1.3 proto static') self.assertIn('unreachable 202.54.1.3 proto static', output)
print('### ip route show type prohibit') print('### ip route show type prohibit')
output = check_output('ip route show type prohibit') output = check_output('ip route show type prohibit')
print(output) print(output)
self.assertRegex(output, 'prohibit 202.54.1.4 proto static') self.assertIn('prohibit 202.54.1.4 proto static', output)
print('### ip -6 route show type blackhole') print('### ip -6 route show type blackhole')
output = check_output('ip -6 route show type blackhole') output = check_output('ip -6 route show type blackhole')
@ -2263,26 +2264,26 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
print('### ip route show 192.168.10.1') print('### ip route show 192.168.10.1')
output = check_output('ip route show 192.168.10.1') output = check_output('ip route show 192.168.10.1')
print(output) print(output)
self.assertRegex(output, '192.168.10.1 proto static') self.assertIn('192.168.10.1 proto static', output)
self.assertRegex(output, 'nexthop via 149.10.124.59 dev dummy98 weight 10') self.assertIn('nexthop via 149.10.124.59 dev dummy98 weight 10', output)
self.assertRegex(output, 'nexthop via 149.10.124.60 dev dummy98 weight 5') self.assertIn('nexthop via 149.10.124.60 dev dummy98 weight 5', output)
print('### ip route show 192.168.10.2') print('### ip route show 192.168.10.2')
output = check_output('ip route show 192.168.10.2') output = check_output('ip route show 192.168.10.2')
print(output) print(output)
# old ip command does not show IPv6 gateways... # old ip command does not show IPv6 gateways...
self.assertRegex(output, '192.168.10.2 proto static') self.assertIn('192.168.10.2 proto static', output)
self.assertRegex(output, 'nexthop') self.assertIn('nexthop', output)
self.assertRegex(output, 'dev dummy98 weight 10') self.assertIn('dev dummy98 weight 10', output)
self.assertRegex(output, 'dev dummy98 weight 5') self.assertIn('dev dummy98 weight 5', output)
print('### ip -6 route show 2001:1234:5:7fff:ff:ff:ff:ff') print('### ip -6 route show 2001:1234:5:7fff:ff:ff:ff:ff')
output = check_output('ip -6 route show 2001:1234:5:7fff:ff:ff:ff:ff') output = check_output('ip -6 route show 2001:1234:5:7fff:ff:ff:ff:ff')
print(output) print(output)
# old ip command does not show 'nexthop' keyword and weight... # old ip command does not show 'nexthop' keyword and weight...
self.assertRegex(output, '2001:1234:5:7fff:ff:ff:ff:ff') self.assertIn('2001:1234:5:7fff:ff:ff:ff:ff', output)
self.assertRegex(output, 'via 2001:1234:5:8fff:ff:ff:ff:ff dev dummy98') self.assertIn('via 2001:1234:5:8fff:ff:ff:ff:ff dev dummy98', output)
self.assertRegex(output, 'via 2001:1234:5:9fff:ff:ff:ff:ff dev dummy98') self.assertIn('via 2001:1234:5:9fff:ff:ff:ff:ff dev dummy98', output)
copy_unit_to_networkd_unit_path('25-address-static.network') copy_unit_to_networkd_unit_path('25-address-static.network')
check_output(*networkctl_cmd, 'reload', env=env) check_output(*networkctl_cmd, 'reload', env=env)
@ -2329,17 +2330,17 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
print('### ip route show type blackhole') print('### ip route show type blackhole')
output = check_output('ip route show type blackhole') output = check_output('ip route show type blackhole')
print(output) print(output)
self.assertRegex(output, 'blackhole 202.54.1.2 proto static') self.assertIn('blackhole 202.54.1.2 proto static', output)
print('### ip route show type unreachable') print('### ip route show type unreachable')
output = check_output('ip route show type unreachable') output = check_output('ip route show type unreachable')
print(output) print(output)
self.assertRegex(output, 'unreachable 202.54.1.3 proto static') self.assertIn('unreachable 202.54.1.3 proto static', output)
print('### ip route show type prohibit') print('### ip route show type prohibit')
output = check_output('ip route show type prohibit') output = check_output('ip route show type prohibit')
print(output) print(output)
self.assertRegex(output, 'prohibit 202.54.1.4 proto static') self.assertIn('prohibit 202.54.1.4 proto static', output)
print('### ip -6 route show type blackhole') print('### ip -6 route show type blackhole')
output = check_output('ip -6 route show type blackhole') output = check_output('ip -6 route show type blackhole')