diff options
author | Matt Hoosier <matt.hoosier@garmin.com> | 2020-05-27 15:28:23 -0500 |
---|---|---|
committer | Matt Hoosier <matt.hoosier@garmin.com> | 2020-05-28 14:08:42 -0500 |
commit | a9480f87902840388497ff85062e73381317626f (patch) | |
tree | b40f1a32cbe8d0b3b8e03d1b652e04935b985e8e | |
parent | 852eedd94c0d519bb63ca989b9e13fa9c36f6b14 (diff) |
card: add constructor for pre-opened FD
This is an escape hatch to let the user do whatever crazy thing he
wants to obtain the DRM fd. This could be from a DRM lease, an FD
passed across a Wayland protocol request, something calculated by
manually walking across the set of DRI cards and selecting specific
criteria, etc.
-rw-r--r-- | kms++/inc/kms++/card.h | 1 | ||||
-rw-r--r-- | kms++/src/card.cpp | 14 |
2 files changed, 15 insertions, 0 deletions
diff --git a/kms++/inc/kms++/card.h b/kms++/inc/kms++/card.h index e561ffc..9ca06b2 100644 --- a/kms++/inc/kms++/card.h +++ b/kms++/inc/kms++/card.h @@ -26,6 +26,7 @@ class Card public: Card(const std::string& dev_path = ""); Card(const std::string& driver, uint32_t idx); + Card(int fd, bool take_ownership); virtual ~Card(); Card(const Card& other) = delete; diff --git a/kms++/src/card.cpp b/kms++/src/card.cpp index 5b3d69e..062645a 100644 --- a/kms++/src/card.cpp +++ b/kms++/src/card.cpp @@ -148,6 +148,20 @@ Card::Card(const std::string& driver, uint32_t idx) setup(); } +Card::Card(int fd, bool take_ownership) +{ + if (take_ownership) { + m_fd = fd; + } else { + m_fd = fcntl(fd, F_DUPFD_CLOEXEC, 0); + + if (m_fd < 0) + throw invalid_argument(string(strerror(errno)) + " duplicating fd"); + } + + setup(); +} + void Card::setup() { drmVersionPtr ver = drmGetVersion(m_fd); |