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
3// found in the LICENSE file.
4
5#include <windows.h>
6#include <stdlib.h>
7#include <tchar.h>
8
9#include "base/at_exit.h"
10#include "base/command_line.h"
11#include "base/files/file_util.h"
12#include "base/logging.h"
13#include "base/path_service.h"
14#include "chrome/common/chrome_constants.h"
15#include "chrome/common/chrome_paths.h"
16#include "components/crash/tools/crash_service.h"
17
18namespace {
19
20const wchar_t kStandardLogFile[] = L"operation_log.txt";
21
22bool GetCrashServiceDirectory(base::FilePath* dir) {
23  base::FilePath temp_dir;
24  if (!base::GetTempDir(&temp_dir))
25    return false;
26  temp_dir = temp_dir.Append(L"chrome_crashes");
27  if (!base::PathExists(temp_dir)) {
28    if (!base::CreateDirectory(temp_dir))
29      return false;
30  }
31  *dir = temp_dir;
32  return true;
33}
34
35}  // namespace.
36
37int __stdcall wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd_line,
38                       int show_mode) {
39  // Manages the destruction of singletons.
40  base::AtExitManager exit_manager;
41
42  CommandLine::Init(0, NULL);
43
44  chrome::RegisterPathProvider();
45
46  // We use/create a directory under the user's temp folder, for logging.
47  base::FilePath operating_dir;
48  GetCrashServiceDirectory(&operating_dir);
49  base::FilePath log_file = operating_dir.Append(kStandardLogFile);
50
51  // Logging to stderr (to help with debugging failures on the
52  // buildbots) and to a file.
53  logging::LoggingSettings settings;
54  settings.logging_dest = logging::LOG_TO_ALL;
55  settings.log_file = log_file.value().c_str();
56  logging::InitLogging(settings);
57  // Logging with pid, tid and timestamp.
58  logging::SetLogItems(true, true, true, false);
59
60  VLOG(1) << "session start. cmdline is [" << cmd_line << "]";
61
62  base::FilePath dumps_path;
63  if (!PathService::Get(chrome::DIR_CRASH_DUMPS, &dumps_path)) {
64    LOG(ERROR) << "could not get DIR_CRASH_DUMPS";
65    return 1;
66  }
67
68  breakpad::CrashService crash_service;
69  if (!crash_service.Initialize(operating_dir, dumps_path))
70    return 1;
71
72  VLOG(1) << "ready to process crash requests";
73
74  // Enter the message loop.
75  int retv = crash_service.ProcessingLoop();
76  // Time to exit.
77  VLOG(1) << "session end. return code is " << retv;
78  return retv;
79}
80