mirror of
https://github.com/systemd/systemd.git
synced 2024-12-25 01:34:28 +03:00
Merge pull request #15626 from poettering/more-specifiers
tmpfiles,sysusers,pid1: add a bunch of more specifiers
This commit is contained in:
commit
e83ef04d97
3
TODO
3
TODO
@ -57,9 +57,6 @@ Features:
|
||||
* by default, in systemd --user service bump the OOMAdjust to 100, as privs
|
||||
allow so that systemd survives
|
||||
|
||||
* honour specifiers in unit files that resolve to some very basic
|
||||
/etc/os-release data, such as ID, VERSION_ID, BUILD_ID, VARIANT_ID.
|
||||
|
||||
* cryptsetup: allow encoding key directly in /etc/crypttab, maybe with a
|
||||
"base64:" prefix. Useful in particular for pkcs11 mode.
|
||||
|
||||
|
32
man/standard-specifiers.xml
Normal file
32
man/standard-specifiers.xml
Normal file
@ -0,0 +1,32 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
|
||||
<!-- SPDX-License-Identifier: LGPL-2.1+ -->
|
||||
|
||||
<tbody>
|
||||
<row id='a'>
|
||||
<entry><literal>%a</literal></entry>
|
||||
<entry>Architecture</entry>
|
||||
<entry>A short string identifying the architecture of the local system. A string such as <constant>x86</constant>, <constant>x86-64</constant> or <constant>arm64</constant>. See the architectures defined for <varname>ConditionArchitecture=</varname> in <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry> for a full list.</entry>
|
||||
</row>
|
||||
<row id='B'>
|
||||
<entry><literal>%B</literal></entry>
|
||||
<entry>Operating system build ID</entry>
|
||||
<entry>The operating system build identifier of the running system, as read from the <varname>BUILD_ID=</varname> field of <filename>/etc/os-release</filename>. If not set, resolves to an empty string. See <citerefentry><refentrytitle>os-release</refentrytitle><manvolnum>5</manvolnum></citerefentry> for more information.</entry>
|
||||
</row>
|
||||
<row id='o'>
|
||||
<entry><literal>%o</literal></entry>
|
||||
<entry>Operating system ID</entry>
|
||||
<entry>The operating system identifier of the running system, as read from the <varname>ID=</varname> field of <filename>/etc/os-release</filename>. See <citerefentry><refentrytitle>os-release</refentrytitle><manvolnum>5</manvolnum></citerefentry> for more information.</entry>
|
||||
</row>
|
||||
<row id='w'>
|
||||
<entry><literal>%w</literal></entry>
|
||||
<entry>Operating system version ID</entry>
|
||||
<entry>The operating system version identifier of the running system, as read from the <varname>VERSION_ID=</varname> field of <filename>/etc/os-release</filename>. If not set, resolves to an empty string. See <citerefentry><refentrytitle>os-release</refentrytitle><manvolnum>5</manvolnum></citerefentry> for more information.</entry>
|
||||
</row>
|
||||
<row id='W'>
|
||||
<entry><literal>%W</literal></entry>
|
||||
<entry>Operating system variant ID</entry>
|
||||
<entry>The operating system variant identifier of the running system, as read from the <varname>VARIANT_ID=</varname> field of <filename>/etc/os-release</filename>. If not set, resolves to an empty string. See <citerefentry><refentrytitle>os-release</refentrytitle><manvolnum>5</manvolnum></citerefentry> for more information.</entry>
|
||||
</row>
|
||||
</tbody>
|
@ -3,7 +3,9 @@
|
||||
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
|
||||
<!-- SPDX-License-Identifier: LGPL-2.1+ -->
|
||||
|
||||
<refentry id="systemd.dnssd" conditional='ENABLE_RESOLVE'>
|
||||
<refentry id="systemd.dnssd"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||||
conditional='ENABLE_RESOLVE'>
|
||||
|
||||
<refentryinfo>
|
||||
<title>systemd.dnssd</title>
|
||||
@ -87,26 +89,31 @@
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry><literal>%m</literal></entry>
|
||||
<entry>Machine ID</entry>
|
||||
<entry>The machine ID of the running system, formatted as string. See <citerefentry><refentrytitle>machine-id</refentrytitle><manvolnum>5</manvolnum></citerefentry> for more information.</entry>
|
||||
</row>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="a"/>
|
||||
<row>
|
||||
<entry><literal>%b</literal></entry>
|
||||
<entry>Boot ID</entry>
|
||||
<entry>The boot ID of the running system, formatted as string. See <citerefentry><refentrytitle>random</refentrytitle><manvolnum>4</manvolnum></citerefentry> for more information.</entry>
|
||||
</row>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="B"/>
|
||||
<row>
|
||||
<entry><literal>%H</literal></entry>
|
||||
<entry>Host name</entry>
|
||||
<entry>The hostname of the running system.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><literal>%m</literal></entry>
|
||||
<entry>Machine ID</entry>
|
||||
<entry>The machine ID of the running system, formatted as string. See <citerefentry><refentrytitle>machine-id</refentrytitle><manvolnum>5</manvolnum></citerefentry> for more information.</entry>
|
||||
</row>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="o"/>
|
||||
<row>
|
||||
<entry><literal>%v</literal></entry>
|
||||
<entry>Kernel release</entry>
|
||||
<entry>Identical to <command>uname -r</command> output.</entry>
|
||||
</row>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="w"/>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="W"/>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
@ -6,7 +6,8 @@
|
||||
]>
|
||||
<!-- SPDX-License-Identifier: LGPL-2.1+ -->
|
||||
|
||||
<refentry id="systemd.unit">
|
||||
<refentry id="systemd.unit"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
|
||||
<refentryinfo>
|
||||
<title>systemd.unit</title>
|
||||
@ -1708,11 +1709,18 @@
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<!-- We do not use the common definition from standard-specifiers.xml here since it includes a reference onto our own man page, which would make the rendered version self-referential. -->
|
||||
<entry><literal>%a</literal></entry>
|
||||
<entry>Architecture</entry>
|
||||
<entry>A short string identifying the architecture of the local system. A string such as <constant>x86</constant>, <constant>x86-64</constant> or <constant>arm64</constant>. See the architectures defined for <varname>ConditionArchitecture=</varname> above for a full list.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><literal>%b</literal></entry>
|
||||
<entry>Boot ID</entry>
|
||||
<entry>The boot ID of the running system, formatted as string. See <citerefentry><refentrytitle>random</refentrytitle><manvolnum>4</manvolnum></citerefentry> for more information.</entry>
|
||||
</row>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="B"/>
|
||||
<row>
|
||||
<entry><literal>%C</literal></entry>
|
||||
<entry>Cache directory root</entry>
|
||||
@ -1770,6 +1778,7 @@ Note that this setting is <emphasis>not</emphasis> influenced by the <varname>Us
|
||||
<entry>Machine ID</entry>
|
||||
<entry>The machine ID of the running system, formatted as string. See <citerefentry><refentrytitle>machine-id</refentrytitle><manvolnum>5</manvolnum></citerefentry> for more information.</entry>
|
||||
</row>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="o"/>
|
||||
<row>
|
||||
<entry><literal>%n</literal></entry>
|
||||
<entry>Full unit name</entry>
|
||||
@ -1844,6 +1853,8 @@ Note that this setting is <emphasis>not</emphasis> influenced by the <varname>Us
|
||||
<entry>Directory for larger and persistent temporary files</entry>
|
||||
<entry>This is either <filename>/var/tmp</filename> or the path <literal>$TMPDIR</literal>, <literal>$TEMP</literal> or <literal>$TMP</literal> are set to.</entry>
|
||||
</row>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="w"/>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="W"/>
|
||||
<row>
|
||||
<entry><literal>%%</literal></entry>
|
||||
<entry>Single percent sign</entry>
|
||||
|
@ -251,11 +251,13 @@ r - 500-900
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="a"/>
|
||||
<row>
|
||||
<entry><literal>%b</literal></entry>
|
||||
<entry>Boot ID</entry>
|
||||
<entry>The boot ID of the running system, formatted as string. See <citerefentry><refentrytitle>random</refentrytitle><manvolnum>4</manvolnum></citerefentry> for more information.</entry>
|
||||
</row>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="B"/>
|
||||
<row>
|
||||
<entry><literal>%H</literal></entry>
|
||||
<entry>Host name</entry>
|
||||
@ -266,6 +268,7 @@ r - 500-900
|
||||
<entry>Machine ID</entry>
|
||||
<entry>The machine ID of the running system, formatted as string. See <citerefentry><refentrytitle>machine-id</refentrytitle><manvolnum>5</manvolnum></citerefentry> for more information.</entry>
|
||||
</row>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="o"/>
|
||||
<row>
|
||||
<entry><literal>%T</literal></entry>
|
||||
<entry>Directory for temporary files</entry>
|
||||
@ -281,6 +284,8 @@ r - 500-900
|
||||
<entry>Directory for larger and persistent temporary files</entry>
|
||||
<entry>This is either <filename>/var/tmp</filename> or the path <literal>$TMPDIR</literal>, <literal>$TEMP</literal> or <literal>$TMP</literal> are set to.</entry>
|
||||
</row>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="w"/>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="W"/>
|
||||
<row>
|
||||
<entry><literal>%%</literal></entry>
|
||||
<entry>Escaped <literal>%</literal></entry>
|
||||
|
@ -6,7 +6,8 @@
|
||||
|
||||
Copyright © 2010 Brandon Philips
|
||||
-->
|
||||
<refentry id="tmpfiles.d">
|
||||
<refentry id="tmpfiles.d"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
|
||||
<refentryinfo>
|
||||
<title>tmpfiles.d</title>
|
||||
@ -631,11 +632,13 @@ w- /proc/sys/vm/swappiness - - - - 10</programlisting></para>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="a"/>
|
||||
<row>
|
||||
<entry><literal>%b</literal></entry>
|
||||
<entry>Boot ID</entry>
|
||||
<entry>The boot ID of the running system, formatted as string. See <citerefentry><refentrytitle>random</refentrytitle><manvolnum>4</manvolnum></citerefentry> for more information.</entry>
|
||||
</row>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="B"/>
|
||||
<row>
|
||||
<entry><literal>%C</literal></entry>
|
||||
<entry>System or user cache directory</entry>
|
||||
@ -661,6 +664,7 @@ w- /proc/sys/vm/swappiness - - - - 10</programlisting></para>
|
||||
<entry>Machine ID</entry>
|
||||
<entry>The machine ID of the running system, formatted as string. See <citerefentry><refentrytitle>machine-id</refentrytitle><manvolnum>5</manvolnum></citerefentry> for more information.</entry>
|
||||
</row>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="o"/>
|
||||
<row>
|
||||
<entry><literal>%S</literal></entry>
|
||||
<entry>System or user state directory</entry>
|
||||
@ -706,6 +710,8 @@ w- /proc/sys/vm/swappiness - - - - 10</programlisting></para>
|
||||
<entry>Directory for larger and persistent temporary files</entry>
|
||||
<entry>This is either <filename>/var/tmp</filename> or the path <literal>$TMPDIR</literal>, <literal>$TEMP</literal> or <literal>$TMP</literal> are set to.</entry>
|
||||
</row>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="w"/>
|
||||
<xi:include href="standard-specifiers.xml" xpointer="W"/>
|
||||
<row>
|
||||
<entry><literal>%%</literal></entry>
|
||||
<entry>Escaped <literal>%</literal></entry>
|
||||
|
@ -186,8 +186,14 @@ int unit_name_printf(const Unit *u, const char* format, char **ret) {
|
||||
* %u: the username of the running user
|
||||
*
|
||||
* %m: the machine ID of the running system
|
||||
* %H: the hostname of the running system
|
||||
* %b: the boot ID of the running system
|
||||
* %H: the hostname of the running system
|
||||
* %v: the kernel version
|
||||
* %a: the native userspace architecture
|
||||
* %o: the OS ID according to /etc/os-release
|
||||
* %w: the OS version ID, according to /etc/os-release
|
||||
* %B: the OS build ID, according to /etc/os-release
|
||||
* %W: the OS variant ID, according to /etc/os-release
|
||||
*/
|
||||
|
||||
const Specifier table[] = {
|
||||
@ -203,8 +209,14 @@ int unit_name_printf(const Unit *u, const char* format, char **ret) {
|
||||
{ 'u', specifier_user_name, NULL },
|
||||
|
||||
{ 'm', specifier_machine_id, NULL },
|
||||
{ 'H', specifier_host_name, NULL },
|
||||
{ 'b', specifier_boot_id, NULL },
|
||||
{ 'H', specifier_host_name, NULL },
|
||||
{ 'v', specifier_kernel_release, NULL },
|
||||
{ 'a', specifier_architecture, NULL },
|
||||
{ 'o', specifier_os_id, NULL },
|
||||
{ 'w', specifier_os_version_id, NULL },
|
||||
{ 'B', specifier_os_build_id, NULL },
|
||||
{ 'W', specifier_os_variant_id, NULL },
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -218,10 +218,15 @@ int config_parse_search_domains(
|
||||
|
||||
int config_parse_dnssd_service_name(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) {
|
||||
static const Specifier specifier_table[] = {
|
||||
{ 'm', specifier_machine_id, NULL },
|
||||
{ 'b', specifier_boot_id, NULL },
|
||||
{ 'H', specifier_host_name, NULL },
|
||||
{ 'm', specifier_machine_id, NULL },
|
||||
{ 'v', specifier_kernel_release, NULL },
|
||||
{ 'a', specifier_architecture, NULL },
|
||||
{ 'o', specifier_os_id, NULL },
|
||||
{ 'w', specifier_os_version_id, NULL },
|
||||
{ 'B', specifier_os_build_id, NULL },
|
||||
{ 'W', specifier_os_variant_id, NULL },
|
||||
{}
|
||||
};
|
||||
DnssdService *s = userdata;
|
||||
|
@ -153,10 +153,15 @@ static int specifier_dnssd_host_name(char specifier, const void *data, const voi
|
||||
|
||||
int dnssd_render_instance_name(DnssdService *s, char **ret_name) {
|
||||
static const Specifier specifier_table[] = {
|
||||
{ 'm', specifier_machine_id, NULL },
|
||||
{ 'b', specifier_boot_id, NULL },
|
||||
{ 'H', specifier_dnssd_host_name, NULL },
|
||||
{ 'm', specifier_machine_id, NULL },
|
||||
{ 'v', specifier_kernel_release, NULL },
|
||||
{ 'a', specifier_architecture, NULL },
|
||||
{ 'o', specifier_os_id, NULL },
|
||||
{ 'w', specifier_os_version_id, NULL },
|
||||
{ 'B', specifier_os_build_id, NULL },
|
||||
{ 'W', specifier_os_variant_id, NULL },
|
||||
{}
|
||||
};
|
||||
_cleanup_free_ char *name = NULL;
|
||||
|
@ -133,9 +133,14 @@ int install_full_printf(const UnitFileInstallInfo *i, const char *format, char *
|
||||
{ 'u', specifier_user_name, NULL },
|
||||
|
||||
{ 'm', specifier_machine_id, NULL },
|
||||
{ 'H', specifier_host_name, NULL },
|
||||
{ 'b', specifier_boot_id, NULL },
|
||||
{ 'H', specifier_host_name, NULL },
|
||||
{ 'v', specifier_kernel_release, NULL },
|
||||
{ 'a', specifier_architecture, NULL },
|
||||
{ 'o', specifier_os_id, NULL },
|
||||
{ 'w', specifier_os_version_id, NULL },
|
||||
{ 'B', specifier_os_build_id, NULL },
|
||||
{ 'W', specifier_os_variant_id, NULL },
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -9,10 +9,12 @@
|
||||
#include "sd-id128.h"
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "architecture.h"
|
||||
#include "format-util.h"
|
||||
#include "fs-util.h"
|
||||
#include "hostname-util.h"
|
||||
#include "macro.h"
|
||||
#include "os-util.h"
|
||||
#include "specifier.h"
|
||||
#include "string-util.h"
|
||||
#include "strv.h"
|
||||
@ -175,6 +177,52 @@ int specifier_kernel_release(char specifier, const void *data, const void *userd
|
||||
return 0;
|
||||
}
|
||||
|
||||
int specifier_architecture(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
char *t;
|
||||
|
||||
t = strdup(architecture_to_string(uname_architecture()));
|
||||
if (!t)
|
||||
return -ENOMEM;
|
||||
|
||||
*ret = t;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int specifier_os_release_common(const char *field, char **ret) {
|
||||
char *t = NULL;
|
||||
int r;
|
||||
|
||||
r = parse_os_release(NULL, field, &t, NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (!t) {
|
||||
/* fields in /etc/os-release might quite possibly be missing, even if everything is entirely
|
||||
* valid otherwise. Let's hence return "" in that case. */
|
||||
t = strdup("");
|
||||
if (!t)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
*ret = t;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int specifier_os_id(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
return specifier_os_release_common("ID", ret);
|
||||
}
|
||||
|
||||
int specifier_os_version_id(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
return specifier_os_release_common("VERSION_ID", ret);
|
||||
}
|
||||
|
||||
int specifier_os_build_id(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
return specifier_os_release_common("BUILD_ID", ret);
|
||||
}
|
||||
|
||||
int specifier_os_variant_id(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
return specifier_os_release_common("VARIANT_ID", ret);
|
||||
}
|
||||
|
||||
int specifier_group_name(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
char *t;
|
||||
|
||||
|
@ -19,6 +19,11 @@ int specifier_machine_id(char specifier, const void *data, const void *userdata,
|
||||
int specifier_boot_id(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_host_name(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_kernel_release(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_architecture(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_os_id(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_os_version_id(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_os_build_id(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_os_variant_id(char specifier, const void *data, const void *userdata, char **ret);
|
||||
|
||||
int specifier_group_name(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_group_id(char specifier, const void *data, const void *userdata, char **ret);
|
||||
|
@ -1393,6 +1393,11 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
|
||||
{ 'b', specifier_boot_id, NULL },
|
||||
{ 'H', specifier_host_name, NULL },
|
||||
{ 'v', specifier_kernel_release, NULL },
|
||||
{ 'a', specifier_architecture, NULL },
|
||||
{ 'o', specifier_os_id, NULL },
|
||||
{ 'w', specifier_os_version_id, NULL },
|
||||
{ 'B', specifier_os_build_id, NULL },
|
||||
{ 'W', specifier_os_variant_id, NULL },
|
||||
{ 'T', specifier_tmp_dir, NULL },
|
||||
{ 'V', specifier_var_tmp_dir, NULL },
|
||||
{}
|
||||
|
@ -9,12 +9,17 @@
|
||||
|
||||
static void test_specifier_printf(void) {
|
||||
static const Specifier table[] = {
|
||||
{ 'a', specifier_string, (char*) "AAAA" },
|
||||
{ 'b', specifier_string, (char*) "BBBB" },
|
||||
{ 'm', specifier_machine_id, NULL },
|
||||
{ 'B', specifier_boot_id, NULL },
|
||||
{ 'H', specifier_host_name, NULL },
|
||||
{ 'X', specifier_string, (char*) "AAAA" },
|
||||
{ 'Y', specifier_string, (char*) "BBBB" },
|
||||
{ 'm', specifier_machine_id, NULL },
|
||||
{ 'b', specifier_boot_id, NULL },
|
||||
{ 'H', specifier_host_name, NULL },
|
||||
{ 'v', specifier_kernel_release, NULL },
|
||||
{ 'a', specifier_architecture, NULL },
|
||||
{ 'o', specifier_os_id, NULL },
|
||||
{ 'w', specifier_os_version_id, NULL },
|
||||
{ 'B', specifier_os_build_id, NULL },
|
||||
{ 'W', specifier_os_variant_id, NULL },
|
||||
{}
|
||||
};
|
||||
|
||||
@ -23,7 +28,7 @@ static void test_specifier_printf(void) {
|
||||
|
||||
log_info("/* %s */", __func__);
|
||||
|
||||
r = specifier_printf("xxx a=%a b=%b yyy", table, NULL, &w);
|
||||
r = specifier_printf("xxx a=%X b=%Y yyy", table, NULL, &w);
|
||||
assert_se(r >= 0);
|
||||
assert_se(w);
|
||||
|
||||
@ -31,10 +36,15 @@ static void test_specifier_printf(void) {
|
||||
assert_se(streq(w, "xxx a=AAAA b=BBBB yyy"));
|
||||
|
||||
free(w);
|
||||
r = specifier_printf("machine=%m, boot=%B, host=%H, version=%v", table, NULL, &w);
|
||||
r = specifier_printf("machine=%m, boot=%b, host=%H, version=%v, arch=%a", table, NULL, &w);
|
||||
assert_se(r >= 0);
|
||||
assert_se(w);
|
||||
puts(w);
|
||||
|
||||
w = mfree(w);
|
||||
specifier_printf("os=%o, os-version=%w, build=%B, variant=%W", table, NULL, &w);
|
||||
if (w)
|
||||
puts(w);
|
||||
}
|
||||
|
||||
static void test_str_in_set(void) {
|
||||
|
@ -185,6 +185,11 @@ static const Specifier specifier_table[] = {
|
||||
{ 'b', specifier_boot_id, NULL },
|
||||
{ 'H', specifier_host_name, NULL },
|
||||
{ 'v', specifier_kernel_release, NULL },
|
||||
{ 'a', specifier_architecture, NULL },
|
||||
{ 'o', specifier_os_id, NULL },
|
||||
{ 'w', specifier_os_version_id, NULL },
|
||||
{ 'B', specifier_os_build_id, NULL },
|
||||
{ 'W', specifier_os_variant_id, NULL },
|
||||
|
||||
{ 'g', specifier_group_name, NULL },
|
||||
{ 'G', specifier_group_id, NULL },
|
||||
|
Loading…
Reference in New Issue
Block a user