#include "services/device/usb/usb_device_linux.h"
#include <fcntl.h>
#include <stddef.h>
#include <algorithm>
#include "base/files/file_util.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/location.h"
#include "base/posix/eintr_wrapper.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/single_thread_task_runner.h"
#include "components/device_event_log/device_event_log.h"
#include "services/device/usb/usb_descriptors.h"
#include "services/device/usb/usb_device_handle_usbfs.h"
#include "services/device/usb/usb_service.h"
#if BUILDFLAG(IS_CHROMEOS)
#include "base/memory/memory_pressure_monitor.h"
#include "base/process/process_metrics.h"
#include "chromeos/dbus/permission_broker/permission_broker_client.h"
#include "components/crash/core/common/crash_key.h"
#include "services/device/public/cpp/device_features.h"
namespace {
constexpr uint32_t kAllInterfacesMask = ~0U;
}
#endif
namespace device {
UsbDeviceLinux::UsbDeviceLinux(const std::string& device_path,
std::unique_ptr<UsbDeviceDescriptor> descriptor)
: … { … }
UsbDeviceLinux::~UsbDeviceLinux() = default;
#if BUILDFLAG(IS_CHROMEOS)
void UsbDeviceLinux::CheckUsbAccess(ResultCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
chromeos::PermissionBrokerClient::Get()->CheckPathAccess(device_path_,
std::move(callback));
}
#endif
void UsbDeviceLinux::Open(OpenCallback callback) { … }
#if BUILDFLAG(IS_CHROMEOS)
void UsbDeviceLinux::OnOpenRequestComplete(OpenCallback callback,
base::ScopedFD lifeline_fd,
const std::string& client_id,
base::ScopedFD fd) {
if (!fd.is_valid()) {
USB_LOG(EVENT) << "Did not get valid device handle from permission broker.";
std::move(callback).Run(nullptr);
return;
}
Opened(std::move(fd), std::move(lifeline_fd), client_id, std::move(callback),
UsbService::CreateBlockingTaskRunner());
}
void UsbDeviceLinux::OnOpenRequestError(OpenCallback callback,
const std::string& error_name,
const std::string& error_message) {
USB_LOG(EVENT) << "Permission broker failed to open the device: "
<< error_name << ": " << error_message;
std::move(callback).Run(nullptr);
}
#else
void UsbDeviceLinux::OpenOnBlockingThread(
OpenCallback callback,
scoped_refptr<base::SequencedTaskRunner> task_runner,
scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) { … }
#endif
void UsbDeviceLinux::Opened(
base::ScopedFD fd,
base::ScopedFD lifeline_fd,
const std::string& client_id,
OpenCallback callback,
scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) { … }
}