1299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang//
2299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang// Copyright (C) 2016 The Android Open Source Project
3299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang//
4299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang// Licensed under the Apache License, Version 2.0 (the "License");
5299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang// you may not use this file except in compliance with the License.
6299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang// You may obtain a copy of the License at
7299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang//
8299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang//      http://www.apache.org/licenses/LICENSE-2.0
9299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang//
10299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang// Unless required by applicable law or agreed to in writing, software
11299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang// distributed under the License is distributed on an "AS IS" BASIS,
12299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang// See the License for the specific language governing permissions and
14299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang// limitations under the License.
15299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang//
16299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang
17299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang#include "update_engine/dbus_connection.h"
18299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang
19299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang#include <base/time/time.h>
20299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang
21299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiangnamespace chromeos_update_engine {
22299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang
23299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiangnamespace {
24299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiangconst int kDBusSystemMaxWaitSeconds = 2 * 60;
25299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang
26299128ee0f9009f79a62d5f57d75270f62353c9dSen JiangDBusConnection* dbus_connection_singleton = nullptr;
27299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang}  // namespace
28299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang
29299128ee0f9009f79a62d5f57d75270f62353c9dSen JiangDBusConnection::DBusConnection() {
30299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang  // We wait for the D-Bus connection for up two minutes to avoid re-spawning
31299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang  // the daemon too fast causing thrashing if dbus-daemon is not running.
32299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang  bus_ = dbus_connection_.ConnectWithTimeout(
33299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang      base::TimeDelta::FromSeconds(kDBusSystemMaxWaitSeconds));
34299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang
35299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang  if (!bus_) {
36299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang    // TODO(deymo): Make it possible to run update_engine even if dbus-daemon
37299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang    // is not running or constantly crashing.
38299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang    LOG(FATAL) << "Failed to initialize DBus, aborting.";
39299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang  }
40299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang
41299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang  CHECK(bus_->SetUpAsyncOperations());
42299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang}
43299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang
44299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiangconst scoped_refptr<dbus::Bus>& DBusConnection::GetDBus() {
45299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang  CHECK(bus_);
46299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang  return bus_;
47299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang}
48299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang
49299128ee0f9009f79a62d5f57d75270f62353c9dSen JiangDBusConnection* DBusConnection::Get() {
50299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang  if (!dbus_connection_singleton)
51299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang    dbus_connection_singleton = new DBusConnection();
52299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang  return dbus_connection_singleton;
53299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang}
54299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang
55299128ee0f9009f79a62d5f57d75270f62353c9dSen Jiang}  // namespace chromeos_update_engine
56