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