[email protected] | 61b8ad7 | 2009-07-22 00:35:18 | [diff] [blame] | 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 | |
[email protected] | 3214ef1 | 2009-10-19 16:40:57 | [diff] [blame] | 15 | #if defined(GOOGLE_CHROME_BUILD) |
[email protected] | 61b8ad7 | 2009-07-22 00:35:18 | [diff] [blame] | 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) { |
[email protected] | 323b877 | 2009-12-09 01:55:04 | [diff] [blame] | 46 | size_t version_key_index = lsb_release.find(kLinuxStandardBaseVersionKey); |
[email protected] | 61b8ad7 | 2009-07-22 00:35:18 | [diff] [blame] | 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 |