X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftbm_drm_helper_client.c;h=ecd5653b7fc6668cbc23c98545441b29de9919c9;hb=eae7e7b536576af5e78f76a52c5468dbba7d7a2e;hp=4e2eaf1c03775f7349cf834ff7b01dadff1a2d59;hpb=379ff5cfc90ec535211bfb983f3d65f0037d7714;p=platform%2Fcore%2Fuifw%2Flibtbm.git diff --git a/src/tbm_drm_helper_client.c b/src/tbm_drm_helper_client.c index 4e2eaf1..ecd5653 100644 --- a/src/tbm_drm_helper_client.c +++ b/src/tbm_drm_helper_client.c @@ -31,6 +31,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define WL_HIDE_DEPRECATED +#include "config.h" + #include #include #include @@ -40,68 +42,68 @@ 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; 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; - - 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); + struct wayland_tbm_drm_auth_client *tbm_drm_client = (struct wayland_tbm_drm_auth_client *)data; - wl_tbm_drm_add_listener(tbm_drm_client->wl_tbm_drm, &wl_tbm_drm_client_listener, tbm_drm_client); + 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_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 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 -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_LOG_E("Failed to connect display\n"); free(tbm_drm_client); return 0; @@ -111,18 +113,24 @@ wayland_tbm_drm_client_get_auth_info(int *auth_fd, char **device, uint32_t *capa wl_registry = wl_display_get_registry(display); if (!wl_registry) { - TBM_LOG("Failed to connect display\n"); + TBM_LOG_E("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_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); @@ -130,10 +138,21 @@ wayland_tbm_drm_client_get_auth_info(int *auth_fd, char **device, uint32_t *capa 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); @@ -144,18 +163,20 @@ wayland_tbm_drm_client_get_auth_info(int *auth_fd, char **device, uint32_t *capa 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); @@ -167,3 +188,69 @@ wayland_tbm_drm_client_get_auth_info(int *auth_fd, char **device, uint32_t *capa 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 */