blob: 20fc8ceaca35f1d2cbe565288f22a43dfa92c779 [file] [log] [blame]
// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "mist/udev_monitor.h"
#include <libudev.h>
#include <base/logging.h>
#include <base/strings/stringprintf.h>
#include "mist/udev_device.h"
using base::StringPrintf;
namespace mist {
UdevMonitor::UdevMonitor() : monitor_(nullptr) {}
UdevMonitor::UdevMonitor(udev_monitor* monitor)
: monitor_(monitor) {
CHECK(monitor_);
udev_monitor_ref(monitor_);
}
UdevMonitor::~UdevMonitor() {
if (monitor_) {
udev_monitor_unref(monitor_);
monitor_ = nullptr;
}
}
bool UdevMonitor::EnableReceiving() {
int result = udev_monitor_enable_receiving(monitor_);
if (result == 0)
return true;
VLOG(2) << StringPrintf("udev_monitor_enable_receiving(%p) returned %d.",
monitor_,
result);
return false;
}
bool UdevMonitor::SetReceiveBufferSize(int size) {
int result = udev_monitor_set_receive_buffer_size(monitor_, size);
if (result == 0)
return true;
VLOG(2) << StringPrintf("udev_monitor_set_receive_buffer_size"
"(%p) returned %d.",
monitor_,
result);
return false;
}
int UdevMonitor::GetFileDescriptor() const {
int file_descriptor = udev_monitor_get_fd(monitor_);
if (file_descriptor >= 0)
return file_descriptor;
VLOG(2) << StringPrintf("udev_monitor_get_fd(%p) returned %d.",
monitor_,
file_descriptor);
return kInvalidFileDescriptor;
}
UdevDevice* UdevMonitor::ReceiveDevice() {
udev_device* received_device = udev_monitor_receive_device(monitor_);
if (received_device) {
UdevDevice* device = new UdevDevice(received_device);
CHECK(device);
// udev_monitor_receive_device increases the reference count of the returned
// udev_device struct, while UdevDevice also holds a reference count of the
// udev_device struct. Thus, decrease the reference count of the udev_device
// struct.
udev_device_unref(received_device);
return device;
}
VLOG(2) << StringPrintf("udev_monitor_receive_device(%p) returned nullptr.",
monitor_);
return nullptr;
}
bool UdevMonitor::FilterAddMatchSubsystemDeviceType(const char* subsystem,
const char* device_type) {
int result = udev_monitor_filter_add_match_subsystem_devtype(
monitor_, subsystem, device_type);
if (result == 0)
return true;
VLOG(2) << StringPrintf("udev_monitor_filter_add_match_subsystem_devtype"
"(%p, \"%s\", \"%s\") returned %d.",
monitor_,
subsystem,
device_type,
result);
return false;
}
bool UdevMonitor::FilterAddMatchTag(const char* tag) {
int result = udev_monitor_filter_add_match_tag(monitor_, tag);
if (result == 0)
return true;
VLOG(2) << StringPrintf("udev_monitor_filter_add_tag"
"(%p, \"%s\") returned %d.",
monitor_,
tag,
result);
return false;
}
bool UdevMonitor::FilterUpdate() {
int result = udev_monitor_filter_update(monitor_);
if (result == 0)
return true;
VLOG(2) << StringPrintf("udev_monitor_filter_update(%p) returned %d.",
monitor_,
result);
return false;
}
bool UdevMonitor::FilterRemove() {
int result = udev_monitor_filter_remove(monitor_);
if (result == 0)
return true;
VLOG(2) << StringPrintf("udev_monitor_filter_remove(%p) returned %d.",
monitor_,
result);
return false;
}
} // namespace mist