Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2012 The Chromium 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 "content/browser/udev_linux.h"
      6 
      7 #include <libudev.h>
      8 
      9 #include "base/message_loop/message_loop.h"
     10 
     11 namespace content {
     12 
     13 UdevLinux::UdevLinux(const std::vector<UdevMonitorFilter>& filters,
     14                      const UdevNotificationCallback& callback)
     15     : udev_(udev_new()),
     16       monitor_(NULL),
     17       monitor_fd_(-1),
     18       callback_(callback) {
     19   CHECK(udev_);
     20 
     21   monitor_ = udev_monitor_new_from_netlink(udev_, "udev");
     22   CHECK(monitor_);
     23 
     24   for (size_t i = 0; i < filters.size(); ++i) {
     25     int ret = udev_monitor_filter_add_match_subsystem_devtype(
     26         monitor_, filters[i].subsystem, filters[i].devtype);
     27     CHECK_EQ(0, ret);
     28   }
     29 
     30   int ret = udev_monitor_enable_receiving(monitor_);
     31   CHECK_EQ(0, ret);
     32   monitor_fd_ = udev_monitor_get_fd(monitor_);
     33   CHECK_GE(monitor_fd_, 0);
     34 
     35   bool success = base::MessageLoopForIO::current()->WatchFileDescriptor(
     36       monitor_fd_,
     37       true,
     38       base::MessageLoopForIO::WATCH_READ,
     39       &monitor_watcher_,
     40       this);
     41   CHECK(success);
     42 }
     43 
     44 UdevLinux::~UdevLinux() {
     45   monitor_watcher_.StopWatchingFileDescriptor();
     46   udev_monitor_unref(monitor_);
     47   udev_unref(udev_);
     48 }
     49 
     50 udev* UdevLinux::udev_handle() {
     51   return udev_;
     52 }
     53 
     54 void UdevLinux::OnFileCanReadWithoutBlocking(int fd) {
     55   // Events occur when devices attached to the system are added, removed, or
     56   // change state. udev_monitor_receive_device() will return a device object
     57   // representing the device which changed and what type of change occured.
     58   DCHECK_EQ(monitor_fd_, fd);
     59   udev_device* dev = udev_monitor_receive_device(monitor_);
     60   if (!dev)
     61     return;
     62 
     63   callback_.Run(dev);
     64   udev_device_unref(dev);
     65 }
     66 
     67 void UdevLinux::OnFileCanWriteWithoutBlocking(int fd) {
     68 }
     69 
     70 }  // namespace content
     71