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