diff --git a/src/confd/src/services.c b/src/confd/src/services.c index 997eac88..0f487f13 100644 --- a/src/confd/src/services.c +++ b/src/confd/src/services.c @@ -340,12 +340,20 @@ static void fput_list(FILE *fp, struct lyd_node *cfg, const char *list, const ch #define AVAHI_CONF "/etc/avahi/avahi-daemon.conf" -static void mdns_conf(struct lyd_node *cfg) +static void mdns_conf(struct confd *confd, struct lyd_node *cfg) { - const char *hostname = fgetkey("/etc/os-release", "DEFAULT_HOSTNAME"); + char hname[HOST_NAME_MAX + 1]; + const char *hostname; + const char *fmt; struct lyd_node *ctx; FILE *fp; + fmt = lydx_get_cattr(cfg, "hostname"); /* "%h" when unset (YANG default) */ + if (!hostnamefmt(confd, fmt, hname, sizeof(hname), NULL, 0)) + hostname = hname; + else + hostname = fgetkey("/etc/os-release", "DEFAULT_HOSTNAME"); + fp = fopen(AVAHI_CONF, "w"); if (!fp) { ERRNO("failed creating %s", AVAHI_CONF); @@ -424,7 +432,7 @@ static int mdns_change(sr_session_ctx_t *session, struct lyd_node *config, struc ena = lydx_is_enabled(srv, "enabled"); if (ena) { /* Generate/update avahi-daemon.conf */ - mdns_conf(srv); + mdns_conf(confd, srv); /* Generate/update basic mDNS service records */ mdns_records(MDNS_UPDATE, all); diff --git a/src/confd/src/system.c b/src/confd/src/system.c index 7d9a7e8c..9af3327c 100644 --- a/src/confd/src/system.c +++ b/src/confd/src/system.c @@ -1540,27 +1540,33 @@ static char *get_mac(struct confd *confd, char *mac, size_t len) int hostnamefmt(struct confd *confd, const char *fmt, char *hostnm, size_t hostlen, char *domain, size_t domlen) { + char buf[HOST_NAME_MAX + 1]; char mac[10]; - char *ptr; + char *f, *ptr; size_t i; if (!fmt || !*fmt) return -1; + strlcpy(buf, fmt, sizeof(buf)); + f = buf; + memset(hostnm, 0, hostlen); if (domain) memset(domain, 0, domlen); - ptr = strchr(fmt, '.'); + ptr = strchr(f, '.'); if (ptr) { *ptr++ = 0; if (domain) strlcpy(domain, ptr, domlen); } - for (i = 0; i < strlen(fmt); i++) { - if (fmt[i] == '%') { - switch (fmt[++i]) { + for (i = 0; i < strlen(f); i++) { + if (f[i] == '%') { + if (f[++i] == '\0') + break; + switch (f[i]) { case 'i': strlcat(hostnm, id, hostlen); break; @@ -1577,7 +1583,7 @@ int hostnamefmt(struct confd *confd, const char *fmt, char *hostnm, size_t hostl break; /* Unknown, skip */ } } else { - char ch[2] = { fmt[i], 0 }; + char ch[2] = { f[i], 0 }; strlcat(hostnm, ch, hostlen); } } diff --git a/src/confd/yang/confd.inc b/src/confd/yang/confd.inc index 74d4e8a6..2b237e08 100644 --- a/src/confd/yang/confd.inc +++ b/src/confd/yang/confd.inc @@ -43,7 +43,7 @@ MODULES=( "infix-firewall-icmp-types@2025-04-26.yang" "infix-meta@2025-12-10.yang" "infix-system@2026-03-09.yang" - "infix-services@2025-12-10.yang" + "infix-services@2026-03-03.yang" "ieee802-ethernet-interface@2019-06-21.yang" "infix-ethernet-interface@2024-02-27.yang" "infix-factory-default@2023-06-28.yang" diff --git a/src/confd/yang/confd/infix-services.yang b/src/confd/yang/confd/infix-services.yang index a08135ac..11d13643 100644 --- a/src/confd/yang/confd/infix-services.yang +++ b/src/confd/yang/confd/infix-services.yang @@ -16,6 +16,9 @@ module infix-services { reference "RFC 9640: YANG Data Types and Groupings for Cryptography"; } + import infix-system { + prefix infix-sys; + } import ietf-keystore { prefix ks; @@ -25,6 +28,10 @@ module infix-services { contact "kernelkit@googlegroups.com"; description "Infix services, generic."; + revision 2026-03-03 { + description "Add hostname leaf to mdns container for avahi host-name override."; + reference "internal"; + } revision 2025-12-10 { description "Adapt to changes in final version of ietf-keystore"; reference "internal"; @@ -80,6 +87,18 @@ module infix-services { type inet:domain-name; } + leaf hostname { + description "Hostname for mDNS A/AAAA records (avahi host-name setting). + + When not set the default is the build-time branding hostname. + Supports the same format specifiers as /system/hostname: + %h Default hostname (DEFAULT_HOSTNAME from os-release) + %i OS ID from os-release + %m Last three octets of base MAC (e.g. c0-ff-ee)"; + type infix-sys:hostname; + default "%h"; + } + container interfaces { description "Filter interfaces to act on."; diff --git a/src/confd/yang/confd/infix-services@2025-12-10.yang b/src/confd/yang/confd/infix-services@2026-03-03.yang similarity index 100% rename from src/confd/yang/confd/infix-services@2025-12-10.yang rename to src/confd/yang/confd/infix-services@2026-03-03.yang