Compare commits

...

47 Commits

Author SHA1 Message Date
2f44996edc Merge commit 'b1fe0644843f5d08cd203bb5d4cdb923172f247b' 2024-01-14 21:51:01 +01:00
b1fe064484 Squashed 'external/toxcore/c-toxcore/' changes from 6d634674a9..73d9b845a3
73d9b845a3 cleanup: Remove old type-ordered event getters.
b0840cc02d feat: add ngc events
7df9a51349 refactor: Make event dispatch ordered by receive time.
bcb6592af5 test: Add C++ classes wrapping system interfaces.
4cea4f9ca4 fix: Make all the fuzzers work again, and add a test for protodump.
c4e209ea1d refactor: Factor out malloc+memcpy into memdup.
87bcc4322d fix: Remove fatal error for non-erroneous case
REVERT: 6d634674a9 cleanup: Remove old type-ordered event getters.
REVERT: d1d48d1dfc feat: add ngc events
REVERT: 994ffecc6b refactor: Make event dispatch ordered by receive time.

git-subtree-dir: external/toxcore/c-toxcore
git-subtree-split: 73d9b845a310c3f56d2d6d77ed56b93d84256d6e
2024-01-14 21:51:01 +01:00
18ca88a0d4 asan in flake 2024-01-14 21:48:41 +01:00
565aa4b7eb update deps and adopt 2024-01-14 18:50:23 +01:00
b117da5ccf add compute powersave extreme 2024-01-13 18:38:12 +01:00
8eb4892b49 Squashed 'external/toxcore/c-toxcore/' changes from 8f0d505f9a..6d634674a9
6d634674a9 cleanup: Remove old type-ordered event getters.
d1d48d1dfc feat: add ngc events
994ffecc6b refactor: Make event dispatch ordered by receive time.
812f931d5f fix: Make sure there's enough space for CONSUME1 in fuzzers.
50f1b30fa9 test: Add fuzz tests to the coverage run.
df76f5cf47 chore: Move from gcov to llvm source-based coverage.
072e3beb3f fix: issues with packet broadcast error reporting
6b6718e4d2 cleanup: Make group packet entry creation less error-prone
5b9c420ce1 refactor: packet broadcast functions now return errors
af4cb31028 refactor: Use `operator==` for equality tests of `Node_format`.
9592d590cf refactor(test): Slightly nicer C++ interface to tox Random.
c66e10fb7a refactor: Minor refactoring of get_close_nodes functions.
ebc9643862 fix: don't pass garbage data buffer to packet send functions
32b68cffca cleanup: Some more test cleanups, removing overly smart code.
0426624dcb refactor: Assign malloc return to a local variable first.
afc38f2458 test: Add more unit tests for `add_to_list`.
05ce5c1ab9 test: Add "infer" CI check to github, remove from circle.
REVERT: 8f0d505f9a feat: add ngc events
REVERT: 9b8216e70c refactor: Make event dispatch ordered by receive time.

git-subtree-dir: external/toxcore/c-toxcore
git-subtree-split: 6d634674a929edb0ab70689dcbcb195b3547be13
2024-01-12 21:30:48 +01:00
82fe4c3dd7 Merge commit '8eb4892b4976e82e020d0e30dcf8f0705b76bb4e' 2024-01-12 21:30:48 +01:00
78b0e9a77f more small fixes 2024-01-12 19:04:50 +01:00
7fa6aa7ac2 forgot to update plugin 2024-01-12 18:51:29 +01:00
20b4cdc5f1 sync and delivery (and unused read) states and other smaller refactors 2024-01-12 16:45:52 +01:00
7c576dd4d0 make fade less noticable 2024-01-10 14:17:29 +01:00
f6cda522ca correct message order 2024-01-09 22:38:13 +01:00
3d2f5b644b make toxcore work 2024-01-09 20:36:06 +01:00
9ace11a0e2 Squashed 'external/toxcore/c-toxcore/' changes from f1df709b87..8f0d505f9a
8f0d505f9a feat: add ngc events
9b8216e70c refactor: Make event dispatch ordered by receive time.
814c12a6f4 cleanup: Add dynamically derived array sizes to the API.
226b23be12 cleanup: Add explicit array sizes to toxencryptsave.
ef33cb4de0 cleanup: Add Toxav alias for ToxAV.
1da723b34d cleanup: Make Tox_Options a typedef.
b148a2afff chore: Simplify msvc build using vcpkg.
5cac6d7eb1 cleanup: Move `tox_get_system` out of the public API.
c9ca4007e3 refactor: Align group message sending with other send functions.
6c6c0b1b1b cleanup: Make setters take non-const `Tox *`.
a76f758d70 cleanup: Mark arrays in the tox API as `[]` instead of `*`.
baf6d1f6cf cleanup: Make array params in toxav `[]` instead of `*`.
79f55bd06a cleanup: Put the size of fixed arrays into the API types.
1e73698db2 cleanup: Add typedefs for public API int identifiers.
cac074c57f chore: Add fetch-sha256 script to update bootstrap node hash.
32576656bb Make the comment capitalization uniform
aff4dda17c Spellcheck tox-bootstrapd
40b5fbbe9d chore: Remove settings.yml in favour of hs-github-tools.
ebafd51be7 chore: Use GPL license with https.
0e42752f0f cleanup: Move all vptr-to-ptr casts to the beginning of a function.
5407384211 cleanup: Use github actions matrix to simplify CI.
82d8265688 fix: Use QueryPerformanceCounter on windows for monotonic time.
1224e656e3 chore: Add `net_(new|kill)_strerror` to cppcheck's allocators.
6a90ddfe4e cleanup: Run clang-tidy on headers, as well.
bd930cc80a cleanup: Make TCP connection failures a warning instead of error.
fad6e4e173 cleanup: Make all .c files include the headers they need.
ef4897a898 cleanup: Upgrade to clang-tidy-17 and fix some warnings.
REVERT: f1df709b87 feat: add ngc events
REVERT: 1b6c907235 refactor: Make event dispatch ordered by receive time.

git-subtree-dir: external/toxcore/c-toxcore
git-subtree-split: 8f0d505f9a598cc41c682178e1589bcc01efe9cb
2024-01-09 16:39:05 +01:00
6104d3b6d1 Merge commit '9ace11a0e2843cbde4af2b6ff7b49bcc6d429f78' 2024-01-09 16:39:05 +01:00
f637c7c942 make fade respect fps 2024-01-09 16:30:27 +01:00
afb886ea7c default to reduced fps 2024-01-09 15:57:20 +01:00
74129cabef fix url open with unsanitized strings 2024-01-09 02:26:50 +01:00
be8ceb861c 1 sec cooldown for reduced fps mode 2024-01-07 22:20:40 +01:00
da0f59a3f5 try fix plugin rendering 2024-01-07 19:37:05 +01:00
000254320e add ubuntu linux to cd 2024-01-07 18:54:18 +01:00
2fac7206d2 pull windows fixes 2024-01-07 18:05:36 +01:00
e8234f2a4a properly seperate tick and render 2024-01-07 16:33:08 +01:00
a0ba0b39d8 add fps reduced mode 2024-01-06 18:23:06 +01:00
845967cf12 more main loop fiddling 2024-01-06 16:45:08 +01:00
92b58cbfa9 faster wakeup 2024-01-06 15:13:45 +01:00
5a0651eaf0 wip low fps mode for hidden states and powersave modes.
dont use yet, as all compute is still done in the render method
2024-01-06 14:38:21 +01:00
14fcaf1d7e why is windows so bad 2024-01-05 16:32:37 +01:00
5a0252d8d0 start screen refactor 2024-01-05 14:47:08 +01:00
9c0ffd38ce last update fixes 2023-12-27 12:49:52 +01:00
b2ae9530a4 Squashed 'external/toxcore/c-toxcore/' changes from e29e185c03..f1df709b87
f1df709b87 feat: add ngc events
1b6c907235 refactor: Make event dispatch ordered by receive time.
b7f9367f6f test: Upgrade cppcheck, fix some warnings.
766e62bc89 chore: Use `pkg_search_module` directly in cmake.
00ff078f91 cleanup: Use target_link_libraries directly in cmake.
c58928cc89 chore: Add `IMPORTED_TARGET` to pkg-config packages.
895a6af122 cleanup: Remove NaCl support.
41dfb1c1c0 fix: unpack enum function names in event impl generator
447666d1a1 chore: Disable targets for cross-compilation.
572924e924 chore: Build a docker image with coverage info in it.
415cb78f5e cleanup: Some portability/warning fixes for Windows builds.
425216d9ec fix: Correct a use-after-free and fix some memory leaks.
4b1cfa3e08 refactor: Change all enum-like `#define` sequences into enums.
d3c2704fa9 chore: Fix make_single_file to support core-only.
0ce46b644e refactor: Change the `TCP_PACKET_*` defines into an enum.
22cd38ad50 adopt event impl generation tool to #2392
f31ea1088a add the event impl generation tool
4e603bb613 refactor: Use `enum-from-int` rule from tokstyle.
19d8f180d6 chore: Update github actions `uses`.
6a895be0c7 test: Make esp32 build actually try to instantiate tox.
65d09c9bfb cleanup: Remove test net support.
REVERT: e29e185c03 feat: add ngc events

git-subtree-dir: external/toxcore/c-toxcore
git-subtree-split: f1df709b8792da4c0e946d826b11df77d565064d
2023-12-27 12:37:22 +01:00
ae1fb0fde3 Merge commit 'b2ae9530a405e02a50476c04fc7196c5e9863ad6' 2023-12-27 12:37:22 +01:00
35ebbbef93 prep for new toxcore events 2023-12-27 12:36:38 +01:00
83e200df43 Squashed 'external/toxcore/c-toxcore/' changes from adbd5b32d8..e29e185c03
e29e185c03 feat: add ngc events
2b0dc0f46b add ngc related unpack functions
b2315c50e0 Add groupchat API function that returns an IP address string for a peer
5f863a5492 feat: Add `to_string` functions for all public enums.
0c998a7598 add real timeout test
68c827609a chore: Move s390x build to post-merge.
028b017d79 perf: Slightly reduce bandwidth usage when there are few nodes.
90f7496819 feat: Enable ubsan on bootstrap nodes.
89b6450d66 test: Add check-c run to bazel build.
REVERT: adbd5b32d8 feat: add ngc events

git-subtree-dir: external/toxcore/c-toxcore
git-subtree-split: e29e185c03fea7337036e5ef4d1d9080a6cee721
2023-12-24 12:21:34 +01:00
260d3b7818 Merge commit '83e200df43eb790719c40103099c8d70e37c0477' 2023-12-24 12:21:34 +01:00
4ebffd8c63 switch to cerr in test to restore log order 2023-12-22 12:07:43 +01:00
8923e09b36 add asan option and enable for msvc ci/cd 2023-12-22 11:44:59 +01:00
ec4195f18a add linux to test 2023-12-19 01:56:35 +01:00
062ad7ae80 fix mac 2023-12-19 01:47:50 +01:00
aad07611c7 ci/cd blancing 2023-12-19 01:26:56 +01:00
0dcb66f143 add temp test 2023-12-19 00:29:27 +01:00
331c25b0e6 switch to debug 2023-12-19 00:22:23 +01:00
e50844be06 switch to release with debug info 2023-12-19 00:07:47 +01:00
4dd7c98c1a change to 2019 2023-12-18 23:58:15 +01:00
63bad2e99a add deterrent 2023-12-18 22:58:23 +01:00
9ddeea3d06 Squashed 'external/toxcore/c-toxcore/' changes from d4b06edc2a..adbd5b32d8
adbd5b32d8 feat: add ngc events
15ee46d431 add simple test for max sized lossy custom group packet
01e7950c67 increase lossy custom packet size in ngc to the toxcore common max of 1373
9b3c1089f1 Make group saving/loading more forgiving with data errors
55a76003b0 Replace memset(int32_t*, -1, _) with a for-loop
66453439ac fix: also Install header for private/experimental API functions with autotools
3983369103 fix: Enable debug flag for ubsan.
4d1db21102 Update tox-boostrapd hash
e700c31b70 Fix memory leak in group connection
2994441d9c Fix memory leak in save-generator
d0400df13d Fix memory leak in tox-bootstrapd
7a6d50ebe3 Install header for private/experimental API functions
d89677fb5f Remove defunct IRC channel from README.md
26d41fc604 Replace DEFAULT_TCP_RELAY_PORTS_COUNT with a compile-time calculation
63fb2941ca Clarify disabling of static assert checks
65b3375b98 refactor: Use Bin_Pack for packing Node_format.
84ba154f6a group connection queries now return our own connection type
a4df2862ed Replace tabs with spaces
1b6dee7594 Update tox-bootstrapd's base Docker images
a030cdee5c Fix Docker tox-bootstrapd hash update failing when using BuildKit
7cfe35dff2 cleanup: Remove explicit layering_check feature.
d390947245 chore: Upgrade sonar-scan jvm to java 17.
d1e850c56c fix: Add missing `htons` call when adding configured TCP relay.
814090f2b8 chore: Cancel old PR builds on docker and sonar-scan workflows.
83efb17367 perf: Add a KVM FreeBSD build on cirrus ci.
a927183233 test: Add a test for encrypting 100MB of data.
28f39049f6 chore: Retry freebsd tests 2 times.
47e77d1bb0 chore: Use C99 on MSVC instead of C11.
7155f7f60e test: Add an s390x build (on alpine) for CI.
6c35cef63f chore: Add a compcert docker run script.
41e6ea865e cleanup: Use tcc docker image for CI.
e726b197b0 refactor: Store time in Mono_Time in milliseconds.
REVERT: d4b06edc2a feat: add ngc events

git-subtree-dir: external/toxcore/c-toxcore
git-subtree-split: adbd5b32d85d9c13800f5ece17c0a9dce99faacd
2023-12-15 15:21:40 +01:00
b95f0498b6 Merge commit '9ddeea3d06045c8ae38cd2d6eed0fc2891c6e146' 2023-12-15 15:21:40 +01:00
360 changed files with 15359 additions and 8719 deletions

View File

@@ -10,10 +10,40 @@ env:
BUILD_TYPE: Release BUILD_TYPE: Release
jobs: jobs:
linux-ubuntu:
timeout-minutes: 10
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- name: Install Dependencies
run: sudo apt update && sudo apt -y install libsodium-dev
- name: Configure CMake
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
- name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4
- name: temp test
run: ${{github.workspace}}/build/bin/mono_time_test
- uses: actions/upload-artifact@v3
with:
name: ${{ github.event.repository.name }}-ubuntu20.04-x86_64
# TODO: do propper packing
path: |
${{github.workspace}}/build/bin/
windows: windows:
timeout-minutes: 15 timeout-minutes: 15
runs-on: windows-latest runs-on: windows-2019
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
@@ -34,10 +64,50 @@ jobs:
- name: Build - name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4
- name: temp test
run: ${{github.workspace}}/build/bin/mono_time_test.exe
- uses: actions/upload-artifact@v3 - uses: actions/upload-artifact@v3
if: success() || failure()
with: with:
name: ${{ github.event.repository.name }}-windows-msvc-x86_64 name: ${{ github.event.repository.name }}-windows-msvc-x86_64
# TODO: do propper packing # TODO: do propper packing
path: | path: |
${{github.workspace}}/build/bin/ ${{github.workspace}}/build/bin/
windows-asan:
timeout-minutes: 15
runs-on: windows-2019
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- name: Install Dependencies
run: vcpkg install libsodium:x64-windows-static pthreads:x64-windows-static
# setup vs env
- uses: ilammy/msvc-dev-cmd@v1
with:
arch: amd64
- name: Configure CMake
run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DTOMATO_ASAN=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded
- name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4
- name: temp test
run: ${{github.workspace}}/build/bin/mono_time_test.exe
- uses: actions/upload-artifact@v3
if: success() || failure()
with:
name: ${{ github.event.repository.name }}-windows-msvc-asan-x86_64
# TODO: do propper packing
# TODO: also switch to asan dlls
path: |
${{github.workspace}}/build/bin/

View File

@@ -29,6 +29,9 @@ jobs:
- name: Build - name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4
- name: temp test
run: ${{github.workspace}}/build/bin/mono_time_test
macos: macos:
timeout-minutes: 10 timeout-minutes: 10
@@ -72,3 +75,6 @@ jobs:
- name: Build - name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4
- name: temp test
run: ${{github.workspace}}/build/bin/mono_time_test.exe

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.9 FATAL_ERROR) cmake_minimum_required(VERSION 3.14...3.24 FATAL_ERROR)
# cmake setup begin # cmake setup begin
project(tomato) project(tomato)
@@ -6,7 +6,7 @@ project(tomato)
set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# defaulting to debug mode, if not specified # defaulting to debug mode, if not specified
if(NOT CMAKE_BUILD_TYPE) if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Debug") set(CMAKE_BUILD_TYPE "Debug")
endif() endif()
@@ -18,6 +18,26 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
option(TOMATO_ASAN "Build tomato with asan (gcc/clang/msvc)" OFF)
if (TOMATO_ASAN)
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
if (NOT WIN32) # exclude mingw
link_libraries(-fsanitize=address)
#link_libraries(-fsanitize=address,undefined)
#link_libraries(-fsanitize=undefined)
message("II enabled ASAN")
else()
message("!! can not enable ASAN on this platform (gcc/clang + win)")
endif()
elseif (MSVC)
add_compile_options("/fsanitize=address")
message("II enabled ASAN")
else()
message("!! can not enable ASAN on this platform")
endif()
endif()
# external libs # external libs
add_subdirectory(./external) # before increasing warn levels, sad :( add_subdirectory(./external) # before increasing warn levels, sad :(
@@ -33,13 +53,8 @@ if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL
#-Wsign-conversion # Warn on sign conversions #-Wsign-conversion # Warn on sign conversions
-Wshadow # Warn if a variable declaration shadows one from a parent context -Wshadow # Warn if a variable declaration shadows one from a parent context
) )
if (NOT WIN32)
#link_libraries(-fsanitize=address,undefined)
#link_libraries(-fsanitize=undefined)
endif()
elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC") elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC")
if (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") if (MSVC)
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
else() else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")

View File

@@ -127,6 +127,8 @@ add_library(toxcore STATIC
${TOX_DIR}toxcore/tox.c ${TOX_DIR}toxcore/tox.c
${TOX_DIR}toxcore/tox_dispatch.c ${TOX_DIR}toxcore/tox_dispatch.c
${TOX_DIR}toxcore/tox_dispatch.h ${TOX_DIR}toxcore/tox_dispatch.h
${TOX_DIR}toxcore/tox_event.c
${TOX_DIR}toxcore/tox_event.h
${TOX_DIR}toxcore/tox_events.c ${TOX_DIR}toxcore/tox_events.c
${TOX_DIR}toxcore/tox_events.h ${TOX_DIR}toxcore/tox_events.h
${TOX_DIR}toxcore/tox.h ${TOX_DIR}toxcore/tox.h
@@ -203,6 +205,10 @@ add_executable(DHT_Bootstrap EXCLUDE_FROM_ALL
${TOX_DIR}testing/misc_tools.h ${TOX_DIR}testing/misc_tools.h
${TOX_DIR}testing/misc_tools.c ${TOX_DIR}testing/misc_tools.c
) )
target_link_libraries(DHT_Bootstrap toxcore) target_link_libraries(DHT_Bootstrap toxcore)
add_executable(mono_time_test
./mono_time_test.cc
)
target_link_libraries(mono_time_test toxcore)
target_compile_features(mono_time_test PUBLIC cxx_std_11)

View File

@@ -6,6 +6,7 @@ CACHEDIR="$HOME/cache"
. ".github/scripts/flags-$CC.sh" . ".github/scripts/flags-$CC.sh"
add_flag -Werror add_flag -Werror
add_flag -D_DEBUG
add_flag -fdiagnostics-color=always add_flag -fdiagnostics-color=always
add_flag -fno-omit-frame-pointer add_flag -fno-omit-frame-pointer
add_flag -fno-sanitize-recover=all add_flag -fno-sanitize-recover=all

View File

@@ -15,9 +15,7 @@ workflows:
- ubsan - ubsan
# Static analysis # Static analysis
- clang-analyze - clang-analyze
- clang-tidy
- cpplint - cpplint
- infer
- static-analysis - static-analysis
jobs: jobs:
@@ -70,6 +68,7 @@ jobs:
cmake cmake
git git
libconfig-dev libconfig-dev
libgmock-dev
libgtest-dev libgtest-dev
libopus-dev libopus-dev
libsodium-dev libsodium-dev
@@ -103,27 +102,6 @@ jobs:
- run: git submodule update --init --recursive - run: git submodule update --init --recursive
- run: CC=clang .circleci/cmake-ubsan - run: CC=clang .circleci/cmake-ubsan
infer:
working_directory: ~/work
docker:
- image: toxchat/infer
steps:
- run: *apt_install
- checkout
- run: git submodule update --init --recursive
- run: infer --no-progress-bar -- cc
auto_tests/auto_test_support.c
auto_tests/lossless_packet_test.c
testing/misc_tools.c
toxav/*.c
toxcore/*.c
toxcore/*/*.c
toxencryptsave/*.c
third_party/cmp/*.c
-lpthread
$(pkg-config --cflags --libs libsodium opus vpx)
static-analysis: static-analysis:
working_directory: ~/work working_directory: ~/work
docker: docker:
@@ -134,7 +112,6 @@ jobs:
- run: - run:
apt-get install -y --no-install-recommends apt-get install -y --no-install-recommends
ca-certificates ca-certificates
cppcheck
g++ g++
llvm-dev llvm-dev
- checkout - checkout
@@ -142,7 +119,6 @@ jobs:
- run: other/analysis/check_includes - run: other/analysis/check_includes
- run: other/analysis/check_logger_levels - run: other/analysis/check_logger_levels
- run: other/analysis/run-clang - run: other/analysis/run-clang
- run: other/analysis/run-cppcheck
- run: other/analysis/run-gcc - run: other/analysis/run-gcc
clang-analyze: clang-analyze:
@@ -156,24 +132,6 @@ jobs:
- run: git submodule update --init --recursive - run: git submodule update --init --recursive
- run: other/analysis/run-clang-analyze - run: other/analysis/run-clang-analyze
clang-tidy:
working_directory: ~/work
docker:
- image: ubuntu
steps:
- run: *apt_install
- run:
apt-get install -y --no-install-recommends
ca-certificates
clang-tidy-14
- checkout
- run: git submodule update --init --recursive
- run:
other/analysis/run-clang-tidy ||
other/analysis/run-clang-tidy ||
other/analysis/run-clang-tidy
cpplint: cpplint:
working_directory: ~/work working_directory: ~/work
docker: docker:

View File

@@ -9,7 +9,6 @@ bazel-opt_task:
- /src/workspace/tools/inject-repo c-toxcore - /src/workspace/tools/inject-repo c-toxcore
test_all_script: test_all_script:
- cd /src/workspace && bazel test -k - cd /src/workspace && bazel test -k
--config=ci
--build_tag_filters=-haskell --build_tag_filters=-haskell
--test_tag_filters=-haskell --test_tag_filters=-haskell
-- --
@@ -26,7 +25,6 @@ bazel-dbg_task:
- /src/workspace/tools/inject-repo c-toxcore - /src/workspace/tools/inject-repo c-toxcore
test_all_script: test_all_script:
- cd /src/workspace && bazel test -k - cd /src/workspace && bazel test -k
--config=ci
--build_tag_filters=-haskell --build_tag_filters=-haskell
--test_tag_filters=-haskell --test_tag_filters=-haskell
-- --
@@ -43,8 +41,19 @@ cimple_task:
- /src/workspace/tools/inject-repo c-toxcore - /src/workspace/tools/inject-repo c-toxcore
test_all_script: test_all_script:
- cd /src/workspace && bazel test -k - cd /src/workspace && bazel test -k
--config=ci
--build_tag_filters=haskell --build_tag_filters=haskell
--test_tag_filters=haskell --test_tag_filters=haskell
-- --
//c-toxcore/... //c-toxcore/...
freebsd_task:
container:
image: toxchat/freebsd:latest
cpu: 2
memory: 4G
kvm: true
configure_script:
- git submodule update --init --recursive
- cd .. && mv cirrus-ci-build /work/c-toxcore && mkdir cirrus-ci-build
test_all_script:
- cd /work/c-toxcore && .github/scripts/cmake-freebsd

View File

@@ -1,4 +1,5 @@
# vim:ft=yaml # vim:ft=yaml
HeaderFilterRegex: "/c-toxcore/[^/]+/[^.].+"
CheckOptions: CheckOptions:
- key: readability-identifier-naming.ClassCase - key: readability-identifier-naming.ClassCase
value: Camel_Snake_Case value: Camel_Snake_Case
@@ -35,6 +36,12 @@ CheckOptions:
value: lower_case value: lower_case
- key: llvmlibc-restrict-system-libc-headers.Includes - key: llvmlibc-restrict-system-libc-headers.Includes
value: "arpa/inet.h,assert.h,ctype.h,errno.h,fcntl.h,getopt.h,libconfig.h,linux/netdevice.h,math.h,netdb.h,netinet/in.h,opus.h,pthread.h,signal.h,sodium/crypto_scalarmult_curve25519.h,sodium.h,sodium/randombytes.h,stdio.h,stdlib.h,string.h,sys/ioctl.h,syslog.h,sys/resource.h,sys/socket.h,sys/stat.h,sys/time.h,sys/types.h,time.h,unistd.h,vpx/vp8cx.h,vpx/vp8dx.h,vpx/vpx_decoder.h,vpx/vpx_encoder.h,vpx/vpx_image.h" value: "arpa/inet.h,assert.h,ctype.h,errno.h,fcntl.h,getopt.h,libconfig.h,limits.h,linux/if.h,math.h,netdb.h,netinet/in.h,opus.h,pthread.h,signal.h,sodium/crypto_scalarmult_curve25519.h,sodium.h,sodium/randombytes.h,stdarg.h,stdbool.h,stddef.h,stdint.h,stdio.h,stdlib.h,string.h,sys/ioctl.h,syslog.h,sys/resource.h,sys/socket.h,sys/stat.h,sys/time.h,sys/types.h,time.h,unistd.h,vpx/vp8cx.h,vpx/vp8dx.h,vpx/vpx_decoder.h,vpx/vpx_encoder.h,vpx/vpx_image.h"
- key: hicpp-signed-bitwise.IgnorePositiveIntegerLiterals - key: hicpp-signed-bitwise.IgnorePositiveIntegerLiterals
value: true value: true
- key: concurrency-mt-unsafe.FunctionSet
value: posix
- key: misc-include-cleaner.IgnoreHeaders
value: "pthread.h;stdbool.h;stddef.h;stdint.;stdint.h;stdint...;cstdint;sodium.*;sys/.*;unistd.h;opus.*;vpx.*;attributes.h;tox_struct.h"
- key: readability-function-cognitive-complexity.Threshold
value: 153 # TODO(iphydf): Decrease. tox_new is the highest at the moment.

View File

@@ -1,6 +1,6 @@
#!/bin/bash -eu #!/bin/bash -eu
FUZZ_TARGETS="bootstrap_fuzzer toxsave_fuzzer" FUZZ_TARGETS="bootstrap_fuzz_test toxsave_fuzz_test"
# out of tree build # out of tree build
cd "$WORK" cd "$WORK"

View File

@@ -0,0 +1,2 @@
/_build
/_install

View File

@@ -11,10 +11,7 @@ add_ld_flag -Wl,-z,defs
# Make compilation error on a warning # Make compilation error on a warning
add_flag -Werror add_flag -Werror
add_config_flag --with-nacl-libs="$CACHEDIR/lib/amd64"
add_config_flag --with-nacl-headers="$CACHEDIR/include/amd64"
add_config_flag --disable-ipv6 add_config_flag --disable-ipv6
add_config_flag --enable-nacl
add_config_flag --enable-daemon add_config_flag --enable-daemon
add_config_flag --with-log-level=TRACE add_config_flag --with-log-level=TRACE

View File

@@ -0,0 +1,55 @@
#!/bin/bash
# Copyright (C) 2018-2023 nurupo
# Toxcore building
set -eux
cd .. # /work
. cmake-alpine-run.sh
# === Get VM ready to build the code ===
start_vm
RUN apk add cmake g++ ninja
mv c-toxcore /
# Copy over toxcore code from host to qemu
scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -P "$SSH_PORT" -r /c-toxcore root@localhost:~
cd /c-toxcore
. ".github/scripts/flags-gcc.sh"
# Make compilation error on a warning
add_flag -Werror
# - disabling toxav because vpx doesn't work on s390x.
# - disabling bootstrap daemons because we don't need them for testing (saving time).
# - disabling shared libraries because it saves a lot of time on building PIC objects.
# - enable unity build because it saves a lot of time as well (fewer objects to build).
RUN "cmake -B_build -Hc-toxcore -GNinja \
-DCMAKE_C_FLAGS='$C_FLAGS' \
-DCMAKE_CXX_FLAGS='$CXX_FLAGS' \
-DCMAKE_EXE_LINKER_FLAGS='$LD_FLAGS' \
-DCMAKE_SHARED_LINKER_FLAGS='$LD_FLAGS' \
-DCMAKE_INSTALL_PREFIX:PATH='_install' \
-DCMAKE_UNITY_BUILD=ON \
-DMIN_LOGGER_LEVEL=TRACE \
-DNON_HERMETIC_TESTS=ON \
-DENABLE_SHARED=OFF \
-DBUILD_TOXAV=OFF \
-DDHT_BOOTSTRAP=OFF \
-DBOOTSTRAP_DAEMON=OFF \
-DSTRICT_ABI=ON \
-DTEST_TIMEOUT_SECONDS=90 \
-DUSE_IPV6=OFF \
-DAUTOTEST=ON"
RUN 'cmake --build _build --parallel 2 --target install -- -k 0'
RUN 'cd _build && ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:1 --timeout 90 || true' &
# Give the tests 5 minutes to run. Sometimes, the per-test timeout doesn't
# work, so we put a global timeout here for everything.
sleep 300

View File

@@ -0,0 +1,58 @@
#!/bin/bash
# Copyright (C) 2018-2023 nurupo
# Toxcore building
set -eux
cd .. # /work
. cmake-freebsd-run.sh
# === Get VM ready to build the code ===
# Unpack image only if it's compressed.
if [ -f "$IMAGE_NAME.gz" ]; then
gunzip "$IMAGE_NAME.gz"
fi
mv c-toxcore /
start_vm
# Copy over toxcore code from host to qemu
scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -P "$SSH_PORT" -r /c-toxcore root@localhost:~
RUN ls -lh
cd /c-toxcore
. '.github/scripts/flags-clang.sh'
add_ld_flag -Wl,-z,defs
# Make compilation error on a warning.
add_flag -Werror
# This triggers on FreeBSD's clang.
add_flag -Wno-format
add_flag -Wno-unsafe-buffer-usage
RUN "cmake -B_build -Hc-toxcore \
-DCMAKE_C_FLAGS='$C_FLAGS' \
-DCMAKE_CXX_FLAGS='$CXX_FLAGS' \
-DCMAKE_EXE_LINKER_FLAGS='$LD_FLAGS' \
-DCMAKE_SHARED_LINKER_FLAGS='$LD_FLAGS' \
-DCMAKE_INSTALL_PREFIX:PATH='_install' \
-DMIN_LOGGER_LEVEL=TRACE \
-DMUST_BUILD_TOXAV=ON \
-DNON_HERMETIC_TESTS=ON \
-DSTRICT_ABI=ON \
-DTEST_TIMEOUT_SECONDS=120 \
-DUSE_IPV6=OFF \
-DAUTOTEST=ON"
# We created the VM with the same number of cores as the host, so the host-ran `nproc` here is fine.
RUN 'cmake --build _build --parallel "$NPROC" --target install -- -k'
RUN 'cd _build && ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:2 --timeout 120 || true'
# Gracefully shut down the VM.
stop_vm

View File

@@ -1,52 +0,0 @@
#!/bin/bash
# Copyright (C) 2018-2021 nurupo
# Toxcore building
set -eux
if [ "$PWD" != "/work" ]; then
cd ..
mv c-toxcore /
mkdir c-toxcore
cd /work
fi
. cmake-freebsd-run.sh
# === Get VM ready to build the code ===
gunzip "$IMAGE_NAME.gz"
start_vm
# Copy over toxcore code from host to qemu
scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -P "$SSH_PORT" -r /c-toxcore root@localhost:~
RUN ls -lh
cd /c-toxcore
. ".github/scripts/flags-clang.sh"
add_ld_flag -Wl,-z,defs
# Make compilation error on a warning
add_flag -Werror
RUN 'cmake -B_build -Hc-toxcore \
-DCMAKE_C_FLAGS="$C_FLAGS" \
-DCMAKE_CXX_FLAGS="$CXX_FLAGS" \
-DCMAKE_EXE_LINKER_FLAGS="$LD_FLAGS" \
-DCMAKE_SHARED_LINKER_FLAGS="$LD_FLAGS" \
-DCMAKE_INSTALL_PREFIX:PATH="_install" \
-DMIN_LOGGER_LEVEL=TRACE \
-DMUST_BUILD_TOXAV=ON \
-DNON_HERMETIC_TESTS=ON \
-DSTRICT_ABI=ON \
-DTEST_TIMEOUT_SECONDS=90 \
-DUSE_IPV6=OFF \
-DAUTOTEST=ON'
# We created the VM with the same number of cores as the host, so the host-ran `nproc` here is fine
RUN 'gmake "-j$NPROC" -k install -C_build'
RUN 'gmake "-j$NPROC" test ARGS="-j50" -C_build || true'

View File

@@ -1,61 +0,0 @@
#!/bin/bash
set -eu
NPROC=$(nproc)
sudo apt-get install -y --no-install-recommends \
libgtest-dev \
libopus-dev \
libsodium-dev \
libvpx-dev \
llvm-14 \
ninja-build
git clone --depth=1 https://github.com/ralight/mallocfail /tmp/mallocfail
cd /tmp/mallocfail # pushd
make
sudo make install
cd - # popd
export CC=clang
export CXX=clang++
sudo install other/docker/coverage/run_mallocfail /usr/local/bin/run_mallocfail
(cd other/proxy && go get && go build)
other/proxy/proxy &
. ".github/scripts/flags-coverage.sh"
cmake -B_build -H. -GNinja \
-DCMAKE_C_FLAGS="$C_FLAGS" \
-DCMAKE_CXX_FLAGS="$CXX_FLAGS" \
-DCMAKE_EXE_LINKER_FLAGS="$LD_FLAGS" \
-DCMAKE_SHARED_LINKER_FLAGS="$LD_FLAGS" \
-DCMAKE_INSTALL_PREFIX:PATH="$PWD/_install" \
-DENABLE_SHARED=OFF \
-DMIN_LOGGER_LEVEL=TRACE \
-DMUST_BUILD_TOXAV=ON \
-DNON_HERMETIC_TESTS=OFF \
-DSTRICT_ABI=ON \
-DTEST_TIMEOUT_SECONDS=120 \
-DUSE_IPV6=OFF \
-DAUTOTEST=ON \
-DPROXY_TEST=ON
cmake --build _build --parallel "$NPROC" --target install -- -k 0
cd _build # pushd
ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:6 ||
ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:6
export PYTHONUNBUFFERED=1
run_mallocfail --ctest=2 --jobs=8
cd - # popd
#coveralls \
# --exclude auto_tests \
# --exclude other \
# --exclude testing \
# --gcov-options '\-lp'
bash <(curl -s https://codecov.io/bash) -x "llvm-cov-14 gcov"

View File

@@ -65,6 +65,8 @@ add_cxx_flag -Wno-c++98-compat-pedantic
add_cxx_flag -Wno-c99-extensions add_cxx_flag -Wno-c99-extensions
# We're C-compatible, so use C style casts. # We're C-compatible, so use C style casts.
add_cxx_flag -Wno-old-style-cast add_cxx_flag -Wno-old-style-cast
# GTest does this.
add_cxx_flag -Wno-global-constructors
# Downgrade to warning so we still see it. # Downgrade to warning so we still see it.
add_flag -Wno-error=unreachable-code add_flag -Wno-error=unreachable-code

View File

@@ -5,16 +5,16 @@
add_ld_flag -Wl,-z,defs add_ld_flag -Wl,-z,defs
# Make compilation error on a warning # Make compilation error on a warning
add_flag -Werror add_flag -Werror -Wno-unsafe-buffer-usage
# Coverage flags. # Coverage flags.
add_flag --coverage add_flag -fprofile-instr-generate -fcoverage-mapping
# Optimisation, but keep stack traces useful. # Optimisation, but keep stack traces useful.
add_c_flag -fno-inline -fno-omit-frame-pointer add_c_flag -fno-inline -fno-omit-frame-pointer
# Show useful stack traces on crash. # Show useful stack traces on crash.
add_flag -fsanitize=undefined -fno-sanitize-recover=all add_flag -fsanitize=undefined -fno-sanitize-recover=all -D_DEBUG
# In test code (_test.cc and libgtest), throw away all debug information. # In test code (_test.cc and libgtest), throw away all debug information.
# We only care about stack frames inside toxcore (which is C). Without this, # We only care about stack frames inside toxcore (which is C). Without this,

View File

@@ -28,8 +28,6 @@ add_flag -O3 -march=native
# Warn on non-ISO C. # Warn on non-ISO C.
add_c_flag -pedantic add_c_flag -pedantic
add_c_flag -std=c99
add_cxx_flag -std=c++11
add_flag -g3 add_flag -g3
add_flag -ftrapv add_flag -ftrapv

View File

@@ -1,12 +1,15 @@
#!/bin/bash #!/bin/bash
set -exu set -exu -o pipefail
LOCAL="${1:-}" LOCAL="${1:-}"
readarray -t FILES <<<"$(git ls-files)" readarray -t FILES <<<"$(git ls-files)"
tar c "${FILES[@]}" | docker build -f other/bootstrap_daemon/docker/Dockerfile -t toxchat/bootstrap-node - if ! tar c "${FILES[@]}" | docker build -f other/bootstrap_daemon/docker/Dockerfile -t toxchat/bootstrap-node - 2>&1 | tee docker-build.log; then
grep -o "::error.*::[a-f0-9]* /usr/local/bin/tox-bootstrapd" docker-build.log
false
fi
docker tag toxchat/bootstrap-node:latest toxchat/bootstrap-node:"$(other/print-version)" docker tag toxchat/bootstrap-node:latest toxchat/bootstrap-node:"$(other/print-version)"
sudo useradd \ sudo useradd \

View File

@@ -1,70 +0,0 @@
---
_extends: .github
repository:
name: c-toxcore
description: The future of online communications.
homepage: https://tox.chat/
topics: toxcore, network, p2p, security, encryption, cryptography
branches:
- name: "master"
protection:
required_status_checks:
contexts:
- "bazel-asan"
- "bazel-dbg"
- "bazel-opt"
- "bazel-tsan"
- "build-compcert"
- "build-macos"
- "build-nacl"
- "build-tcc"
- "build-win32"
- "build-win64"
- "CodeFactor"
- "common / buildifier"
- "coverage-linux"
- "ci/circleci: asan"
- "ci/circleci: clang-analyze"
- "ci/circleci: clang-tidy"
- "ci/circleci: cpplint"
- "ci/circleci: infer"
- "ci/circleci: msan"
- "ci/circleci: static-analysis"
- "ci/circleci: tsan"
- "ci/circleci: ubsan"
- "cimple"
- "code-review/reviewable"
- "continuous-integration/appveyor/pr"
- "docker-bootstrap-node"
- "docker-bootstrap-node-websocket"
- "docker-toxcore-js"
- "mypy"
- "sonar-scan"
# Labels specific to c-toxcore.
labels:
- name: "bootstrap"
color: "#01707f"
description: "Bootstrap"
- name: "crypto"
color: "#1d76db"
description: "Crypto"
- name: "file transfers"
color: "#e02abf"
description: "File Transfers"
- name: "messenger"
color: "#d93f0b"
description: "Messenger"
- name: "network"
color: "#d4c5f9"
description: "Network"
- name: "toxav"
color: "#0052cc"
description: "Audio/video"

View File

@@ -13,14 +13,115 @@ jobs:
common: common:
uses: TokTok/ci-tools/.github/workflows/common-ci.yml@master uses: TokTok/ci-tools/.github/workflows/common-ci.yml@master
analysis:
strategy:
matrix:
tool: [autotools, clang-tidy, compcert, cppcheck, doxygen, infer, misra, tcc, tokstyle]
runs-on: ubuntu-latest
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker Build
uses: docker/build-push-action@v4
with:
file: other/docker/${{ matrix.tool }}/Dockerfile
coverage-linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Build, test, and upload coverage
run: other/docker/coverage/run
generate-events:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Run generate_event_c
run: |
other/event_tooling/run
git diff --exit-code
cimplefmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Run cimplefmt
run: other/docker/cimplefmt/run -u $(find tox* -name "*.[ch]")
build-android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- run: .github/scripts/cmake-android armeabi-v7a
- run: .github/scripts/cmake-android arm64-v8a
- run: .github/scripts/cmake-android x86
- run: .github/scripts/cmake-android x86_64
build-macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Build and test
run: .github/scripts/cmake-osx
build-msvc:
strategy:
matrix:
version: [2019, 2022]
runs-on: windows-${{ matrix.version }}
env:
VCPKG_ROOT: "C:/vcpkg"
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Export GitHub Actions cache environment variables
uses: actions/github-script@v6
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
- name: Configure CMake
run: cmake --preset windows-default
- name: Build
run: cmake --build _build
- name: Test
run: |
cd _build
ctest -j50 --output-on-failure --rerun-failed --repeat until-pass:6 --build-config Debug
build-windows:
strategy:
matrix:
bits: [32, 64]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Cross compilation
run: .github/scripts/cmake-win${{ matrix.bits }} script
mypy: mypy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
with: with:
submodules: recursive submodules: recursive
- name: Set up Python 3.9 - name: Set up Python 3.9
uses: actions/setup-python@v1 uses: actions/setup-python@v5
with: with:
python-version: 3.9 python-version: 3.9
- name: Install mypy - name: Install mypy
@@ -29,184 +130,3 @@ jobs:
run: | run: |
(find . -name "*.py" -and -not -name "conanfile.py"; grep -lR '^#!.*python') \ (find . -name "*.py" -and -not -name "conanfile.py"; grep -lR '^#!.*python') \
| xargs -n1 -P8 mypy --strict | xargs -n1 -P8 mypy --strict
doxygen:
runs-on: ubuntu-latest
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Docker Build
uses: docker/build-push-action@v2
with:
file: other/docker/doxygen/Dockerfile
tokstyle:
runs-on: ubuntu-latest
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Docker Build
uses: docker/build-push-action@v2
with:
file: other/docker/tokstyle/Dockerfile
misra:
runs-on: ubuntu-latest
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Docker Build
uses: docker/build-push-action@v2
with:
file: other/docker/misra/Dockerfile
cimplefmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Run cimplefmt
run: other/docker/cimplefmt/run -u $(find tox* -name "*.[ch]")
build-nacl:
runs-on: ubuntu-latest
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Docker Build
uses: docker/build-push-action@v2
with:
file: other/docker/autotools/Dockerfile
build-win32:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Cross compilation
run: .github/scripts/cmake-win32 script
build-win64:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Cross compilation
run: .github/scripts/cmake-win64 script
build-freebsd:
runs-on: ubuntu-latest
container: toxchat/freebsd
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Build on FreeBSD
run: .github/scripts/cmake-freebsd-stage2
build-macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Build and test
run: .github/scripts/cmake-osx
coverage-linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Build, test, and upload coverage
run: .github/scripts/coverage-linux
build-tcc:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Install dependencies
run:
sudo apt-get install -y --no-install-recommends
tcc
libconfig-dev
libopus-dev
libsodium-dev
libvpx-dev
- name: Build with TCC
run:
tcc
-Dinline=static
-o send_message_test
-Wall -Werror
-bench -g
auto_tests/auto_test_support.c
auto_tests/send_message_test.c
testing/misc_tools.c
toxav/*.c
toxcore/*.c
toxcore/*/*.c
toxencryptsave/*.c
third_party/cmp/*.c
$(pkg-config --cflags --libs libsodium opus vpx)
- name: Run the test
run: "./send_message_test | grep 'tox clients connected'"
- name: Build amalgamation file with TCC
run:
other/make_single_file
auto_tests/auto_test_support.c
auto_tests/send_message_test.c
testing/misc_tools.c |
tcc -
-o send_message_test
-Wall -Werror
-bench -g
$(pkg-config --cflags --libs libsodium opus vpx)
- name: Run the test again
run: "./send_message_test | grep 'tox clients connected'"
build-compcert:
runs-on: ubuntu-latest
container: toxchat/compcert
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Build with CompCert
run:
ccomp
-o send_message_test
-Wall -Werror
-Wno-c11-extensions
-Wno-unknown-pragmas
-Wno-unused-variable
-fstruct-passing -fno-unprototyped -g
auto_tests/auto_test_support.c
auto_tests/send_message_test.c
testing/misc_tools.c
toxav/*.c
toxcore/*.c
toxcore/*/*.c
toxencryptsave/*.c
third_party/cmp/*.c
-D__COMPCERT__ -DDISABLE_VLA -Dinline=
-lpthread $(pkg-config --cflags --libs libsodium opus vpx)
- name: Run the test
run: "./send_message_test | grep 'tox clients connected'"
build-android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- run: .github/scripts/cmake-android armeabi-v7a
- run: .github/scripts/cmake-android arm64-v8a
- run: .github/scripts/cmake-android x86
- run: .github/scripts/cmake-android x86_64

View File

@@ -6,17 +6,22 @@ on:
pull_request: pull_request:
branches: [master] branches: [master]
# Cancel old PR builds when pushing new commits.
concurrency:
group: docker-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs: jobs:
docker-bootstrap-node: docker-bootstrap-node:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Login to DockerHub - name: Login to DockerHub
if: ${{ github.event_name == 'push' }} if: ${{ github.event_name == 'push' }}
uses: docker/login-action@v1 uses: docker/login-action@v3
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- uses: actions/checkout@v2 - uses: actions/checkout@v4
with: with:
submodules: recursive submodules: recursive
- name: Docker Build - name: Docker Build
@@ -33,15 +38,15 @@ jobs:
needs: [docker-bootstrap-node] needs: [docker-bootstrap-node]
steps: steps:
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1 uses: docker/setup-buildx-action@v3
- name: Login to DockerHub - name: Login to DockerHub
if: ${{ github.event_name == 'push' }} if: ${{ github.event_name == 'push' }}
uses: docker/login-action@v1 uses: docker/login-action@v3
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push - name: Build and push
uses: docker/build-push-action@v2 uses: docker/build-push-action@v4
with: with:
context: "{{defaultContext}}:other/bootstrap_daemon/websocket" context: "{{defaultContext}}:other/bootstrap_daemon/websocket"
push: ${{ github.event_name == 'push' }} push: ${{ github.event_name == 'push' }}
@@ -52,17 +57,17 @@ jobs:
docker-clusterfuzz: docker-clusterfuzz:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1 uses: docker/setup-buildx-action@v3
- name: Login to DockerHub - name: Login to DockerHub
if: ${{ github.event_name == 'push' }} if: ${{ github.event_name == 'push' }}
uses: docker/login-action@v1 uses: docker/login-action@v3
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push - name: Build and push
uses: docker/build-push-action@v2 uses: docker/build-push-action@v4
with: with:
context: "." context: "."
file: .clusterfuzzlite/Dockerfile file: .clusterfuzzlite/Dockerfile
@@ -75,15 +80,15 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1 uses: docker/setup-buildx-action@v3
- name: Login to DockerHub - name: Login to DockerHub
if: ${{ github.event_name == 'push' }} if: ${{ github.event_name == 'push' }}
uses: docker/login-action@v1 uses: docker/login-action@v3
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push - name: Build and push
uses: docker/build-push-action@v2 uses: docker/build-push-action@v4
with: with:
file: testing/Dockerfile file: testing/Dockerfile
push: ${{ github.event_name == 'push' }} push: ${{ github.event_name == 'push' }}
@@ -95,15 +100,15 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1 uses: docker/setup-buildx-action@v3
- name: Login to DockerHub - name: Login to DockerHub
if: ${{ github.event_name == 'push' }} if: ${{ github.event_name == 'push' }}
uses: docker/login-action@v1 uses: docker/login-action@v3
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push - name: Build and push
uses: docker/build-push-action@v2 uses: docker/build-push-action@v4
with: with:
file: other/emscripten/Dockerfile file: other/emscripten/Dockerfile
push: ${{ github.event_name == 'push' }} push: ${{ github.event_name == 'push' }}
@@ -115,22 +120,22 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1 uses: docker/setup-buildx-action@v3
with: with:
driver: docker driver: docker
- name: Login to DockerHub - name: Login to DockerHub
if: ${{ github.event_name == 'push' }} if: ${{ github.event_name == 'push' }}
uses: docker/login-action@v1 uses: docker/login-action@v3
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build toxchat/c-toxcore:sources - name: Build toxchat/c-toxcore:sources
uses: docker/build-push-action@v2 uses: docker/build-push-action@v4
with: with:
file: other/docker/sources/Dockerfile file: other/docker/sources/Dockerfile
tags: toxchat/c-toxcore:sources tags: toxchat/c-toxcore:sources
- name: Build and push - name: Build and push
uses: docker/build-push-action@v2 uses: docker/build-push-action@v4
with: with:
file: other/docker/esp32/Dockerfile file: other/docker/esp32/Dockerfile
push: ${{ github.event_name == 'push' }} push: ${{ github.event_name == 'push' }}
@@ -142,15 +147,15 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1 uses: docker/setup-buildx-action@v3
- name: Login to DockerHub - name: Login to DockerHub
if: ${{ github.event_name == 'push' }} if: ${{ github.event_name == 'push' }}
uses: docker/login-action@v1 uses: docker/login-action@v3
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push - name: Build and push
uses: docker/build-push-action@v2 uses: docker/build-push-action@v4
with: with:
context: "{{defaultContext}}:other/docker/windows" context: "{{defaultContext}}:other/docker/windows"
push: ${{ github.event_name == 'push' }} push: ${{ github.event_name == 'push' }}
@@ -166,15 +171,15 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1 uses: docker/setup-buildx-action@v3
- name: Login to DockerHub - name: Login to DockerHub
if: ${{ github.event_name == 'push' }} if: ${{ github.event_name == 'push' }}
uses: docker/login-action@v1 uses: docker/login-action@v3
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push - name: Build and push
uses: docker/build-push-action@v2 uses: docker/build-push-action@v4
with: with:
context: "{{defaultContext}}:other/docker/windows" context: "{{defaultContext}}:other/docker/windows"
push: ${{ github.event_name == 'push' }} push: ${{ github.event_name == 'push' }}

View File

@@ -0,0 +1,43 @@
name: post-submit
on:
push:
branches: [master]
jobs:
build-alpine-s390x:
runs-on: ubuntu-latest
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker Build
uses: docker/build-push-action@v4
with:
file: other/docker/alpine-s390x/Dockerfile
docker-coverage:
runs-on: ubuntu-latest
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
driver: docker
- name: Login to DockerHub
if: ${{ github.event_name == 'push' }}
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build toxchat/c-toxcore:sources
uses: docker/build-push-action@v4
with:
file: other/docker/sources/Dockerfile
tags: toxchat/c-toxcore:sources
- name: Build and push
uses: docker/build-push-action@v4
with:
file: other/docker/coverage/Dockerfile
push: ${{ github.event_name == 'push' }}
tags: toxchat/c-toxcore:coverage
cache-from: type=registry,ref=toxchat/c-toxcore:coverage
cache-to: type=inline

View File

@@ -6,22 +6,28 @@ on:
pull_request: pull_request:
branches: [master] branches: [master]
# Cancel old PR builds when pushing new commits.
concurrency:
group: scan-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs: jobs:
sonar-scan: sonar-scan:
runs-on: ubuntu-latest runs-on: ubuntu-latest
env: env:
SONAR_SCANNER_VERSION: 4.4.0.2170 SONAR_SCANNER_VERSION: 5.0.1.3006
SONAR_SERVER_URL: "https://sonarcloud.io" SONAR_SERVER_URL: "https://sonarcloud.io"
BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
with: with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
submodules: recursive submodules: recursive
- name: Set up JDK 11 - name: Set up JDK 17
uses: actions/setup-java@v1 uses: actions/setup-java@v2
with: with:
java-version: 11 distribution: "zulu"
java-version: 17
- name: Download and set up sonar-scanner - name: Download and set up sonar-scanner
env: env:
SONAR_SCANNER_DOWNLOAD_URL: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${{ env.SONAR_SCANNER_VERSION }}-linux.zip SONAR_SCANNER_DOWNLOAD_URL: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${{ env.SONAR_SCANNER_VERSION }}-linux.zip

View File

@@ -14,6 +14,8 @@ Thumbs.db
/_build /_build
/_install /_install
/tox-0.0.0* /tox-0.0.0*
/.vs
/CppProperties.json
CMakeCache.txt CMakeCache.txt
CMakeFiles CMakeFiles
Makefile Makefile
@@ -91,4 +93,5 @@ cscope.files
# rpm # rpm
tox.spec tox.spec
/infer
.idea/ .idea/

View File

@@ -1,25 +1,26 @@
load("@rules_cc//cc:defs.bzl", "cc_library") load("@rules_cc//cc:defs.bzl", "cc_library")
load("//tools/project:build_defs.bzl", "project") load("//tools/project:build_defs.bzl", "project")
package(features = ["layering_check"]) project(license = "gpl3-https")
project()
genrule( genrule(
name = "public_headers", name = "public_headers",
srcs = [ srcs = [
"//c-toxcore/toxav:toxav.h", "//c-toxcore/toxav:toxav.h",
"//c-toxcore/toxcore:tox.h", "//c-toxcore/toxcore:tox.h",
"//c-toxcore/toxcore:tox_private.h",
"//c-toxcore/toxencryptsave:toxencryptsave.h", "//c-toxcore/toxencryptsave:toxencryptsave.h",
], ],
outs = [ outs = [
"tox/toxav.h", "tox/toxav.h",
"tox/tox.h", "tox/tox.h",
"tox/tox_private.h",
"tox/toxencryptsave.h", "tox/toxencryptsave.h",
], ],
cmd = """ cmd = """
cp $(location //c-toxcore/toxav:toxav.h) $(GENDIR)/c-toxcore/tox/toxav.h cp $(location //c-toxcore/toxav:toxav.h) $(GENDIR)/c-toxcore/tox/toxav.h
cp $(location //c-toxcore/toxcore:tox.h) $(GENDIR)/c-toxcore/tox/tox.h cp $(location //c-toxcore/toxcore:tox.h) $(GENDIR)/c-toxcore/tox/tox.h
cp $(location //c-toxcore/toxcore:tox_private.h) $(GENDIR)/c-toxcore/tox/tox_private.h
cp $(location //c-toxcore/toxencryptsave:toxencryptsave.h) $(GENDIR)/c-toxcore/tox/toxencryptsave.h cp $(location //c-toxcore/toxencryptsave:toxencryptsave.h) $(GENDIR)/c-toxcore/tox/toxencryptsave.h
""", """,
visibility = ["//visibility:public"], visibility = ["//visibility:public"],

View File

@@ -14,8 +14,8 @@
# #
################################################################################ ################################################################################
cmake_minimum_required(VERSION 2.8.12) cmake_minimum_required(VERSION 3.16)
cmake_policy(VERSION 2.8.12) cmake_policy(VERSION 3.16)
project(toxcore) project(toxcore)
list(APPEND CMAKE_MODULE_PATH ${toxcore_SOURCE_DIR}/cmake) list(APPEND CMAKE_MODULE_PATH ${toxcore_SOURCE_DIR}/cmake)
@@ -76,23 +76,51 @@ if(APPLE)
endif() endif()
enable_testing() enable_testing()
find_package(GTest)
set(CMAKE_MACOSX_RPATH ON) set(CMAKE_MACOSX_RPATH ON)
if(${CMAKE_VERSION} VERSION_LESS "3.1.0") # Set standard version for compiler.
if(NOT MSVC) if(MSVC AND MSVC_TOOLSET_VERSION LESS 143)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") # https://developercommunity.visualstudio.com/t/older-winsdk-headers-are-incompatible-with-zcprepr/1593479
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
endif()
else()
# Set standard version for compiler.
set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 17) else()
set(CMAKE_C_EXTENSIONS OFF) set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF) endif()
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_CXX_EXTENSIONS OFF)
message(STATUS "Supported C compiler features = ${CMAKE_C_COMPILE_FEATURES}") message(STATUS "Supported C compiler features = ${CMAKE_C_COMPILE_FEATURES}")
message(STATUS "Supported C++ compiler features = ${CMAKE_CXX_COMPILE_FEATURES}") message(STATUS "Supported C++ compiler features = ${CMAKE_CXX_COMPILE_FEATURES}")
# Enable some warnings if we know the compiler.
if(MSVC)
add_compile_options(/W4 /analyze)
add_compile_options(/wd4100) # unreferenced formal parameter
add_compile_options(/wd4267) # narrowing conversion
add_compile_options(/wd4244) # narrowing conversion
add_compile_options(/wd4127) # conditional expression is constant
add_compile_options(/wd4995) # #pragma deprecated
add_compile_options(/wd4018) # signed/unsigned compare
add_compile_options(/wd4310) # cast truncates constant value
add_compile_options(/wd4389) # signed/unsigned compare
add_compile_options(/wd4245) # signed/unsigned assign/return/function call
add_compile_options(/wd4200) # nonstandard extension used: zero-sized array in struct/union
add_compile_options(/wd4702) # unreachable code
add_compile_options(/wd6340) # unsigned int passed to signed parameter
add_compile_options(/wd6326) # potential comparison of a constant with another constant
# TODO(iphydf): Look into these
add_compile_options(/wd4996) # use WSAAddressToStringW() instead of WSAAddressToStringA()
add_compile_options(/wd6255) # don't use alloca
add_compile_options(/wd6385) # reading invalid data
add_compile_options(/wd6001) # using uninitialized memory
add_compile_options(/wd6101) # returning uninitialized memory
add_compile_options(/wd6386) # buffer overrun
add_compile_options(/wd6011) # NULL dereference
add_compile_options(/wd6031) # sscanf return value ignored
add_compile_options(/wd6387) # passing NULL to fwrite
endif() endif()
set(MIN_LOGGER_LEVEL "" CACHE STRING "Logging level to use (TRACE, DEBUG, INFO, WARNING, ERROR)") set(MIN_LOGGER_LEVEL "" CACHE STRING "Logging level to use (TRACE, DEBUG, INFO, WARNING, ERROR)")
@@ -113,16 +141,11 @@ if(NOT USE_IPV6)
add_definitions(-DUSE_IPV6=0) add_definitions(-DUSE_IPV6=0)
endif() endif()
option(USE_TEST_NETWORK "Use a separate test network with different packet IDs" OFF)
if(USE_TEST_NETWORK)
add_definitions(-DUSE_TEST_NETWORK=1)
endif()
option(BUILD_MISC_TESTS "Build additional tests and utilities" OFF) option(BUILD_MISC_TESTS "Build additional tests and utilities" OFF)
option(BUILD_FUN_UTILS "Build additional just for fun utilities" OFF) option(BUILD_FUN_UTILS "Build additional just for fun utilities" OFF)
option(AUTOTEST "Enable autotests (mainly for CI)" OFF) option(AUTOTEST "Enable autotests (mainly for CI)" OFF)
if (AUTOTEST) if(AUTOTEST)
option(NON_HERMETIC_TESTS "Whether to build and run tests that depend on an internet connection" OFF) option(NON_HERMETIC_TESTS "Whether to build and run tests that depend on an internet connection" OFF)
option(PROXY_TEST "Enable proxy test (needs HTTP/SOCKS5 proxy on port 8080/8081)" OFF) option(PROXY_TEST "Enable proxy test (needs HTTP/SOCKS5 proxy on port 8080/8081)" OFF)
endif() endif()
@@ -137,21 +160,7 @@ if(BOOTSTRAP_DAEMON AND WIN32)
set(BOOTSTRAP_DAEMON OFF) set(BOOTSTRAP_DAEMON OFF)
endif() endif()
# Enabling this breaks all other tests and no network connections will be possible
option(BUILD_FUZZ_TESTS "Build fuzzing harnesses" OFF) option(BUILD_FUZZ_TESTS "Build fuzzing harnesses" OFF)
if(BUILD_FUZZ_TESTS)
message(STATUS "Building in fuzz testing mode, no network connection will be possible")
# Disable everything we can
set(AUTOTEST OFF)
set(BUILD_MISC_TESTS OFF)
set(BUILD_FUN_UTILS OFF)
set(ENABLE_SHARED OFF)
set(MUST_BUILD_TOXAV OFF)
set(BUILD_TOXAV OFF)
set(BOOTSTRAP_DAEMON OFF)
set(DHT_BOOTSTRAP OFF)
endif()
if(MSVC) if(MSVC)
option(MSVC_STATIC_SODIUM "Whether to link libsodium statically for MSVC" OFF) option(MSVC_STATIC_SODIUM "Whether to link libsodium statically for MSVC" OFF)
@@ -322,6 +331,8 @@ set(toxcore_SOURCES
toxcore/tox.c toxcore/tox.c
toxcore/tox_dispatch.c toxcore/tox_dispatch.c
toxcore/tox_dispatch.h toxcore/tox_dispatch.h
toxcore/tox_event.c
toxcore/tox_event.h
toxcore/tox_events.c toxcore/tox_events.c
toxcore/tox_events.h toxcore/tox_events.h
toxcore/tox.h toxcore/tox.h
@@ -331,12 +342,20 @@ set(toxcore_SOURCES
toxcore/tox_unpack.h toxcore/tox_unpack.h
toxcore/util.c toxcore/util.c
toxcore/util.h) toxcore/util.h)
set(toxcore_LINK_MODULES ${toxcore_LINK_MODULES} ${LIBSODIUM_LIBRARIES}) if(TARGET unofficial-sodium::sodium)
set(toxcore_LINK_LIBRARIES ${toxcore_LINK_LIBRARIES} unofficial-sodium::sodium)
else()
set(toxcore_LINK_LIBRARIES ${toxcore_LINK_LIBRARIES} ${LIBSODIUM_LIBRARIES})
set(toxcore_LINK_DIRECTORIES ${toxcore_LINK_DIRECTORIES} ${LIBSODIUM_LIBRARY_DIRS})
set(toxcore_INCLUDE_DIRECTORIES ${toxcore_INCLUDE_DIRECTORIES} ${LIBSODIUM_INCLUDE_DIRS})
set(toxcore_COMPILE_OPTIONS ${toxcore_COMPILE_OPTIONS} ${LIBSODIUM_CFLAGS_OTHER})
endif()
set(toxcore_PKGCONFIG_REQUIRES ${toxcore_PKGCONFIG_REQUIRES} libsodium) set(toxcore_PKGCONFIG_REQUIRES ${toxcore_PKGCONFIG_REQUIRES} libsodium)
set(toxcore_API_HEADERS set(toxcore_API_HEADERS
${toxcore_SOURCE_DIR}/toxcore/tox.h^tox ${toxcore_SOURCE_DIR}/toxcore/tox.h^tox
${toxcore_SOURCE_DIR}/toxcore/tox_events.h^tox ${toxcore_SOURCE_DIR}/toxcore/tox_events.h^tox
${toxcore_SOURCE_DIR}/toxcore/tox_dispatch.h^tox) ${toxcore_SOURCE_DIR}/toxcore/tox_dispatch.h^tox
${toxcore_SOURCE_DIR}/toxcore/tox_private.h^tox)
################################################################################ ################################################################################
# #
@@ -366,7 +385,14 @@ if(BUILD_TOXAV)
set(toxcore_API_HEADERS ${toxcore_API_HEADERS} set(toxcore_API_HEADERS ${toxcore_API_HEADERS}
${toxcore_SOURCE_DIR}/toxav/toxav.h^toxav) ${toxcore_SOURCE_DIR}/toxav/toxav.h^toxav)
set(toxcore_LINK_MODULES ${toxcore_LINK_MODULES} ${OPUS_LIBRARIES} ${VPX_LIBRARIES}) if(MSVC)
set(toxcore_LINK_LIBRARIES ${toxcore_LINK_LIBRARIES} PkgConfig::OPUS PkgConfig::VPX)
else()
set(toxcore_LINK_LIBRARIES ${toxcore_LINK_LIBRARIES} ${OPUS_LIBRARIES} ${VPX_LIBRARIES})
set(toxcore_LINK_DIRECTORIES ${toxcore_LINK_DIRECTORIES} ${OPUS_LIBRARY_DIRS} ${VPX_LIBRARY_DIRS})
set(toxcore_INCLUDE_DIRECTORIES ${toxcore_INCLUDE_DIRECTORIES} ${OPUS_INCLUDE_DIRS} ${VPX_INCLUDE_DIRS})
set(toxcore_COMPILE_OPTIONS ${toxcore_COMPILE_OPTIONS} ${OPUS_CFLAGS_OTHER} ${VPX_CFLAGS_OTHER})
endif()
set(toxcore_PKGCONFIG_REQUIRES ${toxcore_PKGCONFIG_REQUIRES} opus vpx) set(toxcore_PKGCONFIG_REQUIRES ${toxcore_PKGCONFIG_REQUIRES} opus vpx)
endif() endif()
@@ -393,29 +419,32 @@ set(toxcore_API_HEADERS ${toxcore_API_HEADERS}
# any potential libvpx linking. # any potential libvpx linking.
message("CMAKE_THREAD_LIBS_INIT: ${CMAKE_THREAD_LIBS_INIT}") message("CMAKE_THREAD_LIBS_INIT: ${CMAKE_THREAD_LIBS_INIT}")
if(CMAKE_THREAD_LIBS_INIT) if(CMAKE_THREAD_LIBS_INIT)
set(toxcore_LINK_MODULES ${toxcore_LINK_MODULES} ${CMAKE_THREAD_LIBS_INIT}) set(toxcore_LINK_LIBRARIES ${toxcore_LINK_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} ${CMAKE_THREAD_LIBS_INIT}) set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} ${CMAKE_THREAD_LIBS_INIT})
endif() endif()
if(NSL_LIBRARIES) if(NSL_LIBRARIES)
set(toxcore_LINK_MODULES ${toxcore_LINK_MODULES} ${NSL_LIBRARIES}) set(toxcore_LINK_LIBRARIES ${toxcore_LINK_LIBRARIES} ${NSL_LIBRARIES})
set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} -lnsl) set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} -lnsl)
endif() endif()
if(RT_LIBRARIES) if(RT_LIBRARIES)
set(toxcore_LINK_MODULES ${toxcore_LINK_MODULES} ${RT_LIBRARIES}) set(toxcore_LINK_LIBRARIES ${toxcore_LINK_LIBRARIES} ${RT_LIBRARIES})
set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} -lrt) set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} -lrt)
endif() endif()
if(SOCKET_LIBRARIES) if(SOCKET_LIBRARIES)
set(toxcore_LINK_MODULES ${toxcore_LINK_MODULES} ${SOCKET_LIBRARIES}) set(toxcore_LINK_LIBRARIES ${toxcore_LINK_LIBRARIES} ${SOCKET_LIBRARIES})
set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} -lsocket) set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} -lsocket)
endif() endif()
if(TARGET PThreads4W::PThreads4W)
set(toxcore_LINK_LIBRARIES ${toxcore_LINK_LIBRARIES} PThreads4W::PThreads4W)
elseif(TARGET Threads::Threads)
set(toxcore_LINK_LIBRARIES ${toxcore_LINK_LIBRARIES} Threads::Threads)
endif()
if(WIN32) if(WIN32)
set(toxcore_LINK_MODULES ${toxcore_LINK_MODULES} ws2_32 iphlpapi) set(toxcore_LINK_LIBRARIES ${toxcore_LINK_LIBRARIES} iphlpapi wsock32 ws2_32)
set(toxcore_PKGCONFIG_LIBS ${toxcore_PKGCONFIG_LIBS} -lws2_32 -liphlpapi)
endif() endif()
################################################################################ ################################################################################
@@ -425,10 +454,34 @@ endif()
################################################################################ ################################################################################
# Create combined library from all the sources. # Create combined library from all the sources.
add_module(toxcore ${toxcore_SOURCES}) if(ENABLE_SHARED)
add_library(toxcore_shared SHARED ${toxcore_SOURCES})
set_target_properties(toxcore_shared PROPERTIES OUTPUT_NAME toxcore)
target_link_libraries(toxcore_shared PRIVATE ${toxcore_LINK_LIBRARIES})
target_link_directories(toxcore_shared PUBLIC ${toxcore_LINK_DIRECTORIES})
target_include_directories(toxcore_shared SYSTEM PRIVATE ${toxcore_INCLUDE_DIRECTORIES})
target_compile_options(toxcore_shared PRIVATE ${toxcore_COMPILE_OPTIONS})
endif()
# Link it to all dependencies. if(ENABLE_STATIC)
target_link_modules(toxcore ${toxcore_LINK_MODULES}) add_library(toxcore_static STATIC ${toxcore_SOURCES})
if(NOT MSVC)
set_target_properties(toxcore_static PROPERTIES OUTPUT_NAME toxcore)
endif()
target_link_libraries(toxcore_static PRIVATE ${toxcore_LINK_LIBRARIES})
target_link_directories(toxcore_static PUBLIC ${toxcore_LINK_DIRECTORIES})
target_include_directories(toxcore_static SYSTEM PRIVATE ${toxcore_INCLUDE_DIRECTORIES})
target_compile_options(toxcore_static PRIVATE ${toxcore_COMPILE_OPTIONS})
endif()
if(BUILD_FUZZ_TESTS)
add_library(toxcore_fuzz STATIC ${toxcore_SOURCES})
target_link_libraries(toxcore_fuzz PRIVATE ${toxcore_LINK_LIBRARIES})
target_link_directories(toxcore_fuzz PUBLIC ${toxcore_LINK_DIRECTORIES})
target_include_directories(toxcore_fuzz SYSTEM PRIVATE ${toxcore_INCLUDE_DIRECTORIES})
target_compile_options(toxcore_fuzz PRIVATE ${toxcore_COMPILE_OPTIONS})
target_compile_definitions(toxcore_fuzz PUBLIC "FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION")
endif()
# Make version script (on systems that support it) to limit symbol visibility. # Make version script (on systems that support it) to limit symbol visibility.
make_version_script(toxcore ${toxcore_API_HEADERS}) make_version_script(toxcore ${toxcore_API_HEADERS})
@@ -443,22 +496,50 @@ install_module(toxcore DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tox)
# #
################################################################################ ################################################################################
include(CompileGTest) add_library(test_util STATIC
toxcore/DHT_test_util.cc
toxcore/DHT_test_util.hh
toxcore/crypto_core_test_util.cc
toxcore/crypto_core_test_util.hh
toxcore/mem_test_util.cc
toxcore/mem_test_util.hh
toxcore/network_test_util.cc
toxcore/network_test_util.hh
toxcore/test_util.cc
toxcore/test_util.hh)
function(unit_test subdir target)
add_executable(unit_${target}_test ${subdir}/${target}_test.cc)
target_link_libraries(unit_${target}_test PRIVATE test_util)
if(TARGET toxcore_static)
target_link_libraries(unit_${target}_test PRIVATE toxcore_static)
else()
target_link_libraries(unit_${target}_test PRIVATE toxcore_shared)
endif()
target_link_libraries(unit_${target}_test PRIVATE GTest::gtest GTest::gtest_main GTest::gmock)
set_target_properties(unit_${target}_test PROPERTIES COMPILE_FLAGS "${TEST_CXX_FLAGS}")
add_test(NAME ${target} COMMAND ${CROSSCOMPILING_EMULATOR} unit_${target}_test)
set_property(TEST ${target} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${target}.profraw")
endfunction()
# The actual unit tests follow. # The actual unit tests follow.
# #
unit_test(toxav ring_buffer) if(GTEST_FOUND)
unit_test(toxav rtp) unit_test(toxav ring_buffer)
unit_test(toxcore DHT) unit_test(toxav rtp)
unit_test(toxcore bin_pack) unit_test(toxcore DHT)
unit_test(toxcore crypto_core) unit_test(toxcore bin_pack)
unit_test(toxcore group_announce) unit_test(toxcore crypto_core)
unit_test(toxcore group_moderation) unit_test(toxcore group_announce)
unit_test(toxcore mem) unit_test(toxcore group_moderation)
unit_test(toxcore mono_time) unit_test(toxcore list)
unit_test(toxcore ping_array) unit_test(toxcore mem)
unit_test(toxcore tox) unit_test(toxcore mono_time)
unit_test(toxcore util) unit_test(toxcore ping_array)
unit_test(toxcore test_util)
unit_test(toxcore tox)
unit_test(toxcore util)
endif()
add_subdirectory(testing) add_subdirectory(testing)
@@ -482,7 +563,20 @@ if(DHT_BOOTSTRAP)
add_executable(DHT_bootstrap add_executable(DHT_bootstrap
other/DHT_bootstrap.c other/DHT_bootstrap.c
other/bootstrap_node_packets.c) other/bootstrap_node_packets.c)
target_link_modules(DHT_bootstrap toxcore misc_tools) if(TARGET toxcore_static)
target_link_libraries(DHT_bootstrap PRIVATE toxcore_static)
else()
target_link_libraries(DHT_bootstrap PRIVATE toxcore_shared)
endif()
target_link_libraries(DHT_bootstrap PRIVATE misc_tools)
if(TARGET unofficial-sodium::sodium)
target_link_libraries(DHT_bootstrap PRIVATE unofficial-sodium::sodium)
endif()
if(TARGET PThreads4W::PThreads4W)
target_link_libraries(DHT_bootstrap PRIVATE PThreads4W::PThreads4W)
elseif(TARGET Threads::Threads)
target_link_libraries(DHT_bootstrap PRIVATE Threads::Threads)
endif()
install(TARGETS DHT_bootstrap RUNTIME DESTINATION bin) install(TARGETS DHT_bootstrap RUNTIME DESTINATION bin)
endif() endif()

View File

@@ -0,0 +1,21 @@
{
"version": 3,
"configurePresets": [
{
"name": "windows-default",
"binaryDir": "${sourceDir}/_build",
"cacheVariables": {
"ENABLE_SHARED": true,
"ENABLE_STATIC": true,
"AUTOTEST": true,
"BUILD_MISC_TESTS": true,
"BOOTSTRAP_DAEMON": false,
"MUST_BUILD_TOXAV": true,
"TEST_TIMEOUT_SECONDS": "60",
"CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS": true,
"CMAKE_COMPILE_WARNING_AS_ERROR": true,
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
}
}
]
}

View File

@@ -32,14 +32,14 @@ These instructions will guide you through the process of building and installing
This repository, although called `toxcore`, in fact contains several libraries besides `toxcore` which complement it, as well as several executables. However, note that although these are separate libraries, at the moment, when building the libraries, they are all merged into a single `toxcore` library. Here is the full list of the main components that can be built using the CMake, their dependencies and descriptions. This repository, although called `toxcore`, in fact contains several libraries besides `toxcore` which complement it, as well as several executables. However, note that although these are separate libraries, at the moment, when building the libraries, they are all merged into a single `toxcore` library. Here is the full list of the main components that can be built using the CMake, their dependencies and descriptions.
| Name | Type | Dependencies | Platform | Description | | Name | Type | Dependencies | Platform | Description |
|------------------|------------|-----------------------------------------------|----------------|----------------------------------------------------------------------------| |------------------|------------|------------------------------------|----------------|----------------------------------------------------------------------------|
| `toxcore` | Library | libnacl or libsodium, libm, libpthread, librt | Cross-platform | The main Tox library that provides the messenger functionality. | | `toxcore` | Library | libsodium, libm, libpthread, librt | Cross-platform | The main Tox library that provides the messenger functionality. |
| `toxav` | Library | libtoxcore, libopus, libvpx | Cross-platform | Provides audio/video functionality. | | `toxav` | Library | libtoxcore, libopus, libvpx | Cross-platform | Provides audio/video functionality. |
| `toxencryptsave` | Library | libtoxcore, libnacl or libsodium | Cross-platform | Provides encryption of Tox profiles (savedata), as well as arbitrary data. | | `toxencryptsave` | Library | libtoxcore, libsodium | Cross-platform | Provides encryption of Tox profiles (savedata), as well as arbitrary data. |
| `DHT_bootstrap` | Executable | libtoxcore | Cross-platform | A simple DHT bootstrap node. | | `DHT_bootstrap` | Executable | libtoxcore | Cross-platform | A simple DHT bootstrap node. |
| `tox-bootstrapd` | Executable | libtoxcore, libconfig | Unix-like | Highly configurable DHT bootstrap node daemon (systemd, SysVinit, Docker). | | `tox-bootstrapd` | Executable | libtoxcore, libconfig | Unix-like | Highly configurable DHT bootstrap node daemon (systemd, SysVinit, Docker). |
| `cmp` | Library | | Cross-platform | C implementation of the MessagePack serialization format. [https://github.com/camgunz/cmp](https://github.com/camgunz/cmp) | | `cmp` | Library | | Cross-platform | C implementation of the MessagePack serialization format. [https://github.com/camgunz/cmp](https://github.com/camgunz/cmp) |
#### Secondary #### Secondary

View File

@@ -1,7 +1,7 @@
GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007 Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
@@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found.
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail. Also add information on how to contact you by electronic and paper mail.
@@ -664,12 +664,11 @@ might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school, You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary. if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>. <https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>. <https://www.gnu.org/licenses/why-not-lgpl.html>.

View File

@@ -4,13 +4,12 @@
[**Website**](https://tox.chat) **|** [**Wiki**](https://wiki.tox.chat/) **|** [**Blog**](https://blog.tox.chat/) **|** [**FAQ**](https://wiki.tox.chat/doku.php?id=users:faq) **|** [**Binaries/Downloads**](https://tox.chat/download.html) **|** [**Clients**](https://wiki.tox.chat/doku.php?id=clients) **|** [**Compiling**](/INSTALL.md) [**Website**](https://tox.chat) **|** [**Wiki**](https://wiki.tox.chat/) **|** [**Blog**](https://blog.tox.chat/) **|** [**FAQ**](https://wiki.tox.chat/doku.php?id=users:faq) **|** [**Binaries/Downloads**](https://tox.chat/download.html) **|** [**Clients**](https://wiki.tox.chat/doku.php?id=clients) **|** [**Compiling**](/INSTALL.md)
**IRC Channels:** Users: [#tox@libera.chat](https://web.libera.chat/#tox), Developers: [#toktok@libera.chat](https://web.libera.chat/#toktok)
## What is Tox ## What is Tox
Tox is a peer to peer (serverless) instant messenger aimed at making security Tox is a peer to peer (serverless) instant messenger aimed at making security
and privacy easy to obtain for regular users. It uses and privacy easy to obtain for regular users. It uses
[NaCl](https://nacl.cr.yp.to/) for its encryption and authentication. [libsodium](https://doc.libsodium.org/) (based on
[NaCl](https://nacl.cr.yp.to/)) for its encryption and authentication.
## IMPORTANT! ## IMPORTANT!
@@ -20,12 +19,12 @@ This is an **experimental** cryptographic network library. It has not been
formally audited by an independent third party that specializes in formally audited by an independent third party that specializes in
cryptography or cryptanalysis. **Use this library at your own risk.** cryptography or cryptanalysis. **Use this library at your own risk.**
The underlying crypto library [NaCl](https://nacl.cr.yp.to/install.html) The underlying crypto library [libsodium](https://doc.libsodium.org/) provides
provides reliable encryption, but the security model has not yet been fully reliable encryption, but the security model has not yet been fully specified.
specified. See [issue 210](https://github.com/TokTok/c-toxcore/issues/210) for See [issue 210](https://github.com/TokTok/c-toxcore/issues/210) for a
a discussion on developing a threat model. See other issues for known discussion on developing a threat model. See other issues for known weaknesses
weaknesses (e.g. [issue 426](https://github.com/TokTok/c-toxcore/issues/426) (e.g. [issue 426](https://github.com/TokTok/c-toxcore/issues/426) describes
describes what can happen if your secret key is stolen). what can happen if your secret key is stolen).
## Toxcore Development Roadmap ## Toxcore Development Roadmap

View File

@@ -1,7 +1,5 @@
load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test")
package(features = ["layering_check"])
cc_library( cc_library(
name = "check_compat", name = "check_compat",
testonly = True, testonly = True,

View File

@@ -3,19 +3,35 @@ set(TEST_TIMEOUT_SECONDS "" CACHE STRING "Limit runtime of each test to the numb
add_library(auto_test_support add_library(auto_test_support
auto_test_support.c auto_test_support.c
auto_test_support.h) auto_test_support.h)
target_link_modules(auto_test_support toxcore misc_tools) target_link_libraries(auto_test_support PRIVATE misc_tools)
if(TARGET toxcore_static)
target_link_libraries(auto_test_support PRIVATE toxcore_static)
else()
target_link_libraries(auto_test_support PRIVATE toxcore_shared)
endif()
if(TARGET PThreads4W::PThreads4W)
target_link_libraries(auto_test_support PRIVATE PThreads4W::PThreads4W)
elseif(TARGET Threads::Threads)
target_link_libraries(auto_test_support PRIVATE Threads::Threads)
endif()
function(auto_test target) function(auto_test target)
if(AUTOTEST AND NOT (MSVC AND ARGV1 STREQUAL "MSVC_DONT_BUILD")) add_executable(auto_${target}_test ${target}_test.c)
add_executable(auto_${target}_test ${target}_test.c) target_link_libraries(auto_${target}_test PRIVATE misc_tools auto_test_support)
target_link_modules(auto_${target}_test toxcore misc_tools auto_test_support) if(TARGET toxcore_static)
if(NOT ARGV1 STREQUAL "DONT_RUN") target_link_libraries(auto_${target}_test PRIVATE toxcore_static)
add_test(NAME ${target} COMMAND ${CROSSCOMPILING_EMULATOR} auto_${target}_test) else()
set_tests_properties(${target} PROPERTIES TIMEOUT "${TEST_TIMEOUT_SECONDS}") target_link_libraries(auto_${target}_test PRIVATE toxcore_shared)
# add the source dir as environment variable, so the testdata can be found
set_tests_properties(${target} PROPERTIES ENVIRONMENT "LLVM_PROFILE_FILE=${target}.profraw;srcdir=${CMAKE_CURRENT_SOURCE_DIR}")
endif()
endif() endif()
if(TARGET PThreads4W::PThreads4W)
target_link_libraries(auto_${target}_test PRIVATE PThreads4W::PThreads4W)
elseif(TARGET Threads::Threads)
target_link_libraries(auto_${target}_test PRIVATE Threads::Threads)
endif()
add_test(NAME ${target} COMMAND ${CROSSCOMPILING_EMULATOR} auto_${target}_test)
set_tests_properties(${target} PROPERTIES TIMEOUT "${TEST_TIMEOUT_SECONDS}")
# add the source dir as environment variable, so the testdata can be found
set_tests_properties(${target} PROPERTIES ENVIRONMENT "LLVM_PROFILE_FILE=${target}.profraw;srcdir=${CMAKE_CURRENT_SOURCE_DIR}")
endfunction() endfunction()
auto_test(TCP) auto_test(TCP)
@@ -69,17 +85,33 @@ auto_test(typing)
auto_test(version) auto_test(version)
auto_test(save_compatibility) auto_test(save_compatibility)
target_include_directories(auto_encryptsave_test SYSTEM PRIVATE ${LIBSODIUM_INCLUDE_DIRS})
if(NON_HERMETIC_TESTS) if(NON_HERMETIC_TESTS)
auto_test(bootstrap) auto_test(bootstrap)
auto_test(tcp_relay) auto_test(tcp_relay)
endif() endif()
if(BUILD_TOXAV) if(BUILD_TOXAV)
auto_test(conference_av MSVC_DONT_BUILD) auto_test(conference_av)
auto_test(toxav_basic) auto_test(toxav_basic)
auto_test(toxav_many) auto_test(toxav_many)
endif()
if(MSVC)
target_link_libraries(auto_toxav_basic_test PRIVATE PkgConfig::VPX)
target_link_libraries(auto_toxav_many_test PRIVATE PkgConfig::VPX)
else()
target_link_libraries(auto_toxav_basic_test PRIVATE ${VPX_LIBRARIES})
target_link_directories(auto_toxav_basic_test PRIVATE ${VPX_LIBRARY_DIRS})
target_include_directories(auto_toxav_basic_test SYSTEM PRIVATE ${VPX_INCLUDE_DIRS})
target_compile_options(auto_toxav_basic_test PRIVATE ${VPX_CFLAGS_OTHER})
target_link_libraries(auto_toxav_many_test PRIVATE ${VPX_LIBRARIES})
target_link_directories(auto_toxav_many_test PRIVATE ${VPX_LIBRARY_DIRS})
target_include_directories(auto_toxav_many_test SYSTEM PRIVATE ${VPX_INCLUDE_DIRS})
target_compile_options(auto_toxav_many_test PRIVATE ${VPX_CFLAGS_OTHER})
endif()
endif()
if(PROXY_TEST) if(PROXY_TEST)
auto_test(proxy) auto_test(proxy)

View File

@@ -5,7 +5,7 @@ libauto_test_support_la_SOURCES = ../auto_tests/auto_test_support.c ../auto_test
libauto_test_support_la_LIBADD = libmisc_tools.la libtoxcore.la libauto_test_support_la_LIBADD = libmisc_tools.la libtoxcore.la
TESTS = \ TESTS = \
announce_test \ announce_test \
conference_double_invite_test \ conference_double_invite_test \
conference_invite_merge_test \ conference_invite_merge_test \
conference_peer_nick_test \ conference_peer_nick_test \
@@ -13,6 +13,8 @@ TESTS = \
conference_test \ conference_test \
conference_two_test \ conference_two_test \
crypto_test \ crypto_test \
encryptsave_test \
file_saving_test \
file_transfer_test \ file_transfer_test \
forwarding_test \ forwarding_test \
friend_connection_test \ friend_connection_test \
@@ -34,34 +36,24 @@ TESTS = \
set_name_test \ set_name_test \
set_status_message_test \ set_status_message_test \
TCP_test \ TCP_test \
tox_events_test \
tox_dispatch_test \ tox_dispatch_test \
tox_events_test \
tox_many_tcp_test \ tox_many_tcp_test \
tox_many_test \ tox_many_test \
tox_strncasecmp_test \ tox_strncasecmp_test \
typing_test \ typing_test \
version_test version_test
if !WITH_NACL
TESTS += \
encryptsave_test \
file_saving_test
endif
AUTOTEST_CFLAGS = \ AUTOTEST_CFLAGS = \
$(LIBSODIUM_CFLAGS) \ $(LIBSODIUM_CFLAGS)
$(NACL_CFLAGS)
AUTOTEST_LDADD = \ AUTOTEST_LDADD = \
$(LIBSODIUM_LDFLAGS) \ $(LIBSODIUM_LDFLAGS) \
$(NACL_LDFLAGS) \
libmisc_tools.la \ libmisc_tools.la \
libauto_test_support.la \ libauto_test_support.la \
libtoxcore.la \ libtoxcore.la \
libtoxencryptsave.la \ libtoxencryptsave.la \
$(LIBSODIUM_LIBS) \ $(LIBSODIUM_LIBS)
$(NACL_OBJECTS) \
$(NACL_LIBS)
if BUILD_AV if BUILD_AV
@@ -195,14 +187,14 @@ TCP_test_SOURCES = ../auto_tests/TCP_test.c
TCP_test_CFLAGS = $(AUTOTEST_CFLAGS) TCP_test_CFLAGS = $(AUTOTEST_CFLAGS)
TCP_test_LDADD = $(AUTOTEST_LDADD) TCP_test_LDADD = $(AUTOTEST_LDADD)
tox_events_test_SOURCES = ../auto_tests/tox_events_test.c
tox_events_test_CFLAGS = $(AUTOTEST_CFLAGS)
tox_events_test_LDADD = $(AUTOTEST_LDADD)
tox_dispatch_test_SOURCES = ../auto_tests/tox_dispatch_test.c tox_dispatch_test_SOURCES = ../auto_tests/tox_dispatch_test.c
tox_dispatch_test_CFLAGS = $(AUTOTEST_CFLAGS) tox_dispatch_test_CFLAGS = $(AUTOTEST_CFLAGS)
tox_dispatch_test_LDADD = $(AUTOTEST_LDADD) tox_dispatch_test_LDADD = $(AUTOTEST_LDADD)
tox_events_test_SOURCES = ../auto_tests/tox_events_test.c
tox_events_test_CFLAGS = $(AUTOTEST_CFLAGS)
tox_events_test_LDADD = $(AUTOTEST_LDADD)
tox_many_tcp_test_SOURCES = ../auto_tests/tox_many_tcp_test.c tox_many_tcp_test_SOURCES = ../auto_tests/tox_many_tcp_test.c
tox_many_tcp_test_CFLAGS = $(AUTOTEST_CFLAGS) tox_many_tcp_test_CFLAGS = $(AUTOTEST_CFLAGS)
tox_many_tcp_test_LDADD = $(AUTOTEST_LDADD) tox_many_tcp_test_LDADD = $(AUTOTEST_LDADD)

View File

@@ -61,9 +61,13 @@ static void test_store_data(void)
ck_assert(log != nullptr); ck_assert(log != nullptr);
logger_callback_log(log, print_debug_logger, nullptr, nullptr); logger_callback_log(log, print_debug_logger, nullptr, nullptr);
Mono_Time *mono_time = mono_time_new(mem, nullptr, nullptr); Mono_Time *mono_time = mono_time_new(mem, nullptr, nullptr);
ck_assert(mono_time != nullptr);
Networking_Core *net = new_networking_no_udp(log, mem, ns); Networking_Core *net = new_networking_no_udp(log, mem, ns);
ck_assert(net != nullptr);
DHT *dht = new_dht(log, mem, rng, ns, mono_time, net, true, true); DHT *dht = new_dht(log, mem, rng, ns, mono_time, net, true, true);
ck_assert(dht != nullptr);
Forwarding *forwarding = new_forwarding(log, rng, mono_time, dht); Forwarding *forwarding = new_forwarding(log, rng, mono_time, dht);
ck_assert(forwarding != nullptr);
Announcements *announce = new_announcements(log, mem, rng, mono_time, forwarding); Announcements *announce = new_announcements(log, mem, rng, mono_time, forwarding);
ck_assert(announce != nullptr); ck_assert(announce != nullptr);

View File

@@ -28,7 +28,6 @@ static const struct BootstrapNodes {
uint16_t port; uint16_t port;
const uint8_t key[32]; const uint8_t key[32];
} bootstrap_nodes[] = { } bootstrap_nodes[] = {
#ifndef USE_TEST_NETWORK
{ {
"tox.abilinski.com", 33445, "tox.abilinski.com", 33445,
0x10, 0xC0, 0x0E, 0xB2, 0x50, 0xC3, 0x23, 0x3E, 0x10, 0xC0, 0x0E, 0xB2, 0x50, 0xC3, 0x23, 0x3E,
@@ -57,22 +56,6 @@ static const struct BootstrapNodes {
0x6D, 0xC9, 0xD0, 0xA3, 0x00, 0xE6, 0xC3, 0x57, 0x6D, 0xC9, 0xD0, 0xA3, 0x00, 0xE6, 0xC3, 0x57,
0x63, 0x4E, 0xE2, 0xDA, 0x88, 0xC3, 0x54, 0x63, 0x63, 0x4E, 0xE2, 0xDA, 0x88, 0xC3, 0x54, 0x63,
}, },
#else
{
"172.93.52.70", 33445,
0x79, 0xCA, 0xDA, 0x49, 0x74, 0xB0, 0x92, 0x6F,
0x28, 0x6F, 0x02, 0x5C, 0xD5, 0xFF, 0xDF, 0x3E,
0x65, 0x4A, 0x37, 0x58, 0xC5, 0x3E, 0x02, 0x73,
0xEC, 0xFC, 0x4D, 0x12, 0xC2, 0x1D, 0xCA, 0x48,
},
{
"tox.plastiras.org", 38445,
0x5E, 0x47, 0xBA, 0x1D, 0xC3, 0x91, 0x3E, 0xB2,
0xCB, 0xF2, 0xD6, 0x4C, 0xE4, 0xF2, 0x3D, 0x8B,
0xFE, 0x53, 0x91, 0xBF, 0xAB, 0xE5, 0xC4, 0x3C,
0x5B, 0xAD, 0x13, 0xF0, 0xA4, 0x14, 0xCD, 0x77,
},
#endif // USE_TEST_NETWORK
{ nullptr, 0, 0 }, { nullptr, 0, 0 },
}; };
@@ -166,6 +149,8 @@ void set_mono_time_callback(AutoTox *autotox)
Mono_Time *mono_time = autotox->tox->mono_time; Mono_Time *mono_time = autotox->tox->mono_time;
autotox->clock = current_time_monotonic(mono_time); autotox->clock = current_time_monotonic(mono_time);
ck_assert_msg(autotox->clock >= 1000,
"clock is too low (not initialised?): %lu", (unsigned long)autotox->clock);
mono_time_set_current_time_callback(mono_time, nullptr, nullptr); // set to default first mono_time_set_current_time_callback(mono_time, nullptr, nullptr); // set to default first
mono_time_set_current_time_callback(mono_time, get_state_clock_callback, &autotox->clock); mono_time_set_current_time_callback(mono_time, get_state_clock_callback, &autotox->clock);
} }
@@ -332,7 +317,7 @@ static void bootstrap_autotoxes(struct Tox_Options *options, uint32_t tox_count,
for (uint32_t i = 1; i < tox_count; ++i) { for (uint32_t i = 1; i < tox_count; ++i) {
Tox_Err_Bootstrap err; Tox_Err_Bootstrap err;
tox_bootstrap(autotoxes[i].tox, "localhost", dht_port, dht_key, &err); tox_bootstrap(autotoxes[i].tox, "localhost", dht_port, dht_key, &err);
ck_assert(err == TOX_ERR_BOOTSTRAP_OK); ck_assert_msg(err == TOX_ERR_BOOTSTRAP_OK, "bootstrap error for port %d: %d", dht_port, err);
} }
if (!udp_enabled) { if (!udp_enabled) {

View File

@@ -9,7 +9,7 @@
#define ck_assert(ok) do { \ #define ck_assert(ok) do { \
if (!(ok)) { \ if (!(ok)) { \
fprintf(stderr, "%s:%d: failed `%s'\n", __FILE__, __LINE__, #ok); \ fprintf(stderr, "%s:%d: failed `%s'\n", __FILE__, __LINE__, #ok); \
abort(); \ exit(7); \
} \ } \
} while (0) } while (0)
@@ -18,7 +18,7 @@
fprintf(stderr, "%s:%d: failed `%s': ", __FILE__, __LINE__, #ok); \ fprintf(stderr, "%s:%d: failed `%s': ", __FILE__, __LINE__, #ok); \
fprintf(stderr, __VA_ARGS__); \ fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, "\n"); \ fprintf(stderr, "\n"); \
abort(); \ exit(7); \
} \ } \
} while (0) } while (0)
@@ -26,7 +26,7 @@
fprintf(stderr, "%s:%d: ", __FILE__, __LINE__); \ fprintf(stderr, "%s:%d: ", __FILE__, __LINE__); \
fprintf(stderr, __VA_ARGS__); \ fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, "\n"); \ fprintf(stderr, "\n"); \
abort(); \ exit(7); \
} while (0) } while (0)
#endif // C_TOXCORE_AUTO_TESTS_CHECK_COMPAT_H #endif // C_TOXCORE_AUTO_TESTS_CHECK_COMPAT_H

View File

@@ -269,6 +269,30 @@ static void test_large_data_symmetric(void)
free(m1); free(m1);
} }
static void test_very_large_data(void)
{
const Random *rng = system_random();
ck_assert(rng != nullptr);
uint8_t nonce[CRYPTO_NONCE_SIZE] = {0};
uint8_t pk[CRYPTO_PUBLIC_KEY_SIZE];
uint8_t sk[CRYPTO_SECRET_KEY_SIZE];
crypto_new_keypair(rng, pk, sk);
// 100 MiB of data (all zeroes, doesn't matter what's inside).
const uint32_t plain_size = 100 * 1024 * 1024;
uint8_t *plain = (uint8_t *)malloc(plain_size);
uint8_t *encrypted = (uint8_t *)malloc(plain_size + CRYPTO_MAC_SIZE);
ck_assert(plain != nullptr);
ck_assert(encrypted != nullptr);
encrypt_data(pk, sk, nonce, plain, plain_size, encrypted);
free(encrypted);
free(plain);
}
static void increment_nonce_number_cmp(uint8_t *nonce, uint32_t num) static void increment_nonce_number_cmp(uint8_t *nonce, uint32_t num)
{ {
uint32_t num1 = 0; uint32_t num1 = 0;
@@ -340,6 +364,7 @@ int main(void)
test_endtoend(); /* waiting up to 15 seconds */ test_endtoend(); /* waiting up to 15 seconds */
test_large_data(); test_large_data();
test_large_data_symmetric(); test_large_data_symmetric();
test_very_large_data();
test_increment_nonce(); test_increment_nonce();
test_memzero(); test_memzero();

View File

@@ -123,7 +123,7 @@ static void test_dht_getnodes(AutoTox *autotoxes)
tox_self_get_dht_id(autotoxes[i].tox, public_key_list[i]); tox_self_get_dht_id(autotoxes[i].tox, public_key_list[i]);
tox_callback_dht_get_nodes_response(autotoxes[i].tox, getnodes_response_cb); tox_callback_dht_get_nodes_response(autotoxes[i].tox, getnodes_response_cb);
printf("Peer %zu dht closenode count total/annouce-capable: %d/%d\n", printf("Peer %zu dht closenode count total/announce-capable: %d/%d\n",
i, i,
tox_dht_get_num_closelist(autotoxes[i].tox), tox_dht_get_num_closelist(autotoxes[i].tox),
tox_dht_get_num_closelist_announce_capable(autotoxes[i].tox) tox_dht_get_num_closelist_announce_capable(autotoxes[i].tox)

View File

@@ -3,7 +3,6 @@
#include <string.h> #include <string.h>
#include <sys/types.h> #include <sys/types.h>
#ifndef VANILLA_NACL
#include <sodium.h> #include <sodium.h>
#include "../testing/misc_tools.h" #include "../testing/misc_tools.h"
@@ -232,9 +231,3 @@ int main(void)
return 0; return 0;
} }
#else // VANILLA_NACL
int main(void)
{
return 0;
}
#endif

View File

@@ -9,6 +9,7 @@
#include <string.h> #include <string.h>
#include "auto_test_support.h" #include "auto_test_support.h"
#include "../toxcore/tox_private.h"
typedef struct State { typedef struct State {
size_t peer_joined_count; size_t peer_joined_count;
@@ -42,6 +43,22 @@ typedef struct State {
#define PEER_LIMIT 20 #define PEER_LIMIT 20
static void print_ip(Tox *tox, uint32_t groupnumber, uint32_t peer_id)
{
Tox_Err_Group_Peer_Query err;
size_t length = tox_group_peer_get_ip_address_size(tox, groupnumber, peer_id, &err);
ck_assert_msg(err == TOX_ERR_GROUP_PEER_QUERY_OK, "failed to get ip address size: error %d", err);
uint8_t ip_str[TOX_GROUP_PEER_IP_STRING_MAX_LENGTH];
tox_group_peer_get_ip_address(tox, groupnumber, peer_id, ip_str, &err);
ip_str[length] = '\0';
ck_assert_msg(err == TOX_ERR_GROUP_PEER_QUERY_OK, "failed to get ip address: error %d", err);
fprintf(stderr, "%s\n", ip_str);
}
static bool all_group_peers_connected(AutoTox *autotoxes, uint32_t tox_count, uint32_t groupnumber, size_t name_length) static bool all_group_peers_connected(AutoTox *autotoxes, uint32_t tox_count, uint32_t groupnumber, size_t name_length)
{ {
for (size_t i = 0; i < tox_count; ++i) { for (size_t i = 0; i < tox_count; ++i) {
@@ -119,6 +136,9 @@ static void group_peer_join_handler(Tox *tox, uint32_t groupnumber, uint32_t pee
} }
} }
fprintf(stderr, "%s joined with IP: ", peer_name);
print_ip(tox, groupnumber, peer_id);
state->peer_id = peer_id; state->peer_id = peer_id;
++state->peer_joined_count; ++state->peer_joined_count;
} }
@@ -178,6 +198,11 @@ static void group_peer_self_join_handler(Tox *tox, uint32_t groupnumber, void *u
ck_assert_msg(query_err == TOX_ERR_GROUP_STATE_QUERIES_OK, "%d", query_err); ck_assert_msg(query_err == TOX_ERR_GROUP_STATE_QUERIES_OK, "%d", query_err);
ck_assert(memcmp(topic, TOPIC, TOPIC_LEN) == 0); ck_assert(memcmp(topic, TOPIC, TOPIC_LEN) == 0);
uint32_t peer_id = tox_group_self_get_peer_id(tox, groupnumber, nullptr);
fprintf(stderr, "self joined with IP: ");
print_ip(tox, groupnumber, peer_id);
++state->self_joined_count; ++state->self_joined_count;
} }
@@ -234,7 +259,6 @@ static void group_peer_status_handler(Tox *tox, uint32_t groupnumber, uint32_t p
static void group_announce_test(AutoTox *autotoxes) static void group_announce_test(AutoTox *autotoxes)
{ {
#ifndef VANILLA_NACL
ck_assert_msg(NUM_GROUP_TOXES == 2, "NUM_GROUP_TOXES needs to be 2"); ck_assert_msg(NUM_GROUP_TOXES == 2, "NUM_GROUP_TOXES needs to be 2");
Tox *tox0 = autotoxes[0].tox; Tox *tox0 = autotoxes[0].tox;
@@ -341,6 +365,7 @@ static void group_announce_test(AutoTox *autotoxes)
ck_assert(memcmp(tox0_pk_query, tox0_self_pk, TOX_GROUP_PEER_PUBLIC_KEY_SIZE) == 0); ck_assert(memcmp(tox0_pk_query, tox0_self_pk, TOX_GROUP_PEER_PUBLIC_KEY_SIZE) == 0);
fprintf(stderr, "Peer 0 disconnecting...\n"); fprintf(stderr, "Peer 0 disconnecting...\n");
// tox 0 disconnects then reconnects // tox 0 disconnects then reconnects
Tox_Err_Group_Disconnect d_err; Tox_Err_Group_Disconnect d_err;
tox_group_disconnect(tox0, groupnumber, &d_err); tox_group_disconnect(tox0, groupnumber, &d_err);
@@ -410,7 +435,6 @@ static void group_announce_test(AutoTox *autotoxes)
ck_assert(num_groups1 == num_groups2 && num_groups2 == 0); ck_assert(num_groups1 == num_groups2 && num_groups2 == 0);
printf("All tests passed!\n"); printf("All tests passed!\n");
#endif // VANILLA_NACL
} }
int main(void) int main(void)

View File

@@ -102,7 +102,6 @@ static void group_peer_join_handler(Tox *tox, uint32_t group_number, uint32_t pe
static void group_invite_test(AutoTox *autotoxes) static void group_invite_test(AutoTox *autotoxes)
{ {
#ifndef VANILLA_NACL
ck_assert_msg(NUM_GROUP_TOXES > 7, "NUM_GROUP_TOXES is too small: %d", NUM_GROUP_TOXES); ck_assert_msg(NUM_GROUP_TOXES > 7, "NUM_GROUP_TOXES is too small: %d", NUM_GROUP_TOXES);
for (size_t i = 0; i < NUM_GROUP_TOXES; ++i) { for (size_t i = 0; i < NUM_GROUP_TOXES; ++i) {
@@ -260,8 +259,6 @@ static void group_invite_test(AutoTox *autotoxes)
} }
printf("All tests passed!\n"); printf("All tests passed!\n");
#endif // VANILLA_NACL
} }
int main(void) int main(void)

View File

@@ -44,6 +44,10 @@ typedef struct State {
#define TEST_CUSTOM_PACKET "Why'd ya spill yer beans?" #define TEST_CUSTOM_PACKET "Why'd ya spill yer beans?"
#define TEST_CUSTOM_PACKET_LEN (sizeof(TEST_CUSTOM_PACKET) - 1) #define TEST_CUSTOM_PACKET_LEN (sizeof(TEST_CUSTOM_PACKET) - 1)
#define TEST_CUSTOM_PACKET_LARGE "Where is it I've read that someone condemned to death says or thinks, an hour before his death, that if he had to live on some high rock, on such a narrow ledge that he'd only room to stand, and the ocean, everlasting darkness, everlasting solitude, everlasting tempest around him, if he had to remain standing on a square yard of space all his life, a thousand years, eternity, it were better to live so than to die at once. Only to live, to live and live! Life, whatever it may be! ...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................0123456789"
#define TEST_CUSTOM_PACKET_LARGE_LEN (sizeof(TEST_CUSTOM_PACKET_LARGE) - 1)
static_assert(TEST_CUSTOM_PACKET_LARGE_LEN == TOX_GROUP_MAX_CUSTOM_LOSSY_PACKET_LENGTH, "Should be max");
#define TEST_CUSTOM_PRIVATE_PACKET "This is a custom private packet. Enjoy." #define TEST_CUSTOM_PRIVATE_PACKET "This is a custom private packet. Enjoy."
#define TEST_CUSTOM_PRIVATE_PACKET_LEN (sizeof(TEST_CUSTOM_PRIVATE_PACKET) - 1) #define TEST_CUSTOM_PRIVATE_PACKET_LEN (sizeof(TEST_CUSTOM_PRIVATE_PACKET) - 1)
@@ -187,6 +191,21 @@ static void group_custom_packet_handler(Tox *tox, uint32_t groupnumber, uint32_t
++state->custom_packets_received; ++state->custom_packets_received;
} }
static void group_custom_packet_large_handler(Tox *tox, uint32_t groupnumber, uint32_t peer_id, const uint8_t *data,
size_t length, void *user_data)
{
ck_assert_msg(length == TEST_CUSTOM_PACKET_LARGE_LEN, "Failed to receive large custom packet. Invalid length: %zu\n", length);
ck_assert(memcmp(data, TEST_CUSTOM_PACKET_LARGE, length) == 0);
AutoTox *autotox = (AutoTox *)user_data;
ck_assert(autotox != nullptr);
State *state = (State *)autotox->state;
++state->custom_packets_received;
}
static void group_message_handler(Tox *tox, uint32_t groupnumber, uint32_t peer_id, TOX_MESSAGE_TYPE type, static void group_message_handler(Tox *tox, uint32_t groupnumber, uint32_t peer_id, TOX_MESSAGE_TYPE type,
const uint8_t *message, size_t length, uint32_t pseudo_msg_id, void *user_data) const uint8_t *message, size_t length, uint32_t pseudo_msg_id, void *user_data)
{ {
@@ -331,7 +350,6 @@ static void group_message_handler_wraparound_test(Tox *tox, uint32_t groupnumber
static void group_message_test(AutoTox *autotoxes) static void group_message_test(AutoTox *autotoxes)
{ {
#ifndef VANILLA_NACL
ck_assert_msg(NUM_GROUP_TOXES >= 2, "NUM_GROUP_TOXES is too small: %d", NUM_GROUP_TOXES); ck_assert_msg(NUM_GROUP_TOXES >= 2, "NUM_GROUP_TOXES is too small: %d", NUM_GROUP_TOXES);
const Random *rng = system_random(); const Random *rng = system_random();
@@ -377,8 +395,9 @@ static void group_message_test(AutoTox *autotoxes)
iterate_all_wait(autotoxes, NUM_GROUP_TOXES, ITERATION_INTERVAL); iterate_all_wait(autotoxes, NUM_GROUP_TOXES, ITERATION_INTERVAL);
if (state1->peer_joined && !state1->message_sent) { if (state1->peer_joined && !state1->message_sent) {
tox_group_send_message(tox1, group_number, TOX_MESSAGE_TYPE_NORMAL, (const uint8_t *)TEST_MESSAGE, state1->pseudo_msg_id = tox_group_send_message(
TEST_MESSAGE_LEN, &state1->pseudo_msg_id, &err_send); tox1, group_number, TOX_MESSAGE_TYPE_NORMAL, (const uint8_t *)TEST_MESSAGE,
TEST_MESSAGE_LEN, &err_send);
ck_assert(err_send == TOX_ERR_GROUP_SEND_MESSAGE_OK); ck_assert(err_send == TOX_ERR_GROUP_SEND_MESSAGE_OK);
state1->message_sent = true; state1->message_sent = true;
} }
@@ -401,7 +420,7 @@ static void group_message_test(AutoTox *autotoxes)
// tox1 sends group a message which should not be seen by tox0's message handler // tox1 sends group a message which should not be seen by tox0's message handler
tox_group_send_message(tox1, group_number, TOX_MESSAGE_TYPE_NORMAL, (const uint8_t *)IGNORE_MESSAGE, tox_group_send_message(tox1, group_number, TOX_MESSAGE_TYPE_NORMAL, (const uint8_t *)IGNORE_MESSAGE,
IGNORE_MESSAGE_LEN, nullptr, &err_send); IGNORE_MESSAGE_LEN, &err_send);
iterate_all_wait(autotoxes, NUM_GROUP_TOXES, ITERATION_INTERVAL); iterate_all_wait(autotoxes, NUM_GROUP_TOXES, ITERATION_INTERVAL);
@@ -450,6 +469,19 @@ static void group_message_test(AutoTox *autotoxes)
iterate_all_wait(autotoxes, NUM_GROUP_TOXES, ITERATION_INTERVAL); iterate_all_wait(autotoxes, NUM_GROUP_TOXES, ITERATION_INTERVAL);
} }
// tox0 sends a large max sized lossy custom packet
// overwrite callback for larger packet
tox_callback_group_custom_packet(tox0, group_custom_packet_large_handler);
tox_group_send_custom_packet(tox1, group_number, false, (const uint8_t *)TEST_CUSTOM_PACKET_LARGE, TEST_CUSTOM_PACKET_LARGE_LEN,
&c_err);
ck_assert_msg(c_err == TOX_ERR_GROUP_SEND_CUSTOM_PACKET_OK, "%d", c_err);
while (state0->custom_packets_received < 3) {
iterate_all_wait(autotoxes, NUM_GROUP_TOXES, ITERATION_INTERVAL);
}
uint8_t m[TOX_GROUP_MAX_MESSAGE_LENGTH] = {0}; uint8_t m[TOX_GROUP_MAX_MESSAGE_LENGTH] = {0};
fprintf(stderr, "Doing lossless packet test...\n"); fprintf(stderr, "Doing lossless packet test...\n");
@@ -475,7 +507,7 @@ static void group_message_test(AutoTox *autotoxes)
memcpy(m + 2, &checksum, sizeof(uint16_t)); memcpy(m + 2, &checksum, sizeof(uint16_t));
tox_group_send_message(tox0, group_number, TOX_MESSAGE_TYPE_NORMAL, (const uint8_t *)m, message_size, nullptr, &err_send); tox_group_send_message(tox0, group_number, TOX_MESSAGE_TYPE_NORMAL, (const uint8_t *)m, message_size, &err_send);
ck_assert(err_send == TOX_ERR_GROUP_SEND_MESSAGE_OK); ck_assert(err_send == TOX_ERR_GROUP_SEND_MESSAGE_OK);
} }
@@ -497,7 +529,7 @@ static void group_message_test(AutoTox *autotoxes)
memcpy(m, &i, sizeof(uint16_t)); memcpy(m, &i, sizeof(uint16_t));
tox_group_send_message(tox0, group_number, TOX_MESSAGE_TYPE_NORMAL, (const uint8_t *)m, 2, nullptr, &err_send); tox_group_send_message(tox0, group_number, TOX_MESSAGE_TYPE_NORMAL, (const uint8_t *)m, 2, &err_send);
ck_assert(err_send == TOX_ERR_GROUP_SEND_MESSAGE_OK); ck_assert(err_send == TOX_ERR_GROUP_SEND_MESSAGE_OK);
} }
@@ -512,7 +544,6 @@ static void group_message_test(AutoTox *autotoxes)
} }
fprintf(stderr, "All tests passed!\n"); fprintf(stderr, "All tests passed!\n");
#endif // VANILLA_NACL
} }
int main(void) int main(void)
@@ -538,6 +569,8 @@ int main(void)
#undef TEST_PRIVATE_MESSAGE_LEN #undef TEST_PRIVATE_MESSAGE_LEN
#undef TEST_CUSTOM_PACKET #undef TEST_CUSTOM_PACKET
#undef TEST_CUSTOM_PACKET_LEN #undef TEST_CUSTOM_PACKET_LEN
#undef TEST_CUSTOM_PACKET_LARGE
#undef TEST_CUSTOM_PACKET_LARGE_LEN
#undef TEST_CUSTOM_PRIVATE_PACKET #undef TEST_CUSTOM_PRIVATE_PACKET
#undef TEST_CUSTOM_PRIVATE_PACKET_LEN #undef TEST_CUSTOM_PRIVATE_PACKET_LEN
#undef IGNORE_MESSAGE #undef IGNORE_MESSAGE

View File

@@ -334,21 +334,21 @@ static void voice_state_message_test(AutoTox *autotox, Tox_Group_Voice_State voi
ck_assert(sq_err == TOX_ERR_GROUP_SELF_QUERY_OK); ck_assert(sq_err == TOX_ERR_GROUP_SELF_QUERY_OK);
Tox_Err_Group_Send_Message msg_err; Tox_Err_Group_Send_Message msg_err;
bool send_ret = tox_group_send_message(autotox->tox, state->group_number, TOX_MESSAGE_TYPE_NORMAL, tox_group_send_message(autotox->tox, state->group_number, TOX_MESSAGE_TYPE_NORMAL,
(const uint8_t *)"test", 4, nullptr, &msg_err); (const uint8_t *)"test", 4, &msg_err);
switch (self_role) { switch (self_role) {
case TOX_GROUP_ROLE_OBSERVER: { case TOX_GROUP_ROLE_OBSERVER: {
ck_assert(!send_ret && msg_err == TOX_ERR_GROUP_SEND_MESSAGE_PERMISSIONS); ck_assert(msg_err == TOX_ERR_GROUP_SEND_MESSAGE_PERMISSIONS);
break; break;
} }
case TOX_GROUP_ROLE_USER: { case TOX_GROUP_ROLE_USER: {
if (voice_state != TOX_GROUP_VOICE_STATE_ALL) { if (voice_state != TOX_GROUP_VOICE_STATE_ALL) {
ck_assert_msg(!send_ret && msg_err == TOX_ERR_GROUP_SEND_MESSAGE_PERMISSIONS, ck_assert_msg(msg_err == TOX_ERR_GROUP_SEND_MESSAGE_PERMISSIONS,
"%d, %d", send_ret, msg_err); "%d", msg_err);
} else { } else {
ck_assert(send_ret && msg_err == TOX_ERR_GROUP_SEND_MESSAGE_OK); ck_assert(msg_err == TOX_ERR_GROUP_SEND_MESSAGE_OK);
} }
break; break;
@@ -356,16 +356,16 @@ static void voice_state_message_test(AutoTox *autotox, Tox_Group_Voice_State voi
case TOX_GROUP_ROLE_MODERATOR: { case TOX_GROUP_ROLE_MODERATOR: {
if (voice_state != TOX_GROUP_VOICE_STATE_FOUNDER) { if (voice_state != TOX_GROUP_VOICE_STATE_FOUNDER) {
ck_assert(send_ret && msg_err == TOX_ERR_GROUP_SEND_MESSAGE_OK); ck_assert(msg_err == TOX_ERR_GROUP_SEND_MESSAGE_OK);
} else { } else {
ck_assert(!send_ret && msg_err == TOX_ERR_GROUP_SEND_MESSAGE_PERMISSIONS); ck_assert(msg_err == TOX_ERR_GROUP_SEND_MESSAGE_PERMISSIONS);
} }
break; break;
} }
case TOX_GROUP_ROLE_FOUNDER: { case TOX_GROUP_ROLE_FOUNDER: {
ck_assert(send_ret && msg_err == TOX_ERR_GROUP_SEND_MESSAGE_OK); ck_assert(msg_err == TOX_ERR_GROUP_SEND_MESSAGE_OK);
break; break;
} }
} }
@@ -432,7 +432,6 @@ static void check_voice_state(AutoTox *autotoxes, uint32_t num_toxes)
static void group_moderation_test(AutoTox *autotoxes) static void group_moderation_test(AutoTox *autotoxes)
{ {
#ifndef VANILLA_NACL
ck_assert_msg(NUM_GROUP_TOXES >= 4, "NUM_GROUP_TOXES is too small: %d", NUM_GROUP_TOXES); ck_assert_msg(NUM_GROUP_TOXES >= 4, "NUM_GROUP_TOXES is too small: %d", NUM_GROUP_TOXES);
ck_assert_msg(NUM_GROUP_TOXES < 10, "NUM_GROUP_TOXES is too big: %d", NUM_GROUP_TOXES); ck_assert_msg(NUM_GROUP_TOXES < 10, "NUM_GROUP_TOXES is too big: %d", NUM_GROUP_TOXES);
@@ -634,7 +633,6 @@ static void group_moderation_test(AutoTox *autotoxes)
} }
fprintf(stderr, "All tests passed!\n"); fprintf(stderr, "All tests passed!\n");
#endif // VANILLA_NACL
} }
int main(void) int main(void)

View File

@@ -148,7 +148,6 @@ static int has_correct_self_state(const Tox *tox, uint32_t group_number, const u
static void group_save_test(AutoTox *autotoxes) static void group_save_test(AutoTox *autotoxes)
{ {
#ifndef VANILLA_NACL
ck_assert_msg(NUM_GROUP_TOXES > 1, "NUM_GROUP_TOXES is too small: %d", NUM_GROUP_TOXES); ck_assert_msg(NUM_GROUP_TOXES > 1, "NUM_GROUP_TOXES is too small: %d", NUM_GROUP_TOXES);
for (size_t i = 0; i < NUM_GROUP_TOXES; ++i) { for (size_t i = 0; i < NUM_GROUP_TOXES; ++i) {
@@ -270,8 +269,6 @@ static void group_save_test(AutoTox *autotoxes)
tox_kill(new_tox); tox_kill(new_tox);
printf("All tests passed!\n"); printf("All tests passed!\n");
#endif // VANILLA_NACL
} }
int main(void) int main(void)

View File

@@ -238,7 +238,6 @@ static void set_group_state(Tox *tox, uint32_t groupnumber, uint32_t peer_limit,
static void group_state_test(AutoTox *autotoxes) static void group_state_test(AutoTox *autotoxes)
{ {
#ifndef VANILLA_NACL
ck_assert_msg(NUM_GROUP_TOXES >= 3, "NUM_GROUP_TOXES is too small: %d", NUM_GROUP_TOXES); ck_assert_msg(NUM_GROUP_TOXES >= 3, "NUM_GROUP_TOXES is too small: %d", NUM_GROUP_TOXES);
for (size_t i = 0; i < NUM_GROUP_TOXES; ++i) { for (size_t i = 0; i < NUM_GROUP_TOXES; ++i) {
@@ -318,8 +317,6 @@ static void group_state_test(AutoTox *autotoxes)
} }
fprintf(stderr, "All tests passed!\n"); fprintf(stderr, "All tests passed!\n");
#endif /* VANILLA_NACL */
} }
int main(void) int main(void)

View File

@@ -330,7 +330,6 @@ static void topic_spam(const Random *rng, AutoTox *autotoxes, uint32_t num_peers
static void group_sync_test(AutoTox *autotoxes) static void group_sync_test(AutoTox *autotoxes)
{ {
#ifndef VANILLA_NACL
ck_assert(NUM_GROUP_TOXES >= 5); ck_assert(NUM_GROUP_TOXES >= 5);
const Random *rng = system_random(); const Random *rng = system_random();
ck_assert(rng != nullptr); ck_assert(rng != nullptr);
@@ -443,8 +442,6 @@ static void group_sync_test(AutoTox *autotoxes)
} }
fprintf(stderr, "All tests passed!\n"); fprintf(stderr, "All tests passed!\n");
#endif // VANILLA_NACL
} }
int main(void) int main(void)

View File

@@ -8,8 +8,6 @@
#include "auto_test_support.h" #include "auto_test_support.h"
#ifdef USE_TEST_NETWORK
#define NUM_GROUP_TOXES 2 #define NUM_GROUP_TOXES 2
#define CODEWORD "RONALD MCDONALD" #define CODEWORD "RONALD MCDONALD"
#define CODEWORD_LEN (sizeof(CODEWORD) - 1) #define CODEWORD_LEN (sizeof(CODEWORD) - 1)
@@ -129,7 +127,6 @@ static bool all_peers_got_code(AutoTox *autotoxes)
static void group_tcp_test(AutoTox *autotoxes) static void group_tcp_test(AutoTox *autotoxes)
{ {
#ifndef VANILLA_NACL
ck_assert(NUM_GROUP_TOXES >= 2); ck_assert(NUM_GROUP_TOXES >= 2);
State *state0 = (State *)autotoxes[0].state; State *state0 = (State *)autotoxes[0].state;
@@ -209,7 +206,7 @@ static void group_tcp_test(AutoTox *autotoxes)
Tox_Err_Group_Send_Message merr; Tox_Err_Group_Send_Message merr;
tox_group_send_message(autotoxes[0].tox, groupnumber, TOX_MESSAGE_TYPE_NORMAL, tox_group_send_message(autotoxes[0].tox, groupnumber, TOX_MESSAGE_TYPE_NORMAL,
(const uint8_t *)CODEWORD, CODEWORD_LEN, nullptr, &merr); (const uint8_t *)CODEWORD, CODEWORD_LEN, &merr);
ck_assert(merr == TOX_ERR_GROUP_SEND_MESSAGE_OK); ck_assert(merr == TOX_ERR_GROUP_SEND_MESSAGE_OK);
while (!state1->got_second_code) { while (!state1->got_second_code) {
@@ -222,34 +219,29 @@ static void group_tcp_test(AutoTox *autotoxes)
} }
printf("Test passed!\n"); printf("Test passed!\n");
#endif // VANILLA_NACL
} }
#endif // USE_TEST_NETWORK
int main(void) int main(int argc, char **argv)
{ {
#ifdef USE_TEST_NETWORK // TODO(Jfreegman): Enable this test when the mainnet works with DHT groupchats
setvbuf(stdout, nullptr, _IONBF, 0); setvbuf(stdout, nullptr, _IONBF, 0);
struct Tox_Options *options = (struct Tox_Options *)calloc(1, sizeof(struct Tox_Options)); struct Tox_Options *options = tox_options_new(nullptr);
ck_assert(options != nullptr); ck_assert(options != nullptr);
tox_options_default(options);
tox_options_set_udp_enabled(options, false); tox_options_set_udp_enabled(options, false);
Run_Auto_Options autotest_opts = default_run_auto_options(); Run_Auto_Options autotest_opts = default_run_auto_options();
autotest_opts.graph = GRAPH_COMPLETE; autotest_opts.graph = GRAPH_COMPLETE;
run_auto_test(options, NUM_GROUP_TOXES, group_tcp_test, sizeof(State), &autotest_opts); // TODO(JFreegman): Fix this test and remove the "if".
if (argc > 2) {
run_auto_test(options, NUM_GROUP_TOXES, group_tcp_test, sizeof(State), &autotest_opts);
}
tox_options_free(options); tox_options_free(options);
#endif
return 0; return 0;
} }
#ifdef USE_TEST_NETWORK
#undef NUM_GROUP_TOXES
#undef CODEWORD_LEN #undef CODEWORD_LEN
#undef CODEWORD #undef CODEWORD
#endif // USE_TEST_NETWORK #undef NUM_GROUP_TOXES

View File

@@ -203,7 +203,6 @@ static uint32_t set_topic_all_peers(const Random *rng, AutoTox *autotoxes, size_
static void group_topic_test(AutoTox *autotoxes) static void group_topic_test(AutoTox *autotoxes)
{ {
#ifndef VANILLA_NACL
ck_assert_msg(NUM_GROUP_TOXES >= 3, "NUM_GROUP_TOXES is too small: %d", NUM_GROUP_TOXES); ck_assert_msg(NUM_GROUP_TOXES >= 3, "NUM_GROUP_TOXES is too small: %d", NUM_GROUP_TOXES);
const Random *rng = system_random(); const Random *rng = system_random();
@@ -318,8 +317,6 @@ static void group_topic_test(AutoTox *autotoxes)
} }
fprintf(stderr, "All tests passed!\n"); fprintf(stderr, "All tests passed!\n");
#endif /* VANILLA_NACL */
} }
int main(void) int main(void)

View File

@@ -7,15 +7,8 @@
#include "auto_test_support.h" #include "auto_test_support.h"
#include "check_compat.h" #include "check_compat.h"
static uint8_t const key[] = { // Try to bootstrap for 20 seconds.
0x15, 0xE9, 0xC3, 0x09, 0xCF, 0xCB, 0x79, 0xFD, #define NUM_ITERATIONS (unsigned)(20.0 / (ITERATION_INTERVAL / 1000.0))
0xDF, 0x0E, 0xBA, 0x05, 0x7D, 0xAB, 0xB4, 0x9F,
0xE1, 0x5F, 0x38, 0x03, 0xB1, 0xBF, 0xF0, 0x65,
0x36, 0xAE, 0x2E, 0x5B, 0xA5, 0xE4, 0x69, 0x0E,
};
// Try to bootstrap for 30 seconds.
#define NUM_ITERATIONS (unsigned)(30.0 / (ITERATION_INTERVAL / 1000.0))
int main(void) int main(void)
{ {
@@ -24,13 +17,12 @@ int main(void)
struct Tox_Options *opts = tox_options_new(nullptr); struct Tox_Options *opts = tox_options_new(nullptr);
tox_options_set_udp_enabled(opts, false); tox_options_set_udp_enabled(opts, false);
tox_options_set_proxy_type(opts, TOX_PROXY_TYPE_SOCKS5); tox_options_set_proxy_type(opts, TOX_PROXY_TYPE_SOCKS5);
tox_options_set_proxy_host(opts, "localhost"); tox_options_set_proxy_host(opts, "127.0.0.1");
tox_options_set_proxy_port(opts, 51724); tox_options_set_proxy_port(opts, 51724);
Tox *tox = tox_new_log(opts, nullptr, nullptr); Tox *tox = tox_new_log(opts, nullptr, nullptr);
tox_options_free(opts); tox_options_free(opts);
tox_add_tcp_relay(tox, "tox.ngc.zone", 33445, key, nullptr); bootstrap_tox_live_network(tox, true);
tox_bootstrap(tox, "tox.ngc.zone", 33445, key, nullptr);
printf("Waiting for connection...\n"); printf("Waiting for connection...\n");

View File

@@ -7,15 +7,8 @@
#include "auto_test_support.h" #include "auto_test_support.h"
#include "check_compat.h" #include "check_compat.h"
static uint8_t const key[] = { // Try to bootstrap for 20 seconds.
0x15, 0xE9, 0xC3, 0x09, 0xCF, 0xCB, 0x79, 0xFD, #define NUM_ITERATIONS (unsigned)(20.0 / (ITERATION_INTERVAL / 1000.0))
0xDF, 0x0E, 0xBA, 0x05, 0x7D, 0xAB, 0xB4, 0x9F,
0xE1, 0x5F, 0x38, 0x03, 0xB1, 0xBF, 0xF0, 0x65,
0x36, 0xAE, 0x2E, 0x5B, 0xA5, 0xE4, 0x69, 0x0E,
};
// Try to bootstrap for 30 seconds.
#define NUM_ITERATIONS (unsigned)(30.0 / (ITERATION_INTERVAL / 1000.0))
int main(void) int main(void)
{ {
@@ -24,13 +17,12 @@ int main(void)
struct Tox_Options *opts = tox_options_new(nullptr); struct Tox_Options *opts = tox_options_new(nullptr);
tox_options_set_udp_enabled(opts, true); tox_options_set_udp_enabled(opts, true);
tox_options_set_proxy_type(opts, TOX_PROXY_TYPE_SOCKS5); tox_options_set_proxy_type(opts, TOX_PROXY_TYPE_SOCKS5);
tox_options_set_proxy_host(opts, "localhost"); tox_options_set_proxy_host(opts, "127.0.0.1");
tox_options_set_proxy_port(opts, 51724); tox_options_set_proxy_port(opts, 51724);
Tox *tox = tox_new_log(opts, nullptr, nullptr); Tox *tox = tox_new_log(opts, nullptr, nullptr);
tox_options_free(opts); tox_options_free(opts);
tox_add_tcp_relay(tox, "tox.ngc.zone", 33445, key, nullptr); bootstrap_tox_live_network(tox, true);
tox_bootstrap(tox, "tox.ngc.zone", 33445, key, nullptr);
printf("Waiting for connection..."); printf("Waiting for connection...");

View File

@@ -53,7 +53,7 @@ static int handle_test_1(void *object, const IP_Port *source, const uint8_t *pac
res_packet[0] = NET_PACKET_ANNOUNCE_RESPONSE; res_packet[0] = NET_PACKET_ANNOUNCE_RESPONSE;
memcpy(res_packet + 1, res_message, sizeof(res_message)); memcpy(res_packet + 1, res_message, sizeof(res_message));
if (send_onion_response(onion->net, source, res_packet, sizeof(res_packet), if (send_onion_response(onion->log, onion->net, source, res_packet, sizeof(res_packet),
packet + sizeof(res_packet)) == -1) { packet + sizeof(res_packet)) == -1) {
return 1; return 1;
} }
@@ -293,7 +293,7 @@ static void test_basic(void)
uint64_t s; uint64_t s;
memcpy(&s, sb_data, sizeof(uint64_t)); memcpy(&s, sb_data, sizeof(uint64_t));
memcpy(test_3_pub_key, nodes[3].public_key, CRYPTO_PUBLIC_KEY_SIZE); memcpy(test_3_pub_key, nodes[3].public_key, CRYPTO_PUBLIC_KEY_SIZE);
int ret = send_announce_request(onion1->net, rng, &path, &nodes[3], int ret = send_announce_request(log1, onion1->net, rng, &path, &nodes[3],
dht_get_self_public_key(onion1->dht), dht_get_self_public_key(onion1->dht),
dht_get_self_secret_key(onion1->dht), dht_get_self_secret_key(onion1->dht),
zeroes, zeroes,
@@ -315,7 +315,7 @@ static void test_basic(void)
memcpy(onion_announce_entry_public_key(onion2_a, 1), dht_get_self_public_key(onion2->dht), CRYPTO_PUBLIC_KEY_SIZE); memcpy(onion_announce_entry_public_key(onion2_a, 1), dht_get_self_public_key(onion2->dht), CRYPTO_PUBLIC_KEY_SIZE);
onion_announce_entry_set_time(onion2_a, 1, mono_time_get(mono_time2)); onion_announce_entry_set_time(onion2_a, 1, mono_time_get(mono_time2));
networking_registerhandler(onion1->net, NET_PACKET_ONION_DATA_RESPONSE, &handle_test_4, onion1); networking_registerhandler(onion1->net, NET_PACKET_ONION_DATA_RESPONSE, &handle_test_4, onion1);
send_announce_request(onion1->net, rng, &path, &nodes[3], send_announce_request(log1, onion1->net, rng, &path, &nodes[3],
dht_get_self_public_key(onion1->dht), dht_get_self_public_key(onion1->dht),
dht_get_self_secret_key(onion1->dht), dht_get_self_secret_key(onion1->dht),
test_3_ping_id, test_3_ping_id,
@@ -340,7 +340,7 @@ static void test_basic(void)
ck_assert_msg((onion3 != nullptr), "Onion failed initializing."); ck_assert_msg((onion3 != nullptr), "Onion failed initializing.");
random_nonce(rng, nonce); random_nonce(rng, nonce);
ret = send_data_request(onion3->net, rng, &path, &nodes[3].ip_port, ret = send_data_request(log3, onion3->net, rng, &path, &nodes[3].ip_port,
dht_get_self_public_key(onion1->dht), dht_get_self_public_key(onion1->dht),
dht_get_self_public_key(onion1->dht), dht_get_self_public_key(onion1->dht),
nonce, (const uint8_t *)"Install gentoo", sizeof("Install gentoo")); nonce, (const uint8_t *)"Install gentoo", sizeof("Install gentoo"));

View File

@@ -42,6 +42,7 @@ static void send_message_test(AutoTox *autotoxes)
const size_t msgs_len = tox_max_message_length() + 1; const size_t msgs_len = tox_max_message_length() + 1;
uint8_t *msgs = (uint8_t *)malloc(msgs_len); uint8_t *msgs = (uint8_t *)malloc(msgs_len);
ck_assert(msgs != nullptr);
memset(msgs, MESSAGE_FILLER, msgs_len); memset(msgs, MESSAGE_FILLER, msgs_len);
Tox_Err_Friend_Send_Message errm; Tox_Err_Friend_Send_Message errm;

View File

@@ -10,6 +10,8 @@
#include "../toxcore/tox.h" #include "../toxcore/tox.h"
#include "../toxcore/tox_dispatch.h" #include "../toxcore/tox_dispatch.h"
#include "../toxcore/tox_events.h" #include "../toxcore/tox_events.h"
#include "../toxcore/tox_private.h"
#include "../toxcore/tox_unpack.h"
#include "auto_test_support.h" #include "auto_test_support.h"
#include "check_compat.h" #include "check_compat.h"
@@ -30,31 +32,36 @@ static void handle_events_friend_message(Tox *tox, const Tox_Event_Friend_Messag
static void dump_events(const char *path, const Tox_Events *events) static void dump_events(const char *path, const Tox_Events *events)
{ {
if (want_dump_events) { FILE *fh = fopen(path, "w");
FILE *fh = fopen(path, "w"); ck_assert(fh != nullptr);
ck_assert(fh != nullptr); const uint32_t len = tox_events_bytes_size(events);
const uint32_t len = tox_events_bytes_size(events); uint8_t *buf = (uint8_t *)malloc(len);
uint8_t *buf = (uint8_t *)malloc(len); ck_assert(buf != nullptr);
ck_assert(buf != nullptr); ck_assert(tox_events_get_bytes(events, buf));
tox_events_get_bytes(events, buf); fwrite(buf, 1, len, fh);
fwrite(buf, 1, len, fh); free(buf);
free(buf); fclose(fh);
fclose(fh);
}
} }
static void print_events(const Tox_System *sys, Tox_Events *events) static void print_events(const Tox_System *sys, Tox_Events *events)
{ {
const uint32_t size = tox_events_bytes_size(events); const uint32_t size = tox_events_bytes_size(events);
uint8_t *bytes = (uint8_t *)malloc(size); uint8_t *bytes1 = (uint8_t *)malloc(size);
ck_assert(bytes != nullptr); uint8_t *bytes2 = (uint8_t *)malloc(size);
ck_assert(bytes1 != nullptr);
ck_assert(bytes2 != nullptr);
tox_events_get_bytes(events, bytes); ck_assert(tox_events_get_bytes(events, bytes1));
ck_assert(tox_events_get_bytes(events, bytes2));
Tox_Events *events_copy = tox_events_load(sys, bytes, size); // Make sure get_bytes is deterministic.
ck_assert(memcmp(bytes1, bytes2, size) == 0);
Tox_Events *events_copy = tox_events_load(sys, bytes1, size);
ck_assert(events_copy != nullptr); ck_assert(events_copy != nullptr);
free(bytes); free(bytes1);
free(bytes2);
ck_assert(tox_events_equal(sys, events, events_copy)); ck_assert(tox_events_equal(sys, events, events_copy));
@@ -72,7 +79,9 @@ static bool await_message(Tox **toxes, const Tox_Dispatch *dispatch)
// Check if tox 2 got the message from tox 1. // Check if tox 2 got the message from tox 1.
Tox_Events *events = tox_events_iterate(toxes[1], false, nullptr); Tox_Events *events = tox_events_iterate(toxes[1], false, nullptr);
dump_events("/tmp/test.mp", events); if (want_dump_events) {
dump_events("/tmp/test.mp", events);
}
bool success = false; bool success = false;
tox_dispatch_invoke(dispatch, events, toxes[1], &success); tox_dispatch_invoke(dispatch, events, toxes[1], &success);
@@ -160,9 +169,22 @@ static void test_tox_events(void)
} }
} }
static void fake_test_unpack(void)
{
// TODO(Green-Sky): add proper unpack tests and/or implement ngc events
(void)tox_group_privacy_state_unpack;
(void)tox_group_privacy_state_unpack;
(void)tox_group_voice_state_unpack;
(void)tox_group_topic_lock_unpack;
(void)tox_group_join_fail_unpack;
(void)tox_group_mod_event_unpack;
(void)tox_group_exit_type_unpack;
}
int main(void) int main(void)
{ {
setvbuf(stdout, nullptr, _IONBF, 0); setvbuf(stdout, nullptr, _IONBF, 0);
test_tox_events(); test_tox_events();
fake_test_unpack();
return 0; return 0;
} }

View File

@@ -22,12 +22,23 @@ static bool await_message(Tox **toxes)
Tox_Events *events = tox_events_iterate(toxes[1], false, nullptr); Tox_Events *events = tox_events_iterate(toxes[1], false, nullptr);
if (events != nullptr) { if (events != nullptr) {
ck_assert(tox_events_get_friend_message_size(events) == 1); uint32_t events_size = tox_events_get_size(events);
const Tox_Event_Friend_Message *msg_event = tox_events_get_friend_message(events, 0); ck_assert(events_size == 1);
const Tox_Event_Friend_Message *msg_event = nullptr;
for (uint32_t j = 0; j < events_size; ++j) {
const Tox_Event *ev = tox_events_get(events, j);
if (tox_event_get_type(ev) == TOX_EVENT_FRIEND_MESSAGE) {
msg_event = tox_event_get_friend_message(ev);
}
}
ck_assert(msg_event != nullptr);
ck_assert(tox_event_friend_message_get_message_length(msg_event) == sizeof("hello")); ck_assert(tox_event_friend_message_get_message_length(msg_event) == sizeof("hello"));
const uint8_t *msg = tox_event_friend_message_get_message(msg_event); const uint8_t *msg = tox_event_friend_message_get_message(msg_event);
ck_assert_msg(memcmp(msg, "hello", sizeof("hello")) == 0, ck_assert_msg(memcmp(msg, "hello", sizeof("hello")) == 0,
"message was not expected 'hello' but '%s'", (const char *)msg); "message was not expected 'hello' but '%s'", (const char *)msg);
tox_events_free(events); tox_events_free(events);
return true; return true;
} }

View File

@@ -12,4 +12,4 @@ jobs:
- bash: python -m pip install conan==1.59.0 - bash: python -m pip install conan==1.59.0
- bash: git submodule update --init --recursive - bash: git submodule update --init --recursive
- bash: conan install -if _build -o with_tests=True -o shared=$(conan.shared) . - bash: conan install -if _build -o with_tests=True -o shared=$(conan.shared) .
- bash: CONAN_CPU_COUNT=50 CTEST_OUTPUT_ON_FAILURE=1 conan build -bf _build -if _build . - bash: CONAN_CPU_COUNT=50 CTEST_OUTPUT_ON_FAILURE=1 conan build -bf _build -if _build . || true

View File

@@ -1,62 +0,0 @@
# Find and compile the GTest library.
include(CheckCXXCompilerFlag)
include(CheckIncludeFileCXX)
message(STATUS "Checking for gtest")
# Look for the sources.
find_file(GTEST_ALL_CC gtest-all.cc PATHS
${CMAKE_SOURCE_DIR}/third_party/googletest/googletest/src
/usr/src/gtest/src
NO_DEFAULT_PATH
)
if(GTEST_ALL_CC)
# ../.. from the source file is the source root.
get_filename_component(GTEST_SRC_DIR ${GTEST_ALL_CC} DIRECTORY)
get_filename_component(GTEST_SRC_ROOT ${GTEST_SRC_DIR} DIRECTORY)
# Look for the header file.
include(CheckIncludeFileCXX)
include_directories(SYSTEM ${GTEST_SRC_ROOT}/include)
check_include_file_cxx("gtest/gtest.h" HAVE_GTEST_GTEST_H)
if(HAVE_GTEST_GTEST_H)
message(STATUS "Found gtest: ${GTEST_SRC_ROOT}")
add_library(gtest
${GTEST_SRC_DIR}/gtest-all.cc
${GTEST_SRC_DIR}/gtest_main.cc)
target_include_directories(gtest PRIVATE ${GTEST_SRC_ROOT})
# Ignore all warnings for gtest. We don't care about their implementation.
check_cxx_compiler_flag("-w" HAVE_CXX_W QUIET)
if(HAVE_CXX_W)
set_target_properties(gtest PROPERTIES COMPILE_FLAGS "-w")
endif()
set(HAVE_GTEST TRUE)
set(TEST_CXX_FLAGS "")
check_cxx_compiler_flag("-Wno-global-constructors" HAVE_CXX_W_NO_GLOBAL_CONSTRUCTORS QUIET)
if(HAVE_CXX_W_NO_GLOBAL_CONSTRUCTORS)
set(TEST_CXX_FLAGS "${TEST_CXX_FLAGS} -Wno-global-constructors")
endif()
check_cxx_compiler_flag("-Wno-zero-as-null-pointer-constant" HAVE_CXX_W_NO_ZERO_AS_NULL_POINTER_CONSTANT QUIET)
if(HAVE_CXX_W_NO_ZERO_AS_NULL_POINTER_CONSTANT)
set(TEST_CXX_FLAGS "${TEST_CXX_FLAGS} -Wno-zero-as-null-pointer-constant")
endif()
endif()
endif()
function(unit_test subdir target)
if(HAVE_GTEST)
add_executable(unit_${target}_test ${subdir}/${target}_test.cc)
target_link_modules(unit_${target}_test toxcore gtest)
set_target_properties(unit_${target}_test PROPERTIES COMPILE_FLAGS "${TEST_CXX_FLAGS}")
add_test(NAME ${target} COMMAND ${CROSSCOMPILING_EMULATOR} unit_${target}_test)
set_property(TEST ${target} PROPERTY ENVIRONMENT "LLVM_PROFILE_FILE=${target}.profraw")
endif()
endfunction()

View File

@@ -1,76 +1,36 @@
############################################################################### ###############################################################################
# #
# :: For UNIX-like systems that have pkg-config. # :: For systems that have pkg-config.
# #
############################################################################### ###############################################################################
include(ModulePackage) find_package(PkgConfig REQUIRED)
find_package(Threads REQUIRED) find_library(NSL_LIBRARIES nsl )
find_library(RT_LIBRARIES rt )
find_library(SOCKET_LIBRARIES socket)
find_library(NSL_LIBRARIES nsl ) find_package(pthreads QUIET)
find_library(RT_LIBRARIES rt ) if(NOT TARGET PThreads4W::PThreads4W)
find_library(SOCKET_LIBRARIES socket ) set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
endif()
# For toxcore. # For toxcore.
pkg_use_module(LIBSODIUM libsodium ) pkg_search_module(LIBSODIUM libsodium IMPORTED_TARGET REQUIRED)
if(MSVC)
find_package(unofficial-sodium REQUIRED)
endif()
# For toxav. # For toxav.
pkg_use_module(OPUS "opus;Opus" ) pkg_search_module(OPUS opus IMPORTED_TARGET)
pkg_use_module(VPX "vpx;libvpx" ) if(NOT OPUS_FOUND)
pkg_search_module(OPUS Opus IMPORTED_TARGET)
endif()
pkg_search_module(VPX vpx IMPORTED_TARGET)
if(NOT VPX_FOUND)
pkg_search_module(VPX libvpx IMPORTED_TARGET)
endif()
# For tox-bootstrapd. # For tox-bootstrapd.
pkg_use_module(LIBCONFIG libconfig ) pkg_search_module(LIBCONFIG libconfig IMPORTED_TARGET)
###############################################################################
#
# :: For MSVC Windows builds.
#
# These require specific installation paths of dependencies:
# - libsodium in third-party/libsodium/Win32/Release/v140/dynamic
# - pthreads in third-party/pthreads-win32/Pre-built.2
#
###############################################################################
if(MSVC)
# libsodium
# ---------
if(NOT LIBSODIUM_FOUND)
find_library(LIBSODIUM_LIBRARIES
NAMES sodium libsodium
PATHS
"third_party/libsodium/Win32/Release/v140/dynamic"
"third_party/libsodium/x64/Release/v140/dynamic"
)
if(LIBSODIUM_LIBRARIES)
include_directories("third_party/libsodium/include")
set(LIBSODIUM_FOUND TRUE)
message("libsodium: ${LIBSODIUM_LIBRARIES}")
else()
message(FATAL_ERROR "libsodium libraries not found")
endif()
endif()
# pthreads
# --------
if(CMAKE_USE_WIN32_THREADS_INIT)
find_library(CMAKE_THREAD_LIBS_INIT
NAMES pthreadVC2
PATHS
"third_party/pthreads-win32/Pre-built.2/lib/x86"
"third_party/pthreads-win32/Pre-built.2/lib/x64"
)
if(CMAKE_THREAD_LIBS_INIT)
include_directories("third_party/pthreads-win32/Pre-built.2/include")
add_definitions(-DHAVE_STRUCT_TIMESPEC)
message("libpthreads: ${CMAKE_THREAD_LIBS_INIT}")
else()
find_package(pthreads4w)
if(NOT pthreads4w_FOUND)
message(FATAL_ERROR "libpthreads libraries not found")
endif()
include_directories(${pthreads4w_INCLUDE_DIR})
link_libraries(${pthreads4w_LIBRARIES})
endif()
endif()
endif()

View File

@@ -19,58 +19,8 @@ if(FULLY_STATIC)
set(ENABLE_STATIC ON) set(ENABLE_STATIC ON)
endif() endif()
find_package(PkgConfig)
function(pkg_use_module mod pkgs)
foreach(pkg IN ITEMS ${pkgs})
if(PKG_CONFIG_FOUND)
pkg_search_module(${mod} ${pkg})
endif()
if(NOT ${mod}_FOUND)
find_package(${pkg} QUIET)
# This is very very ugly, but the variables are sometimes used in this scope
# and sometimes in the parent scope, so we have to set them to both places.
set(${mod}_FOUND ${${pkg}_FOUND})
set(${mod}_FOUND ${${pkg}_FOUND} PARENT_SCOPE)
set(${mod}_LIBRARIES ${${pkg}_LIBS})
set(${mod}_LIBRARIES ${${pkg}_LIBS} PARENT_SCOPE)
set(${mod}_LIBRARY_DIRS ${${pkg}_LIBRARY_DIRS})
set(${mod}_LIBRARY_DIRS ${${pkg}_LIBRARY_DIRS} PARENT_SCOPE)
set(${mod}_INCLUDE_DIRS ${${pkg}_INCLUDE_DIRS})
set(${mod}_INCLUDE_DIRS ${${pkg}_INCLUDE_DIRS} PARENT_SCOPE)
endif()
if(${mod}_FOUND)
link_directories(${${mod}_LIBRARY_DIRS})
include_directories(${${mod}_INCLUDE_DIRS})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${${mod}_CFLAGS_OTHER}" PARENT_SCOPE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${${mod}_CFLAGS_OTHER}" PARENT_SCOPE)
if(NOT MSVC)
foreach(dir ${${mod}_INCLUDE_DIRS})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isystem ${dir}" PARENT_SCOPE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${dir}" PARENT_SCOPE)
endforeach()
endif()
break()
endif()
endforeach()
endfunction()
function(add_module lib)
set(${lib}_SOURCES ${ARGN} PARENT_SCOPE)
if(ENABLE_SHARED)
add_library(${lib}_shared SHARED ${ARGN})
set_target_properties(${lib}_shared PROPERTIES OUTPUT_NAME ${lib})
endif()
if(ENABLE_STATIC)
add_library(${lib}_static STATIC ${ARGN})
set_target_properties(${lib}_static PROPERTIES OUTPUT_NAME ${lib})
endif()
endfunction()
function(install_module lib) function(install_module lib)
if(ENABLE_SHARED) if(TARGET ${lib}_shared)
set_target_properties(${lib}_shared PROPERTIES set_target_properties(${lib}_shared PROPERTIES
VERSION ${SOVERSION} VERSION ${SOVERSION}
SOVERSION ${SOVERSION_MAJOR} SOVERSION ${SOVERSION_MAJOR}
@@ -80,7 +30,7 @@ function(install_module lib)
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif() endif()
if(ENABLE_STATIC) if(TARGET ${lib}_static)
install(TARGETS ${lib}_static install(TARGETS ${lib}_static
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
@@ -113,59 +63,3 @@ function(install_module lib)
install(FILES ${header} ${ARGN}) install(FILES ${header} ${ARGN})
endforeach() endforeach()
endfunction() endfunction()
function(target_link_modules target)
# If the target we're adding dependencies to is a shared library, add it to
# the set of targets.
if(TARGET ${target}_shared)
set(_targets ${_targets} ${target}_shared)
# Shared libraries should first try to link against other shared libraries.
set(${target}_shared_primary shared)
# If that fails (because the shared target doesn't exist), try linking
# against the static library. This requires the static library's objects to
# be PIC.
set(${target}_shared_secondary static)
endif()
# It can also be a static library at the same time.
if(TARGET ${target}_static)
set(_targets ${_targets} ${target}_static)
# Static libraries aren't actually linked, but their dependencies are
# recorded by "linking" them. If we link an executable to a static library,
# we want to also link statically against its transitive dependencies.
set(${target}_static_primary static)
# If a dependency doesn't exist as static library, we link against the
# shared one.
set(${target}_static_secondary shared)
endif()
# If it's neither, then it's an executable.
if(NOT _targets)
set(_targets ${_targets} ${target})
# Executables preferably link against static libraries, so they are
# standalone and can be shipped without any external dependencies. As a
# frame of reference: tests become roughly 600-800K binaries instead of
# 50-100K on x86_64 Linux.
set(${target}_primary static)
set(${target}_secondary shared)
endif()
foreach(dep ${ARGN})
foreach(_target ${_targets})
if(TARGET ${dep}_${${_target}_primary})
target_link_libraries(${_target} ${dep}_${${_target}_primary})
elseif(TARGET ${dep}_${${_target}_secondary})
target_link_libraries(${_target} ${dep}_${${_target}_secondary})
else()
# We record the modules linked to this target, so that we can collect
# them later when linking a composed module.
list(FIND LINK_MODULES ${dep} _index)
if(_index EQUAL -1)
set(LINK_MODULES ${LINK_MODULES} ${dep})
endif()
target_link_libraries(${_target} ${dep})
endif()
endforeach()
endforeach()
set(${target}_LINK_MODULES ${${target}_LINK_MODULES} ${LINK_MODULES} PARENT_SCOPE)
endfunction()

View File

@@ -29,7 +29,7 @@ function(_make_version_script target)
list(GET sublib 1 ns) list(GET sublib 1 ns)
execute_process( execute_process(
COMMAND ${SHELL} -c "egrep '^\\w' ${header} | grep '${ns}_[a-z0-9_]*(' | grep -v '^typedef' | grep -o '${ns}_[a-z0-9_]*(' | egrep -o '\\w+' | sort -u" COMMAND ${SHELL} -c "egrep '^\\w' ${header} | grep '${ns}_[a-z0-9_]*(' | grep -v '^typedef' | grep -o '${ns}_[a-z0-9_]*(' | egrep -o '[a-z0-9_]+' | sort -u"
OUTPUT_VARIABLE sublib_SYMS OUTPUT_VARIABLE sublib_SYMS
OUTPUT_STRIP_TRAILING_WHITESPACE) OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE "\n" ";" sublib_SYMS ${sublib_SYMS}) string(REPLACE "\n" ";" sublib_SYMS ${sublib_SYMS})

View File

@@ -22,8 +22,6 @@ BUILD_AV="yes"
BUILD_TESTING="yes" BUILD_TESTING="yes"
LIBCONFIG_FOUND="no" LIBCONFIG_FOUND="no"
WANT_NACL="no"
ADD_NACL_OBJECTS_TO_PKGCONFIG="yes"
SET_SO_VERSION="yes" SET_SO_VERSION="yes"
AC_ARG_ENABLE([soname-versions], AC_ARG_ENABLE([soname-versions],
@@ -38,26 +36,11 @@ AC_ARG_ENABLE([soname-versions],
) )
AM_CONDITIONAL(SET_SO_VERSION, test "x$SET_SO_VERSION" = "xyes") AM_CONDITIONAL(SET_SO_VERSION, test "x$SET_SO_VERSION" = "xyes")
AC_ARG_ENABLE([nacl],
[AC_HELP_STRING([--enable-nacl], [use nacl instead of libsodium (default: disabled)]) ],
[
if test "x$enableval" = "xno"; then
WANT_NACL="no"
elif test "x$enableval" = "xyes"; then
WANT_NACL="yes"
fi
]
)
AC_ARG_ENABLE([randombytes-stir], AC_ARG_ENABLE([randombytes-stir],
[AC_HELP_STRING([--enable-randombytes-stir], [use randombytes_stir() instead of sodium_init() for faster startup on android (default: disabled)]) ], [AC_HELP_STRING([--enable-randombytes-stir], [use randombytes_stir() instead of sodium_init() for faster startup on android (default: disabled)]) ],
[ [
if test "x$enableval" = "xyes"; then if test "x$enableval" = "xyes"; then
if test "x$WANT_NACL" = "xyes"; then AC_DEFINE([USE_RANDOMBYTES_STIR], [1], [randombytes_stir() instead of sodium_init()])
AC_MSG_WARN([randombytes_stir() is not available with NaCl library])
else
AC_DEFINE([USE_RANDOMBYTES_STIR], [1], [randombytes_stir() instead of sodium_init()])
fi
fi fi
] ]
) )
@@ -171,16 +154,6 @@ if test "$use_ipv6" != "yes"; then
AC_DEFINE([USE_IPV6],[0],[define to 0 to force ipv4]) AC_DEFINE([USE_IPV6],[0],[define to 0 to force ipv4])
fi fi
AC_ARG_ENABLE([[test_network]],
[AS_HELP_STRING([[--enable-test-network[=ARG]]], [build tox for a test network incompatible with the main DHT [no]])],
[use_test_network=${enableval}],
[use_test_network='no']
)
if test "$use_test_network" == "yes"; then
AC_DEFINE([USE_TEST_NETWORK],[1],[define to 1 to enable the test network])
fi
AX_HAVE_EPOLL AX_HAVE_EPOLL
if test "$enable_epoll" != "no"; then if test "$enable_epoll" != "no"; then
if test "${ax_cv_have_epoll}" = "yes"; then if test "${ax_cv_have_epoll}" = "yes"; then
@@ -197,8 +170,6 @@ fi
DEPSEARCH= DEPSEARCH=
LIBSODIUM_SEARCH_HEADERS= LIBSODIUM_SEARCH_HEADERS=
LIBSODIUM_SEARCH_LIBS= LIBSODIUM_SEARCH_LIBS=
NACL_SEARCH_HEADERS=
NACL_SEARCH_LIBS=
AC_ARG_WITH(dependency-search, AC_ARG_WITH(dependency-search,
AC_HELP_STRING([--with-dependency-search=DIR], AC_HELP_STRING([--with-dependency-search=DIR],
@@ -216,24 +187,6 @@ if test -n "$DEPSEARCH"; then
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$DEPSEARCH/lib/pkgconfig export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$DEPSEARCH/lib/pkgconfig
fi fi
AC_ARG_WITH(nacl-headers,
AC_HELP_STRING([--with-nacl-headers=DIR],
[search for nacl<F2> header files in DIR]),
[
NACL_SEARCH_HEADERS="$withval"
AC_MSG_NOTICE([will search for nacl header files in $withval])
]
)
AC_ARG_WITH(nacl-libs,
AC_HELP_STRING([--with-nacl-libs=DIR],
[search for nacl libraries in DIR]),
[
NACL_SEARCH_LIBS="$withval"
AC_MSG_NOTICE([will search for nacl libraries in $withval])
]
)
AC_ARG_WITH(libsodium-headers, AC_ARG_WITH(libsodium-headers,
AC_HELP_STRING([--with-libsodium-headers=DIR], AC_HELP_STRING([--with-libsodium-headers=DIR],
[search for libsodium header files in DIR]), [search for libsodium header files in DIR]),
@@ -252,11 +205,6 @@ AC_ARG_WITH(libsodium-libs,
] ]
) )
if test "x$WANT_NACL" = "xyes"; then
enable_shared=no
enable_static=yes
fi
# Checks for programs. # Checks for programs.
AC_PROG_CC_C99 AC_PROG_CC_C99
@@ -287,7 +235,6 @@ case $host_os in
LDFLAGS="$LDFLAGS -L/usr/local/lib" LDFLAGS="$LDFLAGS -L/usr/local/lib"
CFLAGS="$CFLAGS -I/usr/local/include" CFLAGS="$CFLAGS -I/usr/local/include"
CPPFLAGS="$CPPFLAGS -I/usr/local/include" CPPFLAGS="$CPPFLAGS -I/usr/local/include"
ADD_NACL_OBJECTS_TO_PKGCONFIG="no"
;; ;;
darwin*) darwin*)
MACH=yes MACH=yes
@@ -312,50 +259,7 @@ PKG_CHECK_MODULES([LIBSODIUM], [libsodium],
LIBSODIUM_FOUND="no" LIBSODIUM_FOUND="no"
]) ])
if test "x$WANT_NACL" = "xyes"; then if test "x$LIBSODIUM_FOUND" = "xno"; then
NACL_LIBS=
NACL_LDFLAGS=
NACL_OBJECTS=
NACL_OBJECTS_PKGCONFIG=
LDFLAGS_SAVE="$LDFLAGS"
if test -n "$NACL_SEARCH_LIBS"; then
LDFLAGS="-L$NACL_SEARCH_LIBS $LDFLAGS"
AC_CHECK_LIB(nacl, random,
[
NACL_LDFLAGS="-L$NACL_SEARCH_LIBS"
NACL_LIBS="-lnacl"
],
[
AC_MSG_ERROR([library nacl was not found in requested location $NACL_SEARCH_LIBS])
]
)
else
AC_CHECK_LIB(nacl, random,
[],
[
AC_MSG_ERROR([you enabled nacl support, but library nacl was not found on your system])
]
)
fi
if (test -f "$NACL_SEARCH_LIBS/cpucycles.o") &&
(test -f "$NACL_SEARCH_LIBS/randombytes.o"); then
NACL_OBJECTS="$NACL_SEARCH_LIBS/cpucycles.o $NACL_SEARCH_LIBS/randombytes.o"
AC_MSG_NOTICE([found extra NaCl objects: $NACL_OBJECTS])
if test "x$ADD_NACL_OBJECTS_TO_PKGCONFIG" = "xyes"; then
AC_MSG_NOTICE([adding extra NaCl objects to pkg-config file])
NACL_OBJECTS_PKGCONFIG="$NACL_OBJECTS"
fi
else
AC_MSG_ERROR([required NaCl object files cpucycles.o randombytes.o not found, please specify their location using the --with-nacl-libs parameter])
fi
LDFLAGS="$LDFLAGS_SAVE"
AC_SUBST(NACL_LIBS)
AC_SUBST(NACL_LDFLAGS)
AC_SUBST(NACL_OBJECTS)
AC_SUBST(NACL_OBJECTS_PKGCONFIG)
elif test "x$LIBSODIUM_FOUND" = "xno"; then
LIBSODIUM_LIBS= LIBSODIUM_LIBS=
LIBSODIUM_LDFLAGS= LIBSODIUM_LDFLAGS=
LDFLAGS_SAVE="$LDFLAGS" LDFLAGS_SAVE="$LDFLAGS"
@@ -388,34 +292,7 @@ fi
AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stdint.h stdlib.h string.h sys/socket.h sys/time.h unistd.h]) AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stdint.h stdlib.h string.h sys/socket.h sys/time.h unistd.h])
if test "x$WANT_NACL" = "xyes"; then if test "x$LIBSODIUM_FOUND" = "xno"; then
NACL_CFLAGS=
CFLAGS_SAVE="$CFLAGS"
CPPFLAGS_SAVE="$CPPFLAGS"
if test -n "$NACL_SEARCH_HEADERS"; then
CFLAGS="-I$NACL_SEARCH_HEADERS $CFLAGS"
CPPFLAGS="-I$NACL_SEARCH_HEADERS $CPPFLAGS"
AC_CHECK_HEADER(crypto_box.h,
[
NACL_CFLAGS="-I$NACL_SEARCH_HEADERS"
],
[
AC_MSG_ERROR([header files for library nacl were not found in requested location $NACL_SEARCH_HEADERS])
]
)
else
AC_CHECK_HEADER(crypto_box.h,
[],
[
AC_MSG_ERROR([you enabled nacl support, but nacl header files were not found on your system])
]
)
fi
CFLAGS="$CFLAGS_SAVE"
CPPFLAGS="$CPPFLAGS_SAVE"
AC_SUBST(NACL_CFLAGS)
AC_DEFINE([VANILLA_NACL], [1], [use nacl instead of libsodium])
elif test "x$LIBSODIUM_FOUND" = "xno"; then
LIBSODIUM_CFLAGS= LIBSODIUM_CFLAGS=
CFLAGS_SAVE="$CFLAGS" CFLAGS_SAVE="$CFLAGS"
CPPFLAGS_SAVE="$CPPFLAGS" CPPFLAGS_SAVE="$CPPFLAGS"
@@ -555,7 +432,6 @@ AM_CONDITIONAL(BUILD_DHT_BOOTSTRAP, test "x$BUILD_DHT_BOOTSTRAP" = "xyes")
AM_CONDITIONAL(BUILD_TESTS, test "x$BUILD_TESTS" = "xyes") AM_CONDITIONAL(BUILD_TESTS, test "x$BUILD_TESTS" = "xyes")
AM_CONDITIONAL(BUILD_AV, test "x$BUILD_AV" = "xyes") AM_CONDITIONAL(BUILD_AV, test "x$BUILD_AV" = "xyes")
AM_CONDITIONAL(BUILD_TESTING, test "x$BUILD_TESTING" = "xyes") AM_CONDITIONAL(BUILD_TESTING, test "x$BUILD_TESTING" = "xyes")
AM_CONDITIONAL(WITH_NACL, test "x$WANT_NACL" = "xyes")
AM_CONDITIONAL(WIN32, test "x$WIN32" = "xyes") AM_CONDITIONAL(WIN32, test "x$WIN32" = "xyes")
AC_CONFIG_FILES([Makefile AC_CONFIG_FILES([Makefile

View File

@@ -49,7 +49,7 @@ The public/private key pair the TCP server uses is the same one he uses for the
DHT. DHT.
all crypto for communication with the server uses the crypto_box() function of all crypto for communication with the server uses the crypto_box() function of
NaCl. libsodium.
TCP doesn't have packets so what we will refer to as packets are sent this way: TCP doesn't have packets so what we will refer to as packets are sent this way:
[[uint16_t (length of data)][data]] [[uint16_t (length of data)][data]]

View File

@@ -1,4 +1,4 @@
Encryption library used: http://nacl.cr.yp.to/ Encryption library used: https://doc.libsodium.org/
When running the program for the first time the crypto_box_keypair() function is used to When running the program for the first time the crypto_box_keypair() function is used to

View File

@@ -1,4 +0,0 @@
---
build:
docker:
web: other/bootstrap_daemon/websocket/Dockerfile

View File

@@ -7,5 +7,5 @@ Name: libtoxcore
Description: Tox protocol library Description: Tox protocol library
Requires: Requires:
Version: @PACKAGE_VERSION@ Version: @PACKAGE_VERSION@
Libs: @NACL_OBJECTS_PKGCONFIG@ -L${libdir} -ltoxcore @NACL_LDFLAGS@ -ltoxencryptsave @NACL_LIBS@ @LIBS@ @MATH_LDFLAGS@ @PTHREAD_LDFLAGS@ Libs: -L${libdir} -ltoxcore -ltoxencryptsave @LIBS@ @MATH_LDFLAGS@ @PTHREAD_LDFLAGS@
Cflags: -I${includedir} Cflags: -I${includedir}

View File

@@ -1,8 +1,6 @@
load("@rules_cc//cc:defs.bzl", "cc_binary") load("@rules_cc//cc:defs.bzl", "cc_binary")
load("//tools:no_undefined.bzl", "cc_library") load("//tools:no_undefined.bzl", "cc_library")
package(features = ["layering_check"])
cc_library( cc_library(
name = "bootstrap_node_packets", name = "bootstrap_node_packets",
srcs = ["bootstrap_node_packets.c"], srcs = ["bootstrap_node_packets.c"],
@@ -23,13 +21,11 @@ cc_binary(
"//c-toxcore/toxcore:Messenger", "//c-toxcore/toxcore:Messenger",
"//c-toxcore/toxcore:TCP_server", "//c-toxcore/toxcore:TCP_server",
"//c-toxcore/toxcore:ccompat", "//c-toxcore/toxcore:ccompat",
"//c-toxcore/toxcore:friend_requests",
"//c-toxcore/toxcore:group_onion_announce", "//c-toxcore/toxcore:group_onion_announce",
"//c-toxcore/toxcore:logger", "//c-toxcore/toxcore:logger",
"//c-toxcore/toxcore:mono_time", "//c-toxcore/toxcore:mono_time",
"//c-toxcore/toxcore:network", "//c-toxcore/toxcore:network",
"//c-toxcore/toxcore:onion_announce", "//c-toxcore/toxcore:onion_announce",
"//c-toxcore/toxcore:tox", "//c-toxcore/toxcore:tox",
"//c-toxcore/toxcore:util",
], ],
) )

View File

@@ -16,12 +16,17 @@
#include "../toxcore/DHT.h" #include "../toxcore/DHT.h"
#include "../toxcore/LAN_discovery.h" #include "../toxcore/LAN_discovery.h"
#include "../toxcore/ccompat.h" #include "../toxcore/ccompat.h"
#include "../toxcore/friend_requests.h" #include "../toxcore/crypto_core.h"
#include "../toxcore/forwarding.h"
#include "../toxcore/group_announce.h"
#include "../toxcore/group_onion_announce.h" #include "../toxcore/group_onion_announce.h"
#include "../toxcore/logger.h" #include "../toxcore/logger.h"
#include "../toxcore/mem.h"
#include "../toxcore/mono_time.h" #include "../toxcore/mono_time.h"
#include "../toxcore/network.h"
#include "../toxcore/onion.h"
#include "../toxcore/onion_announce.h"
#include "../toxcore/tox.h" #include "../toxcore/tox.h"
#include "../toxcore/util.h"
#define TCP_RELAY_ENABLED #define TCP_RELAY_ENABLED
@@ -46,7 +51,7 @@ static const char *motd_str = ""; //Change this to anything within 256 bytes(but
#define PORT 33445 #define PORT 33445
static void manage_keys(DHT *dht) static bool manage_keys(DHT *dht)
{ {
enum { KEYS_SIZE = CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_SECRET_KEY_SIZE }; enum { KEYS_SIZE = CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_SECRET_KEY_SIZE };
uint8_t keys[KEYS_SIZE]; uint8_t keys[KEYS_SIZE];
@@ -60,7 +65,8 @@ static void manage_keys(DHT *dht)
if (read_size != KEYS_SIZE) { if (read_size != KEYS_SIZE) {
printf("Error while reading the key file\nExiting.\n"); printf("Error while reading the key file\nExiting.\n");
exit(1); fclose(keys_file);
return false;
} }
dht_set_self_public_key(dht, keys); dht_set_self_public_key(dht, keys);
@@ -73,18 +79,20 @@ static void manage_keys(DHT *dht)
if (keys_file == nullptr) { if (keys_file == nullptr) {
printf("Error opening key file in write mode.\nKeys will not be saved.\n"); printf("Error opening key file in write mode.\nKeys will not be saved.\n");
return; return false;
} }
if (fwrite(keys, sizeof(uint8_t), KEYS_SIZE, keys_file) != KEYS_SIZE) { if (fwrite(keys, sizeof(uint8_t), KEYS_SIZE, keys_file) != KEYS_SIZE) {
printf("Error while writing the key file.\nExiting.\n"); printf("Error while writing the key file.\nExiting.\n");
exit(1); fclose(keys_file);
return false;
} }
printf("Keys saved successfully.\n"); printf("Keys saved successfully.\n");
} }
fclose(keys_file); fclose(keys_file);
return true;
} }
static const char *strlevel(Logger_Level level) static const char *strlevel(Logger_Level level)
@@ -121,7 +129,7 @@ int main(int argc, char *argv[])
if (argc == 2 && !tox_strncasecmp(argv[1], "-h", 3)) { if (argc == 2 && !tox_strncasecmp(argv[1], "-h", 3)) {
printf("Usage (connected) : %s [--ipv4|--ipv6] IP PORT KEY\n", argv[0]); printf("Usage (connected) : %s [--ipv4|--ipv6] IP PORT KEY\n", argv[0]);
printf("Usage (unconnected): %s [--ipv4|--ipv6]\n", argv[0]); printf("Usage (unconnected): %s [--ipv4|--ipv6]\n", argv[0]);
exit(0); return 0;
} }
/* let user override default by cmdline */ /* let user override default by cmdline */
@@ -129,7 +137,7 @@ int main(int argc, char *argv[])
int argvoffset = cmdline_parsefor_ipv46(argc, argv, &ipv6enabled); int argvoffset = cmdline_parsefor_ipv46(argc, argv, &ipv6enabled);
if (argvoffset < 0) { if (argvoffset < 0) {
exit(1); return 1;
} }
/* Initialize networking - /* Initialize networking -
@@ -162,14 +170,16 @@ int main(int argc, char *argv[])
if (!(onion && forwarding && onion_a)) { if (!(onion && forwarding && onion_a)) {
printf("Something failed to initialize.\n"); printf("Something failed to initialize.\n");
exit(1); return 1;
} }
gca_onion_init(gc_announces_list, onion_a); gca_onion_init(gc_announces_list, onion_a);
perror("Initialization"); perror("Initialization");
manage_keys(dht); if (!manage_keys(dht)) {
return 1;
}
printf("Public key: "); printf("Public key: ");
#ifdef TCP_RELAY_ENABLED #ifdef TCP_RELAY_ENABLED
@@ -179,7 +189,7 @@ int main(int argc, char *argv[])
if (tcp_s == nullptr) { if (tcp_s == nullptr) {
printf("TCP server failed to initialize.\n"); printf("TCP server failed to initialize.\n");
exit(1); return 1;
} }
#endif #endif
@@ -189,7 +199,7 @@ int main(int argc, char *argv[])
if (file == nullptr) { if (file == nullptr) {
printf("Could not open file \"%s\" for writing. Exiting...\n", public_id_filename); printf("Could not open file \"%s\" for writing. Exiting...\n", public_id_filename);
exit(1); return 1;
} }
for (uint32_t i = 0; i < 32; ++i) { for (uint32_t i = 0; i < 32; ++i) {
@@ -210,7 +220,7 @@ int main(int argc, char *argv[])
if (port_conv <= 0 || port_conv > UINT16_MAX) { if (port_conv <= 0 || port_conv > UINT16_MAX) {
printf("Failed to convert \"%s\" into a valid port. Exiting...\n", argv[argvoffset + 2]); printf("Failed to convert \"%s\" into a valid port. Exiting...\n", argv[argvoffset + 2]);
exit(1); return 1;
} }
const uint16_t port = net_htons((uint16_t)port_conv); const uint16_t port = net_htons((uint16_t)port_conv);
@@ -222,7 +232,7 @@ int main(int argc, char *argv[])
if (!res) { if (!res) {
printf("Failed to convert \"%s\" into an IP address. Exiting...\n", argv[argvoffset + 1]); printf("Failed to convert \"%s\" into an IP address. Exiting...\n", argv[argvoffset + 1]);
exit(1); return 1;
} }
} }

View File

@@ -9,16 +9,12 @@ DHT_bootstrap_SOURCES = ../other/DHT_bootstrap.c \
../other/bootstrap_node_packets.c ../other/bootstrap_node_packets.c
DHT_bootstrap_CFLAGS = -I$(top_srcdir)/other \ DHT_bootstrap_CFLAGS = -I$(top_srcdir)/other \
$(LIBSODIUM_CFLAGS) \ $(LIBSODIUM_CFLAGS)
$(NACL_CFLAGS)
DHT_bootstrap_LDADD = $(LIBSODIUM_LDFLAGS) \ DHT_bootstrap_LDADD = $(LIBSODIUM_LDFLAGS) \
$(NACL_LDFLAGS) \
libmisc_tools.la \ libmisc_tools.la \
libtoxcore.la \ libtoxcore.la \
$(LIBSODIUM_LIBS) \ $(LIBSODIUM_LIBS) \
$(NACL_OBJECTS) \
$(NACL_LIBS) \
$(WINSOCK2_LIBS) $(WINSOCK2_LIBS)
endif endif

View File

@@ -31,8 +31,8 @@ out = (subprocess.run(
errors = 0 errors = 0
for line in out.split("\n"): for line in out.split("\n"):
# other/fun can do what it wants. # other/fun and mallocfail can do what they want.
if "/fun/" in line: if "/fun/" in line or "/mallocfail/" in line:
continue continue
filename, include = line.split(":", 1) filename, include = line.split(":", 1)
# We only check headers. # We only check headers.

View File

@@ -15,7 +15,7 @@ CPPFLAGS+=("-Itoxav")
CPPFLAGS+=("-Itoxencryptsave") CPPFLAGS+=("-Itoxencryptsave")
CPPFLAGS+=("-Ithird_party/cmp") CPPFLAGS+=("-Ithird_party/cmp")
LDFLAGS=("-lopus" "-lsodium" "-lvpx" "-lpthread" "-lconfig" "-lgtest") LDFLAGS=("-lopus" "-lsodium" "-lvpx" "-lpthread" "-lconfig" "-lgmock" "-lgtest")
LDFLAGS+=("-fuse-ld=gold") LDFLAGS+=("-fuse-ld=gold")
LDFLAGS+=("-Wl,--detect-odr-violations") LDFLAGS+=("-Wl,--detect-odr-violations")
LDFLAGS+=("-Wl,--warn-common") LDFLAGS+=("-Wl,--warn-common")

View File

@@ -10,7 +10,7 @@ run() {
"${CPPFLAGS[@]}" \ "${CPPFLAGS[@]}" \
"${LDFLAGS[@]}" \ "${LDFLAGS[@]}" \
"$@" \ "$@" \
-std=c++11 \ -std=c++17 \
-Werror \ -Werror \
-Weverything \ -Weverything \
-Wno-alloca \ -Wno-alloca \

View File

@@ -9,7 +9,7 @@ run() {
clang++ --analyze amalgamation.cc \ clang++ --analyze amalgamation.cc \
"${CPPFLAGS[@]}" \ "${CPPFLAGS[@]}" \
"$@" \ "$@" \
-std=c++11 -std=c++20
} }
. other/analysis/variants.sh . other/analysis/variants.sh

View File

@@ -1,6 +1,67 @@
#!/bin/bash #!/usr/bin/env bash
CHECKS="*" CHECKS="*"
ERRORS="*"
# Need to investigate or disable and document these.
# =========================================================
# TODO(iphydf): Fix these.
ERRORS="$ERRORS,-cert-err34-c"
ERRORS="$ERRORS,-readability-suspicious-call-argument"
# TODO(iphydf): Fix once cimple 0.0.19 is released.
CHECKS="$CHECKS,-google-readability-casting"
# TODO(iphydf): Fix these.
CHECKS="$CHECKS,-bugprone-switch-missing-default-case"
# TODO(iphydf): We might want some of these. For the ones we don't want, add a
# comment explaining why not.
CHECKS="$CHECKS,-clang-analyzer-optin.performance.Padding"
CHECKS="$CHECKS,-hicpp-signed-bitwise"
# TODO(iphydf): Maybe fix these?
CHECKS="$CHECKS,-bugprone-implicit-widening-of-multiplication-result"
CHECKS="$CHECKS,-bugprone-integer-division"
CHECKS="$CHECKS,-misc-no-recursion"
# TODO(iphydf): Only happens in bootstrap_daemon. Fix it.
CHECKS="$CHECKS,-cppcoreguidelines-avoid-non-const-global-variables"
# TODO(iphydf): Probably fix these.
CHECKS="$CHECKS,-cert-err33-c"
CHECKS="$CHECKS,-cppcoreguidelines-avoid-magic-numbers"
CHECKS="$CHECKS,-readability-magic-numbers"
# TODO(iphydf): We're using a lot of macros for constants. Should we convert
# all of them to enum?
CHECKS="$CHECKS,-modernize-macro-to-enum"
# Documented disabled checks. We don't want these for sure.
# =========================================================
# https://stackoverflow.com/questions/58672959/why-does-clang-tidy-say-vsnprintf-has-an-uninitialized-va-list-argument
CHECKS="$CHECKS,-clang-analyzer-valist.Uninitialized"
# We pass a lot of ints around, so many function parameters are some kind of
# int type that can be converted from another int type. We won't be getting
# away from that anytime soon.
CHECKS="$CHECKS,-bugprone-easily-swappable-parameters"
# Callback handlers often don't use all their parameters. There's
# IgnoreVirtual, but that doesn't work for C-style callbacks.
CHECKS="$CHECKS,-misc-unused-parameters"
# We sometimes use #if 0.
CHECKS="$CHECKS,-readability-avoid-unconditional-preprocessor-if"
# We have better macro hygiene checks with tokstyle. We can never pass macro
# arguments that require parentheses inside the macro.
CHECKS="$CHECKS,-bugprone-macro-parentheses"
# We don't use memcpy_s.
CHECKS="$CHECKS,-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling"
# __attribute__((nonnull)) causes this warning on defensive null checks. # __attribute__((nonnull)) causes this warning on defensive null checks.
CHECKS="$CHECKS,-clang-diagnostic-pointer-bool-conversion" CHECKS="$CHECKS,-clang-diagnostic-pointer-bool-conversion"
@@ -57,62 +118,69 @@ CHECKS="$CHECKS,-readability-redundant-control-flow"
CHECKS="$CHECKS,-bugprone-narrowing-conversions" CHECKS="$CHECKS,-bugprone-narrowing-conversions"
CHECKS="$CHECKS,-cppcoreguidelines-narrowing-conversions" CHECKS="$CHECKS,-cppcoreguidelines-narrowing-conversions"
# TODO(iphydf): We might want some of these. For the ones we don't want, add a # Mistakenly thinks that
# comment explaining why not. # const int a = 0, b = 1;
CHECKS="$CHECKS,-clang-analyzer-optin.performance.Padding" # assert(a < b);
CHECKS="$CHECKS,-hicpp-signed-bitwise" # is a constant expression in C (it is in C++ though, which is probably why it's
CHECKS="$CHECKS,-misc-unused-parameters" # mistaken), suggesting to replace 'assert()' with 'static_assert()' in cases
CHECKS="$CHECKS,-readability-function-cognitive-complexity" # where that won't work.
#
# TODO(iphydf): Maybe fix these? # There are ways to make 'static_assert()' work, but they are rather annoying --
CHECKS="$CHECKS,-bugprone-easily-swappable-parameters" # they are somewhat ugly, hurting the readability, and some are error-prone:
CHECKS="$CHECKS,-bugprone-implicit-widening-of-multiplication-result" #
CHECKS="$CHECKS,-bugprone-integer-division" # - Turning 'a' and 'b' into enum constants would make it work, but this falls
CHECKS="$CHECKS,-clang-analyzer-core.NullDereference" # apart if the enum types are compared against non-enums down the line
CHECKS="$CHECKS,-clang-analyzer-valist.Uninitialized" # error: enumerated and non-enumerated type in conditional expression [-Werror=extra]
CHECKS="$CHECKS,-concurrency-mt-unsafe" #
CHECKS="$CHECKS,-cppcoreguidelines-avoid-non-const-global-variables" # - Turning 'a' and 'b' into pre-processor macros is the only option left, but
CHECKS="$CHECKS,-misc-no-recursion" # #defines and #undefs in the middle of a function hurt the readability and
# are less idiomatic than simply using 'const int'.
# TODO(iphydf): Probably fix these. CHECKS="$CHECKS,-cert-dcl03-c"
CHECKS="$CHECKS,-cert-err33-c" CHECKS="$CHECKS,-hicpp-static-assert"
CHECKS="$CHECKS,-cppcoreguidelines-avoid-magic-numbers" CHECKS="$CHECKS,-misc-static-assert"
CHECKS="$CHECKS,-google-readability-casting"
CHECKS="$CHECKS,-modernize-macro-to-enum"
CHECKS="$CHECKS,-readability-magic-numbers"
# TODO(iphydf): These two trip on list.c. Investigate why.
CHECKS="$CHECKS,-clang-analyzer-core.NonNullParamChecker"
CHECKS="$CHECKS,-clang-analyzer-unix.Malloc"
ERRORS="*"
# TODO(iphydf): Fix these.
ERRORS="$ERRORS,-bugprone-macro-parentheses"
ERRORS="$ERRORS,-cert-err34-c"
ERRORS="$ERRORS,-cert-str34-c"
ERRORS="$ERRORS,-readability-suspicious-call-argument"
set -eux set -eux
# TODO(iphydf): Add toxav.
DIRS=(
other/bootstrap_daemon/src
other
toxcore
toxcore/events
toxencryptsave
)
copy_files() {
find "${DIRS[@]}" \
-maxdepth 1 -type d -exec mkdir -p "$1/{}" \;
find "${DIRS[@]}" \
-maxdepth 1 -name "*.c" -exec cp "{}" "$1/{}" \;
}
run() { run() {
echo "Running clang-tidy in variant '$*'" echo "Running clang-tidy in variant '$*'"
EXTRA_ARGS=("$@") EXTRA_ARGS=("$@")
for i in "${!EXTRA_ARGS[@]}"; do for i in "${!EXTRA_ARGS[@]}"; do
EXTRA_ARGS[$i]="--extra-arg=${EXTRA_ARGS[$i]}" EXTRA_ARGS[$i]="--extra-arg=${EXTRA_ARGS[$i]}"
done done
clang-tidy-14 \ ls .clang-tidy
-p=_build \ copy_files a
--extra-arg=-DMIN_LOGGER_LEVEL=LOGGER_LEVEL_TRACE \ if ! find "${DIRS[@]}" \
"${EXTRA_ARGS[@]}" \ -maxdepth 1 -name "*.c" -print0 \
--checks="$CHECKS" \ | xargs -0 -n15 -P"$(nproc)" clang-tidy \
--warnings-as-errors="$ERRORS" \ -p="$PWD/_build" \
--use-color \ --extra-arg=-DMIN_LOGGER_LEVEL=LOGGER_LEVEL_TRACE \
other/bootstrap_daemon/src/*.c \ "${EXTRA_ARGS[@]}" \
other/*.c \ --fix \
toxav/*.c \ --checks="$CHECKS" \
toxcore/*.c \ --warnings-as-errors="$ERRORS" \
toxencryptsave/*.c --use-color; then
copy_files b
colordiff -ru a b
rm -rf a b
false
fi
rm -rf a
} }
cmake . -B_build -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON cmake . -B_build -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

View File

@@ -8,9 +8,12 @@ set -e
CPPCHECK=("--enable=all") CPPCHECK=("--enable=all")
CPPCHECK+=("--inconclusive") CPPCHECK+=("--inconclusive")
CPPCHECK+=("--check-level=exhaustive")
CPPCHECK+=("--inline-suppr")
CPPCHECK+=("--library=other/docker/cppcheck/toxcore.cfg")
CPPCHECK+=("--error-exitcode=1") CPPCHECK+=("--error-exitcode=1")
# Used for VLA. # We don't cast function pointers, which cppcheck suggests here.
CPPCHECK+=("--suppress=allocaCalled") CPPCHECK+=("--suppress=constParameterCallback")
# False positives in switch statements. # False positives in switch statements.
CPPCHECK+=("--suppress=knownConditionTrueFalse") CPPCHECK+=("--suppress=knownConditionTrueFalse")
# Cppcheck does not need standard library headers to get proper results. # Cppcheck does not need standard library headers to get proper results.
@@ -19,27 +22,24 @@ CPPCHECK+=("--suppress=missingIncludeSystem")
CPPCHECK+=("--suppress=signConversion") CPPCHECK+=("--suppress=signConversion")
# TODO(iphydf): Fixed in the toxav refactor PR. # TODO(iphydf): Fixed in the toxav refactor PR.
CPPCHECK+=("--suppress=redundantAssignment") CPPCHECK+=("--suppress=redundantAssignment")
# We have some redundant nullptr checks in assertions
CPPCHECK+=("--suppress=nullPointerRedundantCheck")
# Triggers a false warning in group.c
CPPCHECK+=("--suppress=AssignmentAddressToInteger")
# TODO(sudden6): This triggers a false positive, check again later to enable it
CPPCHECK+=("--suppress=arrayIndexOutOfBoundsCond")
# We're a library. This only works on whole programs.
CPPCHECK_C=("--suppress=unusedFunction")
# We use this for VLAs.
CPPCHECK_CXX+=("--suppress=allocaCalled")
# False positive in auto_tests. # False positive in auto_tests.
CPPCHECK_CXX+=("--suppress=shadowArgument")
CPPCHECK_CXX+=("--suppress=shadowFunction") CPPCHECK_CXX+=("--suppress=shadowFunction")
# False positive for callback functions # False positive in group.c.
CPPCHECK_CXX+=("--suppress=constParameter") # Using cppcheck-suppress claims the suppression is unused.
CPPCHECK_CXX+=("--suppress=AssignmentAddressToInteger")
# We use C style casts because we write C code.
CPPCHECK_CXX+=("--suppress=cstyleCast")
# Used in Messenger.c for a static_assert(...) # Used in Messenger.c for a static_assert(...)
CPPCHECK_CXX+=("--suppress=sizeofFunctionCall") CPPCHECK_CXX+=("--suppress=sizeofFunctionCall")
# This is outdated. Range-for is a good choice.
CPPCHECK_CXX+=("--suppress=useStlAlgorithm")
run() { run() {
echo "Running cppcheck in variant '$*'" echo "Running cppcheck in variant '$*'"
cppcheck "${CPPCHECK[@]}" "${CPPCHECK_C[@]}" tox*/*.[ch] tox*/*/*.[ch] "${CPPFLAGS[@]}" "$@" cppcheck -j8 "${CPPCHECK[@]}" "${CPPCHECK_C[@]}" tox*/*.[ch] tox*/*/*.[ch] "${CPPFLAGS[@]}" "$@"
cppcheck "${CPPCHECK[@]}" "${CPPCHECK_CXX[@]}" amalgamation.cc "${CPPFLAGS[@]}" "$@" cppcheck "${CPPCHECK[@]}" "${CPPCHECK_CXX[@]}" amalgamation.cc "${CPPFLAGS[@]}" "$@"
} }

View File

@@ -11,7 +11,7 @@ run() {
"${CPPFLAGS[@]}" \ "${CPPFLAGS[@]}" \
"${LDFLAGS[@]}" \ "${LDFLAGS[@]}" \
"$@" \ "$@" \
-std=c++11 \ -std=c++17 \
-fdiagnostics-color=always \ -fdiagnostics-color=always \
-Wall \ -Wall \
-Wextra \ -Wextra \

View File

@@ -1,25 +0,0 @@
#!/bin/sh
# --bufferoverrun \
# --pulse \
read -r -d '' SCRIPT <<'EOF'
infer \
--report-console-limit 100 \
--jobs 8 \
--biabduction \
--loop-hoisting \
--quandary \
--racerd \
--starvation \
--uninit \
-- clang++ -fsyntax-only \
$(pkg-config --cflags libconfig libsodium opus vpx) \
/work/other/bootstrap_daemon/src/*.c \
/work/other/bootstrap_node_packets.c \
/work/toxav/*.c \
/work/toxcore/*.c \
/work/toxencryptsave/*.c
EOF
docker run --rm -it -v "$PWD:/work" toxchat/infer bash -c "$SCRIPT"

View File

@@ -16,7 +16,6 @@
--align-reference=name --align-reference=name
# Formatting Options # Formatting Options
--add-brackets
--convert-tabs --convert-tabs
--max-code-length=120 --max-code-length=120

View File

@@ -1,7 +1,5 @@
load("@rules_cc//cc:defs.bzl", "cc_binary") load("@rules_cc//cc:defs.bzl", "cc_binary")
package(features = ["layering_check"])
cc_binary( cc_binary(
name = "bootstrap_daemon", name = "bootstrap_daemon",
srcs = glob([ srcs = glob([
@@ -20,7 +18,6 @@ cc_binary(
"//c-toxcore/toxcore:mono_time", "//c-toxcore/toxcore:mono_time",
"//c-toxcore/toxcore:onion_announce", "//c-toxcore/toxcore:onion_announce",
"//c-toxcore/toxcore:tox", "//c-toxcore/toxcore:tox",
"//c-toxcore/toxcore:util",
"@libconfig", "@libconfig",
], ],
) )

View File

@@ -19,6 +19,14 @@ add_executable(tox-bootstrapd
src/tox-bootstrapd.c src/tox-bootstrapd.c
../bootstrap_node_packets.c ../bootstrap_node_packets.c
../bootstrap_node_packets.h) ../bootstrap_node_packets.h)
target_link_modules(tox-bootstrapd toxcore ${LIBCONFIG_LIBRARIES}) target_link_libraries(tox-bootstrapd PRIVATE ${LIBCONFIG_LIBRARIES})
target_link_directories(tox-bootstrapd PRIVATE ${LIBCONFIG_LIBRARY_DIRS})
target_include_directories(tox-bootstrapd SYSTEM PRIVATE ${LIBCONFIG_INCLUDE_DIRS})
target_compile_options(tox-bootstrapd PRIVATE ${LIBCONFIG_CFLAGS_OTHER})
if(TARGET toxcore_static)
target_link_libraries(tox-bootstrapd PRIVATE toxcore_static)
else()
target_link_libraries(tox-bootstrapd PRIVATE toxcore_shared)
endif()
install(TARGETS tox-bootstrapd RUNTIME DESTINATION bin) install(TARGETS tox-bootstrapd RUNTIME DESTINATION bin)
install(FILES bash-completion/completions/tox-bootstrapd DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/bash-completion/completions") install(FILES bash-completion/completions/tox-bootstrapd DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/bash-completion/completions")

View File

@@ -259,7 +259,7 @@ docker run -d --name tox-bootstrapd --restart always \
toxchat/bootstrap-node toxchat/bootstrap-node
``` ```
We create a new user and protect its home directory in order to mount it in the Docker image, so that the kyepair the daemon uses would be stored on the host system, which makes it less likely that you would loose the keypair while playing with or updating the Docker container. We create a new user and protect its home directory in order to mount it in the Docker image, so that the keypair the daemon uses would be stored on the host system, which makes it less likely that you would loose the keypair while playing with or updating the Docker container.
You can check logs for your public key or any errors: You can check logs for your public key or any errors:
```sh ```sh

View File

@@ -1,18 +1,18 @@
########################################################### ###########################################################
# Builder image: we compile the code here (static build) # Builder image: we compile the code here (static build)
FROM alpine:3.15.0 AS build FROM alpine:3.19.0 AS build
RUN ["apk", "--no-cache", "add",\ RUN ["apk", "--no-cache", "add",\
"build-base",\ "clang",\
"cmake",\ "cmake",\
"linux-headers",\ "linux-headers",\
"libconfig-dev",\ "libconfig-dev",\
"libconfig-static",\ "libconfig-static",\
"libsodium-dev",\ "libsodium-dev",\
"libsodium-static",\ "libsodium-static",\
"musl-dev",\
"ninja",\ "ninja",\
"python3"\ "python3"]
]
WORKDIR /src/c-toxcore WORKDIR /src/c-toxcore
@@ -34,9 +34,9 @@ COPY CMakeLists.txt so.version ./
COPY other/bootstrap_daemon/CMakeLists.txt other/bootstrap_daemon/CMakeLists.txt COPY other/bootstrap_daemon/CMakeLists.txt other/bootstrap_daemon/CMakeLists.txt
COPY testing/CMakeLists.txt testing/CMakeLists.txt COPY testing/CMakeLists.txt testing/CMakeLists.txt
RUN cmake -B_build -H. \ RUN CC=clang cmake -B_build -H. \
-GNinja \ -GNinja \
-DCMAKE_C_FLAGS="-DTCP_SERVER_USE_EPOLL -fstack-protector-all -fisolate-erroneous-paths-attribute" \ -DCMAKE_C_FLAGS="-DTCP_SERVER_USE_EPOLL -fsanitize=alignment,return,returns-nonnull-attribute,vla-bound,unreachable,float-cast-overflow,null -fsanitize-trap=all -fstack-protector-all" \
-DCMAKE_UNITY_BUILD=ON \ -DCMAKE_UNITY_BUILD=ON \
-DCMAKE_BUILD_TYPE=Release \ -DCMAKE_BUILD_TYPE=Release \
-DFULLY_STATIC=ON \ -DFULLY_STATIC=ON \
@@ -48,8 +48,10 @@ RUN cmake -B_build -H. \
# Verify checksum from dev-built binary, so we can be sure Docker Hub doesn't # Verify checksum from dev-built binary, so we can be sure Docker Hub doesn't
# mess with your binaries. # mess with your binaries.
COPY other/bootstrap_daemon/docker/tox-bootstrapd.sha256 other/bootstrap_daemon/docker/ COPY other/bootstrap_daemon/docker/tox-bootstrapd.sha256 other/bootstrap_daemon/docker/
RUN sha256sum /usr/local/bin/tox-bootstrapd && \ RUN SHA256="$(sha256sum /usr/local/bin/tox-bootstrapd)" && \
sha256sum -c other/bootstrap_daemon/docker/tox-bootstrapd.sha256 (sha256sum -c other/bootstrap_daemon/docker/tox-bootstrapd.sha256 || \
(echo "::error file=other/bootstrap_daemon/docker/tox-bootstrapd.sha256,line=1::$SHA256" && \
false))
# Remove all the example bootstrap nodes from the config file. # Remove all the example bootstrap nodes from the config file.
COPY other/bootstrap_daemon/tox-bootstrapd.conf other/bootstrap_daemon/ COPY other/bootstrap_daemon/tox-bootstrapd.conf other/bootstrap_daemon/
@@ -62,7 +64,7 @@ RUN ["other/bootstrap_daemon/docker/get-nodes.py", "other/bootstrap_daemon/tox-b
########################################################### ###########################################################
# Final image build: this is what runs the bootstrap node # Final image build: this is what runs the bootstrap node
FROM debian:bullseye-slim FROM debian:bookworm-slim
COPY --from=build /usr/local/bin/tox-bootstrapd /usr/local/bin/ COPY --from=build /usr/local/bin/tox-bootstrapd /usr/local/bin/
COPY --from=build /src/c-toxcore/other/bootstrap_daemon/tox-bootstrapd.conf /etc/tox-bootstrapd.conf COPY --from=build /src/c-toxcore/other/bootstrap_daemon/tox-bootstrapd.conf /etc/tox-bootstrapd.conf

View File

@@ -0,0 +1,46 @@
#!/usr/bin/env python3
import json
import os
import pprint
import subprocess
import sys
import urllib.request
from typing import Any
SHA256_FILE = "other/bootstrap_daemon/docker/tox-bootstrapd.sha256"
with open(f"{os.environ['HOME']}/.github-token") as fh:
token = fh.read().strip()
head_sha = (subprocess.run(["git", "rev-parse", "HEAD"],
capture_output=True,
check=True).stdout.decode("utf-8").strip())
def request(url: str) -> Any:
return json.loads(
urllib.request.urlopen(
urllib.request.Request(
url,
headers={
"Accept": "application/vnd.github+json",
"Authorization": "Bearer " + token,
"X-GitHub-Api-Version": "2022-11-28",
},
)).read())
pp = pprint.PrettyPrinter(indent=2, compact=True)
annots = [
a for r in request(
f"https://api.github.com/repos/TokTok/c-toxcore/commits/{head_sha}/check-runs?per_page=100"
)["check_runs"] if r["name"] == "docker-bootstrap-node"
for a in request(r["output"]["annotations_url"])
if a["path"] == SHA256_FILE
]
if not annots:
print("could not find sha256sum output")
sys.exit(1)
with open(SHA256_FILE, "w") as fh:
fh.write(annots[0]["message"] + "\n")
print(f"updated {SHA256_FILE}")

View File

@@ -1 +1 @@
b2996d73cab7c7453dc10ccf7ad733622558de3b1ad0db824a379cf96f500379 /usr/local/bin/tox-bootstrapd 5061f92a95ba45cfa49d78175fa8fb6e4d66a58d86634ea3fd3ae6d80cb0558a /usr/local/bin/tox-bootstrapd

View File

@@ -3,7 +3,7 @@
set -eux set -eux
docker_build() { docker_build() {
docker build -f other/bootstrap_daemon/docker/Dockerfile -t toxchat/bootstrap-node . DOCKER_BUILDKIT=1 docker build --progress=plain -f other/bootstrap_daemon/docker/Dockerfile -t toxchat/bootstrap-node .
} }
# Run Docker build once. If it succeeds, we're good. # Run Docker build once. If it succeeds, we're good.
@@ -12,12 +12,11 @@ if docker_build; then
fi fi
# We're not good. Run it again, but now capture the output. # We're not good. Run it again, but now capture the output.
OUTPUT=$(docker_build || true 2>&1) OUTPUT=$(docker_build 2>&1 || true)
if echo "$OUTPUT" | grep '/usr/local/bin/tox-bootstrapd: FAILED'; then if echo "$OUTPUT" | grep '/usr/local/bin/tox-bootstrapd: FAILED'; then
# This is a checksum warning, so we need to update it. # This is a checksum warning, so we need to update it.
IMAGE=$(echo "$OUTPUT" | grep '^ ---> [0-9a-f]*$' | grep -o '[0-9a-f]*$' | tail -n1) echo "$OUTPUT" | grep -Eo '[0-9a-f]{64} /usr/local/bin/tox-bootstrapd' | tail -n1 >other/bootstrap_daemon/docker/tox-bootstrapd.sha256
docker run --rm "$IMAGE" sha256sum /usr/local/bin/tox-bootstrapd >other/bootstrap_daemon/docker/tox-bootstrapd.sha256
fi fi
# Run once last time to complete the build. # Run once last time to complete the build.

View File

@@ -24,17 +24,13 @@ tox_bootstrapd_SOURCES = \
tox_bootstrapd_CFLAGS = \ tox_bootstrapd_CFLAGS = \
-I$(top_srcdir)/other/bootstrap_daemon \ -I$(top_srcdir)/other/bootstrap_daemon \
$(LIBSODIUM_CFLAGS) \ $(LIBSODIUM_CFLAGS) \
$(NACL_CFLAGS) \
$(LIBCONFIG_CFLAGS) $(LIBCONFIG_CFLAGS)
tox_bootstrapd_LDADD = \ tox_bootstrapd_LDADD = \
$(LIBSODIUM_LDFLAGS) \ $(LIBSODIUM_LDFLAGS) \
$(NACL_LDFLAGS) \
libtoxcore.la \ libtoxcore.la \
$(LIBCONFIG_LIBS) \ $(LIBCONFIG_LIBS) \
$(LIBSODIUM_LIBS) \ $(LIBSODIUM_LIBS)
$(NACL_OBJECTS) \
$(NACL_LIBS)
bashcompdir = $(datarootdir)/bash-completion/completions bashcompdir = $(datarootdir)/bash-completion/completions
dist_bashcomp_DATA = $(top_builddir)/other/bootstrap_daemon/bash-completion/completions/tox-bootstrapd dist_bashcomp_DATA = $(top_builddir)/other/bootstrap_daemon/bash-completion/completions/tox-bootstrapd

View File

@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later /* SPDX-License-Identifier: GPL-3.0-or-later
* Copyright © 2016-2018 The TokTok team. * Copyright © 2016-2024 The TokTok team.
* Copyright © 2015-2016 Tox project. * Copyright © 2015-2016 Tox project.
*/ */
@@ -10,12 +10,12 @@
#include "command_line_arguments.h" #include "command_line_arguments.h"
#include "global.h" #include "global.h"
#include "log.h"
#include "../../../toxcore/ccompat.h" #include "../../../toxcore/ccompat.h"
#include <getopt.h> #include <getopt.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
@@ -24,9 +24,9 @@
*/ */
static void print_help(void) static void print_help(void)
{ {
// 2 space ident // 2 space indent
// make sure all lines fit into 80 columns // Make sure all lines fit into 80 columns
// make sure options are listed in alphabetical order // Make sure options are listed in alphabetical order
log_write(LOG_LEVEL_INFO, log_write(LOG_LEVEL_INFO,
"Usage: tox-bootstrapd [OPTION]... --config=FILE_PATH\n" "Usage: tox-bootstrapd [OPTION]... --config=FILE_PATH\n"
"\n" "\n"
@@ -39,7 +39,7 @@ static void print_help(void)
" (detach from the terminal) and won't use the PID file.\n" " (detach from the terminal) and won't use the PID file.\n"
" --help Print this help message.\n" " --help Print this help message.\n"
" --log-backend=BACKEND Specify which logging backend to use.\n" " --log-backend=BACKEND Specify which logging backend to use.\n"
" Valid BACKEND values (case sensetive):\n" " Valid BACKEND values (case sensitive):\n"
" syslog Writes log messages to syslog.\n" " syslog Writes log messages to syslog.\n"
" Default option when no --log-backend is\n" " Default option when no --log-backend is\n"
" specified.\n" " specified.\n"
@@ -47,13 +47,14 @@ static void print_help(void)
" --version Print version information.\n"); " --version Print version information.\n");
} }
void handle_command_line_arguments(int argc, char *argv[], char **cfg_file_path, LOG_BACKEND *log_backend, Cli_Status handle_command_line_arguments(
bool *run_in_foreground) int argc, char *argv[], char **cfg_file_path, LOG_BACKEND *log_backend,
bool *run_in_foreground)
{ {
if (argc < 2) { if (argc < 2) {
log_write(LOG_LEVEL_ERROR, "Error: No arguments provided.\n\n"); log_write(LOG_LEVEL_ERROR, "Error: No arguments provided.\n\n");
print_help(); print_help();
exit(1); return CLI_STATUS_ERROR;
} }
opterr = 0; opterr = 0;
@@ -89,7 +90,7 @@ void handle_command_line_arguments(int argc, char *argv[], char **cfg_file_path,
case 'h': case 'h':
print_help(); print_help();
exit(0); return CLI_STATUS_DONE;
case 'l': case 'l':
if (strcmp(optarg, "syslog") == 0) { if (strcmp(optarg, "syslog") == 0) {
@@ -101,24 +102,24 @@ void handle_command_line_arguments(int argc, char *argv[], char **cfg_file_path,
} else { } else {
log_write(LOG_LEVEL_ERROR, "Error: Invalid BACKEND value for --log-backend option passed: %s\n\n", optarg); log_write(LOG_LEVEL_ERROR, "Error: Invalid BACKEND value for --log-backend option passed: %s\n\n", optarg);
print_help(); print_help();
exit(1); return CLI_STATUS_ERROR;
} }
break; break;
case 'v': case 'v':
log_write(LOG_LEVEL_INFO, "Version: %lu\n", DAEMON_VERSION_NUMBER); log_write(LOG_LEVEL_INFO, "Version: %lu\n", DAEMON_VERSION_NUMBER);
exit(0); return CLI_STATUS_DONE;
case '?': case '?':
log_write(LOG_LEVEL_ERROR, "Error: Unrecognized option %s\n\n", argv[optind - 1]); log_write(LOG_LEVEL_ERROR, "Error: Unrecognized option %s\n\n", argv[optind - 1]);
print_help(); print_help();
exit(1); return CLI_STATUS_ERROR;
case ':': case ':':
log_write(LOG_LEVEL_ERROR, "Error: No argument provided for option %s\n\n", argv[optind - 1]); log_write(LOG_LEVEL_ERROR, "Error: No argument provided for option %s\n\n", argv[optind - 1]);
print_help(); print_help();
exit(1); return CLI_STATUS_ERROR;
} }
} }
@@ -129,6 +130,8 @@ void handle_command_line_arguments(int argc, char *argv[], char **cfg_file_path,
if (!cfg_file_path_set) { if (!cfg_file_path_set) {
log_write(LOG_LEVEL_ERROR, "Error: The required --config option wasn't specified\n\n"); log_write(LOG_LEVEL_ERROR, "Error: The required --config option wasn't specified\n\n");
print_help(); print_help();
exit(1); return CLI_STATUS_ERROR;
} }
return CLI_STATUS_OK;
} }

View File

@@ -12,6 +12,15 @@
#include "log.h" #include "log.h"
typedef enum Cli_Status {
/** Continue the program. Command line processing completed. */
CLI_STATUS_OK,
/** Stop the program with success status. */
CLI_STATUS_DONE,
/** Stop the program with error status. */
CLI_STATUS_ERROR,
} Cli_Status;
/** /**
* Handles command line arguments, setting cfg_file_path and log_backend. * Handles command line arguments, setting cfg_file_path and log_backend.
* Terminates the application if incorrect arguments are specified. * Terminates the application if incorrect arguments are specified.
@@ -22,7 +31,8 @@
* @param log_backend Sets to the provided by the user log backend option. * @param log_backend Sets to the provided by the user log backend option.
* @param run_in_foreground Sets to the provided by the user foreground option. * @param run_in_foreground Sets to the provided by the user foreground option.
*/ */
void handle_command_line_arguments(int argc, char *argv[], char **cfg_file_path, LOG_BACKEND *log_backend, Cli_Status handle_command_line_arguments(
bool *run_in_foreground); int argc, char *argv[], char **cfg_file_path, LOG_BACKEND *log_backend,
bool *run_in_foreground);
#endif // C_TOXCORE_OTHER_BOOTSTRAP_DAEMON_SRC_COMMAND_LINE_ARGUMENTS_H #endif // C_TOXCORE_OTHER_BOOTSTRAP_DAEMON_SRC_COMMAND_LINE_ARGUMENTS_H

View File

@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later /* SPDX-License-Identifier: GPL-3.0-or-later
* Copyright © 2016-2018 The TokTok team. * Copyright © 2016-2024 The TokTok team.
* Copyright © 2014-2016 Tox project. * Copyright © 2014-2016 Tox project.
*/ */
@@ -10,6 +10,7 @@
#include "config.h" #include "config.h"
#include "config_defaults.h" #include "config_defaults.h"
#include "global.h"
#include "log.h" #include "log.h"
#include <stdio.h> #include <stdio.h>
@@ -18,6 +19,10 @@
#include <libconfig.h> #include <libconfig.h>
#include "../../../toxcore/DHT.h"
#include "../../../toxcore/ccompat.h"
#include "../../../toxcore/crypto_core.h"
#include "../../../toxcore/network.h"
#include "../../bootstrap_node_packets.h" #include "../../bootstrap_node_packets.h"
/** /**
@@ -39,22 +44,28 @@ static void parse_tcp_relay_ports_config(config_t *cfg, uint16_t **tcp_relay_por
log_write(LOG_LEVEL_WARNING, "No '%s' setting in the configuration file.\n", NAME_TCP_RELAY_PORTS); log_write(LOG_LEVEL_WARNING, "No '%s' setting in the configuration file.\n", NAME_TCP_RELAY_PORTS);
log_write(LOG_LEVEL_WARNING, "Using default '%s':\n", NAME_TCP_RELAY_PORTS); log_write(LOG_LEVEL_WARNING, "Using default '%s':\n", NAME_TCP_RELAY_PORTS);
uint16_t default_ports[DEFAULT_TCP_RELAY_PORTS_COUNT] = {DEFAULT_TCP_RELAY_PORTS}; uint16_t default_ports[] = {DEFAULT_TCP_RELAY_PORTS};
for (int i = 0; i < DEFAULT_TCP_RELAY_PORTS_COUNT; ++i) { // Check to avoid calling malloc(0) later on
log_write(LOG_LEVEL_INFO, "Port #%d: %u\n", i, default_ports[i]); // NOLINTNEXTLINE, clang-tidy: error: suspicious comparison of 'sizeof(expr)' to a constant [bugprone-sizeof-expression,-warnings-as-errors]
static_assert(sizeof(default_ports) > 0, "At least one default TCP relay port should be provided");
const size_t default_ports_count = sizeof(default_ports)/sizeof(*default_ports);
for (size_t i = 0; i < default_ports_count; ++i) {
log_write(LOG_LEVEL_INFO, "Port #%zu: %u\n", i, default_ports[i]);
} }
// similar procedure to the one of reading config file below // Similar procedure to the one of reading config file below
*tcp_relay_ports = (uint16_t *)malloc(DEFAULT_TCP_RELAY_PORTS_COUNT * sizeof(uint16_t)); *tcp_relay_ports = (uint16_t *)malloc(default_ports_count * sizeof(uint16_t));
for (int i = 0; i < DEFAULT_TCP_RELAY_PORTS_COUNT; ++i) { for (size_t i = 0; i < default_ports_count; ++i) {
(*tcp_relay_ports)[*tcp_relay_port_count] = default_ports[i]; (*tcp_relay_ports)[*tcp_relay_port_count] = default_ports[i];
if ((*tcp_relay_ports)[*tcp_relay_port_count] < MIN_ALLOWED_PORT if ((*tcp_relay_ports)[*tcp_relay_port_count] < MIN_ALLOWED_PORT
|| (*tcp_relay_ports)[*tcp_relay_port_count] > MAX_ALLOWED_PORT) { || (*tcp_relay_ports)[*tcp_relay_port_count] > MAX_ALLOWED_PORT) {
log_write(LOG_LEVEL_WARNING, "Port #%d: Invalid port: %u, should be in [%d, %d]. Skipping.\n", i, log_write(LOG_LEVEL_WARNING, "Port #%zu: Invalid port: %u, should be in [%d, %d]. Skipping.\n", i,
(*tcp_relay_ports)[*tcp_relay_port_count], MIN_ALLOWED_PORT, MAX_ALLOWED_PORT); (*tcp_relay_ports)[*tcp_relay_port_count], MIN_ALLOWED_PORT, MAX_ALLOWED_PORT);
continue; continue;
} }
@@ -62,7 +73,7 @@ static void parse_tcp_relay_ports_config(config_t *cfg, uint16_t **tcp_relay_por
++*tcp_relay_port_count; ++*tcp_relay_port_count;
} }
// the loop above skips invalid ports, so we adjust the allocated memory size // The loop above skips invalid ports, so we adjust the allocated memory size
if ((*tcp_relay_port_count) > 0) { if ((*tcp_relay_port_count) > 0) {
*tcp_relay_ports = (uint16_t *)realloc(*tcp_relay_ports, (*tcp_relay_port_count) * sizeof(uint16_t)); *tcp_relay_ports = (uint16_t *)realloc(*tcp_relay_ports, (*tcp_relay_port_count) * sizeof(uint16_t));
} else { } else {
@@ -92,7 +103,7 @@ static void parse_tcp_relay_ports_config(config_t *cfg, uint16_t **tcp_relay_por
config_setting_t *elem = config_setting_get_elem(ports_array, i); config_setting_t *elem = config_setting_get_elem(ports_array, i);
if (elem == nullptr) { if (elem == nullptr) {
// it's NULL if `ports_array` is not an array (we have that check earlier) or if `i` is out of range, which should not be // It's NULL if `ports_array` is not an array (we have that check earlier) or if `i` is out of range, which should not be
log_write(LOG_LEVEL_WARNING, "Port #%d: Something went wrong while parsing the port. Stopping reading ports.\n", i); log_write(LOG_LEVEL_WARNING, "Port #%d: Something went wrong while parsing the port. Stopping reading ports.\n", i);
break; break;
} }
@@ -114,7 +125,7 @@ static void parse_tcp_relay_ports_config(config_t *cfg, uint16_t **tcp_relay_por
++*tcp_relay_port_count; ++*tcp_relay_port_count;
} }
// the loop above skips invalid ports, so we adjust the allocated memory size // The loop above skips invalid ports, so we adjust the allocated memory size
if ((*tcp_relay_port_count) > 0) { if ((*tcp_relay_port_count) > 0) {
*tcp_relay_ports = (uint16_t *)realloc(*tcp_relay_ports, (*tcp_relay_port_count) * sizeof(uint16_t)); *tcp_relay_ports = (uint16_t *)realloc(*tcp_relay_ports, (*tcp_relay_port_count) * sizeof(uint16_t));
} else { } else {
@@ -254,7 +265,7 @@ int get_general_config(const char *cfg_file_path, char **pid_file_path, char **k
log_write(LOG_LEVEL_INFO, "'%s': %s\n", NAME_ENABLE_TCP_RELAY, *enable_tcp_relay ? "true" : "false"); log_write(LOG_LEVEL_INFO, "'%s': %s\n", NAME_ENABLE_TCP_RELAY, *enable_tcp_relay ? "true" : "false");
// show info about tcp ports only if tcp relay is enabled // Show info about tcp ports only if tcp relay is enabled
if (*enable_tcp_relay) { if (*enable_tcp_relay) {
if (*tcp_relay_port_count == 0) { if (*tcp_relay_port_count == 0) {
log_write(LOG_LEVEL_ERROR, "No TCP ports could be read.\n"); log_write(LOG_LEVEL_ERROR, "No TCP ports could be read.\n");
@@ -401,7 +412,7 @@ int bootstrap_from_config(const char *cfg_file_path, DHT *dht, int enable_ipv6)
log_write(LOG_LEVEL_INFO, "Successfully added bootstrap node #%d: %s:%d %s\n", i, bs_address, bs_port, bs_public_key); log_write(LOG_LEVEL_INFO, "Successfully added bootstrap node #%d: %s:%d %s\n", i, bs_address, bs_port, bs_public_key);
next: next:
// config_setting_lookup_string() allocates string inside and doesn't allow us to free it direcly // config_setting_lookup_string() allocates string inside and doesn't allow us to free it directly
// though it's freed when the element is removed, so we free it right away in order to keep memory // though it's freed when the element is removed, so we free it right away in order to keep memory
// consumption minimal // consumption minimal
config_setting_remove_elem(node_list, 0); config_setting_remove_elem(node_list, 0);

View File

@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later /* SPDX-License-Identifier: GPL-3.0-or-later
* Copyright © 2016-2018 The TokTok team. * Copyright © 2016-2024 The TokTok team.
* Copyright © 2014-2016 Tox project. * Copyright © 2014-2016 Tox project.
*/ */
@@ -30,7 +30,7 @@ int get_general_config(const char *cfg_file_path, char **pid_file_path, char **k
* Bootstraps off nodes listed in the config file. * Bootstraps off nodes listed in the config file.
* *
* @return 1 on success, some or no bootstrap nodes were added * @return 1 on success, some or no bootstrap nodes were added
* 0 on failure, a error accured while parsing config file. * 0 on failure, an error occurred while parsing the config file.
*/ */
int bootstrap_from_config(const char *cfg_file_path, DHT *dht, int enable_ipv6); int bootstrap_from_config(const char *cfg_file_path, DHT *dht, int enable_ipv6);

View File

@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later /* SPDX-License-Identifier: GPL-3.0-or-later
* Copyright © 2016-2018 The TokTok team. * Copyright © 2016-2023 The TokTok team.
* Copyright © 2014-2016 Tox project. * Copyright © 2014-2016 Tox project.
*/ */
@@ -19,8 +19,7 @@
#define DEFAULT_ENABLE_IPV4_FALLBACK 1 // 1 - true, 0 - false #define DEFAULT_ENABLE_IPV4_FALLBACK 1 // 1 - true, 0 - false
#define DEFAULT_ENABLE_LAN_DISCOVERY 1 // 1 - true, 0 - false #define DEFAULT_ENABLE_LAN_DISCOVERY 1 // 1 - true, 0 - false
#define DEFAULT_ENABLE_TCP_RELAY 1 // 1 - true, 0 - false #define DEFAULT_ENABLE_TCP_RELAY 1 // 1 - true, 0 - false
#define DEFAULT_TCP_RELAY_PORTS 443, 3389, 33445 // comma-separated list of ports. make sure to adjust DEFAULT_TCP_RELAY_PORTS_COUNT accordingly #define DEFAULT_TCP_RELAY_PORTS 443, 3389, 33445 // comma-separated list of ports
#define DEFAULT_TCP_RELAY_PORTS_COUNT 3
#define DEFAULT_ENABLE_MOTD 1 // 1 - true, 0 - false #define DEFAULT_ENABLE_MOTD 1 // 1 - true, 0 - false
#define DEFAULT_MOTD DAEMON_NAME #define DEFAULT_MOTD DAEMON_NAME

View File

@@ -3,6 +3,8 @@
* Copyright © 2015-2016 Tox project. * Copyright © 2015-2016 Tox project.
*/ */
#include <stdarg.h>
/* /*
* Tox DHT bootstrap daemon. * Tox DHT bootstrap daemon.
* Logging utility with support of multiple logging backends. * Logging utility with support of multiple logging backends.

View File

@@ -9,8 +9,11 @@
*/ */
#include "log_backend_stdout.h" #include "log_backend_stdout.h"
#include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include "log.h"
static FILE *log_backend_stdout_level(LOG_LEVEL level) static FILE *log_backend_stdout_level(LOG_LEVEL level)
{ {
switch (level) { switch (level) {

View File

@@ -10,10 +10,12 @@
#include "log_backend_syslog.h" #include "log_backend_syslog.h"
#include "global.h" #include "global.h"
#include "log.h"
#include "../../../toxcore/ccompat.h" #include "../../../toxcore/ccompat.h"
#include <assert.h> #include <assert.h>
#include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <syslog.h> #include <syslog.h>

View File

@@ -23,17 +23,24 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h>
// toxcore // toxcore
#include "../../../toxcore/tox.h" #include "../../../toxcore/DHT.h"
#include "../../../toxcore/LAN_discovery.h" #include "../../../toxcore/LAN_discovery.h"
#include "../../../toxcore/TCP_server.h" #include "../../../toxcore/TCP_server.h"
#include "../../../toxcore/announce.h" #include "../../../toxcore/announce.h"
#include "../../../toxcore/ccompat.h"
#include "../../../toxcore/crypto_core.h"
#include "../../../toxcore/forwarding.h"
#include "../../../toxcore/group_announce.h"
#include "../../../toxcore/group_onion_announce.h" #include "../../../toxcore/group_onion_announce.h"
#include "../../../toxcore/logger.h" #include "../../../toxcore/logger.h"
#include "../../../toxcore/mem.h"
#include "../../../toxcore/mono_time.h" #include "../../../toxcore/mono_time.h"
#include "../../../toxcore/network.h"
#include "../../../toxcore/onion.h"
#include "../../../toxcore/onion_announce.h" #include "../../../toxcore/onion_announce.h"
#include "../../../toxcore/util.h"
// misc // misc
#include "../../bootstrap_node_packets.h" #include "../../bootstrap_node_packets.h"
@@ -57,7 +64,7 @@ static void sleep_milliseconds(uint32_t ms)
// returns 1 on success // returns 1 on success
// 0 on failure - no keys were read or stored // 0 on failure - no keys were read or stored
static int manage_keys(DHT *dht, char *keys_file_path) static int manage_keys(DHT *dht, const char *keys_file_path)
{ {
enum { KEYS_SIZE = CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_SECRET_KEY_SIZE }; enum { KEYS_SIZE = CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_SECRET_KEY_SIZE };
uint8_t keys[KEYS_SIZE]; uint8_t keys[KEYS_SIZE];
@@ -116,7 +123,7 @@ static void print_public_key(const uint8_t *public_key)
// Demonizes the process, appending PID to the PID file and closing file descriptors based on log backend // Demonizes the process, appending PID to the PID file and closing file descriptors based on log backend
// Terminates the application if the daemonization fails. // Terminates the application if the daemonization fails.
static void daemonize(LOG_BACKEND log_backend, char *pid_file_path) static Cli_Status daemonize(LOG_BACKEND log_backend, char *pid_file_path)
{ {
// Check if the PID file exists // Check if the PID file exists
FILE *pid_file = fopen(pid_file_path, "r"); FILE *pid_file = fopen(pid_file_path, "r");
@@ -131,7 +138,7 @@ static void daemonize(LOG_BACKEND log_backend, char *pid_file_path)
if (pid_file == nullptr) { if (pid_file == nullptr) {
log_write(LOG_LEVEL_ERROR, "Couldn't open the PID file for writing: %s. Exiting.\n", pid_file_path); log_write(LOG_LEVEL_ERROR, "Couldn't open the PID file for writing: %s. Exiting.\n", pid_file_path);
exit(1); return CLI_STATUS_ERROR;
} }
// Fork off from the parent process // Fork off from the parent process
@@ -141,27 +148,27 @@ static void daemonize(LOG_BACKEND log_backend, char *pid_file_path)
fprintf(pid_file, "%d", pid); fprintf(pid_file, "%d", pid);
fclose(pid_file); fclose(pid_file);
log_write(LOG_LEVEL_INFO, "Forked successfully: PID: %d.\n", pid); log_write(LOG_LEVEL_INFO, "Forked successfully: PID: %d.\n", pid);
exit(0); return CLI_STATUS_DONE;
} else { } else {
fclose(pid_file); fclose(pid_file);
} }
if (pid < 0) { if (pid < 0) {
log_write(LOG_LEVEL_ERROR, "Forking failed. Exiting.\n"); log_write(LOG_LEVEL_ERROR, "Forking failed. Exiting.\n");
exit(1); return CLI_STATUS_ERROR;
} }
// Create a new SID for the child process // Create a new SID for the child process
if (setsid() < 0) { if (setsid() < 0) {
log_write(LOG_LEVEL_ERROR, "SID creation failure. Exiting.\n"); log_write(LOG_LEVEL_ERROR, "SID creation failure. Exiting.\n");
exit(1); return CLI_STATUS_ERROR;
} }
// Change the current working directory // Change the current working directory
if ((chdir("/")) < 0) { if ((chdir("/")) < 0) {
log_write(LOG_LEVEL_ERROR, "Couldn't change working directory to '/'. Exiting.\n"); log_write(LOG_LEVEL_ERROR, "Couldn't change working directory to '/'. Exiting.\n");
exit(1); return CLI_STATUS_ERROR;
} }
// Go quiet // Go quiet
@@ -170,6 +177,8 @@ static void daemonize(LOG_BACKEND log_backend, char *pid_file_path)
close(STDIN_FILENO); close(STDIN_FILENO);
close(STDERR_FILENO); close(STDERR_FILENO);
} }
return CLI_STATUS_OK;
} }
// Logs toxcore logger message using our logger facility // Logs toxcore logger message using our logger facility
@@ -212,11 +221,18 @@ int main(int argc, char *argv[])
char *cfg_file_path = nullptr; char *cfg_file_path = nullptr;
bool run_in_foreground = false; bool run_in_foreground = false;
// choose backend for printing command line argument parsing output based on whether the daemon is being run from a terminal // Choose backend for printing command line argument parsing output based on whether the daemon is being run from a terminal
LOG_BACKEND log_backend = isatty(STDOUT_FILENO) ? LOG_BACKEND_STDOUT : LOG_BACKEND_SYSLOG; LOG_BACKEND log_backend = isatty(STDOUT_FILENO) ? LOG_BACKEND_STDOUT : LOG_BACKEND_SYSLOG;
log_open(log_backend); log_open(log_backend);
handle_command_line_arguments(argc, argv, &cfg_file_path, &log_backend, &run_in_foreground); switch (handle_command_line_arguments(argc, argv, &cfg_file_path, &log_backend, &run_in_foreground)) {
case CLI_STATUS_OK:
break;
case CLI_STATUS_DONE:
return 0;
case CLI_STATUS_ERROR:
return 1;
}
log_close(); log_close();
log_open(log_backend); log_open(log_backend);
@@ -254,7 +270,14 @@ int main(int argc, char *argv[])
} }
if (!run_in_foreground) { if (!run_in_foreground) {
daemonize(log_backend, pid_file_path); switch (daemonize(log_backend, pid_file_path)) {
case CLI_STATUS_OK:
break;
case CLI_STATUS_DONE:
return 0;
case CLI_STATUS_ERROR:
return 1;
}
} }
free(pid_file_path); free(pid_file_path);
@@ -375,6 +398,7 @@ int main(int argc, char *argv[])
if (!onion) { if (!onion) {
log_write(LOG_LEVEL_ERROR, "Couldn't initialize Tox Onion. Exiting.\n"); log_write(LOG_LEVEL_ERROR, "Couldn't initialize Tox Onion. Exiting.\n");
kill_gca(group_announce);
kill_announcements(announce); kill_announcements(announce);
kill_forwarding(forwarding); kill_forwarding(forwarding);
kill_dht(dht); kill_dht(dht);
@@ -454,7 +478,7 @@ int main(int argc, char *argv[])
if (tcp_relay_port_count == 0) { if (tcp_relay_port_count == 0) {
log_write(LOG_LEVEL_ERROR, "No TCP relay ports read. Exiting.\n"); log_write(LOG_LEVEL_ERROR, "No TCP relay ports read. Exiting.\n");
kill_onion_announce(onion_a); kill_onion_announce(onion_a);
kill_gca(group_announce); kill_gca(group_announce);
kill_announcements(announce); kill_announcements(announce);
kill_forwarding(forwarding); kill_forwarding(forwarding);
kill_onion(onion); kill_onion(onion);

View File

@@ -1,7 +1,5 @@
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
package(features = ["-layering_check"])
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = ["websockify.go"], srcs = ["websockify.go"],

Some files were not shown because too many files have changed in this diff Show More