| Index: udev_controller.cc
|
| diff --git a/udev_controller.cc b/udev_controller.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..74ac21e7a93fc328de1255c9c8fe5da1cf0736c8
|
| --- /dev/null
|
| +++ b/udev_controller.cc
|
| @@ -0,0 +1,78 @@
|
| +// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "power_manager/udev_controller.h"
|
| +
|
| +#include "base/logging.h"
|
| +
|
| +namespace power_manager {
|
| +
|
| +UdevController::UdevController(UdevDelegate* delegate,
|
| + const std::string& subsystem)
|
| + : subsystem_(subsystem),
|
| + delegate_(delegate),
|
| + udev_(NULL) {
|
| +}
|
| +
|
| +UdevController::~UdevController() {
|
| + if (udev_)
|
| + udev_unref(udev_);
|
| +}
|
| +
|
| +bool UdevController::Init() {
|
| + // Create the udev object.
|
| + udev_ = udev_new();
|
| + if (!udev_) {
|
| + LOG(ERROR) << "Can't create udev object.";
|
| + return false;
|
| + }
|
| +
|
| + // Create the udev monitor structure.
|
| + monitor_ = udev_monitor_new_from_netlink(udev_, "udev");
|
| + if (!monitor_ ) {
|
| + LOG(ERROR) << "Can't create udev monitor.";
|
| + udev_unref(udev_);
|
| + return false;
|
| + }
|
| + udev_monitor_filter_add_match_subsystem_devtype(monitor_,
|
| + subsystem_.c_str(),
|
| + NULL);
|
| + udev_monitor_enable_receiving(monitor_);
|
| +
|
| + int fd = udev_monitor_get_fd(monitor_);
|
| +
|
| + GIOChannel* channel = g_io_channel_unix_new(fd);
|
| + g_io_add_watch(channel, G_IO_IN, &(UdevController::EventHandler), this);
|
| +
|
| + LOG(INFO) << "Udev controller waiting for events on subsystem "
|
| + << subsystem_;
|
| +
|
| + return true;
|
| +}
|
| +
|
| +gboolean UdevController::EventHandler(GIOChannel* source,
|
| + GIOCondition condition,
|
| + gpointer data) {
|
| + UdevController* controller = static_cast<UdevController*>(data);
|
| +
|
| + struct udev_device* dev = udev_monitor_receive_device(controller->monitor_);
|
| + if (dev) {
|
| + LOG(INFO) << "Event on ("
|
| + << udev_device_get_devnode(dev)
|
| + << "|"
|
| + << udev_device_get_subsystem(dev)
|
| + << "|"
|
| + << udev_device_get_devtype(dev)
|
| + << ") Action "
|
| + << udev_device_get_action(dev);
|
| + udev_device_unref(dev);
|
| + controller->delegate_->Run(source, condition);
|
| + } else {
|
| + LOG(ERROR) << "Can't get receive_device()";
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +} // namespace power_manager
|
|
|