From ba948f86612e7cd7f563837512a6195080fd298f Mon Sep 17 00:00:00 2001 From: Gustavo Marques Date: Mon, 12 Oct 2020 15:31:22 -0300 Subject: [PATCH 01/28] generate pkg-config files for targets (#1223) --- CMake/GeneratePkgConfig.cmake | 57 +++++++++++++++++++++++++++++++++++ CMakeLists.txt | 21 +++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 CMake/GeneratePkgConfig.cmake diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake new file mode 100644 index 000000000..2966c3c6e --- /dev/null +++ b/CMake/GeneratePkgConfig.cmake @@ -0,0 +1,57 @@ +function(get_relative_link REL PATH) + get_filename_component(NAME ${PATH} NAME_WE) + if(${NAME} MATCHES "^lib") + string(REGEX REPLACE "^lib" "-l" LINK ${NAME}) + elseif(${NAME} MATCHES "^-") + set(LINK ${NAME}) + else() + string(CONCAT LINK "-l" ${NAME}) + endif() + set(${REL} ${LINK} PARENT_SCOPE) +endfunction() + +function(generate_pkgconfig TARGET DESCRIPTION) + message("generating pkg-config for ${TARGET}") + get_filename_component(PREFIX ${CMAKE_INSTALL_PREFIX} ABSOLUTE) + + get_target_property(LIST ${TARGET} LINK_LIBRARIES) + set(REQS "") + set(LIBS "") + foreach(LIB ${LIST}) + if(TARGET ${LIB}) + set(HAS_REQS 1) + list(APPEND REQS ${LIB}) + else() + set(HAS_LIBS 1) + get_relative_link(LINK ${LIB}) + list(APPEND LIBS ${LINK}) + endif() + endforeach() + + if(HAS_REQS) + set(REQUIRES "\nRequires.private:") + foreach (REQ ${REQS}) + string(APPEND REQUIRES " ${REQ}") + endforeach() + endif() + if(HAS_LIBS) + set(LIBRARIES "\nLibs.private:") + foreach (LIB ${LIBS}) + string(APPEND LIBRARIES " ${LIB}") + endforeach() + endif() + + file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/${TARGET}.pc" CONTENT +"prefix=${PREFIX} +includedir=\${prefix}/include +libdir=\${prefix}/lib + +Name: ${TARGET} +Description: ${DESCRIPTION} +Version: ${PROJECT_VERSION} + +CFlags: -I\${includedir} +Libs: -L\${libdir} -l${TARGET}${REQUIRES}${LIBRARIES}") + + install(FILES "pkgconfig/${TARGET}.pc" DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig") +endfunction() diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d5fc1639..1ffcff72a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -981,6 +981,27 @@ install(TARGETS tdjson TdJson tdjson_static TdJsonStatic tdjson_private tdclient INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) +# generate pkg-config files +include(GeneratePkgConfig) + +generate_pkgconfig(tdutils "Telegram Library - Utils") +generate_pkgconfig(tdactor "Telegram Library - Actor") +generate_pkgconfig(tdnet "Telegram Library - Net") +generate_pkgconfig(tdsqlite "Telegram Library - SQLite") +generate_pkgconfig(tddb "Telegram Library - DataBase") +if(MEMPROF) + generate_pkgconfig(memprof "memprof - simple library for memory usage profiling") +endif() +generate_pkgconfig(tdcore "Telegram Library - Core") +generate_pkgconfig(tdclient "Telegram Library - C++ Interface") +if(TD_ENABLE_DOTNET) + generate_pkgconfig(tddotnet "Telegram Library - C# Interface") +endif() +generate_pkgconfig(tdc "Telegram Library - C Interface") +generate_pkgconfig(tdjson_private "Telegram Library - Json Interface (private)") +generate_pkgconfig(tdjson "Telegram Library - Json Interface") +generate_pkgconfig(tdjson_static "Telegram Library - Json Interface (static)") + install(EXPORT TdTargets FILE TdTargets.cmake NAMESPACE Td:: From 162b87e1a8b886f77529c3bc36a41842d036cc39 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 12 Oct 2020 21:39:48 +0300 Subject: [PATCH 02/28] Use spaces instead of tabs in CMake module for consistency. GitOrigin-RevId: 39fc482b99cb70235b10624bed6adb9a75752020 --- CMake/GeneratePkgConfig.cmake | 76 +++++++++++++++++------------------ 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake index 2966c3c6e..795a4f777 100644 --- a/CMake/GeneratePkgConfig.cmake +++ b/CMake/GeneratePkgConfig.cmake @@ -1,47 +1,47 @@ function(get_relative_link REL PATH) - get_filename_component(NAME ${PATH} NAME_WE) - if(${NAME} MATCHES "^lib") - string(REGEX REPLACE "^lib" "-l" LINK ${NAME}) - elseif(${NAME} MATCHES "^-") - set(LINK ${NAME}) - else() - string(CONCAT LINK "-l" ${NAME}) - endif() - set(${REL} ${LINK} PARENT_SCOPE) + get_filename_component(NAME ${PATH} NAME_WE) + if(${NAME} MATCHES "^lib") + string(REGEX REPLACE "^lib" "-l" LINK ${NAME}) + elseif(${NAME} MATCHES "^-") + set(LINK ${NAME}) + else() + string(CONCAT LINK "-l" ${NAME}) + endif() + set(${REL} ${LINK} PARENT_SCOPE) endfunction() function(generate_pkgconfig TARGET DESCRIPTION) - message("generating pkg-config for ${TARGET}") - get_filename_component(PREFIX ${CMAKE_INSTALL_PREFIX} ABSOLUTE) + # message("Generating pkg-config for ${TARGET}") + get_filename_component(PREFIX ${CMAKE_INSTALL_PREFIX} ABSOLUTE) - get_target_property(LIST ${TARGET} LINK_LIBRARIES) - set(REQS "") - set(LIBS "") - foreach(LIB ${LIST}) - if(TARGET ${LIB}) - set(HAS_REQS 1) - list(APPEND REQS ${LIB}) - else() - set(HAS_LIBS 1) - get_relative_link(LINK ${LIB}) - list(APPEND LIBS ${LINK}) - endif() - endforeach() + get_target_property(LIST ${TARGET} LINK_LIBRARIES) + set(REQS "") + set(LIBS "") + foreach(LIB ${LIST}) + if(TARGET ${LIB}) + set(HAS_REQS 1) + list(APPEND REQS ${LIB}) + else() + set(HAS_LIBS 1) + get_relative_link(LINK ${LIB}) + list(APPEND LIBS ${LINK}) + endif() + endforeach() - if(HAS_REQS) - set(REQUIRES "\nRequires.private:") - foreach (REQ ${REQS}) - string(APPEND REQUIRES " ${REQ}") - endforeach() - endif() - if(HAS_LIBS) - set(LIBRARIES "\nLibs.private:") - foreach (LIB ${LIBS}) - string(APPEND LIBRARIES " ${LIB}") - endforeach() - endif() + if(HAS_REQS) + set(REQUIRES "\nRequires.private:") + foreach (REQ ${REQS}) + string(APPEND REQUIRES " ${REQ}") + endforeach() + endif() + if(HAS_LIBS) + set(LIBRARIES "\nLibs.private:") + foreach (LIB ${LIBS}) + string(APPEND LIBRARIES " ${LIB}") + endforeach() + endif() - file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/${TARGET}.pc" CONTENT + file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/${TARGET}.pc" CONTENT "prefix=${PREFIX} includedir=\${prefix}/include libdir=\${prefix}/lib @@ -53,5 +53,5 @@ Version: ${PROJECT_VERSION} CFlags: -I\${includedir} Libs: -L\${libdir} -l${TARGET}${REQUIRES}${LIBRARIES}") - install(FILES "pkgconfig/${TARGET}.pc" DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig") + install(FILES "pkgconfig/${TARGET}.pc" DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig") endfunction() From 9390cd20bcae684b3e952b7227b2f8e688a01a2c Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 12 Oct 2020 21:45:20 +0300 Subject: [PATCH 03/28] GeneratePkgConfig: use CMAKE_INSTALL_* variables. GitOrigin-RevId: 1054a674f8bdf54d1d45dfe6e439811116f344c4 --- CMake/GeneratePkgConfig.cmake | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake index 795a4f777..25e822600 100644 --- a/CMake/GeneratePkgConfig.cmake +++ b/CMake/GeneratePkgConfig.cmake @@ -43,15 +43,16 @@ function(generate_pkgconfig TARGET DESCRIPTION) file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/${TARGET}.pc" CONTENT "prefix=${PREFIX} -includedir=\${prefix}/include -libdir=\${prefix}/lib +includedir=\${prefix}/${CMAKE_INSTALL_INCLUDEDIR} +libdir=\${prefix}/${CMAKE_INSTALL_LIBDIR} Name: ${TARGET} Description: ${DESCRIPTION} Version: ${PROJECT_VERSION} CFlags: -I\${includedir} -Libs: -L\${libdir} -l${TARGET}${REQUIRES}${LIBRARIES}") +Libs: -L\${libdir} -l${TARGET}${REQUIRES}${LIBRARIES} +") - install(FILES "pkgconfig/${TARGET}.pc" DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig") + install(FILES "pkgconfig/${TARGET}.pc" DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/pkgconfig") endfunction() From 647250bcb46090c2e9f5be64818d285e12c9f03c Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 12 Oct 2020 22:27:26 +0300 Subject: [PATCH 04/28] Generate pkgconfig files only for installed libraries. GitOrigin-RevId: 72c5089e9aaefbf2886cee16bff729d738f1ef1f --- CMake/GeneratePkgConfig.cmake | 2 +- CMakeLists.txt | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake index 25e822600..0ba7e06ba 100644 --- a/CMake/GeneratePkgConfig.cmake +++ b/CMake/GeneratePkgConfig.cmake @@ -12,7 +12,7 @@ endfunction() function(generate_pkgconfig TARGET DESCRIPTION) # message("Generating pkg-config for ${TARGET}") - get_filename_component(PREFIX ${CMAKE_INSTALL_PREFIX} ABSOLUTE) + get_filename_component(PREFIX ${CMAKE_INSTALL_PREFIX} REALPATH) get_target_property(LIST ${TARGET} LINK_LIBRARIES) set(REQS "") diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ffcff72a..fce085173 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -988,18 +988,19 @@ generate_pkgconfig(tdutils "Telegram Library - Utils") generate_pkgconfig(tdactor "Telegram Library - Actor") generate_pkgconfig(tdnet "Telegram Library - Net") generate_pkgconfig(tdsqlite "Telegram Library - SQLite") -generate_pkgconfig(tddb "Telegram Library - DataBase") -if(MEMPROF) - generate_pkgconfig(memprof "memprof - simple library for memory usage profiling") +generate_pkgconfig(tddb "Telegram Library - Database") +if (MEMPROF) + # generate_pkgconfig(memprof "memprof - simple library for memory usage profiling") endif() generate_pkgconfig(tdcore "Telegram Library - Core") generate_pkgconfig(tdclient "Telegram Library - C++ Interface") -if(TD_ENABLE_DOTNET) - generate_pkgconfig(tddotnet "Telegram Library - C# Interface") +if (TD_ENABLE_DOTNET) + # generate_pkgconfig(tddotnet "Telegram Library - C# Interface") endif() -generate_pkgconfig(tdc "Telegram Library - C Interface") +# generate_pkgconfig(tdc "Telegram Library - C interface") +generate_pkgconfig(tdapi "Telegram Library - API") generate_pkgconfig(tdjson_private "Telegram Library - Json Interface (private)") -generate_pkgconfig(tdjson "Telegram Library - Json Interface") +generate_pkgconfig(tdjson "Telegram Library - Json Interface (shared)") generate_pkgconfig(tdjson_static "Telegram Library - Json Interface (static)") install(EXPORT TdTargets From 885a9d8e9c72ba94e3cfd53461073ed419fea6f5 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 12 Oct 2020 22:31:02 +0300 Subject: [PATCH 05/28] GeneratePkgConfig: fix CMake 3.0 compatibility. GitOrigin-RevId: 20aad92a716731d09d55c946bf5655e9f388a6d1 --- CMake/GeneratePkgConfig.cmake | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake index 0ba7e06ba..653300ea1 100644 --- a/CMake/GeneratePkgConfig.cmake +++ b/CMake/GeneratePkgConfig.cmake @@ -31,16 +31,17 @@ function(generate_pkgconfig TARGET DESCRIPTION) if(HAS_REQS) set(REQUIRES "\nRequires.private:") foreach (REQ ${REQS}) - string(APPEND REQUIRES " ${REQ}") + set(REQUIRES "${REQUIRES} ${REQ}") endforeach() endif() if(HAS_LIBS) set(LIBRARIES "\nLibs.private:") foreach (LIB ${LIBS}) - string(APPEND LIBRARIES " ${LIB}") + set(LIBRARIES "${LIBRARIES} ${LIB}") endforeach() endif() + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig") file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/${TARGET}.pc" CONTENT "prefix=${PREFIX} includedir=\${prefix}/${CMAKE_INSTALL_INCLUDEDIR} From cb0688d7921d7c207858cb6303e336e7c3e930f9 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 12 Oct 2020 23:10:28 +0300 Subject: [PATCH 06/28] GeneratePkgConfig: ignore DEBUG-only dependencies. GitOrigin-RevId: f4c551006003879bdb079d36fdf3ef76eb553a14 --- CMake/GeneratePkgConfig.cmake | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake index 653300ea1..dc26c0d21 100644 --- a/CMake/GeneratePkgConfig.cmake +++ b/CMake/GeneratePkgConfig.cmake @@ -1,13 +1,15 @@ -function(get_relative_link REL PATH) +function(get_relative_link OUTPUT PATH) get_filename_component(NAME ${PATH} NAME_WE) - if(${NAME} MATCHES "^lib") + if (${PATH} MATCHES "^[$]<[$]:") + set(LINK "") + elseif (${NAME} MATCHES "^lib") string(REGEX REPLACE "^lib" "-l" LINK ${NAME}) - elseif(${NAME} MATCHES "^-") + elseif (${NAME} MATCHES "^-") set(LINK ${NAME}) else() string(CONCAT LINK "-l" ${NAME}) endif() - set(${REL} ${LINK} PARENT_SCOPE) + set(${OUTPUT} ${LINK} PARENT_SCOPE) endfunction() function(generate_pkgconfig TARGET DESCRIPTION) @@ -17,24 +19,26 @@ function(generate_pkgconfig TARGET DESCRIPTION) get_target_property(LIST ${TARGET} LINK_LIBRARIES) set(REQS "") set(LIBS "") - foreach(LIB ${LIST}) - if(TARGET ${LIB}) + foreach (LIB ${LIST}) + if (TARGET ${LIB}) set(HAS_REQS 1) list(APPEND REQS ${LIB}) else() set(HAS_LIBS 1) get_relative_link(LINK ${LIB}) - list(APPEND LIBS ${LINK}) + if (NOT LINK EQUAL "") + list(APPEND LIBS ${LINK}) + endif() endif() endforeach() - if(HAS_REQS) + if (HAS_REQS) set(REQUIRES "\nRequires.private:") foreach (REQ ${REQS}) set(REQUIRES "${REQUIRES} ${REQ}") endforeach() endif() - if(HAS_LIBS) + if (HAS_LIBS) set(LIBRARIES "\nLibs.private:") foreach (LIB ${LIBS}) set(LIBRARIES "${LIBRARIES} ${LIB}") From e3449e0df870f743d9e82c6982400c04f989082f Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 12 Oct 2020 23:21:30 +0300 Subject: [PATCH 07/28] GeneratePkgConfig: remove duplicate libraries. GitOrigin-RevId: b16e2a7e99d22508e09f5df419d27874941991f6 --- CMake/GeneratePkgConfig.cmake | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake index dc26c0d21..a9ab15ee6 100644 --- a/CMake/GeneratePkgConfig.cmake +++ b/CMake/GeneratePkgConfig.cmake @@ -33,16 +33,20 @@ function(generate_pkgconfig TARGET DESCRIPTION) endforeach() if (HAS_REQS) - set(REQUIRES "\nRequires.private:") + set(REQUIRES "") foreach (REQ ${REQS}) set(REQUIRES "${REQUIRES} ${REQ}") endforeach() + set(REQUIRES "Requires.private:${REQUIRES}\n") endif() if (HAS_LIBS) - set(LIBRARIES "\nLibs.private:") + set(LIBRARIES "") + list(REVERSE LIBS) + list(REMOVE_DUPLICATES LIBS) foreach (LIB ${LIBS}) - set(LIBRARIES "${LIBRARIES} ${LIB}") + set(LIBRARIES " ${LIB}${LIBRARIES}") endforeach() + set(LIBRARIES "Libs.private:${LIBRARIES}\n") endif() file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig") @@ -56,8 +60,8 @@ Description: ${DESCRIPTION} Version: ${PROJECT_VERSION} CFlags: -I\${includedir} -Libs: -L\${libdir} -l${TARGET}${REQUIRES}${LIBRARIES} -") +Libs: -L\${libdir} -l${TARGET} +${REQUIRES}${LIBRARIES}") install(FILES "pkgconfig/${TARGET}.pc" DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/pkgconfig") endfunction() From 8a6bf5e7a1c506e6b2bcececa83a026801b194e2 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 12 Oct 2020 23:38:43 +0300 Subject: [PATCH 08/28] GeneratePkgConfig: fix handling of install path with spaces. GitOrigin-RevId: b18c2db8cd6314765b41509b094093853bbf5def --- CMake/GeneratePkgConfig.cmake | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake index a9ab15ee6..55aef5c2b 100644 --- a/CMake/GeneratePkgConfig.cmake +++ b/CMake/GeneratePkgConfig.cmake @@ -51,16 +51,12 @@ function(generate_pkgconfig TARGET DESCRIPTION) file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig") file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/${TARGET}.pc" CONTENT -"prefix=${PREFIX} -includedir=\${prefix}/${CMAKE_INSTALL_INCLUDEDIR} -libdir=\${prefix}/${CMAKE_INSTALL_LIBDIR} - -Name: ${TARGET} +"Name: ${TARGET} Description: ${DESCRIPTION} Version: ${PROJECT_VERSION} -CFlags: -I\${includedir} -Libs: -L\${libdir} -l${TARGET} +CFlags: -I\"${PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}\" +Libs: -L\"${PREFIX}/${CMAKE_INSTALL_LIBDIR}\" -l${TARGET} ${REQUIRES}${LIBRARIES}") install(FILES "pkgconfig/${TARGET}.pc" DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/pkgconfig") From 9a24cd40ec0b535ab8550fc031ec8aa9876599f5 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 13 Oct 2020 00:50:08 +0300 Subject: [PATCH 09/28] GeneratePkgConfig: return back prefix variable, so it can be overriden by pkg-config. GitOrigin-RevId: 4cf5e2a9e65b0114ec8ee30dcfae5bd7f526bcf5 --- CMake/GeneratePkgConfig.cmake | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake index 55aef5c2b..bd0f01906 100644 --- a/CMake/GeneratePkgConfig.cmake +++ b/CMake/GeneratePkgConfig.cmake @@ -51,12 +51,14 @@ function(generate_pkgconfig TARGET DESCRIPTION) file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig") file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/${TARGET}.pc" CONTENT -"Name: ${TARGET} +"prefix=${PREFIX} + +Name: ${TARGET} Description: ${DESCRIPTION} Version: ${PROJECT_VERSION} -CFlags: -I\"${PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}\" -Libs: -L\"${PREFIX}/${CMAKE_INSTALL_LIBDIR}\" -l${TARGET} +CFlags: -I\"\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}\" +Libs: -L\"\${prefix}/${CMAKE_INSTALL_LIBDIR}\" -l${TARGET} ${REQUIRES}${LIBRARIES}") install(FILES "pkgconfig/${TARGET}.pc" DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/pkgconfig") From 797d42679f411326468e54094147be38371df458 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 13 Oct 2020 00:55:59 +0300 Subject: [PATCH 10/28] GeneratePkgConfig: fix dependent library names on Windows. GitOrigin-RevId: 72de9174b1b9676ef1817b9fe7f2ed893d6c7e16 --- CMake/GeneratePkgConfig.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake index bd0f01906..6bd33f60b 100644 --- a/CMake/GeneratePkgConfig.cmake +++ b/CMake/GeneratePkgConfig.cmake @@ -2,7 +2,7 @@ function(get_relative_link OUTPUT PATH) get_filename_component(NAME ${PATH} NAME_WE) if (${PATH} MATCHES "^[$]<[$]:") set(LINK "") - elseif (${NAME} MATCHES "^lib") + elseif (NOT WIN32 AND ${NAME} MATCHES "^lib") string(REGEX REPLACE "^lib" "-l" LINK ${NAME}) elseif (${NAME} MATCHES "^-") set(LINK ${NAME}) From 95b397d52e99a0d602b094a97669d1c9ae754e81 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 13 Oct 2020 01:09:26 +0300 Subject: [PATCH 11/28] GeneratePkgConfig: minor variable expansion fixes. GitOrigin-RevId: 7b04158cc1262040fb5a9ebd33df50571e63b529 --- CMake/GeneratePkgConfig.cmake | 8 ++++---- CMakeLists.txt | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake index 6bd33f60b..6d68c1c0e 100644 --- a/CMake/GeneratePkgConfig.cmake +++ b/CMake/GeneratePkgConfig.cmake @@ -1,10 +1,10 @@ function(get_relative_link OUTPUT PATH) get_filename_component(NAME ${PATH} NAME_WE) - if (${PATH} MATCHES "^[$]<[$]:") + if (PATH MATCHES "^[$]<[$]:") set(LINK "") - elseif (NOT WIN32 AND ${NAME} MATCHES "^lib") + elseif (NOT WIN32 AND NAME MATCHES "^lib") string(REGEX REPLACE "^lib" "-l" LINK ${NAME}) - elseif (${NAME} MATCHES "^-") + elseif (NAME MATCHES "^-") set(LINK ${NAME}) else() string(CONCAT LINK "-l" ${NAME}) @@ -50,7 +50,7 @@ function(generate_pkgconfig TARGET DESCRIPTION) endif() file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig") - file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/${TARGET}.pc" CONTENT + file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/${TARGET}.pc" CONTENT "prefix=${PREFIX} Name: ${TARGET} diff --git a/CMakeLists.txt b/CMakeLists.txt index fce085173..bf0e1b38b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -999,9 +999,9 @@ if (TD_ENABLE_DOTNET) endif() # generate_pkgconfig(tdc "Telegram Library - C interface") generate_pkgconfig(tdapi "Telegram Library - API") -generate_pkgconfig(tdjson_private "Telegram Library - Json Interface (private)") -generate_pkgconfig(tdjson "Telegram Library - Json Interface (shared)") -generate_pkgconfig(tdjson_static "Telegram Library - Json Interface (static)") +generate_pkgconfig(tdjson_private "Telegram Library - JSON interface (private)") +generate_pkgconfig(tdjson "Telegram Library - JSON interface (shared)") +generate_pkgconfig(tdjson_static "Telegram Library - JSON interface (static)") install(EXPORT TdTargets FILE TdTargets.cmake From b514800cd159a8373b0e3f845c48c917842c8318 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 13 Oct 2020 01:30:50 +0300 Subject: [PATCH 12/28] Fix tdnet dependencies order. GitOrigin-RevId: cf5c5c4f28cd1a3445ab6cda293944655df1c0fa --- tdnet/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tdnet/CMakeLists.txt b/tdnet/CMakeLists.txt index 306da0c67..fb0319855 100644 --- a/tdnet/CMakeLists.txt +++ b/tdnet/CMakeLists.txt @@ -52,11 +52,11 @@ set(TDNET_SOURCE add_library(tdnet STATIC ${TDNET_SOURCE}) target_include_directories(tdnet PUBLIC $) target_include_directories(tdnet SYSTEM PRIVATE $) -target_link_libraries(tdnet PUBLIC tdutils tdactor PRIVATE ${CMAKE_DL_LIBS} ${ZLIB_LIBRARIES}) +target_link_libraries(tdnet PUBLIC tdutils tdactor) if (NOT EMSCRIPTEN) target_link_libraries(tdnet PRIVATE ${OPENSSL_SSL_LIBRARY}) endif() -target_link_libraries(tdnet PRIVATE ${OPENSSL_CRYPTO_LIBRARY}) +target_link_libraries(tdnet PRIVATE ${OPENSSL_CRYPTO_LIBRARY} ${CMAKE_DL_LIBS} ${ZLIB_LIBRARIES}) if (WIN32) if (MINGW) From 1aff1e75efd7472339137ef2892b2a1156c14396 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 13 Oct 2020 02:30:40 +0300 Subject: [PATCH 13/28] Fix net query Counter initialization. GitOrigin-RevId: ba23b816cfed060cea15244e3f2264f74c89d390 --- td/telegram/net/NetQueryStats.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/td/telegram/net/NetQueryStats.h b/td/telegram/net/NetQueryStats.h index c8a7ff469..144d407cb 100644 --- a/td/telegram/net/NetQueryStats.h +++ b/td/telegram/net/NetQueryStats.h @@ -41,7 +41,7 @@ class NetQueryStats { void dump_pending_network_queries(); private: - NetQueryCounter::Counter count_; + NetQueryCounter::Counter count_{0}; std::atomic use_list_{true}; TsList list_; }; From 39fec609680d1c4f5e470680fd12387ed5e3f297 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 13 Oct 2020 10:42:18 +0300 Subject: [PATCH 14/28] Reduce ClientManager timeout in test. GitOrigin-RevId: 806d6b24d0348af17c6334fd9c1983ef3098e62d --- test/tdclient.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/tdclient.cpp b/test/tdclient.cpp index f1a58b8bc..5217b33d8 100644 --- a/test/tdclient.cpp +++ b/test/tdclient.cpp @@ -992,7 +992,7 @@ TEST(Client, Close) { td::thread receive_thread([&] { auto max_continue_send = td::Random::fast_bool() ? 0 : 1000; while (true) { - auto response = client.receive(100.0); + auto response = client.receive(10.0); if (response.object == nullptr) { if (!stop_send) { stop_send = true; @@ -1056,7 +1056,7 @@ TEST(Client, ManagerClose) { auto max_continue_send = td::Random::fast_bool() ? 0 : 1000; bool can_stop_send = false; while (true) { - auto response = client_manager.receive(100.0); + auto response = client_manager.receive(10.0); if (response.object == nullptr) { if (!stop_send) { can_stop_send = true; From f08e0fb116ae6af03449dd490f01a99e84062c1f Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 13 Oct 2020 12:59:24 +0300 Subject: [PATCH 15/28] GeneratePkgConfig: fix variable expansion usages. GitOrigin-RevId: e7545e211540207bcac81c2600413c1357132680 --- CMake/GeneratePkgConfig.cmake | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake index 6d68c1c0e..d6f4bf931 100644 --- a/CMake/GeneratePkgConfig.cmake +++ b/CMake/GeneratePkgConfig.cmake @@ -1,33 +1,37 @@ function(get_relative_link OUTPUT PATH) - get_filename_component(NAME ${PATH} NAME_WE) if (PATH MATCHES "^[$]<[$]:") - set(LINK "") - elseif (NOT WIN32 AND NAME MATCHES "^lib") - string(REGEX REPLACE "^lib" "-l" LINK ${NAME}) - elseif (NAME MATCHES "^-") - set(LINK ${NAME}) - else() - string(CONCAT LINK "-l" ${NAME}) + set(${OUTPUT} "" PARENT_SCOPE) + return() endif() - set(${OUTPUT} ${LINK} PARENT_SCOPE) + string(REGEX REPLACE "^[$]<[$]>:(.*)>$" "\\1" PATH "${PATH}") + + get_filename_component(NAME "${PATH}" NAME_WE) + if (NOT WIN32 AND NAME MATCHES "^lib") + string(REGEX REPLACE "^lib" "-l" LINK "${NAME}") + elseif (NAME MATCHES "^-") + set(LINK "${NAME}") + else() + string(CONCAT LINK "-l" "${NAME}") + endif() + set(${OUTPUT} "${LINK}" PARENT_SCOPE) endfunction() function(generate_pkgconfig TARGET DESCRIPTION) # message("Generating pkg-config for ${TARGET}") - get_filename_component(PREFIX ${CMAKE_INSTALL_PREFIX} REALPATH) + get_filename_component(PREFIX "${CMAKE_INSTALL_PREFIX}" REALPATH) - get_target_property(LIST ${TARGET} LINK_LIBRARIES) + get_target_property(LIST "${TARGET}" LINK_LIBRARIES) set(REQS "") set(LIBS "") foreach (LIB ${LIST}) - if (TARGET ${LIB}) + if (TARGET "${LIB}") set(HAS_REQS 1) - list(APPEND REQS ${LIB}) + list(APPEND REQS "${LIB}") else() set(HAS_LIBS 1) - get_relative_link(LINK ${LIB}) + get_relative_link(LINK "${LIB}") if (NOT LINK EQUAL "") - list(APPEND LIBS ${LINK}) + list(APPEND LIBS "${LINK}") endif() endif() endforeach() From 3d52512d264740c4a3dd7985a7b647fe98aa2954 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 13 Oct 2020 13:14:28 +0300 Subject: [PATCH 16/28] GeneratePkgConfig: fix absolute path handling. GitOrigin-RevId: b5cdd94ca3b8c90781fd6101ab4ed58b159344fe --- CMake/GeneratePkgConfig.cmake | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake index d6f4bf931..4c53d2f8d 100644 --- a/CMake/GeneratePkgConfig.cmake +++ b/CMake/GeneratePkgConfig.cmake @@ -6,6 +6,17 @@ function(get_relative_link OUTPUT PATH) string(REGEX REPLACE "^[$]<[$]>:(.*)>$" "\\1" PATH "${PATH}") get_filename_component(NAME "${PATH}" NAME_WE) + if (IS_ABSOLUTE ${PATH}) + get_filename_component(DIRECTORY_NAME "${PATH}" DIRECTORY) + if (WIN32) + set(${OUTPUT} "-l\"${DIRECTORY_NAME}/${NAME}\"" PARENT_SCOPE) + else() + get_filename_component(FULL_NAME "${PATH}" NAME) + set(${OUTPUT} "-L\"${DIRECTORY_NAME}\" -l:${FULL_NAME}" PARENT_SCOPE) + endif() + return() + endif() + if (NOT WIN32 AND NAME MATCHES "^lib") string(REGEX REPLACE "^lib" "-l" LINK "${NAME}") elseif (NAME MATCHES "^-") From a9c36dbd57267d8195396984847fbf3d6d12a0c0 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 13 Oct 2020 13:37:47 +0300 Subject: [PATCH 17/28] GeneratePkgConfig: fix install. GitOrigin-RevId: a5287a6f9147814994dc948b3f59ff184852bc0d --- CMake/GeneratePkgConfig.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake index 4c53d2f8d..bbba7a27f 100644 --- a/CMake/GeneratePkgConfig.cmake +++ b/CMake/GeneratePkgConfig.cmake @@ -76,5 +76,5 @@ CFlags: -I\"\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}\" Libs: -L\"\${prefix}/${CMAKE_INSTALL_LIBDIR}\" -l${TARGET} ${REQUIRES}${LIBRARIES}") - install(FILES "pkgconfig/${TARGET}.pc" DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/pkgconfig") + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/${TARGET}.pc" DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/pkgconfig") endfunction() From 7a59b3d2b36869b11fb1f4f43e678856a26f8deb Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 13 Oct 2020 13:51:13 +0300 Subject: [PATCH 18/28] Fix td_api C++11 compatibility. GitOrigin-RevId: de46b13b26aa268770e99cf2b83ecf86b9ba5385 --- td/tl/TlObject.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/td/tl/TlObject.h b/td/tl/TlObject.h index 9cf698ebc..85b540f1b 100644 --- a/td/tl/TlObject.h +++ b/td/tl/TlObject.h @@ -115,10 +115,10 @@ class unique_ptr { } explicit unique_ptr(T *ptr) noexcept : ptr_(ptr) { } - template ::value>> + template ::value>::type> unique_ptr(unique_ptr &&other) noexcept : ptr_(static_cast(other.release())) { } - template ::value>> + template ::value>::type> unique_ptr &operator=(unique_ptr &&other) noexcept { reset(static_cast(other.release())); return *this; From 358c0f2249b4cb3fc03a4cdd31b22a56b3d29eeb Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 13 Oct 2020 15:39:17 +0300 Subject: [PATCH 19/28] Add clientCount in Java example. GitOrigin-RevId: 7b7dfcf77de1ab1db55dd42642b59f5b039943cb --- example/java/org/drinkless/tdlib/Client.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/example/java/org/drinkless/tdlib/Client.java b/example/java/org/drinkless/tdlib/Client.java index d95196f17..e8bed6787 100644 --- a/example/java/org/drinkless/tdlib/Client.java +++ b/example/java/org/drinkless/tdlib/Client.java @@ -149,6 +149,7 @@ public final class Client { if (isClosed) { updateHandlers.remove(clientId); // there will be no more updates defaultExceptionHandlers.remove(clientId); // ignore further exceptions + clientCount.decrementAndGet(); } } @@ -164,6 +165,7 @@ public final class Client { private static final ConcurrentHashMap updateHandlers = new ConcurrentHashMap(); private static final ConcurrentHashMap handlers = new ConcurrentHashMap(); private static final AtomicLong currentQueryId = new AtomicLong(); + private static final AtomicLong clientCount = new AtomicLong(); private static final ResponseReceiver responseReceiver = new ResponseReceiver(); @@ -178,6 +180,7 @@ public final class Client { } private Client(ResultHandler updateHandler, ExceptionHandler updateExceptionHandler, ExceptionHandler defaultExceptionHandler) { + clientCount.incrementAndGet(); nativeClientId = createNativeClient(); if (updateHandler != null) { updateHandlers.put(nativeClientId, new Handler(updateHandler, updateExceptionHandler)); From 348fdf1a31da9823c459e29d4d44a89637e8c28c Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 13 Oct 2020 17:02:10 +0300 Subject: [PATCH 20/28] Add "group_anonymous_bot_user_id" option. GitOrigin-RevId: efb6ee569861df005a53fd0255c50fdfa0460382 --- td/telegram/ContactsManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index 3afc4822f..f96acb635 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -2905,6 +2905,7 @@ ContactsManager::ContactsManager(Td *td, ActorShared<> parent) : td_(td), parent G()->shared_config().set_option_integer("telegram_service_notifications_chat_id", DialogId(get_service_notifications_user_id()).get()); G()->shared_config().set_option_integer("replies_bot_chat_id", DialogId(get_replies_bot_user_id()).get()); + G()->shared_config().set_option_integer("group_anonymous_bot_user_id", get_anonymous_bot_user_id().get()); if (G()->parameters().use_chat_info_db) { auto next_contacts_sync_date_string = G()->td_db()->get_binlog_pmc()->get("next_contacts_sync_date"); From a57d9ccbea62c27dda48333109205ef31d636a19 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 13 Oct 2020 17:25:25 +0300 Subject: [PATCH 21/28] Don't add dummy message sender for bots on TDLib's side. GitOrigin-RevId: d1ab4f7ca2739d30b0960f655478404d34d40757 --- td/telegram/MessagesManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 08c3d7cb8..185903167 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -12529,9 +12529,9 @@ std::pair> MessagesManager::creat } if (!is_broadcast_channel(dialog_id) && td_->auth_manager_->is_bot()) { if (dialog_id == sender_dialog_id) { - sender_user_id = td_->contacts_manager_->add_anonymous_bot_user(); + td_->contacts_manager_->add_anonymous_bot_user(); } else { - sender_user_id = td_->contacts_manager_->add_service_notifications_user(); + td_->contacts_manager_->add_service_notifications_user(); } } } From a487d20e2de5e5b8614dc0b1f06c925696386a1e Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 14 Oct 2020 17:30:55 +0300 Subject: [PATCH 22/28] Fix service message reply_to_message_id. GitOrigin-RevId: b0c430c6c04167b15e4b195d86d584e376f88efe --- td/telegram/MessagesManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 185903167..2c10dc842 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -12485,8 +12485,8 @@ MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message( } message_info.date = message->date_; message_info.flags = message->flags_; - auto reply_to_message_id = MessageId( - ServerMessageId(message_info.reply_header == nullptr ? 0 : message_info.reply_header->reply_to_msg_id_)); + auto reply_to_message_id = + MessageId(ServerMessageId(message->reply_to_ == nullptr ? 0 : message->reply_to_->reply_to_msg_id_)); message_info.content = get_action_message_content(td_, std::move(message->action_), message_info.dialog_id, reply_to_message_id); break; From b03e0a827e923e62be21432b1de44c46b42475b3 Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 14 Oct 2020 19:03:36 +0300 Subject: [PATCH 23/28] Remove wrong because of call through send_closure_later CHECK. GitOrigin-RevId: c61586c3dde988c3174f4ce3e05fe0f08d7af468 --- td/telegram/MessagesManager.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 2c10dc842..d29915482 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -19553,7 +19553,6 @@ void MessagesManager::do_read_history_on_server(DialogId dialog_id) { Dialog *d = get_dialog(dialog_id); CHECK(d != nullptr); - CHECK(!d->updated_read_history_message_ids.empty()); for (auto top_thread_message_id : d->updated_read_history_message_ids) { if (!top_thread_message_id.is_valid()) { From 7b4afb7673b9aa7609e8c05df3f4c433e851c7a2 Mon Sep 17 00:00:00 2001 From: levlam Date: Sat, 17 Oct 2020 00:47:05 +0300 Subject: [PATCH 24/28] tdtl: always recalc number of simple constructors. GitOrigin-RevId: dcc2c48f29d8a8f039bb53ec69c8b3076b153608 --- tdtl/td/tl/tl_generate.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tdtl/td/tl/tl_generate.cpp b/tdtl/td/tl/tl_generate.cpp index 71ef03c89..9e3647431 100644 --- a/tdtl/td/tl/tl_generate.cpp +++ b/tdtl/td/tl/tl_generate.cpp @@ -483,7 +483,6 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { std::size_t types_n = config.get_type_count(); std::size_t functions_n = config.get_function_count(); - bool found_complex = false; for (std::size_t type = 0; type < types_n; type++) { tl_type *t = config.get_type_by_num(type); assert(t->constructors_num == t->constructors.size()); @@ -491,7 +490,6 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { if (t->name == "Type") { assert(t->id == ID_VAR_TYPE); t->flags |= FLAG_COMPLEX; - found_complex = true; } continue; } @@ -529,7 +527,6 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { b.exist_var_num != -1) { if (!w.is_built_in_complex_type(t->name)) { t->flags |= FLAG_COMPLEX; - found_complex = true; } } else { assert(b_arg_type == NODE_TYPE_TYPE); @@ -549,14 +546,13 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { if (main_type == NODE_TYPE_VAR_TYPE) { if (!w.is_built_in_complex_type(t->name)) { t->flags |= FLAG_COMPLEX; - found_complex = true; } } } } - while (found_complex) { - found_complex = false; + while (true) { + bool found_complex = false; for (std::size_t type = 0; type < types_n; type++) { tl_type *t = config.get_type_by_num(type); if (t->constructors_num == 0 || w.is_built_in_complex_type(t->name)) { // built-in dummy or complex types @@ -576,6 +572,9 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { // std::fprintf(stderr, "Found complex %s\n", t->name.c_str()); } } + if (!found_complex) { + break; + } } std::set request_types; From 5fc7a7727e00b6883ff124939e9bd8f7405bc492 Mon Sep 17 00:00:00 2001 From: levlam Date: Sun, 18 Oct 2020 01:03:16 +0300 Subject: [PATCH 25/28] Use error code 500 for "Requested data is inaccessible" errors. GitOrigin-RevId: 2d39f90cd196f508b288089433ba2f066b5fcb22 --- td/telegram/RequestActor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/td/telegram/RequestActor.h b/td/telegram/RequestActor.h index cec5f8240..0f0fdaf8e 100644 --- a/td/telegram/RequestActor.h +++ b/td/telegram/RequestActor.h @@ -51,7 +51,7 @@ class RequestActor : public Actor { CHECK(future.get_state() == FutureActor::State::Waiting); if (--tries_left_ == 0) { future.close(); - do_send_error(Status::Error(400, "Requested data is inaccessible")); + do_send_error(Status::Error(500, "Requested data is inaccessible")); return stop(); } From fc5bf9ef06d963bbd6c6b5568160deeb2685eab1 Mon Sep 17 00:00:00 2001 From: levlam Date: Sun, 18 Oct 2020 18:12:32 +0300 Subject: [PATCH 26/28] Suppress SIGPIPE signals on write. GitOrigin-RevId: 19ff2a079a4dc69535e34282bfb2c2f381856def --- tdutils/td/utils/port/SocketFd.cpp | 37 +++++++++++++++++-- tdutils/td/utils/port/detail/EventFdLinux.cpp | 2 +- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/tdutils/td/utils/port/SocketFd.cpp b/tdutils/td/utils/port/SocketFd.cpp index 3b0bcba08..feab6676d 100644 --- a/tdutils/td/utils/port/SocketFd.cpp +++ b/tdutils/td/utils/port/SocketFd.cpp @@ -384,17 +384,37 @@ class SocketFdImpl { const NativeFd &get_native_fd() const { return info.native_fd(); } + Result writev(Span slices) { int native_fd = get_native_fd().socket(); - auto write_res = - detail::skip_eintr([&] { return ::writev(native_fd, slices.begin(), narrow_cast(slices.size())); }); + TRY_RESULT(slices_size, narrow_cast_safe(slices.size())); + auto write_res = detail::skip_eintr([&] { +#ifdef MSG_NOSIGNAL + msghdr msg; + memset(&msg, 0, sizeof(msg)); + msg.msg_iov = const_cast(slices.begin()); + msg.msg_iovlen = slices_size; + return sendmsg(native_fd, &msg, MSG_NOSIGNAL); +#else + return ::writev(native_fd, slices.begin(), slices_size); +#endif + }); return write_finish(write_res); } + Result write(Slice slice) { int native_fd = get_native_fd().socket(); - auto write_res = detail::skip_eintr([&] { return ::write(native_fd, slice.begin(), slice.size()); }); + auto write_res = detail::skip_eintr([&] { + return +#ifdef MSG_NOSIGNAL + send(native_fd, slice.begin(), slice.size(), MSG_NOSIGNAL); +#else + ::write(native_fd, slice.begin(), slice.size()); +#endif + }); return write_finish(write_res); } + Result write_finish(ssize_t write_res) { auto write_errno = errno; if (write_res >= 0) { @@ -538,6 +558,17 @@ Status init_socket_options(NativeFd &native_fd) { setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&flags), sizeof(flags)); setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, reinterpret_cast(&flags), sizeof(flags)); setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast(&flags), sizeof(flags)); +#if TD_PORT_POSIX +#ifndef MSG_NOSIGNAL // Darwin + +#ifdef SO_NOSIGPIPE + setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, reinterpret_cast(&flags), sizeof(flags)); +#else +#warning "Failed to suppress SIGPIPE signals. Use signal(SIGPIPE, SIG_IGN) to suppress them." +#endif + +#endif +#endif // TODO: SO_REUSEADDR, SO_KEEPALIVE, TCP_NODELAY, SO_SNDBUF, SO_RCVBUF, TCP_QUICKACK, SO_LINGER return Status::OK(); diff --git a/tdutils/td/utils/port/detail/EventFdLinux.cpp b/tdutils/td/utils/port/detail/EventFdLinux.cpp index 8de405592..04521fc0b 100644 --- a/tdutils/td/utils/port/detail/EventFdLinux.cpp +++ b/tdutils/td/utils/port/detail/EventFdLinux.cpp @@ -67,7 +67,7 @@ void EventFdLinux::release() { auto native_fd = impl_->info.native_fd().fd(); auto result = [&]() -> Result { - auto write_res = detail::skip_eintr([&] { return ::write(native_fd, slice.begin(), slice.size()); }); + auto write_res = detail::skip_eintr([&] { return write(native_fd, slice.begin(), slice.size()); }); auto write_errno = errno; if (write_res >= 0) { return narrow_cast(write_res); From fa91220f889521f7ef687e796c61826a1b1916f9 Mon Sep 17 00:00:00 2001 From: levlam Date: Sun, 18 Oct 2020 18:29:51 +0300 Subject: [PATCH 27/28] Remove superflous "struct " specifiers. GitOrigin-RevId: 317d66fad270e99c4c4e6bc14b172f4c2eec3d6d --- tdutils/td/utils/port/UdpSocketFd.cpp | 50 +++++++++++++-------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/tdutils/td/utils/port/UdpSocketFd.cpp b/tdutils/td/utils/port/UdpSocketFd.cpp index 8ba885be0..aa146b6a4 100644 --- a/tdutils/td/utils/port/UdpSocketFd.cpp +++ b/tdutils/td/utils/port/UdpSocketFd.cpp @@ -47,7 +47,7 @@ class UdpSocketReceiveHelper { public: void to_native(const UdpMessage &message, WSAMSG &message_header) { socklen_t addr_len{narrow_cast(sizeof(addr_))}; - message_header.name = reinterpret_cast(&addr_); + message_header.name = reinterpret_cast(&addr_); message_header.namelen = addr_len; buf_.buf = const_cast(message.data.as_slice().begin()); buf_.len = narrow_cast(message.data.size()); @@ -59,8 +59,7 @@ class UdpSocketReceiveHelper { } void from_native(WSAMSG &message_header, size_t message_size, UdpMessage &message) { - message.address.init_sockaddr(reinterpret_cast(message_header.name), message_header.namelen) - .ignore(); + message.address.init_sockaddr(reinterpret_cast(message_header.name), message_header.namelen).ignore(); message.error = Status::OK(); if ((message_header.dwFlags & (MSG_TRUNC | MSG_CTRUNC)) != 0) { @@ -82,7 +81,7 @@ class UdpSocketReceiveHelper { class UdpSocketSendHelper { public: void to_native(const UdpMessage &message, WSAMSG &message_header) { - message_header.name = const_cast(message.address.get_sockaddr()); + message_header.name = const_cast(message.address.get_sockaddr()); message_header.namelen = narrow_cast(message.address.get_sockaddr_len()); buf_.buf = const_cast(message.data.as_slice().begin()); buf_.len = narrow_cast(message.data.size()); @@ -373,7 +372,7 @@ void UdpSocketFdImplDeleter::operator()(UdpSocketFdImpl *impl) { class UdpSocketReceiveHelper { public: - void to_native(const UdpSocketFd::InboundMessage &message, struct msghdr &message_header) { + void to_native(const UdpSocketFd::InboundMessage &message, msghdr &message_header) { socklen_t addr_len{narrow_cast(sizeof(addr_))}; message_header.msg_name = &addr_; @@ -387,22 +386,22 @@ class UdpSocketReceiveHelper { message_header.msg_flags = 0; } - void from_native(struct msghdr &message_header, size_t message_size, UdpSocketFd::InboundMessage &message) { + void from_native(msghdr &message_header, size_t message_size, UdpSocketFd::InboundMessage &message) { #if TD_LINUX - struct cmsghdr *cmsg; - struct sock_extended_err *ee = nullptr; + cmsghdr *cmsg; + sock_extended_err *ee = nullptr; for (cmsg = CMSG_FIRSTHDR(&message_header); cmsg != nullptr; cmsg = CMSG_NXTHDR(&message_header, cmsg)) { if (cmsg->cmsg_type == IP_PKTINFO && cmsg->cmsg_level == IPPROTO_IP) { - //auto *pi = reinterpret_cast(CMSG_DATA(cmsg)); + //auto *pi = reinterpret_cast(CMSG_DATA(cmsg)); } else if (cmsg->cmsg_type == IPV6_PKTINFO && cmsg->cmsg_level == IPPROTO_IPV6) { - //auto *pi = reinterpret_cast(CMSG_DATA(cmsg)); + //auto *pi = reinterpret_cast(CMSG_DATA(cmsg)); } else if ((cmsg->cmsg_type == IP_RECVERR && cmsg->cmsg_level == IPPROTO_IP) || (cmsg->cmsg_type == IPV6_RECVERR && cmsg->cmsg_level == IPPROTO_IPV6)) { - ee = reinterpret_cast(CMSG_DATA(cmsg)); + ee = reinterpret_cast(CMSG_DATA(cmsg)); } } if (ee != nullptr) { - auto *addr = reinterpret_cast(SO_EE_OFFENDER(ee)); + auto *addr = reinterpret_cast(SO_EE_OFFENDER(ee)); IPAddress address; address.init_sockaddr(addr).ignore(); if (message.from != nullptr) { @@ -417,8 +416,7 @@ class UdpSocketReceiveHelper { } #endif if (message.from != nullptr) { - message.from - ->init_sockaddr(reinterpret_cast(message_header.msg_name), message_header.msg_namelen) + message.from->init_sockaddr(reinterpret_cast(message_header.msg_name), message_header.msg_namelen) .ignore(); } if (message.error) { @@ -439,14 +437,14 @@ class UdpSocketReceiveHelper { private: std::array control_buf_; sockaddr_storage addr_; - struct iovec io_vec_; + iovec io_vec_; }; class UdpSocketSendHelper { public: - void to_native(const UdpSocketFd::OutboundMessage &message, struct msghdr &message_header) { + void to_native(const UdpSocketFd::OutboundMessage &message, msghdr &message_header) { CHECK(message.to != nullptr && message.to->is_valid()); - message_header.msg_name = const_cast(message.to->get_sockaddr()); + message_header.msg_name = const_cast(message.to->get_sockaddr()); message_header.msg_namelen = narrow_cast(message.to->get_sockaddr_len()); io_vec_.iov_base = const_cast(message.data.begin()); io_vec_.iov_len = message.data.size(); @@ -459,7 +457,7 @@ class UdpSocketSendHelper { } private: - struct iovec io_vec_; + iovec io_vec_; }; class UdpSocketFdImpl { @@ -495,7 +493,7 @@ class UdpSocketFdImpl { #endif } - struct msghdr message_header; + msghdr message_header; detail::UdpSocketReceiveHelper helper; helper.to_native(message, message_header); @@ -549,7 +547,7 @@ class UdpSocketFdImpl { Status send_message(const UdpSocketFd::OutboundMessage &message, bool &is_sent) { is_sent = false; - struct msghdr message_header; + msghdr message_header; detail::UdpSocketSendHelper helper; helper.to_native(message, message_header); @@ -651,11 +649,11 @@ class UdpSocketFdImpl { #if TD_HAS_MMSG Status send_messages_fast(Span messages, size_t &cnt) { //struct mmsghdr { - // struct msghdr msg_hdr; [> Message header <] + // msghdr msg_hdr; [> Message header <] // unsigned int msg_len; [> Number of bytes transmitted <] //}; - struct std::array helpers; - struct std::array headers; + std::array helpers; + std::array headers; size_t to_send = min(messages.size(), headers.size()); for (size_t i = 0; i < to_send; i++) { helpers[i].to_native(messages[i], headers[i].msg_hdr); @@ -702,11 +700,11 @@ class UdpSocketFdImpl { #endif } //struct mmsghdr { - // struct msghdr msg_hdr; [> Message header <] + // msghdr msg_hdr; [> Message header <] // unsigned int msg_len; [> Number of bytes transmitted <] //}; - struct std::array helpers; - struct std::array headers; + std::array helpers; + std::array headers; size_t to_receive = min(messages.size(), headers.size()); for (size_t i = 0; i < to_receive; i++) { helpers[i].to_native(messages[i], headers[i].msg_hdr); From cecdae448e88603c98d7d079855c992be6df739f Mon Sep 17 00:00:00 2001 From: Nikolay Nechaev Date: Sun, 18 Oct 2020 19:25:43 +0300 Subject: [PATCH 28/28] Update td_example.cpp (#1254) Read the whole password, not only the first word from it --- example/cpp/td_example.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/cpp/td_example.cpp b/example/cpp/td_example.cpp index 962be64c2..1b8d7859f 100644 --- a/example/cpp/td_example.cpp +++ b/example/cpp/td_example.cpp @@ -257,7 +257,7 @@ class TdExample { [this](td_api::authorizationStateWaitPassword &) { std::cout << "Enter authentication password: " << std::flush; std::string password; - std::cin >> password; + std::getline(std::cin, line); send_query(td_api::make_object(password), create_authentication_query_handler()); },