static void test_dns_service_name_is_valid(void) { assert_se(dns_service_name_is_valid("Lennart's CompĆ¼ter")); assert_se(dns_service_name_is_valid("piff.paff")); assert_se(!dns_service_name_is_valid(NULL)); assert_se(!dns_service_name_is_valid("")); assert_se(!dns_service_name_is_valid("foo\nbar")); assert_se(!dns_service_name_is_valid("foo\201bar")); assert_se(!dns_service_name_is_valid("this is an overly long string that is certainly longer than 63 characters")); }
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[] = { { 'b', specifier_boot_id, NULL }, { 'H', specifier_host_name, NULL }, { 'm', specifier_machine_id, NULL }, { 'v', specifier_kernel_release, NULL }, {} }; DnssdService *s = userdata; _cleanup_free_ char *name = NULL; int r; assert(filename); assert(lvalue); assert(rvalue); assert(s); if (isempty(rvalue)) { log_syntax(unit, LOG_ERR, filename, line, 0, "Service instance name can't be empty. Ignoring."); return -EINVAL; } r = free_and_strdup(&s->name_template, rvalue); if (r < 0) 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; }