RFR: os_linux.cpp parse_os_info gives non descriptive output on current SLES releases

Coleen Phillimore coleen.phillimore at oracle.com
Tue Apr 19 16:53:49 UTC 2016


Hi Matthais, I captured this email in bug and will fix the indentation 
and will send this out as both of us as contributors.

https://bugs.openjdk.java.net/browse/JDK-8154566

So this works properly on SuSE?

Thanks!
Coleen

On 4/19/16 10:46 AM, Baesken, Matthias wrote:
>
> Ø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 
> <http://cr.openjdk.java.net/%7Ecoleenp/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