| // Copyright 2016 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. |
| |
| #ifndef PERMISSION_BROKER_USB_DRIVER_TRACKER_H_ |
| #define PERMISSION_BROKER_USB_DRIVER_TRACKER_H_ |
| |
| #include <map> |
| #include <string> |
| #include <tuple> |
| #include <utility> |
| #include <vector> |
| |
| #include <base/macros.h> |
| #include <base/message_loop/message_loop.h> |
| #include <base/sequenced_task_runner.h> |
| |
| namespace permission_broker { |
| |
| class UsbDriverTracker { |
| public: |
| UsbDriverTracker(); |
| ~UsbDriverTracker(); |
| |
| // Detach all the interfaces of the USB device at |path| from their |
| // kernel drivers using the |fd| file descriptor pointing to the devfs node. |
| bool DetachPathFromKernel(int fd, const std::string& path); |
| |
| // Try to attach a kernel driver to the interface number |iface| |
| // of the USB device at |path|. |
| bool ReAttachPathToKernel(const std::string& path, |
| const std::vector<uint8_t>& ifaces); |
| |
| private: |
| typedef std::tuple<std::string, uint64_t, std::vector<uint8_t>> UsbInterfaces; |
| |
| void ScanClosedFd(int fd); |
| |
| // File descriptors watcher callback. |
| static void OnFdEvent(UsbDriverTracker *obj, int fd); |
| |
| std::map<const int, UsbInterfaces> dev_fds_; |
| |
| DISALLOW_COPY_AND_ASSIGN(UsbDriverTracker); |
| }; |
| |
| } // namespace permission_broker |
| |
| #endif // PERMISSION_BROKER_USB_DRIVER_TRACKER_H_ |