tbm_bufmgr: add checking of a map_count in the unmap function
[platform/core/uifw/libtbm.git] / src / tbm_drm_helper_client.c
index d0a3f50..ecd5653 100644 (file)
@@ -31,6 +31,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #define WL_HIDE_DEPRECATED
 
+#include "config.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -40,20 +42,23 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #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;
@@ -62,26 +67,26 @@ handle_tbm_drm_authentication_info(void *data, struct wl_tbm_drm *wl_tbm_drm, co
            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_auth_add_listener(tbm_drm_client->wl_tbm_drm_auth, &wl_tbm_drm_auth_client_listener, tbm_drm_client);
        }
 }
 
 static const struct wl_registry_listener registry_listener = {
-    _wayland_tbm_drm_client_registry_handle_global,
-    NULL
+       _wayland_tbm_drm_auth_client_registry_handle_global,
+       NULL
 };
 
 int
@@ -89,16 +94,16 @@ 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_LOG_E("Failed to connect display\n");
                free(tbm_drm_client);
 
                return 0;
@@ -108,7 +113,7 @@ tbm_drm_helper_get_auth_info(int *auth_fd, char **device, uint32_t *capabilities
 
        wl_registry = wl_display_get_registry(display);
        if (!wl_registry) {
-               TBM_LOG("Failed to get registry\n");
+               TBM_LOG_E("Failed to get registry\n");
                wl_display_disconnect(display);
                free(tbm_drm_client);
 
@@ -116,12 +121,16 @@ tbm_drm_helper_get_auth_info(int *auth_fd, char **device, uint32_t *capabilities
        }
 
        wl_registry_add_listener(wl_registry, &registry_listener, tbm_drm_client);
-       wl_display_roundtrip(display); //For Gloabl registry
-        wl_tbm_drm_get_authentication_info(tbm_drm_client->wl_tbm_drm);
-       wl_display_roundtrip(display);
+       if (wl_display_roundtrip(display) < 0) { //For Gloabl registry
+               TBM_LOG_E("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_LOG_E("Failed to get wl_tbm_drm_auth interface\n");
                wl_registry_destroy(wl_registry);
                wl_display_disconnect(display);
                free(tbm_drm_client);
@@ -129,10 +138,21 @@ tbm_drm_helper_get_auth_info(int *auth_fd, char **device, uint32_t *capabilities
                return 0;
        }
 
+       wl_tbm_drm_auth_get_authentication_info(tbm_drm_client->wl_tbm_drm_auth);
+       if (wl_display_roundtrip(display) < 0) {
+               TBM_LOG_E("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_LOG_E("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);
@@ -143,7 +163,7 @@ tbm_drm_helper_get_auth_info(int *auth_fd, char **device, uint32_t *capabilities
        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;
@@ -155,8 +175,8 @@ tbm_drm_helper_get_auth_info(int *auth_fd, char **device, uint32_t *capabilities
                        *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);
@@ -168,3 +188,69 @@ tbm_drm_helper_get_auth_info(int *auth_fd, char **device, uint32_t *capabilities
 
        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_LOG_E("%d out of fd range\n", fd);
+               return;
+       }
+
+       if (tbm_drm_fd != -1)
+               TBM_LOG_W("already has TBM_DRM_FD: %d\n", tbm_drm_fd);
+
+       tbm_drm_fd = fd;
+
+       TBM_LOG_I("TBM_DRM_FD: %d\n", tbm_drm_fd);
+}
+
+void
+tbm_drm_helper_unset_fd(void)
+{
+       tbm_drm_fd = -1;
+       TBM_LOG_I("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_LOG_E("no drm fd");
+               return -1;
+       }
+
+       TBM_LOG_I("TBM_DRM_FD: %d\n", tbm_drm_fd);
+
+       flags = fcntl(tbm_drm_fd, F_GETFD);
+       if (flags == -1) {
+               TBM_LOG_E("fcntl failed: %m");
+               return -1;
+       }
+
+       new_fd = dup(tbm_drm_fd);
+       if (new_fd < 0) {
+               TBM_LOG_E("dup failed: %m");
+               return -1;
+       }
+
+       if (fcntl(new_fd, F_SETFD, flags|FD_CLOEXEC) == -1) {
+               TBM_LOG_E("failed to set fd\n");
+               close(new_fd);
+               return -1;
+       }
+
+       TBM_LOG_I("Return TBM_FD: %d\n", new_fd);
+
+       return new_fd;
+}
+
+/* LCOV_EXCL_STOP */