Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/sys_info.h"
      6 
      7 #include "base/basictypes.h"
      8 #include "base/file_path.h"
      9 #include "base/file_util.h"
     10 #include "base/string_tokenizer.h"
     11 #include "base/string_util.h"
     12 
     13 namespace base {
     14 
     15 #if defined(GOOGLE_CHROME_BUILD)
     16 static const char kLinuxStandardBaseVersionKey[] = "GOOGLE_RELEASE";
     17 #else
     18 static const char kLinuxStandardBaseVersionKey[] = "DISTRIB_RELEASE";
     19 #endif
     20 
     21 const char kLinuxStandardBaseReleaseFile[] = "/etc/lsb-release";
     22 
     23 // static
     24 void SysInfo::OperatingSystemVersionNumbers(int32 *major_version,
     25                                             int32 *minor_version,
     26                                             int32 *bugfix_version) {
     27   // TODO(cmasone): If this gets called a lot, it may kill performance.
     28   // consider using static variables to cache these values?
     29   FilePath path(kLinuxStandardBaseReleaseFile);
     30   std::string contents;
     31   if (file_util::ReadFileToString(path, &contents)) {
     32     ParseLsbRelease(contents, major_version, minor_version, bugfix_version);
     33   }
     34 }
     35 
     36 // static
     37 std::string SysInfo::GetLinuxStandardBaseVersionKey() {
     38   return std::string(kLinuxStandardBaseVersionKey);
     39 }
     40 
     41 // static
     42 void SysInfo::ParseLsbRelease(const std::string& lsb_release,
     43                               int32 *major_version,
     44                               int32 *minor_version,
     45                               int32 *bugfix_version) {
     46   size_t version_key_index = lsb_release.find(kLinuxStandardBaseVersionKey);
     47   if (std::string::npos == version_key_index) {
     48     return;
     49   }
     50   size_t start_index = lsb_release.find_first_of('=', version_key_index);
     51   start_index++;  // Move past '='.
     52   size_t length = lsb_release.find_first_of('\n', start_index) - start_index;
     53   std::string version = lsb_release.substr(start_index, length);
     54   StringTokenizer tokenizer(version, ".");
     55   for (int i = 0; i < 3 && tokenizer.GetNext(); i++) {
     56     if (0 == i) {
     57       *major_version = StringToInt(tokenizer.token());
     58       *minor_version = *bugfix_version = 0;
     59     } else if (1 == i) {
     60       *minor_version = StringToInt(tokenizer.token());
     61     } else {  // 2 == i
     62       *bugfix_version = StringToInt(tokenizer.token());
     63     }
     64   }
     65 }
     66 
     67 }  // namespace base
     68