add tbm_dummy_display
[platform/core/uifw/libtbm.git] / src / tbm_drm_helper_server.c
index ed92b96..9182fa5 100644 (file)
@@ -53,6 +53,8 @@ struct wayland_tbm_drm_auth_server {
 
 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,
@@ -66,12 +68,16 @@ _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");
@@ -80,7 +86,7 @@ _send_server_auth_info(struct wayland_tbm_drm_auth_server *tbm_drm_auth_srv,
 
        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");
@@ -89,7 +95,7 @@ _send_server_auth_info(struct wayland_tbm_drm_auth_server *tbm_drm_auth_srv,
        }
 
        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");
@@ -161,24 +167,24 @@ _tbm_getgrnam_r(const char *name)
 
        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;
        }
 
@@ -197,7 +203,7 @@ 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;
@@ -206,46 +212,39 @@ _tbm_drm_auth_socket_init(struct wayland_tbm_drm_auth_server *tbm_drm_auth_srv)
        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;
        }
 
        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
@@ -262,8 +261,8 @@ tbm_drm_helper_wl_auth_server_init(void *wl_display,   int fd, const char *devic
                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);
@@ -274,6 +273,8 @@ tbm_drm_helper_wl_auth_server_init(void *wl_display,   int fd, const char *devic
                        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);
@@ -299,57 +300,67 @@ tbm_drm_helper_wl_auth_server_deinit(void)
 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;
 }
@@ -357,30 +368,29 @@ tbm_drm_helper_get_master_fd(void)
 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 */