summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Hoosier <matt.hoosier@garmin.com>2020-05-27 15:28:23 -0500
committerMatt Hoosier <matt.hoosier@garmin.com>2020-05-28 14:08:42 -0500
commita9480f87902840388497ff85062e73381317626f (patch)
treeb40f1a32cbe8d0b3b8e03d1b652e04935b985e8e
parent852eedd94c0d519bb63ca989b9e13fa9c36f6b14 (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.h1
-rw-r--r--kms++/src/card.cpp14
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);