/*
* Copyright 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "mmc/daemon/service.h"
// syslog.h and base/logging.h both try to #define LOG_INFO and LOG_WARNING.
// We need to #undef at least these two before including base/logging.h. The
// others are included to be consistent.
namespace {
const int kSyslogDebug = LOG_DEBUG;
const int kSyslogInfo = LOG_INFO;
const int kSyslogWarning = LOG_WARNING;
const int kSyslogError = LOG_ERR;
const int kSyslogCritical = LOG_CRIT;
#undef LOG_INFO
#undef LOG_WARNING
#undef LOG_ERR
#undef LOG_CRIT
} // namespace
static bool MessageHandler(int severity, const char* file, int line, size_t message_start,
const std::string& message) {
const auto str =
base::StringPrintf("%s:%d - %s", file, line, message.substr(message_start).c_str());
switch (severity) {
case logging::LOGGING_INFO:
severity = kSyslogInfo;
break;
case logging::LOGGING_WARNING:
severity = kSyslogWarning;
break;
case logging::LOGGING_ERROR:
severity = kSyslogError;
break;
case logging::LOGGING_FATAL:
severity = kSyslogCritical;
break;
default:
severity = kSyslogDebug;
break;
}
syslog(severity, "%s", str.c_str());
if (severity == kSyslogCritical) {
abort();
}
return true;
}
int main(int argc, char* argv[]) {
// Set up syslog to stderr.
logging::LoggingSettings settings;
settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG | logging::LOG_TO_STDERR;
logging::SetLogItems(false, false, false, false);
logging::InitLogging(settings);
logging::SetLogMessageHandler(MessageHandler);
bluetooth::log::info("Start MMC daemon");
// These are needed to send D-Bus signals and receive messages.
// Even though they are not used directly, they set up some global state
// needed by the D-Bus library.
base::SingleThreadTaskExecutor task_executor(base::MessagePumpType::IO);
base::FileDescriptorWatcher watcher(task_executor.task_runner());
base::AtExitManager at_exit_manager;
base::RunLoop run_loop;
auto service = std::make_unique(run_loop.QuitClosure());
bluetooth::log::assert_that(service->Init(), "assert failed: service->Init()");
run_loop.Run();
return 0;
}