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