1
0
mirror of https://github.com/systemd/systemd synced 2025-09-26 23:34:44 +02:00

Compare commits

..

No commits in common. "b9cbb08e0a35070d57721cd5bf810659a0b80f5e" and "e6ce785d611702532ae71547e78fbb49eff3aded" have entirely different histories.

13 changed files with 200 additions and 218 deletions

9
NEWS
View File

@ -457,7 +457,9 @@ CHANGES WITH 247 in spe:
discipline in the [FlowQueuePIE] sections. discipline in the [FlowQueuePIE] sections.
* systemd-networkd's .netdev files may now be used to create "BareUDP" * systemd-networkd's .netdev files may now be used to create "BareUDP"
tunnels, configured in the new [BareUDP] setting. tunnels, configured in the new [BareUDP] setting. VXLAN tunnels may
now be marked to be independent of any underlying network interface
via the new Independent= boolean setting.
* systemd-networkd's Gateway= setting in .network files now accepts the * systemd-networkd's Gateway= setting in .network files now accepts the
special values "_dhcp4" and "_ipv6ra" to configure additional, special values "_dhcp4" and "_ipv6ra" to configure additional,
@ -480,8 +482,9 @@ CHANGES WITH 247 in spe:
prefix will be announced through IPv6 router advertisement (IPv6 RA). prefix will be announced through IPv6 router advertisement (IPv6 RA).
The setting is enabled by default. The setting is enabled by default.
* VXLAN tunnels may now be marked as independent of any underlying * systemd-networkd's .netdev files gained the Independent= boolean
network interface via the new Independent= boolean setting. setting in [VXLAN] section. When enabled, the vxlan interface will be
created without underlying interfaces. Defaults to false.
* systemctl gained support for two new verbs: "service-log-level" and * systemctl gained support for two new verbs: "service-log-level" and
"service-log-target" may be used on services that implement the "service-log-target" may be used on services that implement the

View File

@ -84,7 +84,7 @@
</row></thead> </row></thead>
<tbody> <tbody>
<row><entry><varname>bond</varname></entry> <row><entry><varname>bond</varname></entry>
<entry>A bond device is an aggregation of all its slave devices. See <ulink url="https://www.kernel.org/doc/Documentation/networking/bonding.txt">Linux Ethernet Bonding Driver HOWTO</ulink> for details.</entry></row> <entry>A bond device is an aggregation of all its slave devices. See <ulink url="https://www.kernel.org/doc/Documentation/networking/bonding.txt">Linux Ethernet Bonding Driver HOWTO</ulink> for details.Local configuration</entry></row>
<row><entry><varname>bridge</varname></entry> <row><entry><varname>bridge</varname></entry>
<entry>A bridge device is a software switch, and each of its slave devices and the bridge itself are ports of the switch.</entry></row> <entry>A bridge device is a software switch, and each of its slave devices and the bridge itself are ports of the switch.</entry></row>
@ -754,8 +754,7 @@
<varlistentry> <varlistentry>
<term><varname>Id=</varname></term> <term><varname>Id=</varname></term>
<listitem> <listitem>
<para>Specifies the Virtual Network Identifier (VNI) to use, a number between 0 and 16777215. This <para>Specifies the Virtual Network Identifier (VNI) to use. Ranges [0-16777215]. This field is mandatory.</para>
field is mandatory.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
@ -767,7 +766,7 @@
<varlistentry> <varlistentry>
<term><varname>TOS=</varname></term> <term><varname>TOS=</varname></term>
<listitem> <listitem>
<para>Specifies the TOS value to use in outgoing packets. Takes a number between 1 and 255.</para> <para>Specifies the TOS value to use in outgoing packets. Ranges [1-255].</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
@ -819,9 +818,8 @@
<varlistentry> <varlistentry>
<term><varname>Independent=</varname></term> <term><varname>Independent=</varname></term>
<listitem> <listitem>
<para>Takes a boolean. When true, the vxlan interface is created without any underlying network <para>Takes a boolean. When true, the vxlan interface is created without underlying interfaces.
interface. Defaults to false, which means that a .network file that requests this tunnel using Defaults to <literal>false</literal>.</para>
<varname>Tunnel=</varname> is required for the tunnel to be created.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
</variablelist> </variablelist>
@ -1278,10 +1276,9 @@
<varlistentry> <varlistentry>
<term><varname>Independent=</varname></term> <term><varname>Independent=</varname></term>
<listitem> <listitem>
<para>Takes a boolean. When false (the default), the tunnel is always created over some network <para>Takes a boolean. When true tunnel does not require .network file. Created as "tunnel@NONE".
device, and a .network file that requests this tunnel using <varname>Tunnel=</varname> is required Defaults to <literal>false</literal>.
for the tunnel to be created. When true, the tunnel is created independently of any network as </para>
"tunnel@NONE".</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
@ -1773,8 +1770,8 @@
<varlistentry> <varlistentry>
<term><varname>AdActorSystem=</varname></term> <term><varname>AdActorSystem=</varname></term>
<listitem> <listitem>
<para>Specifies the 802.3ad system MAC address. This cannot be a null or multicast address. <para>Specifies the 802.3ad system mac address. This can not be either
</para> <constant>NULL</constant> or <constant>Multicast</constant>.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -1951,8 +1948,10 @@
<varlistentry> <varlistentry>
<term><varname>Independent=</varname></term> <term><varname>Independent=</varname></term>
<listitem> <listitem>
<para>Takes a boolean. If false (the default), the xfrm interface must have an underlying device <para>Takes a boolean. If set to <literal>no</literal>, the xfrm interface should have an
which can be used for hardware offloading.</para> underlying device which can be used for hardware offloading. Defaults to <literal>no</literal>.
See <citerefentry><refentrytitle>systemd.network</refentrytitle><manvolnum>5</manvolnum></citerefentry>
for how to configure the underlying device.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
</variablelist> </variablelist>

View File

@ -1594,7 +1594,6 @@ generate_gperfs = find_program('tools/generate-gperfs.py')
subdir('po') subdir('po')
subdir('catalog') subdir('catalog')
subdir('src/libudev')
subdir('src/systemd') subdir('src/systemd')
subdir('src/basic') subdir('src/basic')
subdir('src/libsystemd') subdir('src/libsystemd')
@ -1674,6 +1673,7 @@ update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
# usually, but not always, installed in /bin. # usually, but not always, installed in /bin.
public_programs = [] public_programs = []
subdir('src/libudev')
subdir('src/shared') subdir('src/shared')
subdir('src/core') subdir('src/core')
subdir('src/shutdown') subdir('src/shutdown')

View File

@ -468,10 +468,6 @@ int device_new_from_nulstr(sd_device **ret, uint8_t *nulstr, size_t len) {
i += end - key + 1; i += end - key + 1;
/* netlink messages for some devices contain an unwanted newline at the end of value.
* Let's drop the newline and remaining characters after the newline. */
truncate_nl(key);
r = device_append(device, key, &major, &minor); r = device_append(device, key, &major, &minor);
if (r < 0) if (r < 0)
return r; return r;

View File

@ -469,7 +469,7 @@ int config_parse_ad_actor_system(
} }
if (ether_addr_is_null(&n) || (n.ether_addr_octet[0] & 0x01)) { if (ether_addr_is_null(&n) || (n.ether_addr_octet[0] & 0x01)) {
log_syntax(unit, LOG_WARNING, filename, line, 0, log_syntax(unit, LOG_WARNING, filename, line, 0,
"Not an appropriate MAC address %s, cannot be null or multicast. Ignoring assignment.", "Not a valid MAC address %s, can not be null or multicast. Ignoring assignment.",
rvalue); rvalue);
return 0; return 0;
} }

View File

@ -649,7 +649,7 @@ int netdev_join(NetDev *netdev, Link *link, link_netlink_message_handler_t callb
return r; return r;
break; break;
default: default:
assert_not_reached("Cannot join independent netdev"); assert_not_reached("Can not join independent netdev");
} }
return 0; return 0;

View File

@ -1795,7 +1795,6 @@ static int bus_method_register_service(sd_bus_message *message, void *userdata,
_cleanup_(dnssd_service_freep) DnssdService *service = NULL; _cleanup_(dnssd_service_freep) DnssdService *service = NULL;
_cleanup_(sd_bus_track_unrefp) sd_bus_track *bus_track = NULL; _cleanup_(sd_bus_track_unrefp) sd_bus_track *bus_track = NULL;
_cleanup_free_ char *path = NULL; _cleanup_free_ char *path = NULL;
_cleanup_free_ char *instance_name = NULL;
Manager *m = userdata; Manager *m = userdata;
DnssdService *s = NULL; DnssdService *s = NULL;
const char *name; const char *name;
@ -1836,6 +1835,10 @@ static int bus_method_register_service(sd_bus_message *message, void *userdata,
if (!dnssd_srv_type_is_valid(type)) if (!dnssd_srv_type_is_valid(type))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "DNS-SD service type '%s' is invalid", type); return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "DNS-SD service type '%s' is invalid", type);
r = dnssd_render_instance_name(name_template, NULL);
if (r < 0)
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "DNS-SD service name '%s' is invalid", name_template);
service->name = strdup(name); service->name = strdup(name);
if (!service->name) if (!service->name)
return log_oom(); return log_oom();
@ -1848,10 +1851,6 @@ static int bus_method_register_service(sd_bus_message *message, void *userdata,
if (!service->type) if (!service->type)
return log_oom(); return log_oom();
r = dnssd_render_instance_name(service, &instance_name);
if (r < 0)
return r;
r = sd_bus_message_enter_container(message, SD_BUS_TYPE_ARRAY, "a{say}"); r = sd_bus_message_enter_container(message, SD_BUS_TYPE_ARRAY, "a{say}");
if (r < 0) if (r < 0)
return r; return r;

View File

@ -217,21 +217,19 @@ int config_parse_search_domains(
return 0; return 0;
} }
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) { int config_parse_dnssd_service_name(
static const Specifier specifier_table[] = { const char *unit,
{ 'm', specifier_machine_id, NULL }, const char *filename,
{ 'b', specifier_boot_id, NULL }, unsigned line,
{ 'H', specifier_host_name, NULL }, const char *section,
{ 'v', specifier_kernel_release, NULL }, unsigned section_line,
{ 'a', specifier_architecture, NULL }, const char *lvalue,
{ 'o', specifier_os_id, NULL }, int ltype,
{ 'w', specifier_os_version_id, NULL }, const char *rvalue,
{ 'B', specifier_os_build_id, NULL }, void *data,
{ 'W', specifier_os_variant_id, NULL }, void *userdata) {
{}
};
DnssdService *s = userdata; DnssdService *s = userdata;
_cleanup_free_ char *name = NULL;
int r; int r;
assert(filename); assert(filename);
@ -240,23 +238,23 @@ int config_parse_dnssd_service_name(const char *unit, const char *filename, unsi
assert(s); assert(s);
if (isempty(rvalue)) { if (isempty(rvalue)) {
log_syntax(unit, LOG_ERR, filename, line, 0, "Service instance name can't be empty. Ignoring."); s->name_template = mfree(s->name_template);
return -EINVAL; return 0;
}
r = dnssd_render_instance_name(rvalue, NULL);
if (r == -ENOMEM)
return log_oom();
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Invalid service instance name template '%s', ignoring: %m", rvalue);
return 0;
} }
r = free_and_strdup(&s->name_template, rvalue); r = free_and_strdup(&s->name_template, rvalue);
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
r = specifier_printf(s->name_template, specifier_table, NULL, &name);
if (r < 0)
return log_debug_errno(r, "Failed to replace specifiers: %m");
if (!dns_service_name_is_valid(name)) {
log_syntax(unit, LOG_ERR, filename, line, 0, "Service instance name template renders to invalid name '%s'. Ignoring.", name);
return -EINVAL;
}
return 0; return 0;
} }

View File

@ -155,7 +155,7 @@ static int specifier_dnssd_host_name(char specifier, const void *data, const voi
return 0; return 0;
} }
int dnssd_render_instance_name(DnssdService *s, char **ret_name) { int dnssd_render_instance_name(const char *name_template, char **ret_name) {
static const Specifier specifier_table[] = { static const Specifier specifier_table[] = {
{ 'm', specifier_machine_id, NULL }, { 'm', specifier_machine_id, NULL },
{ 'b', specifier_boot_id, NULL }, { 'b', specifier_boot_id, NULL },
@ -171,18 +171,16 @@ int dnssd_render_instance_name(DnssdService *s, char **ret_name) {
_cleanup_free_ char *name = NULL; _cleanup_free_ char *name = NULL;
int r; int r;
assert(s); assert(name_template);
assert(s->name_template);
r = specifier_printf(s->name_template, specifier_table, s, &name); r = specifier_printf(name_template, specifier_table, NULL, &name);
if (r < 0) if (r < 0)
return log_debug_errno(r, "Failed to replace specifiers: %m"); return r;
if (!dns_service_name_is_valid(name)) if (!dns_service_name_is_valid(name))
return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), return -EINVAL;
"Service instance name '%s' is invalid.",
name);
if (ret_name)
*ret_name = TAKE_PTR(name); *ret_name = TAKE_PTR(name);
return 0; return 0;
@ -227,7 +225,7 @@ int dnssd_update_rrs(DnssdService *s) {
LIST_FOREACH(items, txt_data, s->txt_data_items) LIST_FOREACH(items, txt_data, s->txt_data_items)
txt_data->rr = dns_resource_record_unref(txt_data->rr); txt_data->rr = dns_resource_record_unref(txt_data->rr);
r = dnssd_render_instance_name(s, &n); r = dnssd_render_instance_name(s->name_template, &n);
if (r < 0) if (r < 0)
return r; return r;

View File

@ -53,7 +53,7 @@ DnssdTxtData *dnssd_txtdata_free_all(DnssdTxtData *txt_data);
DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdService*, dnssd_service_free); DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdService*, dnssd_service_free);
DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdTxtData*, dnssd_txtdata_free); DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdTxtData*, dnssd_txtdata_free);
int dnssd_render_instance_name(DnssdService *s, char **ret_name); int dnssd_render_instance_name(const char *name_template, char **ret_name);
int dnssd_load(Manager *manager); int dnssd_load(Manager *manager);
int dnssd_txt_item_new_from_string(const char *key, const char *value, DnsTxtItem **ret_item); int dnssd_txt_item_new_from_string(const char *key, const char *value, DnsTxtItem **ret_item);
int dnssd_txt_item_new_from_data(const char *key, const void *value, const size_t size, DnsTxtItem **ret_item); int dnssd_txt_item_new_from_data(const char *key, const void *value, const size_t size, DnsTxtItem **ret_item);

View File

@ -64,12 +64,9 @@ if add_languages('cpp', required : false)
if cxx.has_argument('-std=c++17') if cxx.has_argument('-std=c++17')
opts += [['c++', '-std=c++17']] opts += [['c++', '-std=c++17']]
endif endif
if cxx.has_argument('-std=c++20')
opts += [['c++', '-std=c++20']]
endif
endif endif
foreach header : _systemd_headers + _not_installed_headers + [libudev_h_path] foreach header : _systemd_headers + _not_installed_headers + ['../libudev/libudev.h']
foreach opt : opts foreach opt : opts
std_name = opt.length() == 2 ? '_'.join(opt[1].split(':')) : '' std_name = opt.length() == 2 ? '_'.join(opt[1].split(':')) : ''
name = ''.join(['cc-', header.split('/')[-1], '_', opt[0], std_name]) name = ''.join(['cc-', header.split('/')[-1], '_', opt[0], std_name])

View File

@ -18,19 +18,11 @@
use warnings; use warnings;
use strict; use strict;
use POSIX qw(WIFEXITED WEXITSTATUS);
BEGIN { use IPC::SysV qw(IPC_PRIVATE S_IRUSR S_IWUSR IPC_CREAT);
my $EXIT_TEST_SKIP = 77; use IPC::Semaphore;
use Time::HiRes qw(usleep);
unless (eval "use POSIX qw(WIFEXITED WEXITSTATUS); use Cwd qw(getcwd abs_path);
use Cwd qw(getcwd abs_path);
use IPC::Semaphore;
use IPC::SysV qw(IPC_PRIVATE S_IRUSR S_IWUSR IPC_CREAT);
use Time::HiRes qw(usleep); 1") {
warn "Failed to import dependencies, skipping the test: $@";
exit($EXIT_TEST_SKIP);
}
}
my $udev_bin = "./test-udev"; my $udev_bin = "./test-udev";
my $valgrind = 0; my $valgrind = 0;