From: Paul Fertser Date: Tue, 11 Feb 2025 13:33:15 +0000 (+0000) Subject: socket: resolve unit specifiers in BindToDevice X-Git-Tag: v258-rc1~1358 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a3aad16c6e662b0ed54e4281aa710f5ece812e39;p=thirdparty%2Fsystemd.git socket: resolve unit specifiers in BindToDevice There are cases where templated Socket unit files are used for network services with interface name used as an instance. This patch allows using %i for BindToDevice setting to limit the scope automatically. --- diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index fe60f272597..a5b9f9eca9a 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -1091,7 +1091,9 @@ int config_parse_socket_bindtodevice( void *data, void *userdata) { + _cleanup_free_ char *p = NULL; Socket *s = ASSERT_PTR(data); + int r; assert(filename); assert(lvalue); @@ -1102,12 +1104,18 @@ int config_parse_socket_bindtodevice( return 0; } - if (!ifname_valid(rvalue)) { - log_syntax(unit, LOG_WARNING, filename, line, 0, "Invalid interface name, ignoring: %s", rvalue); + r = unit_full_printf(UNIT(s), rvalue, &p); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", rvalue); + return 0; + } + + if (!ifname_valid(p)) { + log_syntax(unit, LOG_WARNING, filename, line, 0, "Invalid interface name, ignoring: %s", p); return 0; } - return free_and_strdup_warn(&s->bind_to_device, rvalue); + return free_and_replace(s->bind_to_device, p); } int config_parse_exec_input(