From eaf5e709cf4334c8961398846441987757e48eb3 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Thu, 11 May 2017 09:12:51 +0900 Subject: [PATCH 01/16] package version up to 1.6.17 Change-Id: I302bba1a0087af5ba28a90b8cca52e99d70c174b --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index fb7df61..5632f7c 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.6.16 +Version: 1.6.17 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 884b19df12e2eb24018217824e6e331d3f9c3191 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Mon, 22 May 2017 22:23:05 +0900 Subject: [PATCH 02/16] server: set permission and group to tdm-socket when it is added Change-Id: I9052f391202781a9ac34c2fce7efacdd75e83761 --- packaging/libtdm.spec | 10 ----- service/tdm-socket.path | 5 --- service/tdm-socket.service | 15 ------- src/tdm_private.h | 1 + src/tdm_server.c | 107 ++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 106 insertions(+), 32 deletions(-) delete mode 100644 service/tdm-socket.path delete mode 100644 service/tdm-socket.service diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 5632f7c..8577063 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -81,9 +81,6 @@ make -C ut check rm -rf %{buildroot} %make_install -%__mkdir_p %{buildroot}%{_unitdir} -install -m 644 service/tdm-socket.service %{buildroot}%{_unitdir} -install -m 644 service/tdm-socket.path %{buildroot}%{_unitdir} %__mkdir_p %{buildroot}%{_unitdir_user} install -m 644 service/tdm-socket-user.service %{buildroot}%{_unitdir_user} install -m 644 service/tdm-socket-user.path %{buildroot}%{_unitdir_user} @@ -92,16 +89,11 @@ install -m 644 service/tdm-socket-user.path %{buildroot}%{_unitdir_user} %pre -%__mkdir_p %{_unitdir}/graphical.target.wants -ln -sf ../tdm-socket.path %{_unitdir}/graphical.target.wants/ - %__mkdir_p %{_unitdir_user}/basic.target.wants ln -sf ../tdm-socket-user.path %{_unitdir_user}/basic.target.wants/ %post -p /sbin/ldconfig %postun -p /sbin/ldconfig -rm -f %{_unitdir}/graphical.target.wants/tdm-socket.path - rm -f %{_unitdir_user}/basic.target.wants/tdm-socket-user.path %files @@ -110,8 +102,6 @@ rm -f %{_unitdir_user}/basic.target.wants/tdm-socket-user.path %license COPYING %{_libdir}/libtdm.so.* %attr(750,root,root) %{_bindir}/tdm-monitor -%{_unitdir}/tdm-socket.path -%{_unitdir}/tdm-socket.service %{_unitdir_user}/tdm-socket-user.path %{_unitdir_user}/tdm-socket-user.service %if %{with utest} diff --git a/service/tdm-socket.path b/service/tdm-socket.path deleted file mode 100644 index 5ee772b..0000000 --- a/service/tdm-socket.path +++ /dev/null @@ -1,5 +0,0 @@ -[Unit] -Description=Wait for tdm-socket - -[Path] -PathExists=/run/tdm-socket diff --git a/service/tdm-socket.service b/service/tdm-socket.service deleted file mode 100644 index de50ebe..0000000 --- a/service/tdm-socket.service +++ /dev/null @@ -1,15 +0,0 @@ -[Unit] -Description= tdm-socket setup service - -[Service] -User=ui_fw -Group=ui_fw -Capabilities=cap_fowner,cap_chown=i -SecureBits=keep-caps -Type=oneshot -SmackProcessLabel=System -ExecStart=/usr/bin/chmod g+w /run/tdm-socket -ExecStart=/usr/bin/chgrp display /run/tdm-socket - -[Install] -WantedBy=graphical.target diff --git a/src/tdm_private.h b/src/tdm_private.h index 59cb1ad..25b24b7 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -53,6 +53,7 @@ #include #include #include +#include #include #include diff --git a/src/tdm_server.c b/src/tdm_server.c index 5299c93..9363768 100644 --- a/src/tdm_server.c +++ b/src/tdm_server.c @@ -625,6 +625,109 @@ _tdm_server_bind(struct wl_client *client, void *data, wl_resource_set_implementation(resource, &tdm_implementation, data, destroy_client); } +static int +_tdm_getgrnam_r(const char *name) +{ + struct group *grp = NULL; + struct group *grp_res = NULL; + char* buf = NULL; + size_t buf_len; + int ret; + int id; + + buf_len = sysconf(_SC_GETGR_R_SIZE_MAX); + if (buf_len == -1) + buf_len = 2048; + + buf = calloc(1, buf_len * sizeof(char)); + if (!buf) { + TDM_ERR("creating buffer failed"); + goto failed; + } + + grp = calloc(1, sizeof(struct group)); + if (!grp) { + TDM_ERR("creating group failed"); + goto failed; + } + + ret = getgrnam_r(name, grp, buf, buf_len, &grp_res); + if (ret < 0) { + TDM_ERR("getgrnam_r failed errno:%d(%m)", ret); + goto failed; + } + + if (grp_res == NULL) { + TDM_ERR("finding name:%s group failed", name); + goto failed; + } + + id = grp->gr_gid; + free(buf); + free(grp); + + return id; + +failed: + if (buf) + free(buf); + if (grp) + free(grp); + + return -1; +} + +static int +_tdm_socket_init(tdm_private_loop *private_loop) +{ + const char *dir = NULL; + char socket_path[128]; + int ret = -1; + uid_t uid; + gid_t gid; + + if (wl_display_add_socket(private_loop->wl_display, "tdm-socket")) { + TDM_ERR("createing a tdm-socket failed"); + return 0; + } + + dir = getenv("XDG_RUNTIME_DIR"); + if (!dir) { + TDM_ERR("getting XDG_RUNTIME_DIR failed"); + return 0; + } + + snprintf(socket_path, sizeof(socket_path), "%s/%s", dir, "tdm-socket"); + + ret = chmod(socket_path, 509); + if (ret < 0) { + TDM_ERR("changing modes of socket file failed:%s (%m)", socket_path); + return 0; + } + + ret = _tdm_getgrnam_r("root"); + if (ret < 0) { + TDM_ERR("getting uid failed"); + return 0; + } + uid = ret; + + ret = _tdm_getgrnam_r("display"); + if (ret < 0) { + TDM_ERR("getting gid failed"); + return 0; + } + gid = ret; + + ret = chown(socket_path, uid, gid); + if (ret < 0) { + TDM_ERR("changing owner of socket file failed:%s (%m)", socket_path); + return 0; + } + + return 1; +} + INTERN tdm_error tdm_server_init(tdm_private_loop *private_loop) { @@ -636,8 +739,8 @@ tdm_server_init(tdm_private_loop *private_loop) if (private_loop->private_server) return TDM_ERROR_NONE; - if (wl_display_add_socket(private_loop->wl_display, "tdm-socket")) { - TDM_ERR("createing a tdm-socket failed"); + if (!_tdm_socket_init(private_loop)) { + TDM_ERR("initializing tdm-socket failed"); return TDM_ERROR_OPERATION_FAILED; } -- 2.7.4 From 27b219f2029a624bdc97caef70b1d536106f1a22 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 23 May 2017 00:23:07 +0900 Subject: [PATCH 03/16] package version up to 1.6.18 Change-Id: I6fc719c0eee8e70d6bf482251490697d6d355492 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 8577063..1b9ff2a 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.6.17 +Version: 1.6.18 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 8a3937ce76415837b871c775806a2c3ab1e7ed10 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 26 May 2017 13:08:34 +0900 Subject: [PATCH 04/16] server: skip chown if not a super user If tdm_display_init is called by non super user, we don't need to change the owner and group of a tdm socket file. And also changing the owner of the tdm socket file which is created by non super user is not allowed. So we just skip chown in this case. Change-Id: Ib119becc4b9048f0fcc79c52089cfe04907cac60 --- src/tdm_server.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tdm_server.c b/src/tdm_server.c index 9363768..209429b 100644 --- a/src/tdm_server.c +++ b/src/tdm_server.c @@ -705,6 +705,10 @@ _tdm_socket_init(tdm_private_loop *private_loop) return 0; } + /* if not super user, we don't need to change owner and group */ + if (getuid() != 0) + return 1; + ret = _tdm_getgrnam_r("root"); if (ret < 0) { TDM_ERR("getting uid failed"); -- 2.7.4 From f75fee79b0695962f6edcb7435b9e42ec4c4d82c Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 26 May 2017 13:32:45 +0900 Subject: [PATCH 05/16] package version up to 1.6.19 Change-Id: Ide4d9c9d0deeb0cf0e034497d40824ac8ebd4f8e --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 1b9ff2a..6fbc3c0 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.6.18 +Version: 1.6.19 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 5e09ccc8b30c7fba349d2acf191a967d7a2ad60d Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 30 May 2017 13:57:18 +0900 Subject: [PATCH 06/16] server: ignore chown & chmod errors Change-Id: I0a923486ca44f8b2b0232bfe4d728a39a66d6df0 --- src/tdm_server.c | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/src/tdm_server.c b/src/tdm_server.c index 209429b..bd9cd9f 100644 --- a/src/tdm_server.c +++ b/src/tdm_server.c @@ -677,7 +677,7 @@ failed: return -1; } -static int +static void _tdm_socket_init(tdm_private_loop *private_loop) { const char *dir = NULL; @@ -686,50 +686,39 @@ _tdm_socket_init(tdm_private_loop *private_loop) uid_t uid; gid_t gid; - if (wl_display_add_socket(private_loop->wl_display, "tdm-socket")) { - TDM_ERR("createing a tdm-socket failed"); - return 0; - } - dir = getenv("XDG_RUNTIME_DIR"); if (!dir) { - TDM_ERR("getting XDG_RUNTIME_DIR failed"); - return 0; + TDM_WRN("getting XDG_RUNTIME_DIR failed"); + return; } snprintf(socket_path, sizeof(socket_path), "%s/%s", dir, "tdm-socket"); ret = chmod(socket_path, 509); if (ret < 0) { - TDM_ERR("changing modes of socket file failed:%s (%m)", socket_path); - return 0; + TDM_WRN("changing modes of socket file failed:%s (%m)", socket_path); + return; } - /* if not super user, we don't need to change owner and group */ - if (getuid() != 0) - return 1; - ret = _tdm_getgrnam_r("root"); if (ret < 0) { - TDM_ERR("getting uid failed"); - return 0; + TDM_WRN("getting uid failed"); + return; } uid = ret; ret = _tdm_getgrnam_r("display"); if (ret < 0) { - TDM_ERR("getting gid failed"); - return 0; + TDM_WRN("getting gid failed"); + return; } gid = ret; ret = chown(socket_path, uid, gid); if (ret < 0) { - TDM_ERR("changing owner of socket file failed:%s (%m)", socket_path); - return 0; + TDM_WRN("changing owner of socket file failed:%s (%m)", socket_path); + return; } - - return 1; } INTERN tdm_error @@ -743,11 +732,13 @@ tdm_server_init(tdm_private_loop *private_loop) if (private_loop->private_server) return TDM_ERROR_NONE; - if (!_tdm_socket_init(private_loop)) { - TDM_ERR("initializing tdm-socket failed"); + if (wl_display_add_socket(private_loop->wl_display, "tdm-socket")) { + TDM_ERR("createing a tdm-socket failed"); return TDM_ERROR_OPERATION_FAILED; } + _tdm_socket_init(private_loop); + private_server = calloc(1, sizeof * private_server); if (!private_server) { TDM_ERR("alloc failed"); -- 2.7.4 From 2c307332239ee96a93d80b9737b132977db790f6 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 30 May 2017 14:37:17 +0900 Subject: [PATCH 07/16] package version up to 1.6.20 Change-Id: I6aa36f184b3d4e23c9388af1fc89e1d0ea24c11b --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 6fbc3c0..8724a9d 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.6.19 +Version: 1.6.20 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 1578d492620801adc40404340d546adcb9c76645 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Sun, 11 Jun 2017 08:24:07 +0900 Subject: [PATCH 08/16] helper: add tdm_helper_get_buffer_full_size() to get the real buffer size Change-Id: Ie27d3b52ab57171b25628e8a85fc509d1e643e21 --- include/tdm_helper.h | 11 +++++++++++ src/tdm_helper.c | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/include/tdm_helper.h b/include/tdm_helper.h index c80057d..ef0a657 100644 --- a/include/tdm_helper.h +++ b/include/tdm_helper.h @@ -110,6 +110,17 @@ void tdm_helper_clear_buffer(tbm_surface_h buffer); /** + * @brief Get the buffer full size. + * @details + * In some hardware, the buffer width or height is aligned with the fixed size. + * eg. 8, 16, etc. In this case, the real size of buffer could be bigger than + * the buffer size of tbm_surface_info_s. + * @param[in] buffer A TDM buffer + */ +void +tdm_helper_get_buffer_full_size(tbm_surface_h buffer, int *buffer_w, int *buffer_h); + +/** * @brief convert the source buffer to the destination buffer with given rectangles * trannsform * @details diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 4adbcb8..21758f6 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -390,6 +390,28 @@ tdm_helper_clear_buffer(tbm_surface_h buffer) tdm_helper_clear_buffer_pos(buffer, NULL); } +EXTERN void +tdm_helper_get_buffer_full_size(tbm_surface_h buffer, int *buffer_w, int *buffer_h) +{ + tbm_surface_info_s info; + int ret; + + TDM_RETURN_IF_FAIL(buffer != NULL); + + ret = tbm_surface_get_info(buffer, &info); + TDM_RETURN_IF_FAIL(ret == TBM_SURFACE_ERROR_NONE); + + if (buffer_w) { + if (IS_RGB(info.format)) + *buffer_w = info.planes[0].stride >> 2; + else + *buffer_w = info.planes[0].stride; + } + + if (buffer_h) + *buffer_h = info.planes[0].size / info.planes[0].stride; +} + static pixman_format_code_t _tdm_helper_pixman_format_get(tbm_format format) { -- 2.7.4 From c91a6898749a2445d74ddb4162372e75e0442eec Mon Sep 17 00:00:00 2001 From: Boram Park Date: Sun, 11 Jun 2017 08:25:27 +0900 Subject: [PATCH 09/16] helper: consider the real buffer size Change-Id: I6950f430aa2581c93709c80200f7b60600b56af4 --- src/tdm_helper.c | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 21758f6..90dd618 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -216,7 +216,7 @@ tdm_helper_dump_buffer_str(tbm_surface_h buffer, char *dir, char *str) tbm_surface_info_s info; const char *ext; char file[TDM_PATH_LEN]; - int ret, bw; + int ret, bw, bh; TDM_RETURN_IF_FAIL(buffer != NULL); TDM_RETURN_IF_FAIL(dir != NULL); @@ -225,16 +225,15 @@ tdm_helper_dump_buffer_str(tbm_surface_h buffer, char *dir, char *str) ret = tbm_surface_get_info(buffer, &info); TDM_RETURN_IF_FAIL(ret == TBM_SURFACE_ERROR_NONE); - if (info.format == TBM_FORMAT_ARGB8888 || info.format == TBM_FORMAT_XRGB8888) { + if (IS_RGB(info.format)) ext = file_exts[0]; - bw = info.planes[0].stride >> 2; - } else { + else ext = file_exts[1]; - bw = info.planes[0].stride; - } - snprintf(file, TDM_PATH_LEN, "%s/%c%c%c%c_%dx%d_%s.%s", - dir, FOURCC_STR(info.format), bw, info.height, str, ext); + tdm_helper_get_buffer_full_size(buffer, &bw, &bh); + + snprintf(file, TDM_PATH_LEN, "%s/%c%c%c%c_%dx%d_%dx%d_%s.%s", + dir, FOURCC_STR(info.format), bw, bh, info.width, info.height, str, ext); tdm_helper_dump_buffer(buffer, file); } @@ -246,6 +245,7 @@ tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file) int len, ret; const char *ext; int bo_cnt; + int bw, bh; TDM_RETURN_IF_FAIL(buffer != NULL); TDM_RETURN_IF_FAIL(file != NULL); @@ -254,7 +254,7 @@ tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file) TDM_RETURN_IF_FAIL(ret == TBM_SURFACE_ERROR_NONE); len = strnlen(file, 1024); - if (info.format == TBM_FORMAT_ARGB8888 || info.format == TBM_FORMAT_XRGB8888) + if (IS_RGB(info.format)) ext = file_exts[0]; else ext = file_exts[1]; @@ -265,9 +265,11 @@ tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file) return; } + tdm_helper_get_buffer_full_size(buffer, &bw, &bh); + bo_cnt = tbm_surface_internal_get_num_bos(buffer); - TDM_DBG("buffer: bo_cnt(%d) %dx%d %c%c%c%c, plane: (%p+%d, %d,%d) (%p+%d, %d,%d) (%p+%d, %d,%d)", - bo_cnt, info.width, info.height, FOURCC_STR(info.format), + TDM_DBG("buffer: bo_cnt(%d) %dx%d(%dx%d) %c%c%c%c, plane: (%p+%d, %d,%d) (%p+%d, %d,%d) (%p+%d, %d,%d)", + bo_cnt, bw, bh, info.width, info.height, FOURCC_STR(info.format), info.planes[0].ptr, info.planes[0].offset, info.planes[0].stride, info.planes[0].size, info.planes[1].ptr, info.planes[1].offset, info.planes[1].stride, info.planes[1].size, info.planes[2].ptr, info.planes[2].offset, info.planes[2].stride, info.planes[2].size); @@ -275,37 +277,32 @@ tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file) switch (info.format) { case TBM_FORMAT_ARGB8888: case TBM_FORMAT_XRGB8888: - _tdm_helper_dump_png(file, info.planes[0].ptr, - info.planes[0].stride >> 2, info.height); + _tdm_helper_dump_png(file, info.planes[0].ptr, bw, bh); break; case TBM_FORMAT_YVU420: case TBM_FORMAT_YUV420: _tdm_helper_dump_raw(file, info.planes[0].ptr, - info.planes[0].stride * info.height, + info.planes[0].size, info.planes[1].ptr, - info.planes[1].stride * (info.height >> 1), + info.planes[1].size, info.planes[2].ptr, - info.planes[2].stride * (info.height >> 1)); + info.planes[2].size); break; case TBM_FORMAT_NV12: case TBM_FORMAT_NV21: - if (bo_cnt == 1 && - (info.planes[0].ptr + info.planes[0].stride * info.height) != info.planes[1].ptr) - TDM_WRN("%p != %p", info.planes[0].ptr + info.planes[0].stride * info.height, info.planes[1].ptr); - _tdm_helper_dump_raw(file, info.planes[0].ptr, - info.planes[0].stride * info.height, + info.planes[0].size, info.planes[1].ptr, - info.planes[1].stride * (info.height >> 1), NULL, + info.planes[1].size, NULL, 0); break; case TBM_FORMAT_YUYV: case TBM_FORMAT_UYVY: _tdm_helper_dump_raw(file, info.planes[0].ptr, - info.planes[0].stride * info.height, NULL, 0, + info.planes[0].size, NULL, 0, NULL, 0); break; default: -- 2.7.4 From 470a74ebff119bf94799ddfa1d04afdd65c9f16a Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 13 Jun 2017 15:43:42 +0900 Subject: [PATCH 10/16] package version up to 1.6.21 Change-Id: Ia2a26859bdbe445abc36a72c6c6b7a6b04e5e963 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 8724a9d..81b5794 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.6.20 +Version: 1.6.21 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 799c6b50a1be745398cadad8485f42563fa8b445 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 4 Jul 2017 10:08:12 +0900 Subject: [PATCH 11/16] support tdm_value type Change-Id: I88a97af9c00566cb6d21ce8062fb4d73eb678751 --- include/tdm_common.h | 12 ++++++++++++ include/tdm_types.h | 1 + src/tdm_helper.c | 53 ++++++++++++++++++++++++++++++++++++++++++++-------- src/tdm_macro.h | 9 +++++++++ 4 files changed, 67 insertions(+), 8 deletions(-) diff --git a/include/tdm_common.h b/include/tdm_common.h index dc33494..dfb3f8e 100644 --- a/include/tdm_common.h +++ b/include/tdm_common.h @@ -262,6 +262,18 @@ typedef struct _tdm_pos { } tdm_pos; /** + * @brief The tdm value type enumeration + */ +typedef enum { + TDM_VALUE_TYPE_UNKNOWN, + TDM_VALUE_TYPE_PTR, + TDM_VALUE_TYPE_INT32, + TDM_VALUE_TYPE_UINT32, + TDM_VALUE_TYPE_INT64, + TDM_VALUE_TYPE_UINT64, +} tdm_value_type; + +/** * @brief The value union */ typedef union { diff --git a/include/tdm_types.h b/include/tdm_types.h index 3b62ff5..2cda6d6 100644 --- a/include/tdm_types.h +++ b/include/tdm_types.h @@ -85,6 +85,7 @@ typedef struct _tdm_output_mode { typedef struct _tdm_prop { unsigned int id; char name[TDM_NAME_LEN]; + tdm_value_type type; } tdm_prop; /** diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 90dd618..aaf7fbd 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -44,6 +44,7 @@ #include #include #include +#include #include "tdm.h" #include "tdm_private.h" @@ -854,7 +855,7 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) TDM_SNPRINTF(reply, len, "\t%d properties:\n", private_output->caps.prop_count); if (private_output->caps.prop_count > 0) { - TDM_SNPRINTF(reply, len, "\t\tname\tidx\tvalue\n"); + TDM_SNPRINTF(reply, len, "\t\tname\ttype\tidx\tvalue\n"); for (i = 0; i < private_output->caps.prop_count; i++) { tdm_value value; TDM_DBG_GOTO_IF_FAIL(func_output->output_get_property, unlock); @@ -862,10 +863,28 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) private_output->caps.props[i].id, &value); TDM_DBG_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, unlock); - TDM_SNPRINTF(reply, len, "\t\t%s\t%u\t%u\n", + TDM_SNPRINTF(reply, len, "\t\t%s\t%s\t%u\t", private_output->caps.props[i].name, - private_output->caps.props[i].id, - value.u32); + tdm_value_type_str(private_output->caps.props[i].type), + private_output->caps.props[i].id); + switch (private_output->caps.props[i].type) { + case TDM_VALUE_TYPE_PTR: + TDM_SNPRINTF(reply, len, "%p\n", value.ptr); + break; + case TDM_VALUE_TYPE_INT32: + TDM_SNPRINTF(reply, len, "%d\n", value.s32); + break; + case TDM_VALUE_TYPE_INT64: + TDM_SNPRINTF(reply, len, "%"PRId64"\n", value.s64); + break; + case TDM_VALUE_TYPE_UINT64: + TDM_SNPRINTF(reply, len, "%"PRIu64"\n", value.u64); + break; + case TDM_VALUE_TYPE_UINT32: + default: + TDM_SNPRINTF(reply, len, "%u\n", value.u32); + break; + } } } } @@ -937,7 +956,7 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) TDM_SNPRINTF(reply, len, "\t%u properties:\n", private_layer->caps.prop_count); if (private_layer->caps.prop_count > 0) { - TDM_SNPRINTF(reply, len, "\t\tname\tidx\tvalue\n"); + TDM_SNPRINTF(reply, len, "\t\tname\ttype\tidx\tvalue\n"); for (i = 0; i < private_layer->caps.prop_count; i++) { tdm_value value; TDM_DBG_GOTO_IF_FAIL(func_layer->layer_get_property, unlock); @@ -945,10 +964,28 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) private_layer->caps.props[i].id, &value); TDM_DBG_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, unlock); - TDM_SNPRINTF(reply, len, "\t\t%s\t%u\t%u\n", + TDM_SNPRINTF(reply, len, "\t\t%s\t%s\t%u\t", private_layer->caps.props[i].name, - private_layer->caps.props[i].id, - value.u32); + tdm_value_type_str(private_output->caps.props[i].type), + private_layer->caps.props[i].id); + switch (private_layer->caps.props[i].type) { + case TDM_VALUE_TYPE_PTR: + TDM_SNPRINTF(reply, len, "%p\n", value.ptr); + break; + case TDM_VALUE_TYPE_INT32: + TDM_SNPRINTF(reply, len, "%d\n", value.s32); + break; + case TDM_VALUE_TYPE_INT64: + TDM_SNPRINTF(reply, len, "%"PRId64"\n", value.s64); + break; + case TDM_VALUE_TYPE_UINT64: + TDM_SNPRINTF(reply, len, "%"PRIu64"\n", value.u64); + break; + case TDM_VALUE_TYPE_UINT32: + default: + TDM_SNPRINTF(reply, len, "%u\n", value.u32); + break; + } } } } diff --git a/src/tdm_macro.h b/src/tdm_macro.h index f377fae..6da02b4 100644 --- a/src/tdm_macro.h +++ b/src/tdm_macro.h @@ -219,6 +219,15 @@ static struct tdm_type_name tdm_transform_names[] = { }; TDM_TYPE_NAME_FN(transform) +static struct tdm_type_name tdm_value_type_names[] = { + { TDM_VALUE_TYPE_UNKNOWN, "unknown" }, + { TDM_VALUE_TYPE_PTR, "ptr" }, + { TDM_VALUE_TYPE_INT32, "int32" }, + { TDM_VALUE_TYPE_UINT32, "uint32" }, + { TDM_VALUE_TYPE_INT64, "int64" }, + { TDM_VALUE_TYPE_UINT64, "uint64" }, +}; +TDM_TYPE_NAME_FN(value_type) #define TDM_BIT_NAME_FB(res) \ static inline const char * tdm_##res##_str(int type, char **reply, int *len) \ -- 2.7.4 From d34126b79357c9828d4b22fc91345c6c7b9c3ff8 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 5 Jul 2017 10:35:32 +0900 Subject: [PATCH 12/16] package version up to 1.7.0 Change-Id: I16fa39bb01c3547de50988e47794546578d6331c --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 81b5794..3bc43e4 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.6.21 +Version: 1.7.0 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 0e06e36a5d1f0461697a0449f8c7e747fa450481 Mon Sep 17 00:00:00 2001 From: Sangjin Lee Date: Tue, 11 Jul 2017 13:34:58 +0900 Subject: [PATCH 13/16] log: use public wayland api remove useless code for protocol log. Change-Id: Ide45ca176c8998f604f8f55664271a1c89d5208b --- src/tdm_event_loop.c | 98 ++-------------------------------------------------- src/tdm_private.h | 20 ----------- 2 files changed, 2 insertions(+), 116 deletions(-) diff --git a/src/tdm_event_loop.c b/src/tdm_event_loop.c index 7445ad5..c947243 100644 --- a/src/tdm_event_loop.c +++ b/src/tdm_event_loop.c @@ -532,91 +532,6 @@ _trace_get_next_argument(const char *signature, return signature; } -#if !TDM_WAYLAND_LOGGER - -static void -_trace_protocol_cb(struct wl_closure *closure, struct wl_resource *resource, int send) -{ - int i; - struct argument_details arg; - struct wl_object *object = &resource->object; - struct wl_client *client = resource->client; - const char *signature = closure->message->signature; - struct timespec tp; - unsigned int time; - pid_t pid = -1; - const char *proc_name; - char temp[512] = { 0, }, *p = temp; - int len = sizeof(temp), *l = &len; - - if (client) { - _trace_reg_client_destroy_listener(client); - wl_client_get_credentials(client, &pid, NULL, NULL); - } - - proc_name = tdm_server_get_client_name(pid); - - clock_gettime(CLOCK_MONOTONIC, &tp); - time = (tp.tv_sec * 1000000L) + (tp.tv_nsec / 1000); - - TDM_SNPRINTF(p, l, "[%10.3f] %s%d%s%s@%u.%s(", - time / 1000.0, - send ? "Server -> Client [PID:" : "Server <- Client [PID:", - pid, "] ", - object->interface->name, object->id, closure->message->name); - - for (i = 0; i < closure->count; i++) { - signature = _trace_get_next_argument(signature, &arg); - TDM_RETURN_IF_FAIL(signature != NULL); - - if (i > 0) - TDM_SNPRINTF(p, l, ", "); - - switch (arg.type) { - case 'u': - TDM_SNPRINTF(p, l, "%u", closure->args[i].u); - break; - case 'i': - TDM_SNPRINTF(p, l, "%d", closure->args[i].i); - break; - case 'f': - TDM_SNPRINTF(p, l, "%f", wl_fixed_to_double(closure->args[i].f)); - break; - case 's': - TDM_SNPRINTF(p, l, "\"%s\"", closure->args[i].s); - break; - case 'o': - if (closure->args[i].o) - TDM_SNPRINTF(p, l, "%s@%u", closure->args[i].o->interface->name, closure->args[i].o->id); - else - TDM_SNPRINTF(p, l, "nil"); - break; - case 'n': - TDM_SNPRINTF(p, l, "new id %s@", - (closure->message->types[i]) ? closure->message->types[i]->name : "[unknown]"); - if (closure->args[i].n != 0) - TDM_SNPRINTF(p, l, "%u", closure->args[i].n); - else - TDM_SNPRINTF(p, l, "nil"); - break; - case 'a': - TDM_SNPRINTF(p, l, "array"); - break; - case 'h': - TDM_SNPRINTF(p, l, "fd %d", closure->args[i].h); - break; - default: - return; - } - } - - TDM_SNPRINTF(p, l, "), cmd: %s", proc_name ? proc_name : "Unknown"); - - TDM_INFO("%s", temp); -} - -#else - static struct wl_protocol_logger *_trace_protocol_logger; static void @@ -652,7 +567,7 @@ _trace_protocol_logger_cb(void *user_data, time / 1000.0, send ? "Server -> Client [PID:" : "Server <- Client [PID:", pid, "] ", - wl_resource_get_name(message->resource), + wl_resource_get_class(message->resource), wl_resource_get_id(message->resource), message->message->name); @@ -680,7 +595,7 @@ _trace_protocol_logger_cb(void *user_data, case 'o': if (message->arguments[i].o) TDM_SNPRINTF(p, l, "%s@%u", - wl_resource_get_name((struct wl_resource *) message->arguments[i].o), + wl_resource_get_class((struct wl_resource *) message->arguments[i].o), wl_resource_get_id((struct wl_resource *) message->arguments[i].o)); else TDM_SNPRINTF(p, l, "nil"); @@ -708,7 +623,6 @@ _trace_protocol_logger_cb(void *user_data, TDM_INFO("%s", temp); } -#endif INTERN tdm_error tdm_event_loop_trace_enable(tdm_private_display * private_display, @@ -719,26 +633,18 @@ tdm_event_loop_trace_enable(tdm_private_display * private_display, TDM_RETURN_VAL_IF_FAIL(private_loop->wl_display != NULL, TDM_ERROR_NONE); if (!enable) { -#if !TDM_WAYLAND_LOGGER - wl_debug_server_debug_func_set(NULL); -#else if (_trace_protocol_logger) { wl_protocol_logger_destroy(_trace_protocol_logger); _trace_protocol_logger = NULL; } -#endif return TDM_ERROR_NONE; } -#if !TDM_WAYLAND_LOGGER - wl_debug_server_debug_func_set((wl_server_debug_func_ptr) _trace_protocol_cb); -#else if (_trace_protocol_logger) wl_protocol_logger_destroy(_trace_protocol_logger); _trace_protocol_logger = wl_display_add_protocol_logger(private_loop->wl_display, _trace_protocol_logger_cb, NULL); -#endif return TDM_ERROR_NONE; } diff --git a/src/tdm_private.h b/src/tdm_private.h index 25b24b7..4ea122d 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -696,26 +696,6 @@ void tdm_monitor_server_command(tdm_display *dpy, const char *options, char *reply, int *len); - -#define TDM_WAYLAND_LOGGER ((WAYLAND_VERSION_MAJOR == 1) && (WAYLAND_VERSION_MINOR > 11)) - -#if !TDM_WAYLAND_LOGGER -#ifndef WL_CLOSURE_MAX_ARGS -#define WL_CLOSURE_MAX_ARGS 20 -#endif - -struct wl_closure { - int count; - const struct wl_message *message; - uint32_t opcode; - uint32_t sender_id; - union wl_argument args[WL_CLOSURE_MAX_ARGS]; - struct wl_list link; - struct wl_proxy *proxy; - struct wl_array extra[0]; -}; -#endif /* TDM_WAYLAND_LOGGER */ - struct argument_details { char type; int nullable; -- 2.7.4 From 96cda783ee08e0565a4ca5ef82ed97558feb68c0 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Thu, 6 Jul 2017 11:42:23 +0900 Subject: [PATCH 14/16] increase version to 1.7.0 Change-Id: I69d8bc1d44f992e66a097e6aae7569e13e6df194 --- configure.ac | 2 +- doc/tdm_doc.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index ddd144a..a4cb6b8 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ AC_PREREQ([2.60]) m4_define([tdm_major_version], [1]) -m4_define([tdm_minor_version], [6]) +m4_define([tdm_minor_version], [7]) m4_define([tdm_micro_version], [0]) m4_define([tdm_version], [tdm_major_version.tdm_minor_version.tdm_micro_version]) diff --git a/doc/tdm_doc.h b/doc/tdm_doc.h index 35d9ee9..1d3e915 100644 --- a/doc/tdm_doc.h +++ b/doc/tdm_doc.h @@ -39,7 +39,7 @@ /** * @mainpage TDM * @author Boram Park, boram1288.park@samsung.com - * @version 1.6.0 + * @version 1.7.0 * @par Introduction * TDM stands for Tizen Display Manager. It's the display HAL layer for tizen * display server. It offers the frontend APIs(@ref tdm.h) for a frontend user -- 2.7.4 From 7f8c3b416f50b7a13d22f79cfc813d5ef8c34d79 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 19 Jul 2017 12:23:44 +0900 Subject: [PATCH 15/16] add tdm_output_set_dpms_async Change-Id: I9775ea2e5e78e8a4b11ec85b2b7481b670959b13 --- include/tdm.h | 19 +++++++++- include/tdm_backend.h | 25 +++++++++++--- src/tdm_output.c | 96 ++++++++++++++++++++++++++++++++++++++++----------- src/tdm_private.h | 1 + 4 files changed, 115 insertions(+), 26 deletions(-) diff --git a/include/tdm.h b/include/tdm.h index 29c8193..a7695c1 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -524,15 +524,32 @@ tdm_error tdm_output_get_mode(tdm_output *output, const tdm_output_mode **mode); /** - * @brief Set DPMS of a output object + * @brief Set DPMS of a output object synchronously * @param[in] output A output object * @param[in] dpms_value DPMS value * @return #TDM_ERROR_NONE if success. Otherwise, error value. + * @see tdm_output_set_dpms_async */ tdm_error tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value); /** + * @brief Set DPMS of a output object asynchronously + * @details This function can be used when a output supports the asynchronous DPMS + * control. The output has #TDM_OUTPUT_CAPABILITY_ASYNC_DPMS flags which + * #tdm_output_get_capabilities returns. If an output change handler is added with + * #tdm_output_add_change_handler, the output change handler will be called when + * the DPMS status is changed indeed. + * @param[in] output A output object + * @param[in] dpms_value DPMS value + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + * @see tdm_output_add_change_handler, tdm_output_set_dpms, + * tdm_output_get_capabilities, #TDM_OUTPUT_CAPABILITY_ASYNC_DPMS. + */ +tdm_error +tdm_output_set_dpms_async(tdm_output *output, tdm_output_dpms dpms_value); + +/** * @brief Get DPMS of a output object * @param[in] output A output object * @param[out] dpms_value DPMS value diff --git a/include/tdm_backend.h b/include/tdm_backend.h index 0949372..2de8c7b 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -451,7 +451,7 @@ typedef struct _tdm_func_output { tdm_output_commit_handler func); /** - * @brief Set DPMS of a output object + * @brief Set DPMS of a output object synchronously * @param[in] output A output object * @param[in] dpms_value DPMS value * @return #TDM_ERROR_NONE if success. Otherwise, error value. @@ -512,18 +512,35 @@ typedef struct _tdm_func_output { /** * @brief Set a output dpms handler - * @details A backend module needs to call the output dpms handler when the - * output DPMS has been changed to let the TDM frontend know the change. + * @details This function can be NULL if an output doesn't support asynchronous + * DPMS control. Otherwise, a backend module needs to call the output dpms handler + * to let the TDM frontend know the output DPMS change indeed. * @param[in] output A output object * @param[in] func A output dpms handler * @param[in] user_data The user data * @return #TDM_ERROR_NONE if success. Otherwise, error value. + * @see #output_set_dpms_async, #TDM_OUTPUT_CAPABILITY_ASYNC_DPMS * @since 1.4.0 */ tdm_error (*output_set_dpms_handler)(tdm_output *output, tdm_output_dpms_handler func, void *user_data); - void (*reserved2)(void); + + /** + * @brief Set DPMS of a output object asynchronously + * @param[in] output A output object + * @details This function can be NULL if an output doesn't support asynchronous + * DPMS control. Otherwise, an output should have #TDM_OUTPUT_CAPABILITY_ASYNC_DPMS + * flags which #output_get_capability returns. And if a output dpms handler is added with + * #output_set_dpms_handler, a backend module needs to call the output dpms handler + * to let the TDM frontend know the output DPMS change indeed. + * @param[in] dpms_value DPMS value + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + * @see #output_set_dpms_handler, #TDM_OUTPUT_CAPABILITY_ASYNC_DPMS + * @since 1.7.0 + */ + tdm_error (*output_set_dpms_async)(tdm_output *output, tdm_output_dpms dpms_value); + void (*reserved3)(void); void (*reserved4)(void); void (*reserved5)(void); diff --git a/src/tdm_output.c b/src/tdm_output.c index 62ba065..8b7abd4 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1087,6 +1087,7 @@ tdm_output_cb_dpms(tdm_output *output_backend, tdm_output_dpms dpms, void *user_ } private_output->current_dpms_value = dpms; + private_output->waiting_dpms_change = 0; TDM_INFO("output(%d) dpms %s", private_output->pipe, tdm_dpms_str(dpms)); @@ -1108,6 +1109,12 @@ tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value) _pthread_mutex_lock(&private_display->lock); + if (private_output->waiting_dpms_change) { + TDM_ERR("DPMS is not changed yet. Can't be changed twice"); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_BAD_REQUEST; + } + if (private_output->current_dpms_value == dpms_value) { _pthread_mutex_unlock(&private_display->lock); return TDM_ERROR_NONE; @@ -1132,30 +1139,16 @@ tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value) func_output = &private_display->func_output; - if (!func_output->output_set_dpms) { - _pthread_mutex_unlock(&private_display->lock); - private_output->current_dpms_value = dpms_value; - TDM_INFO("output(%d) dpms %s", private_output->pipe, tdm_dpms_str(dpms_value)); + if (func_output->output_set_dpms) + ret = func_output->output_set_dpms(private_output->output_backend, dpms_value); + else { + ret = TDM_ERROR_NONE; TDM_WRN("not implemented!!"); - return TDM_ERROR_NONE; + goto done; } - if (func_output->output_set_dpms_handler) { - if (!private_output->regist_dpms_cb) { - private_output->regist_dpms_cb = 1; - ret = func_output->output_set_dpms_handler(private_output->output_backend, - tdm_output_cb_dpms, private_output); - if (ret != TDM_ERROR_NONE) { - _pthread_mutex_unlock(&private_display->lock); - TDM_ERR("Can't set the dpms handler!!"); - return ret; - } - } - } - - ret = func_output->output_set_dpms(private_output->output_backend, dpms_value); - - if (ret == TDM_ERROR_NONE && !func_output->output_set_dpms_handler) { +done: + if (ret == TDM_ERROR_NONE) { tdm_value value; private_output->current_dpms_value = dpms_value; @@ -1179,6 +1172,67 @@ tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value) return ret; } +EXTERN tdm_error +tdm_output_set_dpms_async(tdm_output *output, tdm_output_dpms dpms_value) +{ + tdm_func_output *func_output; + OUTPUT_FUNC_ENTRY(); + + if (!(private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_ASYNC_DPMS)) { + TDM_ERR("output doesn't support the asynchronous DPMS control!"); + return TDM_ERROR_BAD_REQUEST; + } + + if (dpms_value > TDM_OUTPUT_DPMS_OFF) + dpms_value = TDM_OUTPUT_DPMS_OFF; + + _pthread_mutex_lock(&private_display->lock); + + if (private_output->waiting_dpms_change) { + TDM_ERR("DPMS is not changed yet. Can't be changed twice"); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_BAD_REQUEST; + } + + if (private_output->current_dpms_value == dpms_value) { + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_NONE; + } + + func_output = &private_display->func_output; + if (!func_output->output_set_dpms_handler) { + TDM_ERR("not implemented: output_set_dpms_handler"); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_NOT_IMPLEMENTED; + } + + if (!func_output->output_set_dpms_async) { + TDM_ERR("not implemented: output_set_dpms_async"); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_NOT_IMPLEMENTED; + } + + if (!private_output->regist_dpms_cb) { + private_output->regist_dpms_cb = 1; + ret = func_output->output_set_dpms_handler(private_output->output_backend, + tdm_output_cb_dpms, private_output); + if (ret != TDM_ERROR_NONE) { + _pthread_mutex_unlock(&private_display->lock); + TDM_ERR("Can't set the dpms handler!!"); + return ret; + } + } + + ret = func_output->output_set_dpms_async(private_output->output_backend, dpms_value); + + if (ret == TDM_ERROR_NONE) + private_output->waiting_dpms_change = 1; + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} + INTERN tdm_error tdm_output_get_dpms_internal(tdm_output *output, tdm_output_dpms *dpms_value) { diff --git a/src/tdm_private.h b/src/tdm_private.h index 4ea122d..12ac385 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -193,6 +193,7 @@ struct _tdm_private_output { unsigned int pipe; tdm_output_dpms current_dpms_value; + unsigned int waiting_dpms_change; const tdm_output_mode *current_mode; int regist_vblank_cb; -- 2.7.4 From 9af4e72354e3c50b9d35081875e5074fbf329003 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 19 Jul 2017 14:06:34 +0900 Subject: [PATCH 16/16] fix invariant result Change-Id: Iecb805dfda52036b6bf9a37bb9af994dbe2979d8 --- src/tdm_helper.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index aaf7fbd..712a9da 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -548,7 +548,7 @@ tdm_helper_get_fd(const char *env) if (!value) return -1; - const long sl = strtol(value, &end, 10); + const long int sl = strtol(value, &end, 10); if (end == value) { TDM_ERR("%s: not a decimal number\n", value); return -1; @@ -558,10 +558,10 @@ tdm_helper_get_fd(const char *env) } else if ((sl == LONG_MIN || sl == LONG_MAX) && errno == ERANGE) { TDM_ERR("%s out of range of type long\n", value); return -1; - } else if (sl > INT_MAX) { + } else if (sl >= INT_MAX) { TDM_ERR("%ld greater than INT_MAX\n", sl); return -1; - } else if (sl < INT_MIN) { + } else if (sl <= INT_MIN) { TDM_ERR("%ld less than INT_MIN\n", sl); return -1; } else { -- 2.7.4