#define WL_HIDE_DEPRECATED
+#include "config.h"
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tbm_bufmgr_int.h"
-#include "wayland-tbm-drm-client-protocol.h"
+#include "wayland-tbm-drm-auth-client-protocol.h"
-struct wayland_tbm_drm_client {
+struct wayland_tbm_drm_auth_client {
struct wl_display *display;
- struct wl_tbm_drm *wl_tbm_drm;
+ struct wl_tbm_drm_auth *wl_tbm_drm_auth;
int auth_fd;
char *device;
uint32_t capabilities;
};
+static int tbm_drm_fd = -1;
+
+/* LCOV_EXCL_START */
static void
-handle_tbm_drm_authentication_info(void *data, struct wl_tbm_drm *wl_tbm_drm, const char *device_name, uint32_t capabilities, int32_t auth_fd)
+handle_tbm_drm_authentication_info(void *data, struct wl_tbm_drm_auth *wl_tbm_drm_auth, const char *device_name, uint32_t capabilities, int32_t auth_fd)
{
- struct wayland_tbm_drm_client *tbm_drm_client = (struct wayland_tbm_drm_client *)data;
+ struct wayland_tbm_drm_auth_client *tbm_drm_client = (struct wayland_tbm_drm_auth_client *)data;
/* client authentication infomation */
tbm_drm_client->auth_fd = auth_fd;
tbm_drm_client->capabilities = capabilities;
if (device_name)
- tbm_drm_client->device = strndup(device_name, 256);
+ tbm_drm_client->device = strdup(device_name);
}
-static const struct wl_tbm_drm_listener wl_tbm_drm_client_listener = {
- handle_tbm_drm_authentication_info
+static const struct wl_tbm_drm_auth_listener wl_tbm_drm_auth_client_listener = {
+ handle_tbm_drm_authentication_info
};
static void
-_wayland_tbm_drm_client_registry_handle_global(void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version)
+_wayland_tbm_drm_auth_client_registry_handle_global(void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version)
{
- struct wayland_tbm_drm_client *tbm_drm_client = (struct wayland_tbm_drm_client *)data;
+ struct wayland_tbm_drm_auth_client *tbm_drm_client = (struct wayland_tbm_drm_auth_client *)data;
- if (!strcmp(interface, "wl_tbm_drm")) {
- tbm_drm_client->wl_tbm_drm = wl_registry_bind(registry, name, &wl_tbm_drm_interface, version);
- TBM_RETURN_IF_FAIL(tbm_drm_client->wl_tbm_drm != NULL);
+ if (!strcmp(interface, "wl_tbm_drm_auth")) {
+ tbm_drm_client->wl_tbm_drm_auth = wl_registry_bind(registry, name, &wl_tbm_drm_auth_interface, version);
+ TBM_RETURN_IF_FAIL(tbm_drm_client->wl_tbm_drm_auth != NULL);
- wl_tbm_drm_add_listener(tbm_drm_client->wl_tbm_drm, &wl_tbm_drm_client_listener, tbm_drm_client);
-
- wl_tbm_drm_get_authentication_info(tbm_drm_client->wl_tbm_drm);
- wl_display_roundtrip(tbm_drm_client->display);
+ wl_tbm_drm_auth_add_listener(tbm_drm_client->wl_tbm_drm_auth, &wl_tbm_drm_auth_client_listener, tbm_drm_client);
}
}
+static void
+_wayland_tbm_drm_auth_client_registry_remove_global(void *data, struct wl_registry *registry, uint32_t name)
+{
+}
+
static const struct wl_registry_listener registry_listener = {
- _wayland_tbm_drm_client_registry_handle_global,
- NULL
+ _wayland_tbm_drm_auth_client_registry_handle_global,
+ _wayland_tbm_drm_auth_client_registry_remove_global
};
int
-wayland_tbm_drm_client_get_auth_info(int *auth_fd, char **device, uint32_t *capabilities)
+tbm_drm_helper_get_auth_info(int *auth_fd, char **device, uint32_t *capabilities)
{
struct wl_display *display;
struct wl_registry *wl_registry;
- struct wayland_tbm_drm_client *tbm_drm_client;
+ struct wayland_tbm_drm_auth_client *tbm_drm_client;
- tbm_drm_client = calloc(1, sizeof(struct wayland_tbm_drm_client));
+ tbm_drm_client = calloc(1, sizeof(struct wayland_tbm_drm_auth_client));
TBM_RETURN_VAL_IF_FAIL(tbm_drm_client != NULL, 0);
tbm_drm_client->auth_fd = -1;
- display = wl_display_connect("tbm_drm");
+ display = wl_display_connect("tbm-drm-auth");
if (!display) {
- TBM_LOG("Failed to connect display\n");
+ TBM_ERR("Failed to connect display\n");
free(tbm_drm_client);
return 0;
wl_registry = wl_display_get_registry(display);
if (!wl_registry) {
- TBM_LOG("Failed to connect display\n");
+ TBM_ERR("Failed to get registry\n");
wl_display_disconnect(display);
free(tbm_drm_client);
return 0;
}
- wl_registry_add_listener(wl_registry, ®istry_listener, &tbm_drm_client);
- wl_display_roundtrip(display); //For Gloabl registry
+ wl_registry_add_listener(wl_registry, ®istry_listener, tbm_drm_client);
+ if (wl_display_roundtrip(display) < 0) { //For Gloabl registry
+ TBM_ERR("Failed to wl_display_roundtrip for global registry\n");
+ wl_registry_destroy(wl_registry);
+ wl_display_disconnect(display);
+ free(tbm_drm_client);
+ return 0;
+ }
- if (!tbm_drm_client->wl_tbm_drm) {
- TBM_LOG("Failed to get wl_tbm_drm interface\n");
+ if (!tbm_drm_client->wl_tbm_drm_auth) {
+ TBM_ERR("Failed to get wl_tbm_drm_auth interface\n");
wl_registry_destroy(wl_registry);
wl_display_disconnect(display);
free(tbm_drm_client);
return 0;
}
+ wl_tbm_drm_auth_get_authentication_info(tbm_drm_client->wl_tbm_drm_auth);
+ if (wl_display_roundtrip(display) < 0) {
+ TBM_ERR("Failed to wl_display_roundtrip get auth info\n");
+ wl_tbm_drm_auth_set_user_data(tbm_drm_client->wl_tbm_drm_auth, NULL);
+ wl_tbm_drm_auth_destroy(tbm_drm_client->wl_tbm_drm_auth);
+ wl_registry_destroy(wl_registry);
+ wl_display_disconnect(display);
+ free(tbm_drm_client);
+ return 0;
+ }
+
if (tbm_drm_client->auth_fd < 0) {
- TBM_LOG("Failed to get auth info\n");
- wl_tbm_drm_set_user_data(tbm_drm_client->wl_tbm_drm, NULL);
- wl_tbm_drm_destroy(tbm_drm_client->wl_tbm_drm);
+ TBM_ERR("Failed to get auth info\n");
+ wl_tbm_drm_auth_set_user_data(tbm_drm_client->wl_tbm_drm_auth, NULL);
+ wl_tbm_drm_auth_destroy(tbm_drm_client->wl_tbm_drm_auth);
wl_registry_destroy(wl_registry);
wl_display_disconnect(display);
free(tbm_drm_client);
if (auth_fd)
*auth_fd = tbm_drm_client->auth_fd;
else
- close(*auth_fd);
+ close(tbm_drm_client->auth_fd);
if (capabilities)
*capabilities = tbm_drm_client->capabilities;
- if (tbm_drm_client->device && device)
- *device = strdup(tbm_drm_client->device);
- else
- *device = NULL;
+ if (device) {
+ if (tbm_drm_client->device)
+ *device = strdup(tbm_drm_client->device);
+ else
+ *device = NULL;
+ }
- wl_tbm_drm_set_user_data(tbm_drm_client->wl_tbm_drm, NULL);
- wl_tbm_drm_destroy(tbm_drm_client->wl_tbm_drm);
+ wl_tbm_drm_auth_set_user_data(tbm_drm_client->wl_tbm_drm_auth, NULL);
+ wl_tbm_drm_auth_destroy(tbm_drm_client->wl_tbm_drm_auth);
if (tbm_drm_client->device)
free(tbm_drm_client->device);
return 1;
}
+
+
+void
+tbm_drm_helper_set_fd(int fd)
+{
+ int fd_max = tbm_bufmgr_get_fd_limit();
+
+ if (tbm_drm_fd == fd)
+ return;
+
+ if (fd < 0 || fd > fd_max) {
+ TBM_ERR("%d out of fd range\n", fd);
+ return;
+ }
+
+ if (tbm_drm_fd != -1)
+ TBM_WRN("already has TBM_DRM_FD: %d\n", tbm_drm_fd);
+
+ tbm_drm_fd = fd;
+
+ TBM_INFO("TBM_DRM_FD: %d\n", tbm_drm_fd);
+}
+
+void
+tbm_drm_helper_unset_fd(void)
+{
+ tbm_drm_fd = -1;
+ TBM_INFO("TBM_DRM_FD: %d\n", tbm_drm_fd);
+}
+
+int
+tbm_drm_helper_get_fd(void)
+{
+ int new_fd, flags;
+
+ if (tbm_drm_fd == -1) {
+ TBM_ERR("no drm fd");
+ return -1;
+ }
+
+ TBM_INFO("TBM_DRM_FD: %d\n", tbm_drm_fd);
+
+ flags = fcntl(tbm_drm_fd, F_GETFD);
+ if (flags == -1) {
+ TBM_ERR("fcntl failed: %m");
+ return -1;
+ }
+
+ new_fd = dup(tbm_drm_fd);
+ if (new_fd < 0) {
+ TBM_ERR("dup failed: %m");
+ return -1;
+ }
+
+ if (fcntl(new_fd, F_SETFD, flags|FD_CLOEXEC) == -1) {
+ TBM_ERR("failed to set fd\n");
+ close(new_fd);
+ return -1;
+ }
+
+ TBM_INFO("Return TBM_FD: %d\n", new_fd);
+
+ return new_fd;
+}
+
+/* LCOV_EXCL_STOP */