struct wayland_tbm_drm_auth_server {
struct wl_display *display;
struct wl_global *wl_tbm_drm_auth_global;
+ pthread_t thread;
char *device_name;
uint32_t fd;
/* send */
wl_tbm_drm_auth_send_authentication_info(resource, device_name, capabilities, fd);
+ TBM_INFO("Send tbm drm auth info fd:%d device_name:%s capabilities:%x",
+ fd, device_name, capabilities);
+
fini:
if (fd >= 0)
close(fd);
}
}
+static void *
+_tbm_drm_auth_main(void *data)
+{
+ wl_display_run(tbm_drm_auth_srv->display);
+ pthread_exit(NULL);
+}
+
int
tbm_drm_helper_wl_auth_server_init(void *wl_display, int fd, const char *device_name, uint32_t flags)
{
- if (!tbm_drm_auth_srv) {
- TBM_RETURN_VAL_IF_FAIL(wl_display != NULL, 0);
-
- tbm_drm_auth_srv = calloc(1, sizeof(struct wayland_tbm_drm_auth_server));
- TBM_RETURN_VAL_IF_FAIL(tbm_drm_auth_srv != NULL, 0);
-
- tbm_drm_auth_srv->display = (struct wl_display *)wl_display;
- if (!device_name) {
- tbm_drm_auth_srv->device_name = drmGetDeviceNameFromFd(fd);
- if (!tbm_drm_auth_srv->device_name) {
- TBM_ERR("fail to get device name!\n");
- return 0;
- }
- } else {
- tbm_drm_auth_srv->device_name = strdup(device_name);
- }
- tbm_drm_auth_srv->fd = fd;
- tbm_drm_auth_srv->flags = flags;
+ int ret;
- if (wl_display_add_socket(tbm_drm_auth_srv->display, "tbm-drm-auth")) {
- TBM_ERR("[TBM_DRM] fail to add socket\n");
+ if (tbm_drm_auth_srv) return 1;
- if (tbm_drm_auth_srv->device_name)
- free(tbm_drm_auth_srv->device_name);
+ tbm_drm_auth_srv = calloc(1, sizeof(struct wayland_tbm_drm_auth_server));
+ TBM_RETURN_VAL_IF_FAIL(tbm_drm_auth_srv != NULL, 0);
- free(tbm_drm_auth_srv);
- tbm_drm_auth_srv = NULL;
+ tbm_drm_auth_srv->display = wl_display_create();
+ if (!tbm_drm_auth_srv->display) {
+ TBM_ERR("fail to create wl_display");
+ goto fail;
+ }
- return 0;
+ if (!device_name) {
+ tbm_drm_auth_srv->device_name = drmGetDeviceNameFromFd(fd);
+ if (!tbm_drm_auth_srv->device_name) {
+ TBM_ERR("fail to get device name");
+ goto fail;
}
+ } else {
+ tbm_drm_auth_srv->device_name = strdup(device_name);
+ }
+
+ tbm_drm_auth_srv->fd = fd;
+ tbm_drm_auth_srv->flags = flags;
+
+ if (wl_display_add_socket(tbm_drm_auth_srv->display, "tbm-drm-auth")) {
+ TBM_ERR("[TBM_DRM] fail to add socket");
+ goto fail;
+ }
+
+ _tbm_drm_auth_socket_init(tbm_drm_auth_srv);
- _tbm_drm_auth_socket_init(tbm_drm_auth_srv);
+ /* init the client resource list */
+ tbm_drm_auth_srv->wl_tbm_drm_auth_global = wl_global_create(tbm_drm_auth_srv->display, &wl_tbm_drm_auth_interface, 1,
+ tbm_drm_auth_srv, _wayland_tbm_drm_auth_server_bind_cb);
- /* init the client resource list */
- tbm_drm_auth_srv->wl_tbm_drm_auth_global = wl_global_create(tbm_drm_auth_srv->display, &wl_tbm_drm_auth_interface, 1,
- tbm_drm_auth_srv, _wayland_tbm_drm_auth_server_bind_cb);
+ ret = pthread_create(&tbm_drm_auth_srv->thread, NULL, _tbm_drm_auth_main, NULL);
+ if (ret != 0) {
+ TBM_ERR("fail to create auth thread err:%d", ret);
+ goto fail;
}
return 1;
+
+fail:
+ if (tbm_drm_auth_srv->display)
+ wl_display_destroy(tbm_drm_auth_srv->display);
+
+ if (tbm_drm_auth_srv->device_name)
+ free(tbm_drm_auth_srv->device_name);
+
+ free(tbm_drm_auth_srv);
+ tbm_drm_auth_srv = NULL;
+
+ return 0;
}
void
tbm_drm_helper_wl_auth_server_deinit(void)
{
- if (tbm_drm_auth_srv) {
- wl_global_destroy(tbm_drm_auth_srv->wl_tbm_drm_auth_global);
+ if (!tbm_drm_auth_srv) return;
- if (tbm_drm_auth_srv->device_name)
- free(tbm_drm_auth_srv->device_name);
+ wl_display_terminate(tbm_drm_auth_srv->display);
+ pthread_join(tbm_drm_auth_srv->thread, NULL);
- free(tbm_drm_auth_srv);
- tbm_drm_auth_srv = NULL;
- }
+ wl_global_destroy(tbm_drm_auth_srv->wl_tbm_drm_auth_global);
+
+ wl_display_destroy(tbm_drm_auth_srv->display);
+
+ if (tbm_drm_auth_srv->device_name)
+ free(tbm_drm_auth_srv->device_name);
+
+ free(tbm_drm_auth_srv);
+ tbm_drm_auth_srv = NULL;
}
int