diff --git a/bin/named/os.c b/bin/named/os.c index 36187b213b..2016adfafa 100644 --- a/bin/named/os.c +++ b/bin/named/os.c @@ -913,12 +913,57 @@ named_os_tzset(void) { } #ifdef HAVE_UNAME -static char unamebuf[sizeof(struct utsname)]; +static char osreleasebuf[256]; +static char + unamebuf[sizeof(struct utsname) + sizeof(osreleasebuf) + sizeof(" ()")]; #else static const char unamebuf[] = { "unknown architecture" }; #endif static const char *unamep = NULL; +#ifdef HAVE_UNAME +static const char * +getosrelease(void) { + FILE *fp; + char line[sizeof(osreleasebuf)]; + char *value; + size_t len; + + fp = fopen("/etc/os-release", "r"); + if (fp == NULL) { + fp = fopen("/usr/lib/os-release", "r"); + } + if (fp == NULL) { + return ""; + } + + while (fgets(line, sizeof(line), fp) != NULL) { + if (strncmp(line, "PRETTY_NAME=", 12) != 0) { + continue; + } + value = line + 12; + len = strlen(value); + if (len > 0 && value[len - 1] == '\n') { + value[--len] = '\0'; + } + if (len >= 2 && (*value == '"' || *value == '\'') && + value[len - 1] == *value) + { + value[len - 1] = '\0'; + value++; + } + if (*value == '\0') { + continue; + } + snprintf(osreleasebuf, sizeof(osreleasebuf), " (%s)", value); + fclose(fp); + return osreleasebuf; + } + fclose(fp); + return ""; +} +#endif /* ifdef HAVE_UNAME */ + static void getuname(void) { #ifdef HAVE_UNAME @@ -930,8 +975,8 @@ getuname(void) { return; } - snprintf(unamebuf, sizeof(unamebuf), "%s %s %s %s", uts.sysname, - uts.machine, uts.release, uts.version); + snprintf(unamebuf, sizeof(unamebuf), "%s %s %s %s%s", uts.sysname, + uts.machine, uts.release, uts.version, getosrelease()); #endif /* ifdef HAVE_UNAME */ unamep = unamebuf; }