struct wayland_tbm_drm_auth_server *tbm_drm_auth_srv;
+static int tbm_drm_master_fd = -1;
+
/* LCOV_EXCL_START */
static void
_send_server_auth_info(struct wayland_tbm_drm_auth_server *tbm_drm_auth_srv,
fd = open(tbm_drm_auth_srv->device_name, O_RDWR | O_CLOEXEC);
if (fd == -1 && errno == EINVAL) {
fd = open(tbm_drm_auth_srv->device_name, O_RDWR);
- if (fd != -1)
- fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
+ if (fd != -1) {
+ if (fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC) == -1) {
+ TBM_ERR("failed to set fd\n");
+ goto fini;
+ }
+ }
}
if (fd < 0) {
- TBM_LOG_E("failed to open drm : device_name, %s\n", tbm_drm_auth_srv->device_name);
+ TBM_ERR("failed to open drm : device_name, %s\n", tbm_drm_auth_srv->device_name);
wl_resource_post_error(resource, WL_TBM_DRM_AUTH_ERROR_AUTHENTICATE_FAIL,
"authenicate failed::open_drm");
if (drmGetMagic(fd, &magic) < 0) {
if (errno != EACCES) {
- TBM_LOG_E("failed to get magic\n");
+ TBM_ERR("failed to get magic\n");
wl_resource_post_error(resource, WL_TBM_DRM_AUTH_ERROR_AUTHENTICATE_FAIL,
"authenicate failed::get_magic");
}
if (drmAuthMagic(tbm_drm_auth_srv->fd, magic) < 0) {
- TBM_LOG_E("failed to authenticate magic\n");
+ TBM_ERR("failed to authenticate magic\n");
wl_resource_post_error(resource, WL_TBM_DRM_AUTH_ERROR_AUTHENTICATE_FAIL,
"authenicate failed::auth_magic");
buf = calloc(1, buf_len * sizeof(char));
if (!buf) {
- TBM_LOG_E("creating buffer failed\n");
+ TBM_ERR("creating buffer failed\n");
goto failed;
}
grp = calloc(1, sizeof(struct group));
if (!grp) {
- TBM_LOG_E("creating group failed\n");
+ TBM_ERR("creating group failed\n");
goto failed;
}
ret = getgrnam_r(name, grp, buf, buf_len, &grp_res);
if (ret < 0) {
- TBM_LOG_E("getgrnam_r failed errno:%d(%m)\n", ret);
+ TBM_ERR("getgrnam_r failed errno:%d(%m)\n", ret);
goto failed;
}
if (grp_res == NULL) {
- TBM_LOG_E("finding name:%s group failed\n", name);
+ TBM_ERR("finding name:%s group failed\n", name);
goto failed;
}
return -1;
}
-static int
+static void
_tbm_drm_auth_socket_init(struct wayland_tbm_drm_auth_server *tbm_drm_auth_srv)
{
const char *dir = NULL;
uid_t uid;
gid_t gid;
- if (wl_display_add_socket(tbm_drm_auth_srv->display, "tbm-drm-auth")) {
- TBM_LOG_E("createing a tdm-socket failed\n");
- return 0;
- }
-
dir = getenv("XDG_RUNTIME_DIR");
if (!dir) {
- TBM_LOG_E("getting XDG_RUNTIME_DIR failed\n");
- return 0;
+ TBM_WRN("getting XDG_RUNTIME_DIR failed\n");
+ return;
}
snprintf(socket_path, sizeof(socket_path), "%s/%s", dir, "tbm-drm-auth");
ret = chmod(socket_path, 509);
if (ret < 0) {
- TBM_LOG_E("changing modes of socket file failed:%s (%m)\n", socket_path);
- return 0;
+ TBM_WRN("changing modes of socket file failed:%s (%m)\n", socket_path);
+ return;
}
- /* if not super user, we don't need to change owner and group */
- if (getuid() != 0)
- return 1;
-
ret = _tbm_getgrnam_r("root");
if (ret < 0) {
- TBM_LOG_E("getting uid failed\n");
- return 0;
+ TBM_WRN("getting uid failed\n");
+ return;
}
uid = ret;
ret = _tbm_getgrnam_r("display");
if (ret < 0) {
- TBM_LOG_E("getting gid failed\n");
- return 0;
+ TBM_WRN("getting gid failed\n");
+ return;
}
gid = ret;
ret = chown(socket_path, uid, gid);
if (ret < 0) {
- TBM_LOG_E("changing owner of socket file failed:%s (%m)\n", socket_path);
- return 0;
+ TBM_WRN("changing owner of socket file failed:%s (%m)\n", socket_path);
+ return;
}
-
- return 1;
}
int
tbm_drm_auth_srv->fd = fd;
tbm_drm_auth_srv->flags = flags;
- if (!_tbm_drm_auth_socket_init(tbm_drm_auth_srv)) {
- TBM_LOG_E("[TBM_DRM] fail to _tbm_drm_auth_socket_init\n");
+ 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->device_name)
free(tbm_drm_auth_srv->device_name);
return 0;
}
+ _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);
int
tbm_drm_helper_get_master_fd(void)
{
- const char *value;
- int flags, fd = -1;
- int new_fd = -1;
- char *end;
- errno = 0;
-
- value = (const char*)getenv("TDM_DRM_MASTER_FD");
- if (!value)
- return -1;
+ int new_fd, flags, fd = -1;
- const long sl = strtol(value, &end, 10);
- if (end == value) {
- TBM_LOG_E("%s: not a decimal number\n", value);
- return -1;
- } else if (*end != '\0') {
- TBM_LOG_E("%s: extra characters at end of input: %s\n", value, end);
- return -1;
- } else if ((sl == LONG_MIN || sl == LONG_MAX) && errno == ERANGE) {
- TBM_LOG_E("%s out of range of type long\n", value);
- return -1;
- } else if (sl > INT_MAX) {
- TBM_LOG_E("%ld greater than INT_MAX\n", sl);
- return -1;
- } else if (sl < INT_MIN) {
- TBM_LOG_E("%ld less than INT_MIN\n", sl);
- return -1;
- } else {
- fd = (int)sl;
- if (fd < 0) {
- TBM_LOG_E("%d out of fd range\n", fd);
+#if 1 /* TODO: can't remove below at this time. This code SHOULD be removed later */
+ const char *value = (const char*)getenv("TDM_DRM_MASTER_FD");
+ if (value) {
+ char *end;
+ const long int sl = strtol(value, &end, 10);
+
+ if (end == value) {
+ TBM_ERR("%s: not a decimal number\n", value);
+ return -1;
+ } else if (*end != '\0') {
+ TBM_ERR("%s: extra characters at end of input: %s\n", value, end);
+ return -1;
+ } else if ((sl == LONG_MIN || sl == LONG_MAX) && errno == ERANGE) {
+ TBM_ERR("%s out of range of type long\n", value);
return -1;
+ } else if (sl >= INT_MAX) {
+ TBM_ERR("%ld greater than INT_MAX\n", sl);
+ return -1;
+ } else if (sl <= INT_MIN) {
+ TBM_ERR("%ld less than INT_MIN\n", sl);
+ return -1;
+ } else {
+ int fd_max = tbm_bufmgr_get_fd_limit();
+ fd = (int)sl;
+ if (fd < 0 || fd > fd_max) {
+ TBM_ERR("%d out of fd range\n", fd);
+ return -1;
+ }
}
+ } else
+#endif
+ fd = tbm_drm_master_fd;
+
+ if (fd == -1) {
+ TBM_INFO("no presetted TBM DRM MASTER FD");
+ return -1;
}
- TBM_LOG_I("TDM_DRM_MASTER_FD: %d\n", fd);
+ TBM_INFO("TBM DRM MASTER FD: %d\n", fd);
flags = fcntl(fd, F_GETFD);
if (flags == -1) {
- TBM_LOG_E("fcntl failed: %m");
+ TBM_ERR("fcntl failed: %m");
return -1;
}
new_fd = dup(fd);
if (new_fd < 0) {
- TBM_LOG_E("dup failed: %m");
+ TBM_ERR("dup failed: %m");
return -1;
}
- fcntl(new_fd, F_SETFD, flags|FD_CLOEXEC);
+ if (fcntl(new_fd, F_SETFD, flags|FD_CLOEXEC) == -1) {
+ TBM_ERR("failed to set fd\n");
+ close(new_fd);
+ return -1;
+ }
- TBM_LOG_I("Return MASTER_FD: %d\n", new_fd);
+ TBM_INFO("Return MASTER_FD: %d\n", new_fd);
return new_fd;
}
void
tbm_drm_helper_set_tbm_master_fd(int fd)
{
- char buf[32];
- int ret;
+ int fd_max = tbm_bufmgr_get_fd_limit();
- snprintf(buf, sizeof(buf), "%d", fd);
+ if (tbm_drm_master_fd == fd)
+ return;
- ret = setenv("TBM_DRM_MASTER_FD", (const char*)buf, 1);
- if (ret) {
- TBM_LOG_E("failed to set TIZEN_DRM_MASTER_FD to %d\n", fd);
+ if (fd < 0 || fd > fd_max) {
+ TBM_ERR("%d out of fd range\n", fd);
return;
}
- TBM_LOG_I("TBM_DRM_MASTER_FD: %d\n", fd);
+ if (tbm_drm_master_fd != -1)
+ TBM_WRN("already has TBM DRM MASTER FD: %d\n", tbm_drm_master_fd);
+
+ tbm_drm_master_fd = fd;
+
+ TBM_INFO("TBM DRM MASTER FD: %d\n", tbm_drm_master_fd);
}
void
tbm_drm_helper_unset_tbm_master_fd(void)
{
- int ret;
-
- ret = unsetenv("TBM_DRM_MASTER_FD");
- if (ret) {
- TBM_LOG_E("failed to unset TBM_DRM_MASTER_FD\n");
- return;
- }
+ tbm_drm_master_fd = -1;
+ TBM_INFO("TBM DRM MASTER FD: %d\n", tbm_drm_master_fd);
}
/* LCOV_EXCL_STOP */