xref: /aosp_15_r20/external/libbrillo/brillo/udev/udev.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.h>
6*1a96fba6SXin Li 
7*1a96fba6SXin Li #include <libudev.h>
8*1a96fba6SXin Li 
9*1a96fba6SXin Li #include <base/format_macros.h>
10*1a96fba6SXin Li #include <base/logging.h>
11*1a96fba6SXin Li #include <base/strings/stringprintf.h>
12*1a96fba6SXin Li #include <brillo/udev/udev_device.h>
13*1a96fba6SXin Li #include <brillo/udev/udev_enumerate.h>
14*1a96fba6SXin Li #include <brillo/udev/udev_monitor.h>
15*1a96fba6SXin Li 
16*1a96fba6SXin Li using base::StringPrintf;
17*1a96fba6SXin Li 
18*1a96fba6SXin Li namespace brillo {
19*1a96fba6SXin Li 
Udev(struct udev * udev)20*1a96fba6SXin Li Udev::Udev(struct udev* udev) : udev_(udev) {}
21*1a96fba6SXin Li 
~Udev()22*1a96fba6SXin Li Udev::~Udev() {
23*1a96fba6SXin Li   if (udev_) {
24*1a96fba6SXin Li     udev_unref(udev_);
25*1a96fba6SXin Li     udev_ = nullptr;
26*1a96fba6SXin Li   }
27*1a96fba6SXin Li }
28*1a96fba6SXin Li 
29*1a96fba6SXin Li // static
Create()30*1a96fba6SXin Li std::unique_ptr<Udev> Udev::Create() {
31*1a96fba6SXin Li   struct udev* udev = udev_new();
32*1a96fba6SXin Li   if (!udev)
33*1a96fba6SXin Li     return nullptr;
34*1a96fba6SXin Li 
35*1a96fba6SXin Li   return std::unique_ptr<Udev>(new Udev(udev));
36*1a96fba6SXin Li }
37*1a96fba6SXin Li 
38*1a96fba6SXin Li // static
CreateDevice(udev_device * device)39*1a96fba6SXin Li std::unique_ptr<UdevDevice> Udev::CreateDevice(udev_device* device) {
40*1a96fba6SXin Li   auto device_to_return = std::make_unique<UdevDevice>(device);
41*1a96fba6SXin Li 
42*1a96fba6SXin Li   // UdevDevice increases the reference count of the udev_device struct by one.
43*1a96fba6SXin Li   // Thus, decrease the reference count of the udev_device struct by one before
44*1a96fba6SXin Li   // returning UdevDevice.
45*1a96fba6SXin Li   udev_device_unref(device);
46*1a96fba6SXin Li 
47*1a96fba6SXin Li   return device_to_return;
48*1a96fba6SXin Li }
49*1a96fba6SXin Li 
CreateDeviceFromSysPath(const char * sys_path)50*1a96fba6SXin Li std::unique_ptr<UdevDevice> Udev::CreateDeviceFromSysPath(
51*1a96fba6SXin Li     const char* sys_path) {
52*1a96fba6SXin Li   udev_device* device = udev_device_new_from_syspath(udev_, sys_path);
53*1a96fba6SXin Li   if (device)
54*1a96fba6SXin Li     return CreateDevice(device);
55*1a96fba6SXin Li 
56*1a96fba6SXin Li   VLOG(2) << StringPrintf(
57*1a96fba6SXin Li       "udev_device_new_from_syspath"
58*1a96fba6SXin Li       "(%p, \"%s\") returned nullptr.",
59*1a96fba6SXin Li       udev_, sys_path);
60*1a96fba6SXin Li   return nullptr;
61*1a96fba6SXin Li }
62*1a96fba6SXin Li 
CreateDeviceFromDeviceNumber(char type,dev_t device_number)63*1a96fba6SXin Li std::unique_ptr<UdevDevice> Udev::CreateDeviceFromDeviceNumber(
64*1a96fba6SXin Li     char type, dev_t device_number) {
65*1a96fba6SXin Li   udev_device* device = udev_device_new_from_devnum(udev_, type, device_number);
66*1a96fba6SXin Li   if (device)
67*1a96fba6SXin Li     return CreateDevice(device);
68*1a96fba6SXin Li 
69*1a96fba6SXin Li   VLOG(2) << StringPrintf(
70*1a96fba6SXin Li       "udev_device_new_from_devnum"
71*1a96fba6SXin Li       "(%p, %d, %" PRIu64 ") returned nullptr.",
72*1a96fba6SXin Li       udev_, type, device_number);
73*1a96fba6SXin Li   return nullptr;
74*1a96fba6SXin Li }
75*1a96fba6SXin Li 
CreateDeviceFromSubsystemSysName(const char * subsystem,const char * sys_name)76*1a96fba6SXin Li std::unique_ptr<UdevDevice> Udev::CreateDeviceFromSubsystemSysName(
77*1a96fba6SXin Li     const char* subsystem, const char* sys_name) {
78*1a96fba6SXin Li   udev_device* device =
79*1a96fba6SXin Li       udev_device_new_from_subsystem_sysname(udev_, subsystem, sys_name);
80*1a96fba6SXin Li   if (device)
81*1a96fba6SXin Li     return CreateDevice(device);
82*1a96fba6SXin Li 
83*1a96fba6SXin Li   VLOG(2) << StringPrintf(
84*1a96fba6SXin Li       "udev_device_new_from_subsystem_sysname"
85*1a96fba6SXin Li       "(%p, \"%s\", \"%s\") returned nullptr.",
86*1a96fba6SXin Li       udev_, subsystem, sys_name);
87*1a96fba6SXin Li   return nullptr;
88*1a96fba6SXin Li }
89*1a96fba6SXin Li 
CreateEnumerate()90*1a96fba6SXin Li std::unique_ptr<UdevEnumerate> Udev::CreateEnumerate() {
91*1a96fba6SXin Li   udev_enumerate* enumerate = udev_enumerate_new(udev_);
92*1a96fba6SXin Li   if (enumerate) {
93*1a96fba6SXin Li     auto enumerate_to_return = std::make_unique<UdevEnumerate>(enumerate);
94*1a96fba6SXin Li 
95*1a96fba6SXin Li     // UdevEnumerate increases the reference count of the udev_enumerate struct
96*1a96fba6SXin Li     // by one. Thus, decrease the reference count of the udev_enumerate struct
97*1a96fba6SXin Li     // by one before returning UdevEnumerate.
98*1a96fba6SXin Li     udev_enumerate_unref(enumerate);
99*1a96fba6SXin Li 
100*1a96fba6SXin Li     return enumerate_to_return;
101*1a96fba6SXin Li   }
102*1a96fba6SXin Li 
103*1a96fba6SXin Li   VLOG(2) << StringPrintf("udev_enumerate_new(%p) returned nullptr.", udev_);
104*1a96fba6SXin Li   return nullptr;
105*1a96fba6SXin Li }
106*1a96fba6SXin Li 
CreateMonitorFromNetlink(const char * name)107*1a96fba6SXin Li std::unique_ptr<UdevMonitor> Udev::CreateMonitorFromNetlink(const char* name) {
108*1a96fba6SXin Li   udev_monitor* monitor = udev_monitor_new_from_netlink(udev_, name);
109*1a96fba6SXin Li   if (monitor) {
110*1a96fba6SXin Li     auto monitor_to_return = std::make_unique<UdevMonitor>(monitor);
111*1a96fba6SXin Li 
112*1a96fba6SXin Li     // UdevMonitor increases the reference count of the udev_monitor struct by
113*1a96fba6SXin Li     // one. Thus, decrease the reference count of the udev_monitor struct by one
114*1a96fba6SXin Li     // before returning UdevMonitor.
115*1a96fba6SXin Li     udev_monitor_unref(monitor);
116*1a96fba6SXin Li 
117*1a96fba6SXin Li     return monitor_to_return;
118*1a96fba6SXin Li   }
119*1a96fba6SXin Li 
120*1a96fba6SXin Li   VLOG(2) << StringPrintf(
121*1a96fba6SXin Li       "udev_monitor_new_from_netlink"
122*1a96fba6SXin Li       "(%p, \"%s\") returned nullptr.",
123*1a96fba6SXin Li       udev_, name);
124*1a96fba6SXin Li   return nullptr;
125*1a96fba6SXin Li }
126*1a96fba6SXin Li 
127*1a96fba6SXin Li }  // namespace brillo
128