#include "chrome/windows_services/service_program/logging_support.h"
#include <windows.h>
#include <stdint.h>
#include "base/command_line.h"
#include "base/logging.h"
#include "base/logging/logging_settings.h"
#include "base/process/process.h"
#include "base/strings/string_number_conversions.h"
#include "base/win/scoped_handle.h"
#include "base/win/windows_handle_util.h"
#include "chrome/windows_services/service_program/switches.h"
void InitializeLogging(const base::CommandLine& command_line) {
logging::LoggingSettings settings;
settings.logging_dest =
logging::LOG_TO_SYSTEM_DEBUG_LOG | logging::LOG_TO_STDERR;
base::Process source_process;
if (uint32_t source_pid; base::StringToUint(command_line.GetSwitchValueASCII(
switches::kLogFileSource),
&source_pid) &&
source_pid) {
source_process =
base::Process::OpenWithAccess(source_pid, PROCESS_DUP_HANDLE);
}
base::win::ScopedHandle log_file_handle;
if (uint32_t file_handle_value;
source_process.IsValid() &&
base::StringToUint(
command_line.GetSwitchValueASCII(switches::kLogFileHandle),
&file_handle_value) &&
file_handle_value) {
HANDLE file_handle = base::win::Uint32ToHandle(file_handle_value);
if (file_handle != INVALID_HANDLE_VALUE) {
HANDLE duplicate;
if (::DuplicateHandle(source_process.Handle(), file_handle,
::GetCurrentProcess(), &duplicate,
0, FALSE,
DUPLICATE_SAME_ACCESS)) {
log_file_handle.Set(duplicate);
}
}
}
if (log_file_handle.is_valid()) {
settings.logging_dest &= ~logging::LOG_TO_STDERR;
settings.logging_dest |= logging::LOG_TO_FILE;
settings.log_file = log_file_handle.release();
logging::SetLogItems(true,
true,
false,
true);
}
logging::InitLogging(settings);
}