1 // Copyright 2016 The Chromium OS 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 <brillo/dbus/dbus_connection.h> 6 7 #include <sysexits.h> 8 9 #include <base/bind.h> 10 #include <brillo/dbus/async_event_sequencer.h> 11 #include <brillo/dbus/exported_object_manager.h> 12 13 using brillo::dbus_utils::AsyncEventSequencer; 14 using brillo::dbus_utils::ExportedObjectManager; 15 16 namespace brillo { 17 DBusConnection()18DBusConnection::DBusConnection() { 19 } 20 ~DBusConnection()21DBusConnection::~DBusConnection() { 22 if (bus_) 23 bus_->ShutdownAndBlock(); 24 } 25 Connect()26scoped_refptr<dbus::Bus> DBusConnection::Connect() { 27 return ConnectWithTimeout(base::TimeDelta()); 28 } 29 ConnectWithTimeout(base::TimeDelta timeout)30scoped_refptr<dbus::Bus> DBusConnection::ConnectWithTimeout( 31 base::TimeDelta timeout) { 32 if (bus_) 33 return bus_; 34 35 base::TimeTicks deadline = base::TimeTicks::Now() + timeout; 36 37 dbus::Bus::Options options; 38 options.bus_type = dbus::Bus::SYSTEM; 39 40 scoped_refptr<dbus::Bus> bus = new dbus::Bus(options); 41 42 do { 43 if (bus->Connect()) { 44 bus_ = bus; 45 return bus_; 46 } 47 LOG(WARNING) << "Failed to get system bus."; 48 // Wait 1 second to prevent trashing the device while waiting for the 49 // dbus-daemon to start. 50 sleep(1); 51 } while (base::TimeTicks::Now() < deadline); 52 53 LOG(ERROR) << "Failed to get system bus after " << timeout.InSeconds() 54 << " seconds."; 55 return nullptr; 56 } 57 58 } // namespace brillo 59