RFR: os_linux.cpp parse_os_info gives non descriptive output on current SLES releases
Baesken, Matthias
matthias.baesken at sap.com
Tue Apr 19 14:46:24 UTC 2016
? Thank you for finding this problem with SuSE and the diff. I don't know
? how many different distros were tested with these changes but it's easy
? not to get them all.
? Would it make more sense, rather than getting the last line then
? checking for DISTRIB_DESCRIPTION=, checking in the fgets() loop for both
? this and PRETTY_NAME. Then we could change it for Ubuntu and there's
? less conditionalizing on the name of the release file.
? Like:
? open webrev at http://cr.openjdk.java.net/~coleenp/suse/webrev
?
? Coleen
Hello Coleen, thanks a lot for creating the webrev, I think it looks good (better than original diff) with the exception of
the indentation at the beginning of parse_os_info_helper (buf declaration) .
2065 static void parse_os_info_helper(FILE* fp, char* distro, size_t length, bool get_first_line) {
2066 char buf[256];
2067 while (fgets(buf, sizeof(buf), fp)) {
Best regards, Matthias
--------------------------------------------------------------
On 4/18/16 8:05 AM, Baesken, Matthias wrote:
> Hello , the current implementation of the parse_os_info-function in os_linux.cpp gets the last line of a Linux-distro related file to
> provide a meaningful OS version string.
>
> However the information provided currently on SuSE Linux (SLES) is not very descriptive, it currently uses /etc/lsb-release and gives :
>
> more /etc/lsb-release
> LSB_VERSION="core-2.0-noarch:core-3.2-noarch:core-4.0-noarch:core-2.0-x86_64:core-3.2-x86_64:core-4.0-x86_64"
>
> So I suggest to use /etc/SuSE-release instead, which gives a good information for
> SLES 9 - 12 in the ***first line*** of /etc/SuSE-release :
>
> Example SLES11 :
>
> more /etc/SuSE-release
> SUSE Linux Enterprise Server 11 (x86_64)
> VERSION = 11
> PATCHLEVEL = 3
>
> (this is similar to using /etc/redhat-release on Red Hat with the difference that the ***first line*** has the relevant info).
>
>
> Additionally, /etc/os-release needs some special handling as well, because
> the meaningful OS-release description string is not always the last line of the file but in the line
> containing the information PRETTY_NAME=...
> See also :
>
> https://www.freedesktop.org/software/systemd/man/os-release.html
>
> Example from Ubuntu 14 :
>
> $ more /etc/os-release
> ...
> PRETTY_NAME="Ubuntu 14.04.3 LTS"
> ...
>
> It might also be a good idea to place /etc/os-release higher in the distro_files list, but I do not have access to
> turbolinux / gentoo to check the situation on these distros.
>
> Regards, Matthias
>
>
>
> Diff :
> --- a/src/os/linux/vm/os_linux.cpp Fri Apr 15 16:19:15 2016 +0100
> +++ b/src/os/linux/vm/os_linux.cpp Mon Apr 18 13:54:04 2016 +0200
> @@ -2013,8 +2013,8 @@
> // their own specific XXX-release file as well as a redhat-release file.
> // Because of this the XXX-release file needs to be searched for before the
> // redhat-release file.
> -// Since Red Hat has a lsb-release file that is not very descriptive the
> -// search for redhat-release needs to be before lsb-release.
> +// Since Red Hat and SuSE have an lsb-release file that is not very descriptive the
> +// search for redhat-release / SuSE-release needs to be before lsb-release.
> // Since the lsb-release file is the new standard it needs to be searched
> // before the older style release files.
> // Searching system-release (Red Hat) and os-release (other Linuxes) are a
> @@ -2031,8 +2031,8 @@
> "/etc/mandrake-release",
> "/etc/sun-release",
> "/etc/redhat-release",
> + "/etc/SuSE-release",
> "/etc/lsb-release",
> - "/etc/SuSE-release",
> "/etc/turbolinux-release",
> "/etc/gentoo-release",
> "/etc/ltib-release",
> @@ -2065,11 +2065,36 @@
> static void parse_os_info(char* distro, size_t length, const char* file) {
> FILE* fp = fopen(file, "r");
> if (fp != NULL) {
> + // SuSE-release : first line is interesting
> + // os-release : PRETTY_NAME= line is interesting
> + // (might be at different locations in the file)
> char buf[256];
> - // get last line of the file.
> - while (fgets(buf, sizeof(buf), fp)) { }
> + int lcnt = 0;
> + bool is_etc_suserelease = false;
> + bool is_etc_osrelease = false;
> + if (strcmp(file, "/etc/SuSE-release") == 0) {
> + is_etc_suserelease = true;
> + }
> + if (strcmp(file, "/etc/os-release") == 0) {
> + is_etc_osrelease = true;
> + }
> +
> + // get last line of the file or
> + // other interesting line on SUSE / os-release
> + while (fgets(buf, sizeof(buf), fp)) {
> + if (lcnt == 0 && is_etc_suserelease) {
> + break;
> + }
> + if (is_etc_osrelease) {
> + if (strstr(buf, "PRETTY_NAME=") != NULL) {
> + break;
> + }
> + }
> + lcnt++;
> + }
> +
> // Edit out extra stuff in expected ubuntu format
> - if (strstr(buf, "DISTRIB_DESCRIPTION=") != NULL) {
> + if (strstr(buf, "DISTRIB_DESCRIPTION=") != NULL || strstr(buf, "PRETTY_NAME=") != NULL) {
> char* ptr = strstr(buf, "\""); // the name is in quotes
> if (ptr != NULL) {
> ptr++; // go beyond first quote
More information about the hotspot-dev
mailing list