int config_parse_dnssd_service_type(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) { DnssdService *s = userdata; int r; assert(filename); assert(lvalue); assert(rvalue); assert(s); if (isempty(rvalue)) { log_syntax(unit, LOG_ERR, filename, line, 0, "Service type can't be empty. Ignoring."); return -EINVAL; } if (!dnssd_srv_type_is_valid(rvalue)) { log_syntax(unit, LOG_ERR, filename, line, 0, "Service type is invalid. Ignoring."); return -EINVAL; } r = free_and_strdup(&s->type, rvalue); if (r < 0) return log_oom(); return 0; }
static void test_dnssd_srv_type_is_valid(void) { assert_se(dnssd_srv_type_is_valid("_http._tcp")); assert_se(dnssd_srv_type_is_valid("_foo-bar._tcp")); assert_se(dnssd_srv_type_is_valid("_w._udp")); assert_se(dnssd_srv_type_is_valid("_a800._tcp")); assert_se(dnssd_srv_type_is_valid("_a-800._tcp")); assert_se(!dnssd_srv_type_is_valid(NULL)); assert_se(!dnssd_srv_type_is_valid("")); assert_se(!dnssd_srv_type_is_valid("x")); assert_se(!dnssd_srv_type_is_valid("_foo")); assert_se(!dnssd_srv_type_is_valid("_tcp")); assert_se(!dnssd_srv_type_is_valid("_")); assert_se(!dnssd_srv_type_is_valid("_foo.")); assert_se(!dnssd_srv_type_is_valid("_föo._tcp")); assert_se(!dnssd_srv_type_is_valid("_f\no._tcp")); assert_se(!dnssd_srv_type_is_valid("_800._tcp")); assert_se(!dnssd_srv_type_is_valid("_-800._tcp")); assert_se(!dnssd_srv_type_is_valid("_-foo._tcp")); assert_se(!dnssd_srv_type_is_valid("_piep._foo._udp")); assert_se(!dnssd_srv_type_is_valid("_foo._unknown")); }