| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/linux_util.h" | 5 #include "base/linux_util.h" |
| 6 | 6 |
| 7 #include <dirent.h> | 7 #include <dirent.h> |
| 8 #include <errno.h> | 8 #include <errno.h> |
| 9 #include <fcntl.h> | 9 #include <fcntl.h> |
| 10 #include <glib.h> | 10 #include <glib.h> |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 } | 119 } |
| 120 | 120 |
| 121 *inode_out = inode_ul; | 121 *inode_out = inode_ul; |
| 122 return true; | 122 return true; |
| 123 } | 123 } |
| 124 | 124 |
| 125 } // namespace | 125 } // namespace |
| 126 | 126 |
| 127 namespace base { | 127 namespace base { |
| 128 | 128 |
| 129 // Account for the terminating null character. |
| 130 static const int kDistroSize = 128 + 1; |
| 131 |
| 129 // We use this static string to hold the Linux distro info. If we | 132 // We use this static string to hold the Linux distro info. If we |
| 130 // crash, the crash handler code will send this in the crash dump. | 133 // crash, the crash handler code will send this in the crash dump. |
| 131 std::string linux_distro = | 134 char g_linux_distro[kDistroSize] = |
| 132 #if defined(OS_CHROMEOS) | 135 #if defined(OS_CHROMEOS) |
| 133 "CrOS"; | 136 "CrOS"; |
| 134 #else // if defined(OS_LINUX) | 137 #else // if defined(OS_LINUX) |
| 135 "Unknown"; | 138 "Unknown"; |
| 136 #endif | 139 #endif |
| 137 | 140 |
| 138 std::string GetLinuxDistro() { | 141 std::string GetLinuxDistro() { |
| 139 #if defined(OS_CHROMEOS) | 142 #if defined(OS_CHROMEOS) |
| 140 return linux_distro; | 143 return g_linux_distro; |
| 141 #elif defined(OS_LINUX) | 144 #elif defined(OS_LINUX) |
| 142 LinuxDistroHelper* distro_state_singleton = LinuxDistroHelper::Get(); | 145 LinuxDistroHelper* distro_state_singleton = LinuxDistroHelper::Get(); |
| 143 LinuxDistroState state = distro_state_singleton->State(); | 146 LinuxDistroState state = distro_state_singleton->State(); |
| 144 if (STATE_DID_NOT_CHECK == state) { | 147 if (STATE_DID_NOT_CHECK == state) { |
| 145 // We do this check only once per process. If it fails, there's | 148 // We do this check only once per process. If it fails, there's |
| 146 // little reason to believe it will work if we attempt to run | 149 // little reason to believe it will work if we attempt to run |
| 147 // lsb_release again. | 150 // lsb_release again. |
| 148 std::vector<std::string> argv; | 151 std::vector<std::string> argv; |
| 149 argv.push_back("lsb_release"); | 152 argv.push_back("lsb_release"); |
| 150 argv.push_back("-d"); | 153 argv.push_back("-d"); |
| 151 std::string output; | 154 std::string output; |
| 152 base::GetAppOutput(CommandLine(argv), &output); | 155 base::GetAppOutput(CommandLine(argv), &output); |
| 153 if (output.length() > 0) { | 156 if (output.length() > 0) { |
| 154 // lsb_release -d should return: Description:<tab>Distro Info | 157 // lsb_release -d should return: Description:<tab>Distro Info |
| 155 static const std::string field = "Description:\t"; | 158 static const std::string field = "Description:\t"; |
| 156 if (output.compare(0, field.length(), field) == 0) { | 159 if (output.compare(0, field.length(), field) == 0) { |
| 157 linux_distro = output.substr(field.length()); | 160 SetLinuxDistro(output.substr(field.length())); |
| 158 TrimWhitespaceASCII(linux_distro, TRIM_ALL, &linux_distro); | |
| 159 } | 161 } |
| 160 } | 162 } |
| 161 distro_state_singleton->CheckFinished(); | 163 distro_state_singleton->CheckFinished(); |
| 162 return linux_distro; | 164 return g_linux_distro; |
| 163 } else if (STATE_CHECK_STARTED == state) { | 165 } else if (STATE_CHECK_STARTED == state) { |
| 164 // If the distro check above is in progress in some other thread, we're | 166 // If the distro check above is in progress in some other thread, we're |
| 165 // not going to wait for the results. | 167 // not going to wait for the results. |
| 166 return "Unknown"; | 168 return "Unknown"; |
| 167 } else { | 169 } else { |
| 168 // In STATE_CHECK_FINISHED, no more writing to |linux_distro|. | 170 // In STATE_CHECK_FINISHED, no more writing to |linux_distro|. |
| 169 return linux_distro; | 171 return g_linux_distro; |
| 170 } | 172 } |
| 171 #else | 173 #else |
| 172 NOTIMPLEMENTED(); | 174 NOTIMPLEMENTED(); |
| 173 #endif | 175 #endif |
| 174 } | 176 } |
| 175 | 177 |
| 178 void SetLinuxDistro(const std::string& distro) { |
| 179 std::string trimmed_distro; |
| 180 TrimWhitespaceASCII(distro, TRIM_ALL, &trimmed_distro); |
| 181 base::strlcpy(g_linux_distro, trimmed_distro.c_str(), kDistroSize); |
| 182 } |
| 183 |
| 176 bool FileDescriptorGetInode(ino_t* inode_out, int fd) { | 184 bool FileDescriptorGetInode(ino_t* inode_out, int fd) { |
| 177 DCHECK(inode_out); | 185 DCHECK(inode_out); |
| 178 | 186 |
| 179 struct stat buf; | 187 struct stat buf; |
| 180 if (fstat(fd, &buf) < 0) | 188 if (fstat(fd, &buf) < 0) |
| 181 return false; | 189 return false; |
| 182 | 190 |
| 183 if (!S_ISSOCK(buf.st_mode)) | 191 if (!S_ISSOCK(buf.st_mode)) |
| 184 return false; | 192 return false; |
| 185 | 193 |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 | 289 |
| 282 if (0 == strncmp(expected_data.c_str(), syscall_data.get(), | 290 if (0 == strncmp(expected_data.c_str(), syscall_data.get(), |
| 283 expected_data.length())) { | 291 expected_data.length())) { |
| 284 return current_tid; | 292 return current_tid; |
| 285 } | 293 } |
| 286 } | 294 } |
| 287 return -1; | 295 return -1; |
| 288 } | 296 } |
| 289 | 297 |
| 290 } // namespace base | 298 } // namespace base |
| OLD | NEW |