mirror of
https://github.com/AxioDL/boo.git
synced 2025-12-08 21:17:50 +00:00
Massive fmtlib refactor
This commit is contained in:
@@ -21,11 +21,8 @@ void DeviceBase::closeDevice() {
|
||||
m_token->_deviceClose();
|
||||
}
|
||||
|
||||
void DeviceBase::deviceError(const char* error, ...) {
|
||||
va_list vl;
|
||||
va_start(vl, error);
|
||||
vfprintf(stderr, error, vl);
|
||||
va_end(vl);
|
||||
void DeviceBase::vdeviceError(fmt::string_view error, fmt::format_args args) {
|
||||
fmt::vprint(error, args);
|
||||
}
|
||||
|
||||
bool DeviceBase::sendUSBInterruptTransfer(const uint8_t* data, size_t length) {
|
||||
|
||||
@@ -13,7 +13,7 @@ DolphinSmashAdapter::DolphinSmashAdapter(DeviceToken* token)
|
||||
|
||||
DolphinSmashAdapter::~DolphinSmashAdapter() {}
|
||||
|
||||
static inline EDolphinControllerType parseType(unsigned char status) {
|
||||
constexpr EDolphinControllerType parseType(unsigned char status) {
|
||||
EDolphinControllerType type =
|
||||
EDolphinControllerType(status) & (EDolphinControllerType::Normal | EDolphinControllerType::Wavebird);
|
||||
switch (type) {
|
||||
@@ -25,7 +25,7 @@ static inline EDolphinControllerType parseType(unsigned char status) {
|
||||
}
|
||||
}
|
||||
|
||||
static inline EDolphinControllerType parseState(DolphinControllerState* stateOut, uint8_t* payload, bool& rumble) {
|
||||
static EDolphinControllerType parseState(DolphinControllerState* stateOut, uint8_t* payload, bool& rumble) {
|
||||
unsigned char status = payload[0];
|
||||
EDolphinControllerType type = parseType(status);
|
||||
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
#include <memory.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
static inline uint16_t bswap16(uint16_t val) { return _byteswap_ushort(val); }
|
||||
constexpr uint16_t bswap16(uint16_t val) { return _byteswap_ushort(val); }
|
||||
#elif __GNUC__ && !defined(__FreeBSD__)
|
||||
static inline uint16_t bswap16(uint16_t val) { return __builtin_bswap16(val); }
|
||||
constexpr uint16_t bswap16(uint16_t val) { return __builtin_bswap16(val); }
|
||||
#elif !defined(__FreeBSD__)
|
||||
static inline uint16_t bswap16(uint16_t val) { return __builtin_byteswap(val); }
|
||||
constexpr uint16_t bswap16(uint16_t val) { return __builtin_byteswap(val); }
|
||||
#endif
|
||||
|
||||
#ifndef M_PIF
|
||||
|
||||
@@ -76,10 +76,7 @@ class HIDDeviceIOKit : public IHIDDevice {
|
||||
}
|
||||
|
||||
static void _threadProcUSBLL(std::shared_ptr<HIDDeviceIOKit> device) {
|
||||
char thrName[128];
|
||||
snprintf(thrName, 128, "%s Transfer Thread", device->m_token.getProductName().data());
|
||||
pthread_setname_np(thrName);
|
||||
char errStr[256];
|
||||
pthread_setname_np(fmt::format(fmt("{} Transfer Thread"), device->m_token.getProductName()));
|
||||
std::unique_lock<std::mutex> lk(device->m_initMutex);
|
||||
|
||||
/* Get the HID element's parent (USB interrupt transfer-interface) */
|
||||
@@ -95,9 +92,8 @@ class HIDDeviceIOKit : public IHIDDevice {
|
||||
}
|
||||
}
|
||||
if (!interfaceEntry) {
|
||||
snprintf(errStr, 256, "Unable to find interface for %s@%s\n", device->m_token.getProductName().data(),
|
||||
device->m_devPath.data());
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt::format(fmt("Unable to find interface for {}@{}\n"),
|
||||
device->m_token.getProductName(), device->m_devPath).c_str());
|
||||
lk.unlock();
|
||||
device->m_initCond.notify_one();
|
||||
return;
|
||||
@@ -110,9 +106,8 @@ class HIDDeviceIOKit : public IHIDDevice {
|
||||
err = IOCreatePlugInInterfaceForService(interfaceEntry.get(), kIOUSBInterfaceUserClientTypeID,
|
||||
kIOCFPlugInInterfaceID, &iodev, &score);
|
||||
if (err) {
|
||||
snprintf(errStr, 256, "Unable to open %s@%s\n", device->m_token.getProductName().data(),
|
||||
device->m_devPath.data());
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}\n"),
|
||||
device->m_token.getProductName(), device->m_devPath).c_str());
|
||||
lk.unlock();
|
||||
device->m_initCond.notify_one();
|
||||
return;
|
||||
@@ -122,9 +117,8 @@ class HIDDeviceIOKit : public IHIDDevice {
|
||||
IUnknownPointer<IOUSBInterfaceInterface> intf;
|
||||
err = iodev.As(&intf, kIOUSBInterfaceInterfaceID);
|
||||
if (err) {
|
||||
snprintf(errStr, 256, "Unable to open %s@%s\n", device->m_token.getProductName().data(),
|
||||
device->m_devPath.data());
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}\n"),
|
||||
device->m_token.getProductName(), device->m_devPath).c_str());
|
||||
lk.unlock();
|
||||
device->m_initCond.notify_one();
|
||||
return;
|
||||
@@ -135,13 +129,11 @@ class HIDDeviceIOKit : public IHIDDevice {
|
||||
err = intf->USBInterfaceOpen(intf.storage());
|
||||
if (err != kIOReturnSuccess) {
|
||||
if (err == kIOReturnExclusiveAccess) {
|
||||
snprintf(errStr, 256, "Unable to open %s@%s: someone else using it\n", device->m_token.getProductName().data(),
|
||||
device->m_devPath.data());
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}: someone else using it\n"),
|
||||
device->m_token.getProductName(), device->m_devPath).c_str());
|
||||
} else {
|
||||
snprintf(errStr, 256, "Unable to open %s@%s\n", device->m_token.getProductName().data(),
|
||||
device->m_devPath.data());
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}\n"),
|
||||
device->m_token.getProductName(), device->m_devPath).c_str());
|
||||
}
|
||||
lk.unlock();
|
||||
device->m_initCond.notify_one();
|
||||
@@ -204,19 +196,15 @@ class HIDDeviceIOKit : public IHIDDevice {
|
||||
}
|
||||
|
||||
static void _threadProcHID(std::shared_ptr<HIDDeviceIOKit> device) {
|
||||
char thrName[128];
|
||||
snprintf(thrName, 128, "%s Transfer Thread", device->m_token.getProductName().data());
|
||||
pthread_setname_np(thrName);
|
||||
char errStr[256];
|
||||
pthread_setname_np(fmt::format(fmt("{} Transfer Thread"), device->m_token.getProductName());
|
||||
std::unique_lock<std::mutex> lk(device->m_initMutex);
|
||||
|
||||
/* Get the HID element's object (HID device interface) */
|
||||
IOObjectPointer<io_service_t> interfaceEntry =
|
||||
IORegistryEntryFromPath(kIOMasterPortDefault, device->m_devPath.data());
|
||||
if (!IOObjectConformsTo(interfaceEntry.get(), "IOHIDDevice")) {
|
||||
snprintf(errStr, 256, "Unable to find interface for %s@%s\n", device->m_token.getProductName().data(),
|
||||
device->m_devPath.data());
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt::format(fmt("Unable to find interface for {}@{}\n"),
|
||||
device->m_token.getProductName(), device->m_devPath);
|
||||
lk.unlock();
|
||||
device->m_initCond.notify_one();
|
||||
return;
|
||||
@@ -224,9 +212,8 @@ class HIDDeviceIOKit : public IHIDDevice {
|
||||
|
||||
device->m_hidIntf = IOHIDDeviceCreate(nullptr, interfaceEntry.get());
|
||||
if (!device->m_hidIntf) {
|
||||
snprintf(errStr, 256, "Unable to open %s@%s\n", device->m_token.getProductName().data(),
|
||||
device->m_devPath.data());
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}\n"),
|
||||
device->m_token.getProductName(), device->m_devPath).c_str());
|
||||
lk.unlock();
|
||||
device->m_initCond.notify_one();
|
||||
return;
|
||||
@@ -236,13 +223,11 @@ class HIDDeviceIOKit : public IHIDDevice {
|
||||
IOReturn err = IOHIDDeviceOpen(device->m_hidIntf.get(), kIOHIDOptionsTypeNone);
|
||||
if (err != kIOReturnSuccess) {
|
||||
if (err == kIOReturnExclusiveAccess) {
|
||||
snprintf(errStr, 256, "Unable to open %s@%s: someone else using it\n", device->m_token.getProductName().data(),
|
||||
device->m_devPath.data());
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}: someone else using it\n"),
|
||||
device->m_token.getProductName(), device->m_devPath).c_str());
|
||||
} else {
|
||||
snprintf(errStr, 256, "Unable to open %s@%s\n", device->m_token.getProductName().data(),
|
||||
device->m_devPath.data());
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}\n"),
|
||||
device->m_token.getProductName(), device->m_devPath).c_str());
|
||||
}
|
||||
lk.unlock();
|
||||
device->m_initCond.notify_one();
|
||||
@@ -304,7 +289,7 @@ public:
|
||||
else if (dType == DeviceType::HID)
|
||||
m_thread = std::thread(_threadProcHID, std::static_pointer_cast<HIDDeviceIOKit>(shared_from_this()));
|
||||
else {
|
||||
fprintf(stderr, "invalid token supplied to device constructor\n");
|
||||
fmt::print(stderr, fmt("invalid token supplied to device constructor\n"));
|
||||
return;
|
||||
}
|
||||
m_initCond.wait(lk);
|
||||
|
||||
@@ -61,7 +61,6 @@ class HIDDeviceUdev final : public IHIDDevice {
|
||||
|
||||
static void _threadProcUSBLL(std::shared_ptr<HIDDeviceUdev> device) {
|
||||
int i;
|
||||
char errStr[256];
|
||||
std::unique_lock<std::mutex> lk(device->m_initMutex);
|
||||
udev_device* udevDev = udev_device_new_from_syspath(GetUdev(), device->m_devPath.data());
|
||||
|
||||
@@ -69,8 +68,8 @@ class HIDDeviceUdev final : public IHIDDevice {
|
||||
const char* dp = udev_device_get_devnode(udevDev);
|
||||
int fd = open(dp, O_RDWR);
|
||||
if (fd < 0) {
|
||||
snprintf(errStr, 256, "Unable to open %s@%s: %s\n", device->m_token.getProductName().data(), dp, strerror(errno));
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt("Unable to open {}@{}: {}\n"),
|
||||
device->m_token.getProductName(), dp, strerror(errno));
|
||||
lk.unlock();
|
||||
device->m_initCond.notify_one();
|
||||
udev_device_unref(udevDev);
|
||||
@@ -142,7 +141,6 @@ class HIDDeviceUdev final : public IHIDDevice {
|
||||
}
|
||||
|
||||
static void _threadProcHID(std::shared_ptr<HIDDeviceUdev> device) {
|
||||
char errStr[256];
|
||||
std::unique_lock<std::mutex> lk(device->m_initMutex);
|
||||
udev_device* udevDev = udev_device_new_from_syspath(GetUdev(), device->m_devPath.data());
|
||||
|
||||
@@ -150,8 +148,8 @@ class HIDDeviceUdev final : public IHIDDevice {
|
||||
const char* dp = udev_device_get_devnode(udevDev);
|
||||
int fd = open(dp, O_RDWR | O_NONBLOCK);
|
||||
if (fd < 0) {
|
||||
snprintf(errStr, 256, "Unable to open %s@%s: %s\n", device->m_token.getProductName().data(), dp, strerror(errno));
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt("Unable to open {}@{}: {}\n"),
|
||||
device->m_token.getProductName(), dp, strerror(errno));
|
||||
lk.unlock();
|
||||
device->m_initCond.notify_one();
|
||||
udev_device_unref(udevDev);
|
||||
@@ -167,9 +165,8 @@ class HIDDeviceUdev final : public IHIDDevice {
|
||||
/* Report descriptor size */
|
||||
int reportDescSize;
|
||||
if (ioctl(fd, HIDIOCGRDESCSIZE, &reportDescSize) == -1) {
|
||||
snprintf(errStr, 256, "Unable to ioctl(HIDIOCGRDESCSIZE) %s@%s: %s\n", device->m_token.getProductName().data(),
|
||||
dp, strerror(errno));
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt("Unable to ioctl(HIDIOCGRDESCSIZE) {}@{}: {}\n"),
|
||||
device->m_token.getProductName(), dp, strerror(errno));
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
@@ -178,9 +175,8 @@ class HIDDeviceUdev final : public IHIDDevice {
|
||||
hidraw_report_descriptor reportDesc;
|
||||
reportDesc.size = reportDescSize;
|
||||
if (ioctl(fd, HIDIOCGRDESC, &reportDesc) == -1) {
|
||||
snprintf(errStr, 256, "Unable to ioctl(HIDIOCGRDESC) %s@%s: %s\n", device->m_token.getProductName().data(), dp,
|
||||
strerror(errno));
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt("Unable to ioctl(HIDIOCGRDESC) {}@{}: {}\n"),
|
||||
device->m_token.getProductName(), dp, strerror(errno));
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
@@ -275,7 +271,7 @@ public:
|
||||
else if (dType == DeviceType::HID)
|
||||
m_thread = std::thread(_threadProcHID, std::static_pointer_cast<HIDDeviceUdev>(shared_from_this()));
|
||||
else {
|
||||
fprintf(stderr, "invalid token supplied to device constructor");
|
||||
fmt::print(stderr, fmt("invalid token supplied to device constructor"));
|
||||
abort();
|
||||
}
|
||||
m_initCond.wait(lk);
|
||||
|
||||
@@ -62,7 +62,6 @@ class HIDDeviceWinUSB final : public IHIDDevice {
|
||||
|
||||
static void _threadProcUSBLL(std::shared_ptr<HIDDeviceWinUSB> device) {
|
||||
unsigned i;
|
||||
char errStr[256];
|
||||
std::unique_lock<std::mutex> lk(device->m_initMutex);
|
||||
|
||||
/* POSIX.. who needs it?? -MS */
|
||||
@@ -70,18 +69,16 @@ class HIDDeviceWinUSB final : public IHIDDevice {
|
||||
CreateFileA(device->m_devPath.data(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL,
|
||||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
|
||||
if (INVALID_HANDLE_VALUE == device->m_devHandle) {
|
||||
_snprintf(errStr, 256, "Unable to open %s@%s: %d\n", device->m_token.getProductName().data(),
|
||||
device->m_devPath.data(), GetLastError());
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}: {}\n"),
|
||||
device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str());
|
||||
lk.unlock();
|
||||
device->m_initCond.notify_one();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!WinUsb_Initialize(device->m_devHandle, &device->m_usbHandle)) {
|
||||
_snprintf(errStr, 256, "Unable to open %s@%s: %d\n", device->m_token.getProductName().data(),
|
||||
device->m_devPath.data(), GetLastError());
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}: {}\n"),
|
||||
device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str());
|
||||
lk.unlock();
|
||||
device->m_initCond.notify_one();
|
||||
CloseHandle(device->m_devHandle);
|
||||
@@ -91,9 +88,8 @@ class HIDDeviceWinUSB final : public IHIDDevice {
|
||||
/* Enumerate device pipes */
|
||||
USB_INTERFACE_DESCRIPTOR ifDesc = {0};
|
||||
if (!WinUsb_QueryInterfaceSettings(device->m_usbHandle, 0, &ifDesc)) {
|
||||
_snprintf(errStr, 256, "Unable to open %s@%s: %d\n", device->m_token.getProductName().data(),
|
||||
device->m_devPath.data(), GetLastError());
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}: {}\n"),
|
||||
device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str());
|
||||
lk.unlock();
|
||||
device->m_initCond.notify_one();
|
||||
CloseHandle(device->m_devHandle);
|
||||
@@ -149,7 +145,6 @@ class HIDDeviceWinUSB final : public IHIDDevice {
|
||||
PHIDP_PREPARSED_DATA m_preparsedData = nullptr;
|
||||
|
||||
static void _threadProcHID(std::shared_ptr<HIDDeviceWinUSB> device) {
|
||||
char errStr[256];
|
||||
std::unique_lock<std::mutex> lk(device->m_initMutex);
|
||||
|
||||
/* POSIX.. who needs it?? -MS */
|
||||
@@ -158,18 +153,16 @@ class HIDDeviceWinUSB final : public IHIDDevice {
|
||||
CreateFileA(device->m_devPath.data(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL,
|
||||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
|
||||
if (INVALID_HANDLE_VALUE == device->m_hidHandle) {
|
||||
_snprintf(errStr, 256, "Unable to open %s@%s: %d\n", device->m_token.getProductName().data(),
|
||||
device->m_devPath.data(), GetLastError());
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}: {}\n"),
|
||||
device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str());
|
||||
lk.unlock();
|
||||
device->m_initCond.notify_one();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!HidD_GetPreparsedData(device->m_hidHandle, &device->m_preparsedData)) {
|
||||
_snprintf(errStr, 256, "Unable get preparsed data of %s@%s: %d\n", device->m_token.getProductName().data(),
|
||||
device->m_devPath.data(), GetLastError());
|
||||
device->m_devImp->deviceError(errStr);
|
||||
device->m_devImp->deviceError(fmt::format(fmt("Unable get preparsed data of {}@{}: {}\n"),
|
||||
device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str());
|
||||
lk.unlock();
|
||||
device->m_initCond.notify_one();
|
||||
return;
|
||||
@@ -237,14 +230,14 @@ class HIDDeviceWinUSB final : public IHIDDevice {
|
||||
}
|
||||
|
||||
if (Error != ERROR_IO_PENDING) {
|
||||
fprintf(stderr, "Write Failed %08X\n", int(Error));
|
||||
fmt::print(stderr, fmt("Write Failed {:08X}\n"), int(Error));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!GetOverlappedResult(m_hidHandle, &Overlapped, &BytesWritten, TRUE)) {
|
||||
DWORD Error = GetLastError();
|
||||
fprintf(stderr, "Write Failed %08X\n", int(Error));
|
||||
fmt::print(stderr, fmt("Write Failed {:08X}\n"), int(Error));
|
||||
return false;
|
||||
}
|
||||
} else if (tp == HIDReportType::Feature) {
|
||||
@@ -313,7 +306,7 @@ public:
|
||||
m_runningTransferLoop = false;
|
||||
return;
|
||||
} else if (Error != ERROR_IO_PENDING) {
|
||||
fprintf(stderr, "Read Failed: %08X\n", int(Error));
|
||||
fmt::print(stderr, fmt("Read Failed: {:08X}\n"), int(Error));
|
||||
return;
|
||||
} else if (!GetOverlappedResultEx(m_hidHandle, &m_overlapped, &BytesRead, 10, TRUE)) {
|
||||
return;
|
||||
|
||||
@@ -84,14 +84,14 @@ class HIDListenerIOKit : public IHIDListener {
|
||||
err = IOCreatePlugInInterfaceForService(obj.get(), kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID,
|
||||
&devServ, &score);
|
||||
if (err != kIOReturnSuccess) {
|
||||
fprintf(stderr, "unable to open IOKit plugin interface\n");
|
||||
fmt::print(stderr, fmt("unable to open IOKit plugin interface\n"));
|
||||
continue;
|
||||
}
|
||||
|
||||
IUnknownPointer<IOUSBDeviceInterface182> dev;
|
||||
err = devServ.As(&dev, kIOUSBDeviceInterfaceID182);
|
||||
if (err != kIOReturnSuccess) {
|
||||
fprintf(stderr, "unable to open IOKit device interface\n");
|
||||
fmt::print(stderr, fmt("unable to open IOKit device interface\n"));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -147,14 +147,14 @@ class HIDListenerIOKit : public IHIDListener {
|
||||
err =
|
||||
IOCreatePlugInInterfaceForService(obj.get(), kIOHIDDeviceTypeID, kIOCFPlugInInterfaceID, &devServ, &score);
|
||||
if (err != kIOReturnSuccess) {
|
||||
fprintf(stderr, "unable to open IOKit plugin interface\n");
|
||||
fmt::print(stderr, fmt("unable to open IOKit plugin interface\n"));
|
||||
continue;
|
||||
}
|
||||
|
||||
IUnknownPointer<IOHIDDeviceDeviceInterface> dev;
|
||||
err = devServ.As(&dev, kIOHIDDeviceDeviceInterfaceID);
|
||||
if (err != kIOReturnSuccess) {
|
||||
fprintf(stderr, "unable to open IOKit device interface\n");
|
||||
fmt::print(stderr, fmt("unable to open IOKit device interface\n"));
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -170,7 +170,7 @@ public:
|
||||
/* Setup hotplug events */
|
||||
m_udevMon = udev_monitor_new_from_netlink(GetUdev(), "udev");
|
||||
if (!m_udevMon) {
|
||||
fprintf(stderr, "unable to init udev_monitor");
|
||||
fmt::print(stderr, fmt("unable to init udev_monitor"));
|
||||
abort();
|
||||
}
|
||||
udev_monitor_filter_add_match_subsystem_devtype(m_udevMon, "usb", "usb_device");
|
||||
|
||||
Reference in New Issue
Block a user