12a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo// Copyright 2016 The Chromium OS Authors. All rights reserved. 22a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo// Use of this source code is governed by a BSD-style license that can be 32a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo// found in the LICENSE file. 42a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 52a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo#include <brillo/dbus/dbus_connection.h> 62a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 72a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo#include <sysexits.h> 82a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 92a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo#include <base/bind.h> 102a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo#include <brillo/dbus/async_event_sequencer.h> 112a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo#include <brillo/dbus/exported_object_manager.h> 122a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 132a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymousing brillo::dbus_utils::AsyncEventSequencer; 142a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymousing brillo::dbus_utils::ExportedObjectManager; 152a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 162a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymonamespace brillo { 172a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 182a25190ea741023a3753e7f381a8a2b1465c43c1Alex DeymoDBusConnection::DBusConnection() { 192a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo} 202a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 212a25190ea741023a3753e7f381a8a2b1465c43c1Alex DeymoDBusConnection::~DBusConnection() { 222a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo if (bus_) 232a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo bus_->ShutdownAndBlock(); 242a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo} 252a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 262a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymoscoped_refptr<dbus::Bus> DBusConnection::Connect() { 272a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo return ConnectWithTimeout(base::TimeDelta()); 282a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo} 292a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 302a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymoscoped_refptr<dbus::Bus> DBusConnection::ConnectWithTimeout( 312a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo base::TimeDelta timeout) { 322a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo if (bus_) 332a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo return bus_; 342a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 352a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo base::TimeTicks deadline = base::TimeTicks::Now() + timeout; 362a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 372a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo dbus::Bus::Options options; 382a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo options.bus_type = dbus::Bus::SYSTEM; 392a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 402a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo scoped_refptr<dbus::Bus> bus = new dbus::Bus(options); 412a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 422a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo do { 432a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo if (bus->Connect()) { 442a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo bus_ = bus; 452a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo return bus_; 462a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo } 472a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo LOG(WARNING) << "Failed to get system bus."; 482a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo // Wait 1 second to prevent trashing the device while waiting for the 492a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo // dbus-daemon to start. 502a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo sleep(1); 512a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo } while (base::TimeTicks::Now() < deadline); 522a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 532a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo LOG(ERROR) << "Failed to get system bus after " << timeout.InSeconds() 542a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo << " seconds."; 552a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo return nullptr; 562a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo} 572a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo 582a25190ea741023a3753e7f381a8a2b1465c43c1Alex Deymo} // namespace brillo 59