xref: /aosp_15_r20/external/libbrillo/brillo/udev/udev_monitor.cc (revision 1a96fba65179ea7d3f56207137718607415c5953)
1*1a96fba6SXin Li // Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2*1a96fba6SXin Li // Use of this source code is governed by a BSD-style license that can be
3*1a96fba6SXin Li // found in the LICENSE file.
4*1a96fba6SXin Li 
5*1a96fba6SXin Li #include <brillo/udev/udev_monitor.h>
6*1a96fba6SXin Li 
7*1a96fba6SXin Li #include <libudev.h>
8*1a96fba6SXin Li 
9*1a96fba6SXin Li #include <base/logging.h>
10*1a96fba6SXin Li #include <base/strings/stringprintf.h>
11*1a96fba6SXin Li #include <brillo/udev/udev_device.h>
12*1a96fba6SXin Li 
13*1a96fba6SXin Li using base::StringPrintf;
14*1a96fba6SXin Li 
15*1a96fba6SXin Li namespace brillo {
16*1a96fba6SXin Li 
UdevMonitor()17*1a96fba6SXin Li UdevMonitor::UdevMonitor() : monitor_(nullptr) {}
18*1a96fba6SXin Li 
UdevMonitor(udev_monitor * monitor)19*1a96fba6SXin Li UdevMonitor::UdevMonitor(udev_monitor* monitor) : monitor_(monitor) {
20*1a96fba6SXin Li   CHECK(monitor_);
21*1a96fba6SXin Li 
22*1a96fba6SXin Li   udev_monitor_ref(monitor_);
23*1a96fba6SXin Li }
24*1a96fba6SXin Li 
~UdevMonitor()25*1a96fba6SXin Li UdevMonitor::~UdevMonitor() {
26*1a96fba6SXin Li   if (monitor_) {
27*1a96fba6SXin Li     udev_monitor_unref(monitor_);
28*1a96fba6SXin Li     monitor_ = nullptr;
29*1a96fba6SXin Li   }
30*1a96fba6SXin Li }
31*1a96fba6SXin Li 
EnableReceiving()32*1a96fba6SXin Li bool UdevMonitor::EnableReceiving() {
33*1a96fba6SXin Li   int result = udev_monitor_enable_receiving(monitor_);
34*1a96fba6SXin Li   if (result == 0)
35*1a96fba6SXin Li     return true;
36*1a96fba6SXin Li 
37*1a96fba6SXin Li   VLOG(2) << StringPrintf("udev_monitor_enable_receiving(%p) returned %d.",
38*1a96fba6SXin Li                           monitor_, result);
39*1a96fba6SXin Li   return false;
40*1a96fba6SXin Li }
41*1a96fba6SXin Li 
GetFileDescriptor() const42*1a96fba6SXin Li int UdevMonitor::GetFileDescriptor() const {
43*1a96fba6SXin Li   int file_descriptor = udev_monitor_get_fd(monitor_);
44*1a96fba6SXin Li   if (file_descriptor >= 0)
45*1a96fba6SXin Li     return file_descriptor;
46*1a96fba6SXin Li 
47*1a96fba6SXin Li   VLOG(2) << StringPrintf("udev_monitor_get_fd(%p) returned %d.", monitor_,
48*1a96fba6SXin Li                           file_descriptor);
49*1a96fba6SXin Li   return kInvalidFileDescriptor;
50*1a96fba6SXin Li }
51*1a96fba6SXin Li 
ReceiveDevice()52*1a96fba6SXin Li std::unique_ptr<UdevDevice> UdevMonitor::ReceiveDevice() {
53*1a96fba6SXin Li   udev_device* received_device = udev_monitor_receive_device(monitor_);
54*1a96fba6SXin Li   if (received_device) {
55*1a96fba6SXin Li     auto device = std::make_unique<UdevDevice>(received_device);
56*1a96fba6SXin Li     // udev_monitor_receive_device increases the reference count of the returned
57*1a96fba6SXin Li     // udev_device struct, while UdevDevice also holds a reference count of the
58*1a96fba6SXin Li     // udev_device struct. Thus, decrease the reference count of the udev_device
59*1a96fba6SXin Li     // struct.
60*1a96fba6SXin Li     udev_device_unref(received_device);
61*1a96fba6SXin Li     return device;
62*1a96fba6SXin Li   }
63*1a96fba6SXin Li 
64*1a96fba6SXin Li   VLOG(2) << StringPrintf("udev_monitor_receive_device(%p) returned nullptr.",
65*1a96fba6SXin Li                           monitor_);
66*1a96fba6SXin Li   return nullptr;
67*1a96fba6SXin Li }
68*1a96fba6SXin Li 
FilterAddMatchSubsystemDeviceType(const char * subsystem,const char * device_type)69*1a96fba6SXin Li bool UdevMonitor::FilterAddMatchSubsystemDeviceType(const char* subsystem,
70*1a96fba6SXin Li                                                     const char* device_type) {
71*1a96fba6SXin Li   int result = udev_monitor_filter_add_match_subsystem_devtype(
72*1a96fba6SXin Li       monitor_, subsystem, device_type);
73*1a96fba6SXin Li   if (result == 0)
74*1a96fba6SXin Li     return true;
75*1a96fba6SXin Li 
76*1a96fba6SXin Li   VLOG(2) << StringPrintf(
77*1a96fba6SXin Li       "udev_monitor_filter_add_match_subsystem_devtype (%p, \"%s\", \"%s\") "
78*1a96fba6SXin Li       "returned %d.",
79*1a96fba6SXin Li       monitor_, subsystem, device_type, result);
80*1a96fba6SXin Li   return false;
81*1a96fba6SXin Li }
82*1a96fba6SXin Li 
FilterAddMatchTag(const char * tag)83*1a96fba6SXin Li bool UdevMonitor::FilterAddMatchTag(const char* tag) {
84*1a96fba6SXin Li   int result = udev_monitor_filter_add_match_tag(monitor_, tag);
85*1a96fba6SXin Li   if (result == 0)
86*1a96fba6SXin Li     return true;
87*1a96fba6SXin Li 
88*1a96fba6SXin Li   VLOG(2) << StringPrintf(
89*1a96fba6SXin Li       "udev_monitor_filter_add_tag (%p, \"%s\") returned %d.", monitor_, tag,
90*1a96fba6SXin Li       result);
91*1a96fba6SXin Li   return false;
92*1a96fba6SXin Li }
93*1a96fba6SXin Li 
FilterUpdate()94*1a96fba6SXin Li bool UdevMonitor::FilterUpdate() {
95*1a96fba6SXin Li   int result = udev_monitor_filter_update(monitor_);
96*1a96fba6SXin Li   if (result == 0)
97*1a96fba6SXin Li     return true;
98*1a96fba6SXin Li 
99*1a96fba6SXin Li   VLOG(2) << StringPrintf("udev_monitor_filter_update(%p) returned %d.",
100*1a96fba6SXin Li                           monitor_, result);
101*1a96fba6SXin Li   return false;
102*1a96fba6SXin Li }
103*1a96fba6SXin Li 
FilterRemove()104*1a96fba6SXin Li bool UdevMonitor::FilterRemove() {
105*1a96fba6SXin Li   int result = udev_monitor_filter_remove(monitor_);
106*1a96fba6SXin Li   if (result == 0)
107*1a96fba6SXin Li     return true;
108*1a96fba6SXin Li 
109*1a96fba6SXin Li   VLOG(2) << StringPrintf("udev_monitor_filter_remove(%p) returned %d.",
110*1a96fba6SXin Li                           monitor_, result);
111*1a96fba6SXin Li   return false;
112*1a96fba6SXin Li }
113*1a96fba6SXin Li 
114*1a96fba6SXin Li }  // namespace brillo
115