| Index: crash_collector.cc
|
| diff --git a/crash_collector.cc b/crash_collector.cc
|
| index afd72d1e129757c3a5f992abac0171d47d826057..9600b44a5edbc8ef6294ad7a935187c46bdec040 100644
|
| --- a/crash_collector.cc
|
| +++ b/crash_collector.cc
|
| @@ -17,7 +17,7 @@
|
| #include "base/file_util.h"
|
| #include "base/logging.h"
|
| #include "base/string_util.h"
|
| -#include "crash-reporter/system_logging.h"
|
| +#include "chromeos/process.h"
|
|
|
| static const char kDefaultUserName[] = "chronos";
|
| static const char kLsbRelease[] = "/etc/lsb-release";
|
| @@ -54,15 +54,12 @@ CrashCollector::~CrashCollector() {
|
|
|
| void CrashCollector::Initialize(
|
| CrashCollector::CountCrashFunction count_crash_function,
|
| - CrashCollector::IsFeedbackAllowedFunction is_feedback_allowed_function,
|
| - SystemLogging *logger) {
|
| + CrashCollector::IsFeedbackAllowedFunction is_feedback_allowed_function) {
|
| CHECK(count_crash_function != NULL);
|
| CHECK(is_feedback_allowed_function != NULL);
|
| - CHECK(logger != NULL);
|
|
|
| count_crash_function_ = count_crash_function;
|
| is_feedback_allowed_function_ = is_feedback_allowed_function;
|
| - logger_ = logger;
|
| }
|
|
|
| int CrashCollector::WriteNewFile(const FilePath &filename,
|
| @@ -79,63 +76,6 @@ int CrashCollector::WriteNewFile(const FilePath &filename,
|
| return rv;
|
| }
|
|
|
| -int CrashCollector::ForkExecAndPipe(std::vector<const char *> &arguments,
|
| - const char *output_file) {
|
| - // Copy off a writeable version of arguments.
|
| - scoped_array<char*> argv(new char *[arguments.size() + 1]);
|
| - int total_args_size = 0;
|
| - for (size_t i = 0; i < arguments.size(); ++i) {
|
| - if (arguments[i] == NULL) {
|
| - logger_->LogError("Bad parameter");
|
| - return -1;
|
| - }
|
| - total_args_size += strlen(arguments[i]) + 1;
|
| - }
|
| - scoped_array<char> buffer(new char[total_args_size]);
|
| - char *buffer_pointer = &buffer[0];
|
| -
|
| - for (size_t i = 0; i < arguments.size(); ++i) {
|
| - argv[i] = buffer_pointer;
|
| - strcpy(buffer_pointer, arguments[i]);
|
| - buffer_pointer += strlen(arguments[i]);
|
| - *buffer_pointer = '\0';
|
| - ++buffer_pointer;
|
| - }
|
| - argv[arguments.size()] = NULL;
|
| -
|
| - int pid = fork();
|
| - if (pid < 0) {
|
| - logger_->LogError("Fork failed: %d", errno);
|
| - return -1;
|
| - }
|
| -
|
| - if (pid == 0) {
|
| - int output_handle = HANDLE_EINTR(
|
| - open(output_file, O_CREAT | O_WRONLY | O_TRUNC | O_EXCL, 0666));
|
| - if (output_handle < 0) {
|
| - logger_->LogError("Could not create %s: %d", output_file, errno);
|
| - // Avoid exit() to avoid atexit handlers from parent.
|
| - _exit(127);
|
| - }
|
| - dup2(output_handle, 1);
|
| - dup2(output_handle, 2);
|
| - execv(argv[0], &argv[0]);
|
| - logger_->LogError("Exec failed: %d", errno);
|
| - _exit(127);
|
| - }
|
| -
|
| - int status = 0;
|
| - if (HANDLE_EINTR(waitpid(pid, &status, 0)) < 0) {
|
| - logger_->LogError("Problem waiting for pid: %d", errno);
|
| - return -1;
|
| - }
|
| - if (!WIFEXITED(status)) {
|
| - logger_->LogError("Process did not exit normally: %d", status);
|
| - return -1;
|
| - }
|
| - return WEXITSTATUS(status);
|
| -}
|
| -
|
| std::string CrashCollector::Sanitize(const std::string &name) {
|
| std::string result = name;
|
| for (size_t i = 0; i < name.size(); ++i) {
|
| @@ -199,7 +139,7 @@ bool CrashCollector::GetUserInfoFromName(const std::string &name,
|
|
|
| if (getpwnam_r(name.c_str(), &passwd_storage, storage, sizeof(storage),
|
| &passwd_result) != 0 || passwd_result == NULL) {
|
| - logger_->LogError("Cannot find user named %s", name.c_str());
|
| + LOG(ERROR) << "Cannot find user named " << name;
|
| return false;
|
| }
|
|
|
| @@ -225,7 +165,7 @@ bool CrashCollector::GetCreatedCrashDirectoryByEuid(uid_t euid,
|
| if (!GetUserInfoFromName(kDefaultUserName,
|
| &default_user_id,
|
| &default_user_group)) {
|
| - logger_->LogError("Could not find default user info");
|
| + LOG(ERROR) << "Could not find default user info";
|
| return false;
|
| }
|
| mode_t directory_mode;
|
| @@ -247,15 +187,15 @@ bool CrashCollector::GetCreatedCrashDirectoryByEuid(uid_t euid,
|
| chown(crash_directory->value().c_str(),
|
| directory_owner,
|
| directory_group) < 0) {
|
| - logger_->LogError("Unable to create appropriate crash directory");
|
| + LOG(ERROR) << "Unable to create appropriate crash directory";
|
| return false;
|
| }
|
| umask(old_mask);
|
| }
|
|
|
| if (!file_util::PathExists(*crash_directory)) {
|
| - logger_->LogError("Unable to create crash directory %s",
|
| - crash_directory->value().c_str());
|
| + LOG(ERROR) << "Unable to create crash directory "
|
| + << crash_directory->value().c_str();
|
| return false;
|
| }
|
|
|
| @@ -297,10 +237,9 @@ bool CrashCollector::CheckHasCapacity(const FilePath &crash_directory) {
|
| basenames.insert(basename);
|
|
|
| if (basenames.size() >= static_cast<size_t>(kMaxCrashDirectorySize)) {
|
| - logger_->LogWarning(
|
| - "Crash directory %s already full with %d pending reports",
|
| - crash_directory.value().c_str(),
|
| - kMaxCrashDirectorySize);
|
| + LOG(WARNING) << "Crash directory " << crash_directory.value()
|
| + << " already full with " << kMaxCrashDirectorySize
|
| + << " pending reports";
|
| full = true;
|
| break;
|
| }
|
| @@ -350,24 +289,24 @@ bool CrashCollector::GetLogContents(const FilePath &config_path,
|
| const FilePath &output_file) {
|
| std::map<std::string, std::string> log_commands;
|
| if (!ReadKeyValueFile(config_path, ':', &log_commands)) {
|
| - logger_->LogInfo("Unable to read log configuration file %s",
|
| - config_path.value().c_str());
|
| + LOG(INFO) << "Unable to read log configuration file "
|
| + << config_path.value();
|
| return false;
|
| }
|
|
|
| if (log_commands.find(exec_name) == log_commands.end())
|
| return false;
|
|
|
| - std::vector<const char *> command;
|
| - command.push_back(kShellPath);
|
| - command.push_back("-c");
|
| + chromeos::ProcessImpl diag_process;
|
| + diag_process.AddArg(kShellPath);
|
| std::string shell_command = log_commands[exec_name];
|
| - command.push_back(shell_command.c_str());
|
| + diag_process.AddStringOption("-c", shell_command);
|
| + diag_process.RedirectOutput(output_file.value());
|
|
|
| - int fork_result = ForkExecAndPipe(command, output_file.value().c_str());
|
| - if (fork_result != 0) {
|
| - logger_->LogInfo("Running shell command %s failed with: %d",
|
| - shell_command.c_str(), fork_result);
|
| + int result = diag_process.Run();
|
| + if (result != 0) {
|
| + LOG(INFO) << "Running shell command " << shell_command << "failed with: "
|
| + << result;
|
| return false;
|
| }
|
| return true;
|
| @@ -383,7 +322,7 @@ void CrashCollector::WriteCrashMetaData(const FilePath &meta_path,
|
| const std::string &payload_path) {
|
| std::map<std::string, std::string> contents;
|
| if (!ReadKeyValueFile(FilePath(std::string(lsb_release_)), '=', &contents)) {
|
| - logger_->LogError("Problem parsing %s", lsb_release_);
|
| + LOG(ERROR) << "Problem parsing " << lsb_release_;
|
| // Even though there was some failure, take as much as we could read.
|
| }
|
| std::string version("unknown");
|
| @@ -407,6 +346,6 @@ void CrashCollector::WriteCrashMetaData(const FilePath &meta_path,
|
| // do not want to write with root access to a symlink that an attacker
|
| // might have created.
|
| if (WriteNewFile(meta_path, meta_data.c_str(), meta_data.size()) < 0) {
|
| - logger_->LogError("Unable to write %s", meta_path.value().c_str());
|
| + LOG(ERROR) << "Unable to write " << meta_path.value();
|
| }
|
| }
|
|
|