uterm: monitor: avoid libdrm dependency
authorDavid Herrmann <dh.herrmann@googlemail.com>
Mon, 7 Jan 2013 13:07:14 +0000 (14:07 +0100)
committerDavid Herrmann <dh.herrmann@googlemail.com>
Mon, 7 Jan 2013 13:07:14 +0000 (14:07 +0100)
Instead of depending on libdrm, we simply copy the VERSION-IOCTL ABI and
perform the ioctl ourself. This reduces complexity and dependencies.

Why does the DRM layer not provide normal uapi headers via
linux-api-headers? We should fix that.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
src/uterm_monitor.c
src/uterm_video_internal.h

index 50fcf15..7080445 100644 (file)
@@ -44,7 +44,6 @@
 #include "shl_dlist.h"
 #include "uterm.h"
 #include "uterm_systemd_internal.h"
-#include "uterm_video_internal.h"
 
 #define LOG_SUBSYSTEM "monitor"
 
@@ -466,12 +465,61 @@ static bool is_drm_primary(struct uterm_monitor *mon, struct udev_device *dev,
        return false;
 }
 
+/*
+ * DRM doesn't provide public uapi headers but instead provides the ABI via
+ * libdrm... GREAT! That means we either need a build-time dependency to libdrm
+ * or we copy the parts we use in here. As we only need the VERSION ioctl, we
+ * simply copy it from drm.h.
+ */
+
+struct uterm_drm_version {
+       int version_major;        /**< Major version */
+       int version_minor;        /**< Minor version */
+       int version_patchlevel;   /**< Patch level */
+       size_t name_len;          /**< Length of name buffer */
+       char *name;       /**< Name of driver */
+       size_t date_len;          /**< Length of date buffer */
+       char *date;       /**< User-space buffer to hold date */
+       size_t desc_len;          /**< Length of desc buffer */
+       char *desc;       /**< User-space buffer to hold desc */
+};
+#define UTERM_DRM_IOCTL_VERSION _IOWR('d', 0x00, struct uterm_drm_version)
+
+static inline char *get_drm_name(int fd)
+{
+       struct uterm_drm_version v;
+       unsigned int len;
+       int ret;
+
+       memset(&v, 0, sizeof(v));
+       ret = ioctl(fd, UTERM_DRM_IOCTL_VERSION, &v);
+       if (ret < 0)
+               return NULL;
+
+       if (!v.name_len)
+               return NULL;
+
+       len = v.name_len;
+       v.name = malloc(len + 1);
+       if (!v.name)
+               return NULL;
+
+       ret = ioctl(fd, UTERM_DRM_IOCTL_VERSION, &v);
+       if (ret < 0) {
+               free(v.name);
+               return NULL;
+       }
+
+       v.name[len] = 0;
+       return v.name;
+}
+
 static bool is_drm_usb(struct uterm_monitor *mon, const char *node, int fd)
 {
        char *name;
        bool res;
 
-       name = video_drm_get_name(fd);
+       name = get_drm_name(fd);
        if (!name) {
                log_warning("cannot get driver name for DRM device %s (%d): %m",
                            node, errno);
@@ -484,7 +532,7 @@ static bool is_drm_usb(struct uterm_monitor *mon, const char *node, int fd)
                res = false;
 
        log_debug("DRM device %s uses driver %s", node, name);
-       video_drm_free_name(name);
+       free(name);
        return res;
 }
 
index 81f5b83..a7937c1 100644 (file)
@@ -415,36 +415,6 @@ static inline int video_do_use(struct uterm_video *video)
 
 #if defined(BUILD_ENABLE_VIDEO_DRM) || defined(BUILD_ENABLE_VIDEO_DUMB)
 
-static inline char *video_drm_get_name(int fd)
-{
-       drmVersionPtr v;
-       char *name;
-
-       if (fd < 0)
-               return NULL;
-
-       v = drmGetVersion(fd);
-       if (!v)
-               return NULL;
-
-       name = malloc(v->name_len + 1);
-       if (name) {
-               memcpy(name, v->name, v->name_len);
-               name[v->name_len] = 0;
-       }
-
-       drmFreeVersion(v);
-       return name;
-}
-
-static inline void video_drm_free_name(char *name)
-{
-       if (!name)
-               return;
-
-       free(name);
-}
-
 static inline bool video_drm_available(void)
 {
        return drmAvailable();
@@ -452,15 +422,6 @@ static inline bool video_drm_available(void)
 
 #else
 
-static inline char *video_drm_get_name(int fd)
-{
-       return NULL;
-}
-
-static inline void video_drm_free_name(char *name)
-{
-}
-
 static inline bool video_drm_available(void)
 {
        return false;