mirror of
https://github.com/systemd/systemd
synced 2026-04-01 04:34:51 +02:00
Compare commits
No commits in common. "00725c3c4f044b55c78467a3dc3d3026aba40a9f" and "5b3874929a4fe5a22f1897dc723247b920a43615" have entirely different histories.
00725c3c4f
...
5b3874929a
6
NEWS
6
NEWS
@ -19,12 +19,6 @@ CHANGES WITH 259 in spe:
|
|||||||
command to add recovery keys to existing user accounts. Previously,
|
command to add recovery keys to existing user accounts. Previously,
|
||||||
recovery keys could only be configured during initial user creation.
|
recovery keys could only be configured during initial user creation.
|
||||||
|
|
||||||
* The default storage mode for the journal is now 'persistent'.
|
|
||||||
Previously, the default was 'auto', so the presence or lack of
|
|
||||||
/var/log/journal determined the default storage mode, if no
|
|
||||||
overriding configuration was provided. The default can be changed
|
|
||||||
with -Djournal-storage-default=.
|
|
||||||
|
|
||||||
CHANGES WITH 258:
|
CHANGES WITH 258:
|
||||||
|
|
||||||
Incompatible changes:
|
Incompatible changes:
|
||||||
|
|||||||
@ -10,14 +10,13 @@
|
|||||||
<!ENTITY FALLBACK_HOSTNAME "{{FALLBACK_HOSTNAME}}">
|
<!ENTITY FALLBACK_HOSTNAME "{{FALLBACK_HOSTNAME}}">
|
||||||
<!ENTITY MEMORY_ACCOUNTING_DEFAULT "{{ 'yes' if MEMORY_ACCOUNTING_DEFAULT else 'no' }}">
|
<!ENTITY MEMORY_ACCOUNTING_DEFAULT "{{ 'yes' if MEMORY_ACCOUNTING_DEFAULT else 'no' }}">
|
||||||
<!ENTITY KILL_USER_PROCESSES "{{ 'yes' if KILL_USER_PROCESSES else 'no' }}">
|
<!ENTITY KILL_USER_PROCESSES "{{ 'yes' if KILL_USER_PROCESSES else 'no' }}">
|
||||||
<!ENTITY JOURNAL_STORAGE_DEFAULT "{{JOURNAL_STORAGE_DEFAULT}}">
|
|
||||||
<!ENTITY DEBUGTTY "{{DEBUGTTY}}">
|
<!ENTITY DEBUGTTY "{{DEBUGTTY}}">
|
||||||
<!ENTITY SYSTEM_SYSVRCLOCAL_PATH "{{SYSTEM_SYSVRCLOCAL_PATH}}">
|
<!ENTITY SYSTEM_SYSVRCLOCAL_PATH "{{SYSTEM_SYSVRCLOCAL_PATH}}">
|
||||||
<!ENTITY HIGH_RLIMIT_NOFILE "{{HIGH_RLIMIT_NOFILE}}">
|
<!ENTITY HIGH_RLIMIT_NOFILE "{{HIGH_RLIMIT_NOFILE}}">
|
||||||
<!ENTITY DEFAULT_DNSSEC_MODE "{{DEFAULT_DNSSEC_MODE_STR}}">
|
<!ENTITY DEFAULT_DNSSEC_MODE "{{DEFAULT_DNSSEC_MODE_STR}}">
|
||||||
<!ENTITY DEFAULT_DNS_OVER_TLS_MODE "{{DEFAULT_DNS_OVER_TLS_MODE_STR}}">
|
<!ENTITY DEFAULT_DNS_OVER_TLS_MODE "{{DEFAULT_DNS_OVER_TLS_MODE_STR}}">
|
||||||
<!ENTITY DEFAULT_TIMEOUT_SEC "{{DEFAULT_TIMEOUT_SEC}} s">
|
<!ENTITY DEFAULT_TIMEOUT "{{DEFAULT_TIMEOUT_SEC}} s">
|
||||||
<!ENTITY DEFAULT_USER_TIMEOUT_SEC "{{DEFAULT_USER_TIMEOUT_SEC}} s">
|
<!ENTITY DEFAULT_USER_TIMEOUT "{{DEFAULT_USER_TIMEOUT_SEC}} s">
|
||||||
<!ENTITY SYSTEMD_DEFAULT_KEYMAP "{{SYSTEMD_DEFAULT_KEYMAP}}">
|
<!ENTITY DEFAULT_KEYMAP "{{SYSTEMD_DEFAULT_KEYMAP}}">
|
||||||
<!ENTITY fedora_latest_version "43">
|
<!ENTITY fedora_latest_version "43">
|
||||||
<!ENTITY fedora_cloud_release "1.6">
|
<!ENTITY fedora_cloud_release "1.6">
|
||||||
|
|||||||
@ -1,9 +1,6 @@
|
|||||||
<?xml version='1.0'?> <!--*-nxml-*-->
|
<?xml version='1.0'?> <!--*-nxml-*-->
|
||||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
||||||
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
|
||||||
<!ENTITY % entities SYSTEM "custom-entities.ent" >
|
|
||||||
%entities;
|
|
||||||
]>
|
|
||||||
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
|
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
|
||||||
|
|
||||||
<refentry id="journald.conf"
|
<refentry id="journald.conf"
|
||||||
@ -85,9 +82,8 @@
|
|||||||
<filename>/var/log/journal</filename> directory exists, and <literal>volatile</literal> otherwise
|
<filename>/var/log/journal</filename> directory exists, and <literal>volatile</literal> otherwise
|
||||||
(the existence of the directory controls the storage mode). <literal>none</literal> turns off all
|
(the existence of the directory controls the storage mode). <literal>none</literal> turns off all
|
||||||
storage, all log data received will be dropped (but forwarding to other targets, such as the console,
|
storage, all log data received will be dropped (but forwarding to other targets, such as the console,
|
||||||
the kernel log buffer, or a syslog socket will still work). Defaults to
|
the kernel log buffer, or a syslog socket will still work). Defaults to <literal>auto</literal> in
|
||||||
<literal>&JOURNAL_STORAGE_DEFAULT;</literal> in the default journal namespace (this value is
|
the default journal namespace, and <literal>persistent</literal> in all others.</para>
|
||||||
determined at compilation time), and <literal>persistent</literal> in all others.</para>
|
|
||||||
|
|
||||||
<para>Note that journald will initially use volatile storage, until a call to
|
<para>Note that journald will initially use volatile storage, until a call to
|
||||||
<command>journalctl --flush</command> (or sending <constant>SIGUSR1</constant> to journald) will cause
|
<command>journalctl --flush</command> (or sending <constant>SIGUSR1</constant> to journald) will cause
|
||||||
|
|||||||
@ -581,9 +581,9 @@
|
|||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para><varname>DefaultTimeoutStartSec=</varname> and <varname>DefaultTimeoutStopSec=</varname>
|
<para><varname>DefaultTimeoutStartSec=</varname> and <varname>DefaultTimeoutStopSec=</varname>
|
||||||
default to &DEFAULT_TIMEOUT_SEC; in the system manager and &DEFAULT_USER_TIMEOUT_SEC; in the user
|
default to &DEFAULT_TIMEOUT; in the system manager and &DEFAULT_USER_TIMEOUT; in the user manager.
|
||||||
manager. <varname>DefaultTimeoutAbortSec=</varname> is not set by default so that all units fall back
|
<varname>DefaultTimeoutAbortSec=</varname> is not set by default so that all units fall back to
|
||||||
to <varname>TimeoutStopSec=</varname>. <varname>DefaultRestartSec=</varname> defaults to 100 ms.
|
<varname>TimeoutStopSec=</varname>. <varname>DefaultRestartSec=</varname> defaults to 100 ms.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<xi:include href="version-info.xml" xpointer="v209"/></listitem>
|
<xi:include href="version-info.xml" xpointer="v209"/></listitem>
|
||||||
@ -597,8 +597,8 @@
|
|||||||
and <filename>/etc/crypttab</filename> (see
|
and <filename>/etc/crypttab</filename> (see
|
||||||
<citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>crypttab</refentrytitle><manvolnum>5</manvolnum></citerefentry>).
|
<citerefentry><refentrytitle>crypttab</refentrytitle><manvolnum>5</manvolnum></citerefentry>).
|
||||||
Defaults to &DEFAULT_TIMEOUT_SEC; in the system manager and &DEFAULT_USER_TIMEOUT_SEC; in the user
|
Defaults to &DEFAULT_TIMEOUT; in the system manager and &DEFAULT_USER_TIMEOUT; in the user manager.
|
||||||
manager.</para>
|
</para>
|
||||||
|
|
||||||
<xi:include href="version-info.xml" xpointer="v252"/></listitem>
|
<xi:include href="version-info.xml" xpointer="v252"/></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|||||||
@ -75,11 +75,11 @@
|
|||||||
<term><varname>KEYMAP=</varname></term>
|
<term><varname>KEYMAP=</varname></term>
|
||||||
<term><varname>KEYMAP_TOGGLE=</varname></term>
|
<term><varname>KEYMAP_TOGGLE=</varname></term>
|
||||||
|
|
||||||
<listitem><para>Configures the key mapping table for the keyboard. <varname>KEYMAP=</varname>
|
<listitem><para>Configures the key mapping table for the keyboard. <varname>KEYMAP=</varname>
|
||||||
defaults to <literal>&SYSTEMD_DEFAULT_KEYMAP;</literal> if not set. As a special case, if
|
defaults to <literal>&DEFAULT_KEYMAP;</literal> if not set. Specially, if <literal>@kernel</literal>
|
||||||
<literal>@kernel</literal> is specified, no keymap will be loaded, i.e. the kernel's default keymap
|
is specified, no keymap will be loaded, i.e. the kernel's default keymap is used. The
|
||||||
will be used. The <varname>KEYMAP_TOGGLE=</varname> can be used to configure a second toggle keymap
|
<varname>KEYMAP_TOGGLE=</varname> can be used to configure a second toggle keymap and is by default
|
||||||
and is by default unset.</para></listitem>
|
unset.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
|
|||||||
@ -117,9 +117,6 @@ conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
|
|||||||
conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
|
conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
|
||||||
conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
|
conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
|
||||||
|
|
||||||
conf.set('JOURNAL_STORAGE_DEFAULT', get_option('journal-storage-default'))
|
|
||||||
conf.set('JOURNAL_STORAGE_DEFAULT_VAL', 'STORAGE_' + get_option('journal-storage-default').to_upper())
|
|
||||||
|
|
||||||
# Meson ignores the preceding arguments when joining paths if an absolute
|
# Meson ignores the preceding arguments when joining paths if an absolute
|
||||||
# component is encountered, so this should canonicalize various paths when they
|
# component is encountered, so this should canonicalize various paths when they
|
||||||
# are absolute or relative.
|
# are absolute or relative.
|
||||||
@ -3099,7 +3096,6 @@ summary({
|
|||||||
'default locale' : default_locale,
|
'default locale' : default_locale,
|
||||||
'default nspawn locale' : nspawn_locale,
|
'default nspawn locale' : nspawn_locale,
|
||||||
'default status unit format' : status_unit_format_default,
|
'default status unit format' : status_unit_format_default,
|
||||||
'default journal storage mode' : conf.get('JOURNAL_STORAGE_DEFAULT'),
|
|
||||||
'default user $PATH' : default_user_path != '' ? default_user_path : '(same as system services)',
|
'default user $PATH' : default_user_path != '' ? default_user_path : '(same as system services)',
|
||||||
'systemd service watchdog' : service_watchdog == '' ? 'disabled' : service_watchdog,
|
'systemd service watchdog' : service_watchdog == '' ? 'disabled' : service_watchdog,
|
||||||
'time epoch' : f'@time_epoch@ (@alt_time_epoch@)',
|
'time epoch' : f'@time_epoch@ (@alt_time_epoch@)',
|
||||||
|
|||||||
@ -139,8 +139,6 @@ option('timedated', type : 'boolean',
|
|||||||
description : 'install the systemd-timedated daemon')
|
description : 'install the systemd-timedated daemon')
|
||||||
option('timesyncd', type : 'boolean',
|
option('timesyncd', type : 'boolean',
|
||||||
description : 'install the systemd-timesyncd daemon')
|
description : 'install the systemd-timesyncd daemon')
|
||||||
option('journal-storage-default', type : 'combo', choices : ['persistent', 'auto', 'volatile', 'none'],
|
|
||||||
description : 'default storage mode for journald (main namespace)')
|
|
||||||
option('remote', type : 'feature', deprecated : { 'true' : 'enabled', 'false' : 'disabled' },
|
option('remote', type : 'feature', deprecated : { 'true' : 'enabled', 'false' : 'disabled' },
|
||||||
description : 'support for "journal over the network"')
|
description : 'support for "journal over the network"')
|
||||||
option('create-log-dirs', type : 'boolean',
|
option('create-log-dirs', type : 'boolean',
|
||||||
|
|||||||
@ -634,6 +634,8 @@ const char* get_tzname(bool dst) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int parse_gmtoff(const char *t, long *ret) {
|
int parse_gmtoff(const char *t, long *ret) {
|
||||||
|
int r;
|
||||||
|
|
||||||
assert(t);
|
assert(t);
|
||||||
|
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
@ -645,11 +647,6 @@ int parse_gmtoff(const char *t, long *ret) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __GLIBC__
|
|
||||||
return -EINVAL;
|
|
||||||
#else
|
|
||||||
int r;
|
|
||||||
|
|
||||||
/* musl v1.2.5 does not support %z specifier in strptime(). Since
|
/* musl v1.2.5 does not support %z specifier in strptime(). Since
|
||||||
* https://github.com/kraj/musl/commit/fced99e93daeefb0192fd16304f978d4401d1d77
|
* https://github.com/kraj/musl/commit/fced99e93daeefb0192fd16304f978d4401d1d77
|
||||||
* %z is supported, but it only supports strict RFC-822/ISO 8601 format, that is, 4 digits with sign
|
* %z is supported, but it only supports strict RFC-822/ISO 8601 format, that is, 4 digits with sign
|
||||||
@ -717,7 +714,6 @@ finalize:
|
|||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parse_timestamp_impl(
|
static int parse_timestamp_impl(
|
||||||
|
|||||||
@ -831,7 +831,7 @@ char* mangle_gecos(const char *d) {
|
|||||||
char *mangled;
|
char *mangled;
|
||||||
|
|
||||||
/* Makes sure the provided string becomes valid as a GEGOS field, by dropping bad chars. glibc's
|
/* Makes sure the provided string becomes valid as a GEGOS field, by dropping bad chars. glibc's
|
||||||
* putpwent() only changes \n and : to spaces. We do more: replace all CC too, and remove invalid
|
* putwent() only changes \n and : to spaces. We do more: replace all CC too, and remove invalid
|
||||||
* UTF-8 */
|
* UTF-8 */
|
||||||
|
|
||||||
mangled = strdup(d);
|
mangled = strdup(d);
|
||||||
|
|||||||
@ -5,7 +5,6 @@
|
|||||||
#include "conf-parser.h"
|
#include "conf-parser.h"
|
||||||
#include "creds-util.h"
|
#include "creds-util.h"
|
||||||
#include "daemon-util.h"
|
#include "daemon-util.h"
|
||||||
#include "initrd-util.h"
|
|
||||||
#include "journald-audit.h"
|
#include "journald-audit.h"
|
||||||
#include "journald-config.h"
|
#include "journald-config.h"
|
||||||
#include "journald-context.h"
|
#include "journald-context.h"
|
||||||
@ -117,12 +116,7 @@ void manager_merge_configs(Manager *m) {
|
|||||||
|
|
||||||
journal_config_done(&m->config);
|
journal_config_done(&m->config);
|
||||||
|
|
||||||
MERGE_NON_NEGATIVE(storage, JOURNAL_STORAGE_DEFAULT_VAL);
|
MERGE_NON_NEGATIVE(storage, STORAGE_AUTO);
|
||||||
|
|
||||||
/* In the initrd, only 'none' and 'volatile' make sense. */
|
|
||||||
if (in_initrd() && IN_SET(m->config.storage, STORAGE_PERSISTENT, STORAGE_AUTO))
|
|
||||||
m->config.storage = STORAGE_VOLATILE;
|
|
||||||
|
|
||||||
manager_merge_journal_compress_options(m);
|
manager_merge_journal_compress_options(m);
|
||||||
MERGE_NON_NEGATIVE(seal, true);
|
MERGE_NON_NEGATIVE(seal, true);
|
||||||
/* By default, /dev/kmsg is read only by the main namespace instance. */
|
/* By default, /dev/kmsg is read only by the main namespace instance. */
|
||||||
|
|||||||
@ -17,7 +17,7 @@
|
|||||||
# See journald.conf(5) for details.
|
# See journald.conf(5) for details.
|
||||||
|
|
||||||
[Journal]
|
[Journal]
|
||||||
#Storage={{ JOURNAL_STORAGE_DEFAULT }}
|
#Storage=auto
|
||||||
#Compress=yes
|
#Compress=yes
|
||||||
#Seal=yes
|
#Seal=yes
|
||||||
#SplitMode=uid
|
#SplitMode=uid
|
||||||
@ -153,12 +153,10 @@ executables += [
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
custom_target(
|
if install_sysconfdir_samples
|
||||||
input : 'journald.conf.in',
|
install_data('journald.conf',
|
||||||
output: 'journald.conf',
|
install_dir : pkgconfigfiledir)
|
||||||
command : [jinja2_cmdline, '@INPUT@', '@OUTPUT@'],
|
endif
|
||||||
install : install_sysconfdir_samples,
|
|
||||||
install_dir : pkgconfigfiledir)
|
|
||||||
|
|
||||||
if get_option('create-log-dirs')
|
if get_option('create-log-dirs')
|
||||||
install_emptydir('/var/log/journal',
|
install_emptydir('/var/log/journal',
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||||
|
|
||||||
#include "env-file.h"
|
#include "env-file.h"
|
||||||
#include "env-util.h"
|
|
||||||
#include "fd-util.h"
|
#include "fd-util.h"
|
||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
#include "fs-util.h"
|
#include "fs-util.h"
|
||||||
@ -188,315 +187,4 @@ TEST(write_and_load_env_file) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(parse_env_file) {
|
|
||||||
_cleanup_(unlink_tempfilep) char
|
|
||||||
t[] = "/tmp/test-fileio-in-XXXXXX",
|
|
||||||
p[] = "/tmp/test-fileio-out-XXXXXX";
|
|
||||||
FILE *f;
|
|
||||||
_cleanup_free_ char *one = NULL, *two = NULL, *three = NULL, *four = NULL, *five = NULL,
|
|
||||||
*six = NULL, *seven = NULL, *eight = NULL, *nine = NULL, *ten = NULL,
|
|
||||||
*eleven = NULL, *twelve = NULL, *thirteen = NULL;
|
|
||||||
_cleanup_strv_free_ char **a = NULL, **b = NULL;
|
|
||||||
unsigned k;
|
|
||||||
|
|
||||||
ASSERT_OK(fmkostemp_safe(t, "w", &f));
|
|
||||||
fputs("one=BAR \n"
|
|
||||||
"# comment\n"
|
|
||||||
" # comment \n"
|
|
||||||
" ; comment \n"
|
|
||||||
" two = bar \n"
|
|
||||||
"invalid line\n"
|
|
||||||
"invalid line #comment\n"
|
|
||||||
"three = \"333\n"
|
|
||||||
"xxxx\"\n"
|
|
||||||
"four = \'44\\\"44\'\n"
|
|
||||||
"five = \"55\\\"55\" \"FIVE\" cinco \n"
|
|
||||||
"six = seis sechs\\\n"
|
|
||||||
" sis\n"
|
|
||||||
"seven=\"sevenval\" #nocomment\n"
|
|
||||||
"eight=eightval #nocomment\n"
|
|
||||||
"export nine=nineval\n"
|
|
||||||
"ten=ignored\n"
|
|
||||||
"ten=ignored\n"
|
|
||||||
"ten=\n"
|
|
||||||
"eleven=\\value\n"
|
|
||||||
"twelve=\"\\value\"\n"
|
|
||||||
"thirteen='\\value'", f);
|
|
||||||
|
|
||||||
fflush(f);
|
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
ASSERT_OK(load_env_file(NULL, t, &a));
|
|
||||||
|
|
||||||
STRV_FOREACH(i, a)
|
|
||||||
log_debug("Got: <%s>", *i);
|
|
||||||
|
|
||||||
ASSERT_STREQ(a[0], "one=BAR");
|
|
||||||
ASSERT_STREQ(a[1], "two=bar");
|
|
||||||
ASSERT_STREQ(a[2], "three=333\nxxxx");
|
|
||||||
ASSERT_STREQ(a[3], "four=44\\\"44");
|
|
||||||
ASSERT_STREQ(a[4], "five=55\"55FIVEcinco");
|
|
||||||
ASSERT_STREQ(a[5], "six=seis sechs sis");
|
|
||||||
ASSERT_STREQ(a[6], "seven=sevenval#nocomment");
|
|
||||||
ASSERT_STREQ(a[7], "eight=eightval #nocomment");
|
|
||||||
ASSERT_STREQ(a[8], "export nine=nineval");
|
|
||||||
ASSERT_STREQ(a[9], "ten=");
|
|
||||||
ASSERT_STREQ(a[10], "eleven=value");
|
|
||||||
ASSERT_STREQ(a[11], "twelve=\\value");
|
|
||||||
ASSERT_STREQ(a[12], "thirteen=\\value");
|
|
||||||
ASSERT_NULL(a[13]);
|
|
||||||
|
|
||||||
strv_env_clean(a);
|
|
||||||
|
|
||||||
k = 0;
|
|
||||||
STRV_FOREACH(i, b) {
|
|
||||||
log_debug("Got2: <%s>", *i);
|
|
||||||
ASSERT_STREQ(*i, a[k++]);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT_OK(parse_env_file(NULL, t,
|
|
||||||
"one", &one,
|
|
||||||
"two", &two,
|
|
||||||
"three", &three,
|
|
||||||
"four", &four,
|
|
||||||
"five", &five,
|
|
||||||
"six", &six,
|
|
||||||
"seven", &seven,
|
|
||||||
"eight", &eight,
|
|
||||||
"export nine", &nine,
|
|
||||||
"ten", &ten,
|
|
||||||
"eleven", &eleven,
|
|
||||||
"twelve", &twelve,
|
|
||||||
"thirteen", &thirteen));
|
|
||||||
|
|
||||||
log_debug("one=[%s]", strna(one));
|
|
||||||
log_debug("two=[%s]", strna(two));
|
|
||||||
log_debug("three=[%s]", strna(three));
|
|
||||||
log_debug("four=[%s]", strna(four));
|
|
||||||
log_debug("five=[%s]", strna(five));
|
|
||||||
log_debug("six=[%s]", strna(six));
|
|
||||||
log_debug("seven=[%s]", strna(seven));
|
|
||||||
log_debug("eight=[%s]", strna(eight));
|
|
||||||
log_debug("export nine=[%s]", strna(nine));
|
|
||||||
log_debug("ten=[%s]", strna(nine));
|
|
||||||
log_debug("eleven=[%s]", strna(eleven));
|
|
||||||
log_debug("twelve=[%s]", strna(twelve));
|
|
||||||
log_debug("thirteen=[%s]", strna(thirteen));
|
|
||||||
|
|
||||||
ASSERT_STREQ(one, "BAR");
|
|
||||||
ASSERT_STREQ(two, "bar");
|
|
||||||
ASSERT_STREQ(three, "333\nxxxx");
|
|
||||||
ASSERT_STREQ(four, "44\\\"44");
|
|
||||||
ASSERT_STREQ(five, "55\"55FIVEcinco");
|
|
||||||
ASSERT_STREQ(six, "seis sechs sis");
|
|
||||||
ASSERT_STREQ(seven, "sevenval#nocomment");
|
|
||||||
ASSERT_STREQ(eight, "eightval #nocomment");
|
|
||||||
ASSERT_STREQ(nine, "nineval");
|
|
||||||
ASSERT_NULL(ten);
|
|
||||||
ASSERT_STREQ(eleven, "value");
|
|
||||||
ASSERT_STREQ(twelve, "\\value");
|
|
||||||
ASSERT_STREQ(thirteen, "\\value");
|
|
||||||
|
|
||||||
/* prepare a temporary file to write the environment to */
|
|
||||||
_cleanup_close_ int fd = -EBADF;
|
|
||||||
ASSERT_OK(fd = mkostemp_safe(p));
|
|
||||||
|
|
||||||
ASSERT_OK(write_env_file(AT_FDCWD, p, /* headers= */ NULL, a, /* flags= */ 0));
|
|
||||||
ASSERT_OK(load_env_file(NULL, p, &b));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_one_shell_var(const char *file, const char *variable, const char *value) {
|
|
||||||
_cleanup_free_ char *cmd = NULL, *from_shell = NULL;
|
|
||||||
_cleanup_pclose_ FILE *f = NULL;
|
|
||||||
size_t sz;
|
|
||||||
|
|
||||||
ASSERT_NOT_NULL(cmd = strjoin(". ", file, " && /bin/echo -n \"$", variable, "\""));
|
|
||||||
ASSERT_NOT_NULL(f = popen(cmd, "re"));
|
|
||||||
ASSERT_OK(read_full_stream(f, &from_shell, &sz));
|
|
||||||
ASSERT_EQ(sz, strlen(value));
|
|
||||||
ASSERT_STREQ(from_shell, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(parse_multiline_env_file) {
|
|
||||||
_cleanup_(unlink_tempfilep) char
|
|
||||||
t[] = "/tmp/test-fileio-in-XXXXXX",
|
|
||||||
p[] = "/tmp/test-fileio-out-XXXXXX";
|
|
||||||
FILE *f;
|
|
||||||
_cleanup_strv_free_ char **a = NULL, **b = NULL;
|
|
||||||
|
|
||||||
ASSERT_OK(fmkostemp_safe(t, "w", &f));
|
|
||||||
fputs("one=BAR\\\n"
|
|
||||||
"\\ \\ \\ \\ VAR\\\n"
|
|
||||||
"\\\tGAR\n"
|
|
||||||
"#comment\n"
|
|
||||||
"two=\"bar\\\n"
|
|
||||||
" var\\\n"
|
|
||||||
"\tgar\"\n"
|
|
||||||
"#comment\n"
|
|
||||||
"tri=\"bar \\\n"
|
|
||||||
" var \\\n"
|
|
||||||
"\tgar \"\n", f);
|
|
||||||
|
|
||||||
ASSERT_OK(fflush_and_check(f));
|
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
test_one_shell_var(t, "one", "BAR VAR\tGAR");
|
|
||||||
test_one_shell_var(t, "two", "bar var\tgar");
|
|
||||||
test_one_shell_var(t, "tri", "bar var \tgar ");
|
|
||||||
|
|
||||||
ASSERT_OK(load_env_file(NULL, t, &a));
|
|
||||||
|
|
||||||
STRV_FOREACH(i, a)
|
|
||||||
log_debug("Got: <%s>", *i);
|
|
||||||
|
|
||||||
ASSERT_STREQ(a[0], "one=BAR VAR\tGAR");
|
|
||||||
ASSERT_STREQ(a[1], "two=bar var\tgar");
|
|
||||||
ASSERT_STREQ(a[2], "tri=bar var \tgar ");
|
|
||||||
ASSERT_NULL(a[3]);
|
|
||||||
|
|
||||||
_cleanup_close_ int fd = -EBADF;
|
|
||||||
ASSERT_OK(fd = mkostemp_safe(p));
|
|
||||||
|
|
||||||
ASSERT_OK(write_env_file(AT_FDCWD, p, /* headers= */ NULL, a, /* flags= */ 0));
|
|
||||||
ASSERT_OK(load_env_file(NULL, p, &b));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(merge_env_file) {
|
|
||||||
_cleanup_(unlink_tempfilep) char t[] = "/tmp/test-fileio-XXXXXX";
|
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
|
||||||
_cleanup_strv_free_ char **a = NULL;
|
|
||||||
|
|
||||||
ASSERT_OK(fmkostemp_safe(t, "w", &f));
|
|
||||||
|
|
||||||
ASSERT_OK(write_string_stream(f,
|
|
||||||
"one=1 \n"
|
|
||||||
"twelve=${one}2\n"
|
|
||||||
"twentyone=2${one}\n"
|
|
||||||
"one=2\n"
|
|
||||||
"twentytwo=2${one}\n"
|
|
||||||
"xxx_minus_three=$xxx - 3\n"
|
|
||||||
"xxx=0x$one$one$one\n"
|
|
||||||
"yyy=${one:-fallback}\n"
|
|
||||||
"zzz=${one:+replacement}\n"
|
|
||||||
"zzzz=${foobar:-${nothing}}\n"
|
|
||||||
"zzzzz=${nothing:+${nothing}}\n"
|
|
||||||
, WRITE_STRING_FILE_AVOID_NEWLINE));
|
|
||||||
|
|
||||||
ASSERT_OK(merge_env_file(&a, NULL, t));
|
|
||||||
strv_sort(a);
|
|
||||||
|
|
||||||
STRV_FOREACH(i, a)
|
|
||||||
log_debug("Got: <%s>", *i);
|
|
||||||
|
|
||||||
ASSERT_STREQ(a[0], "one=2");
|
|
||||||
ASSERT_STREQ(a[1], "twelve=12");
|
|
||||||
ASSERT_STREQ(a[2], "twentyone=21");
|
|
||||||
ASSERT_STREQ(a[3], "twentytwo=22");
|
|
||||||
ASSERT_STREQ(a[4], "xxx=0x222");
|
|
||||||
ASSERT_STREQ(a[5], "xxx_minus_three= - 3");
|
|
||||||
ASSERT_STREQ(a[6], "yyy=2");
|
|
||||||
ASSERT_STREQ(a[7], "zzz=replacement");
|
|
||||||
ASSERT_STREQ(a[8], "zzzz=");
|
|
||||||
ASSERT_STREQ(a[9], "zzzzz=");
|
|
||||||
ASSERT_NULL(a[10]);
|
|
||||||
|
|
||||||
ASSERT_OK(merge_env_file(&a, NULL, t));
|
|
||||||
strv_sort(a);
|
|
||||||
|
|
||||||
STRV_FOREACH(i, a)
|
|
||||||
log_debug("Got2: <%s>", *i);
|
|
||||||
|
|
||||||
ASSERT_STREQ(a[0], "one=2");
|
|
||||||
ASSERT_STREQ(a[1], "twelve=12");
|
|
||||||
ASSERT_STREQ(a[2], "twentyone=21");
|
|
||||||
ASSERT_STREQ(a[3], "twentytwo=22");
|
|
||||||
ASSERT_STREQ(a[4], "xxx=0x222");
|
|
||||||
ASSERT_STREQ(a[5], "xxx_minus_three=0x222 - 3");
|
|
||||||
ASSERT_STREQ(a[6], "yyy=2");
|
|
||||||
ASSERT_STREQ(a[7], "zzz=replacement");
|
|
||||||
ASSERT_STREQ(a[8], "zzzz=");
|
|
||||||
ASSERT_STREQ(a[9], "zzzzz=");
|
|
||||||
ASSERT_NULL(a[10]);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(merge_env_file_invalid) {
|
|
||||||
_cleanup_(unlink_tempfilep) char t[] = "/tmp/test-fileio-XXXXXX";
|
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
|
||||||
_cleanup_strv_free_ char **a = NULL;
|
|
||||||
|
|
||||||
ASSERT_OK(fmkostemp_safe(t, "w", &f));
|
|
||||||
|
|
||||||
ASSERT_OK(write_string_stream(f,
|
|
||||||
"unset one \n"
|
|
||||||
"unset one= \n"
|
|
||||||
"unset one=1 \n"
|
|
||||||
"one \n"
|
|
||||||
"one = \n"
|
|
||||||
"one two =\n"
|
|
||||||
"\x20two=\n"
|
|
||||||
"#comment=comment\n"
|
|
||||||
";comment2=comment2\n"
|
|
||||||
"#\n"
|
|
||||||
"\n\n" /* empty line */
|
|
||||||
, WRITE_STRING_FILE_AVOID_NEWLINE));
|
|
||||||
|
|
||||||
ASSERT_OK(merge_env_file(&a, NULL, t));
|
|
||||||
|
|
||||||
STRV_FOREACH(i, a)
|
|
||||||
log_debug("Got: <%s>", *i);
|
|
||||||
|
|
||||||
ASSERT_TRUE(strv_isempty(a));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void check_file_pairs_one(char **l) {
|
|
||||||
ASSERT_EQ(strv_length(l), 14U);
|
|
||||||
|
|
||||||
STRV_FOREACH_PAIR(k, v, l) {
|
|
||||||
if (streq(*k, "NAME"))
|
|
||||||
ASSERT_STREQ(*v, "Arch Linux");
|
|
||||||
else if (streq(*k, "ID"))
|
|
||||||
ASSERT_STREQ(*v, "arch");
|
|
||||||
else if (streq(*k, "PRETTY_NAME"))
|
|
||||||
ASSERT_STREQ(*v, "Arch Linux");
|
|
||||||
else if (streq(*k, "ANSI_COLOR"))
|
|
||||||
ASSERT_STREQ(*v, "0;36");
|
|
||||||
else if (streq(*k, "HOME_URL"))
|
|
||||||
ASSERT_STREQ(*v, "https://www.archlinux.org/");
|
|
||||||
else if (streq(*k, "SUPPORT_URL"))
|
|
||||||
ASSERT_STREQ(*v, "https://bbs.archlinux.org/");
|
|
||||||
else if (streq(*k, "BUG_REPORT_URL"))
|
|
||||||
ASSERT_STREQ(*v, "https://bugs.archlinux.org/");
|
|
||||||
else
|
|
||||||
assert_not_reached();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(load_env_file_pairs) {
|
|
||||||
_cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-load_env_file_pairs-XXXXXX";
|
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
|
||||||
_cleanup_strv_free_ char **l = NULL;
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
ASSERT_OK(fd = mkostemp_safe(fn));
|
|
||||||
|
|
||||||
ASSERT_OK(write_string_file(fn,
|
|
||||||
"NAME=\"Arch Linux\"\n"
|
|
||||||
"ID=arch\n"
|
|
||||||
"PRETTY_NAME=\"Arch Linux\"\n"
|
|
||||||
"ANSI_COLOR=\"0;36\"\n"
|
|
||||||
"HOME_URL=\"https://www.archlinux.org/\"\n"
|
|
||||||
"SUPPORT_URL=\"https://bbs.archlinux.org/\"\n"
|
|
||||||
"BUG_REPORT_URL=\"https://bugs.archlinux.org/\"\n"
|
|
||||||
, WRITE_STRING_FILE_CREATE));
|
|
||||||
|
|
||||||
ASSERT_OK(load_env_file_pairs_fd(fd, fn, &l));
|
|
||||||
check_file_pairs_one(l);
|
|
||||||
l = strv_free(l);
|
|
||||||
|
|
||||||
ASSERT_NOT_NULL(f = fdopen(fd, "r"));
|
|
||||||
|
|
||||||
ASSERT_OK(load_env_file_pairs(f, fn, &l));
|
|
||||||
check_file_pairs_one(l);
|
|
||||||
}
|
|
||||||
|
|
||||||
DEFINE_TEST_MAIN(LOG_INFO);
|
DEFINE_TEST_MAIN(LOG_INFO);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,5 @@
|
|||||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
@ -11,7 +10,6 @@
|
|||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
#include "format-util.h"
|
#include "format-util.h"
|
||||||
#include "fs-util.h"
|
#include "fs-util.h"
|
||||||
#include "iovec-util.h"
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "path-util.h"
|
#include "path-util.h"
|
||||||
#include "process-util.h"
|
#include "process-util.h"
|
||||||
@ -19,62 +17,6 @@
|
|||||||
#include "tests.h"
|
#include "tests.h"
|
||||||
#include "tmpfile-util.h"
|
#include "tmpfile-util.h"
|
||||||
|
|
||||||
TEST(writing_tmpfile) {
|
|
||||||
_cleanup_(unlink_tempfilep) char name[] = "/tmp/test-systemd_writing_tmpfile.XXXXXX";
|
|
||||||
_cleanup_free_ char *contents = NULL;
|
|
||||||
size_t size;
|
|
||||||
_cleanup_close_ int fd = -EBADF;
|
|
||||||
|
|
||||||
struct iovec iov[] = {
|
|
||||||
IOVEC_MAKE_STRING("abc\n"),
|
|
||||||
IOVEC_MAKE_STRING(ALPHANUMERICAL "\n"),
|
|
||||||
IOVEC_MAKE_STRING(""),
|
|
||||||
};
|
|
||||||
|
|
||||||
ASSERT_OK(fd = mkostemp_safe(name));
|
|
||||||
|
|
||||||
ASSERT_OK_ERRNO(writev(fd, iov, 3));
|
|
||||||
|
|
||||||
ASSERT_OK(read_full_file(name, &contents, &size));
|
|
||||||
ASSERT_STREQ(contents, "abc\n" ALPHANUMERICAL "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(tempfn) {
|
|
||||||
char *ret = NULL, *p;
|
|
||||||
|
|
||||||
ASSERT_OK(tempfn_xxxxxx("/foo/bar/waldo", NULL, &ret));
|
|
||||||
ASSERT_STREQ(ret, "/foo/bar/.#waldoXXXXXX");
|
|
||||||
free(ret);
|
|
||||||
|
|
||||||
ASSERT_OK(tempfn_xxxxxx("/foo/bar/waldo", "[miau]", &ret));
|
|
||||||
ASSERT_STREQ(ret, "/foo/bar/.#[miau]waldoXXXXXX");
|
|
||||||
free(ret);
|
|
||||||
|
|
||||||
ASSERT_OK(tempfn_random("/foo/bar/waldo", NULL, &ret));
|
|
||||||
ASSERT_NOT_NULL(p = startswith(ret, "/foo/bar/.#waldo"));
|
|
||||||
ASSERT_EQ(strlen(p), 16U);
|
|
||||||
ASSERT_TRUE(in_charset(p, "0123456789abcdef"));
|
|
||||||
free(ret);
|
|
||||||
|
|
||||||
ASSERT_OK(tempfn_random("/foo/bar/waldo", "[wuff]", &ret));
|
|
||||||
ASSERT_NOT_NULL(p = startswith(ret, "/foo/bar/.#[wuff]waldo"));
|
|
||||||
ASSERT_EQ(strlen(p), 16U);
|
|
||||||
ASSERT_TRUE(in_charset(p, "0123456789abcdef"));
|
|
||||||
free(ret);
|
|
||||||
|
|
||||||
ASSERT_OK(tempfn_random_child("/foo/bar/waldo", NULL, &ret));
|
|
||||||
ASSERT_NOT_NULL(p = startswith(ret, "/foo/bar/waldo/.#"));
|
|
||||||
ASSERT_EQ(strlen(p), 16U);
|
|
||||||
ASSERT_TRUE(in_charset(p, "0123456789abcdef"));
|
|
||||||
free(ret);
|
|
||||||
|
|
||||||
ASSERT_OK(tempfn_random_child("/foo/bar/waldo", "[kikiriki]", &ret));
|
|
||||||
ASSERT_NOT_NULL(p = startswith(ret, "/foo/bar/waldo/.#[kikiriki]"));
|
|
||||||
ASSERT_EQ(strlen(p), 16U);
|
|
||||||
ASSERT_TRUE(in_charset(p, "0123456789abcdef"));
|
|
||||||
free(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_tempfn_random_one(const char *p, const char *extra, const char *expect, int ret) {
|
static void test_tempfn_random_one(const char *p, const char *extra, const char *expect, int ret) {
|
||||||
_cleanup_free_ char *s = NULL;
|
_cleanup_free_ char *s = NULL;
|
||||||
int r;
|
int r;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user