sys_info_posix.cc revision c7f5f8508d98d5952d42ed7648c2a8f30a4da156
1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2008 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/sys_info.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <errno.h> 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string.h> 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/param.h> 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/statvfs.h> 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/sysctl.h> 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/utsname.h> 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <unistd.h> 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if !defined(OS_MACOSX) 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <gdk/gdk.h> 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h" 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_util.h" 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h" 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/utf_string_conversions.h" 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base { 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if !defined(OS_OPENBSD) 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint SysInfo::NumberOfProcessors() { 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // It seems that sysconf returns the number of "logical" processors on both 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Mac and Linux. So we get the number of "online logical" processors. 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott long res = sysconf(_SC_NPROCESSORS_ONLN); 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (res == -1) { 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NOTREACHED(); 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 1; 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return static_cast<int>(res); 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 SysInfo::AmountOfFreeDiskSpace(const FilePath& path) { 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct statvfs stats; 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (statvfs(path.value().c_str(), &stats) != 0) { 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return -1; 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return static_cast<int64>(stats.f_bavail) * stats.f_frsize; 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool SysInfo::HasEnvVar(const wchar_t* var) { 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string var_utf8 = WideToUTF8(std::wstring(var)); 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return getenv(var_utf8.c_str()) != NULL; 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::wstring SysInfo::GetEnvVar(const wchar_t* var) { 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string var_utf8 = WideToUTF8(std::wstring(var)); 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char* value = getenv(var_utf8.c_str()); 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!value) { 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return std::wstring(); 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return UTF8ToWide(value); 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::OperatingSystemName() { 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott utsname info; 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (uname(&info) < 0) { 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NOTREACHED(); 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return ""; 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return std::string(info.sysname); 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::OperatingSystemVersion() { 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott utsname info; 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (uname(&info) < 0) { 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NOTREACHED(); 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return ""; 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return std::string(info.release); 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::CPUArchitecture() { 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott utsname info; 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (uname(&info) < 0) { 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NOTREACHED(); 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return ""; 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return std::string(info.machine); 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if !defined(OS_MACOSX) 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SysInfo::GetPrimaryDisplayDimensions(int* width, int* height) { 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Note that Bad Things Happen if this isn't called from the UI thread, 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // but also that there's no way to check that from here. :( 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GdkScreen* screen = gdk_screen_get_default(); 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (width) 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *width = gdk_screen_get_width(screen); 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (height) 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *height = gdk_screen_get_height(screen); 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint SysInfo::DisplayCount() { 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Note that Bad Things Happen if this isn't called from the UI thread, 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // but also that there's no way to check that from here. :( 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This query is kinda bogus for Linux -- do we want number of X screens? 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The number of monitors Xinerama has? We'll just use whatever GDK uses. 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GdkScreen* screen = gdk_screen_get_default(); 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return gdk_screen_get_n_monitors(screen); 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottsize_t SysInfo::VMAllocationGranularity() { 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return getpagesize(); 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace base 126