Commit Graph
38 Commits
Author SHA1 Message Date
Max Lv a577ae0927 C++20 port 3/14: compile crypto, config, DNS, ACL and plugin modules as C++ (#3067)
* Make the crypto, config, DNS and plugin modules compile as C++

Cast allocator and memchr results explicitly, pass mbedtls_operation_t
to mbedtls_cipher_setkey, and declare the two locals in
ss2022_encrypt_first() before the gotos that jump past them. Drop the
unused RESOLV_MODE global that resolv.c defined by accident through an
anonymous enum declaration. Still valid C.

* Raise the test origin's listen backlog

socketserver listens with a backlog of 5. With concurrent connections
through the proxy on a loaded machine (parallel ctest), the backlog
overflows, the kernel resets the origin connection, and the proxy
correctly drops the client, which surfaced as intermittent
alloc_audit_report failures ("getpeername: Invalid argument" in
ss-local, "Connection reset by peer" in ss-server). Reproduced
reliably at 64 concurrent connections; gone with a backlog of 256.

* Compile the crypto, config, DNS, ACL and plugin modules as C++

Rename netutils, jconf, stream, aead, aead2022, aead2022_udp, crypto,
acl, plugin, plugin_disabled and resolv from .c to .cpp without changing
their contents, and update source lists, snippet references, test
comments and debian/copyright.

The Doxygen source list and scripts/check_cli_docs.py now accept either
extension for each module, so the remaining programs can move one at a
time. The new .cpp files are added to the no-heap ratchet baseline.
2026-10-15 09:52:17 +08:00
Max Lv 384810efce C++20 port 2/14: compile the leaf modules as C++ (#3066)
* Make headers and leaf modules compile as C++

Wrap the declarations of every project header in extern "C" (after the
system includes, which must keep C++ linkage), so converted modules and
the remaining C files agree on linkage.

In the leaf modules, cast allocator and memchr results explicitly,
rename identifiers called new, replace the getpwnam_r VLA with the
fixed 16 KiB buffer the loop already capped itself at, and make the
rlimit initialiser conversion explicit. All of this is still valid C.

* Compile the leaf modules as C++

Rename base64, json, ipset, process, ppbloom, rule, ssurl and cache from
.c to .cpp without touching their contents, and update the CMake source
lists, debian/copyright and the docs.

Ported code keeps -Wall; -Wextra is now opt-in through
ss_strict_warnings() for code written as C++ (the core tests).
check_no_heap.py gains a ratchet baseline for the converted modules,
which still allocate the way the C code did. A new check_cxx_runtime
test verifies with nm that the programs and libshadowsocks-c.a still
need no C++ runtime library, so C consumers are unaffected.

* Fix the Windows branches of process.cpp for C++

Cast allocator results and the thread argument explicitly and
value-initialise JOBOBJECT_EXTENDED_LIMIT_INFORMATION with {}. Found by
the zig x86_64-windows-gnu cross build.

* Keep clang-tidy clean for the converted modules

Once the C headers are included from C++ translation units,
bugprone-dynamic-static-initializers reports each extern variable
declaration in them; none is defined in a header, so disable the check.
Mark the two bounded memchr searches in ssurl.cpp, which
bugprone-not-null-terminated-result misreads as string copies.

* check_cxx_runtime: ignore glibc symbol versions

nm on glibc prints __cxa_atexit@GLIBC_2.2.5, which the allowlist for the
libc-provided __cxa_atexit/__cxa_finalize did not match.

* Keep GCC's C++-only warnings off for modules converted from C

GCC's C++ -Wall includes -Wsign-compare and -Wclass-memaccess, which C's
-Wall does not, so the converted modules failed -Werror on GCC (Linux,
UCRT64) although nothing in them changed. They keep the warning set they
were written against; code under ss_strict_warnings() re-enables both.
2026-10-15 09:48:18 +08:00
Max Lv bcb3731968 C++20 port 1/14: build, ownership core and allocation audit (#3065)
* Enable C++20 alongside C11 in the build

Add CXX to the project with C++20 (no extensions) and build C++ sources
with -Wextra -fno-exceptions -fno-rtti -fno-threadsafe-statics on top of
the existing warning flags. Give every toolchain a C++ compiler: the zig
Windows toolchain, the static macOS/Windows CI jobs, the static musl
image (clang++ plus libstdc++ headers) and the RPM spec.

* Add C++20 ownership and allocation core

Header-only primitives for the no-heap-after-startup design:
Result/Status, Region, ObjectPool with PoolPtr (std::unique_ptr with a
pool deleter), generation-checked Handle and asynchronous close support,
intrusive RefPtr, FixedBuffer, MonotonicArena, FixedHashMap and FixedLru,
IntrusiveList, and a bounded FixedHeap for third-party allocator hooks.

Unit tests cover each primitive (test_core_*). scripts/check_no_heap.py
rejects heap allocation in C++ sources under src/ and runs as a ctest.
clang-tidy now also analyses C++ sources and the core headers.

* Add heap allocation audit for relayed connections

alloc_counter is a preloadable malloc counter (glibc, macOS) that writes
a snapshot on SIGUSR2. measure_alloc.py warms ss-local and ss-server up,
snapshots both, relays more connections and reports allocations per
connection. It runs report-only as the alloc_audit_report ctest.
interop.peers() now yields the started processes.

* Document the C++20 port and allocation baseline

docs/cpp-core.md describes the language profile, the core primitives,
the phase plan and the measured C baseline (77-89 allocations per
connection in ss-server, 27-39 in ss-local). The compatibility contract
now keeps the C11 public header instead of a C11 code base. CLAUDE.md
drops stale libev, submodule and gnu99 references.

* Fix CI for the C++ core: libstdc++ headers, static unwinder, newer clang

- docker/static: Alpine's libstdc++ headers come with g++, and the C++
  tests' static libstdc++ needs an unwinder that compiler-rt lacks; add
  g++ and llvm-libunwind.
- FixedBuffer: drop the unused kCapacity (clang-tidy 18 reports it as a
  dynamically initialized header static).
- ss-server on Windows: manager_addr was only read in POSIX-only code,
  which newer clang rejects (-Wunused-but-set-global); say that the
  option is ignored there.

* CI: allow running the test and build workflows by hand

Stacked PRs target their parent branch, which these workflows do not
trigger on; workflow_dispatch lets each layer run the full matrix.

* CI: let clang-tidy ignore GCC-only warning flags

The compile database comes from a GCC build, whose flags (for example
-Wno-class-memaccess) clang-tidy does not know and reports as errors.
2026-10-15 09:45:54 +08:00
Max Lv ea951e6bd1 Redesign CLI flags, help, and argument validation 2026-09-12 21:17:38 +08:00
Max Lv f5d5bf0be1 Publish native Doxygen documentation with GitHub Pages 2026-09-12 14:46:42 +08:00
Max Lv 146818c182 Generate CLI manual sections from source option declarations 2026-09-12 10:51:25 +08:00
Max Lv bdc77408cb Rename to shadowsocks-c with libuv, async DNS and CI lint (#3051)
Rename the project to shadowsocks-c while retaining ss-* commands, the embedding ABI, and legacy library/package lookup compatibility.

Replace libev with bundled libuv for IOCP/kqueue event backends, expand asynchronous runtime DNS coverage, and add actionlint/Ruff with strict clang-tidy failure handling. Validate native platforms, static builds, packaging, interoperability, sanitizers, and canonical/legacy consumers.

All 22 hosted checks pass at reviewed head a8493250eb.
2026-09-11 14:18:37 +08:00
Max Lv 201e70c4bd Modernize C builds with offline dependencies and portable runtime helpers (#3050)
Bundle pinned offline dependencies, remove libcork/libipset and submodule requirements, and add portable runtime helpers with relocatable static/shared library installations.

Add Clang static build validation for Linux/musl, macOS and Windows, real TCP/UDP and SIP003 interoperability coverage, and recorded performance tradeoffs. All 21 hosted checks pass at the reviewed PR head 8d504e6218.
2026-09-11 13:42:11 +08:00
Max LvandClaude Opus 4.6 5c2d0e43fa Add ss-setup TUI tool with unit tests and CI integration
Interactive whiptail/dialog TUI for server/client config generation,
systemd service management, SIP003 plugin installation, and ss:// URI
output. Includes 131 bash unit tests covering all utility functions
(validation, JSON generation, URI encoding, config round-trip parsing).
Tests run in CTest and as a dedicated GitHub Actions step.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 18:30:20 +08:00
Max Lv 1b3001007d Clean up 2019-06-14 16:56:00 +08:00
fanck0605 52ee4c7ded update url 2018-07-09 09:15:45 +08:00
Max Prokhorov 999e0555c7 Fedora COPR support
- Support .copr/Makefile for 'SCM / make srpm' COPR package
- Use genrpm.sh to generate srpm and optionally build it
- Use generic substitution syntax in specfile
2018-05-14 09:38:07 +03:00
Roger Shimizu c19f0ed46d Add scripts/chroot_build.sh to call build_deb.sh in a chrooted env
Support common debian and ubuntu version, such as jessie, stretch,
trusty, and xenial, etc.

e.g.
$ sudo scripts/chroot_build.sh jessie
2018-04-12 23:29:57 +09:00
Roger Shimizu 540f0903f5 scripts/build_deb.sh: Update libsodium build due to debhelper 11 2018-04-12 23:29:57 +09:00
Roger Shimizu a98587fa5f scripts/build_deb.sh: Update URL in script
- Use https URL when possible.
- Use salsa git repo instead of alioth (anonscm) for those already
  migrated in debian.
2018-04-07 12:05:00 +09:00
Roger Shimizu f35e24f6d6 scripts/build_deb.sh: Support ubuntu artful and bionic 2017-11-01 23:03:29 +09:00
Roger Shimizu da85fa17d4 Fix scripts/build_deb.sh for debian jessie
Thanks to Tom <hexuxin@foxmail.com> for the bug report.
2017-09-19 08:46:45 +08:00
Roger Shimizu 9a2c74193f Update README and build_deb since libsodium 1.0.13 is backported
libsodium 1.0.13 is current in Debian apt repository of:
 - stretch-backports
 - jessie-backports-sloppy
2017-08-20 02:28:32 -07:00
Roger Shimizu 15a54beb8c Minor fix for build_deb.sh script
- Install libbloom-dev in backports repository.
- Clone libsodium git under "libsodium" directory.
- Change to a safer way to check debhelper version.
- Remove simple-obfs for jessie/stretch because it's just
  accepted to backports repository.
2017-07-28 20:58:44 +09:00
Roger Shimizu cae2625513 Update scripts/build_deb.sh after stretch release
- Update build of libsodium to use debian's git repo
- Now libbloom is available in stretch-backports and
  jessie-backports-sloppy
2017-07-28 06:33:02 +09:00
Roger Shimizu 6c5142a2de Update simple-obfs git repo and branch
simple-obfs is released to debian unstable, and its git repo
is moved to alioth.
So update the URL of git repo and branch accordingly.
2017-05-04 22:01:52 +08:00
Roger Shimizu aaff27ed4d Update scripts/build_deb.sh
- Update debian pkg dsc URL of libsodium to 1.0.11-2.
- Update libbloom git repo to debian's anonscm (alioth).
- Update branch of libbloom git repo from exp1 to master.
  It's got released to debian unstable.
- Update branch of shadowsocks-libev git repo from exp1 to master
  It's got released to debian experimental.
2017-04-19 14:33:56 +08:00
Roger Shimizu f74c730611 Update scripts/build_deb.sh
- Cleanup
- KCP now confirms to work on jessie/stretch/xenial
- install pristine-tar specifically (was through recommends of
  git-buildpackage previously)
2017-04-04 19:33:03 +08:00
Roger Shimizu 669ddeba19 Add kcptun package build support to build_deb.sh script
Confirmed under xenial and jessie-backports.
Other distro still need some work, but should be similar.
2017-03-14 13:42:01 +08:00
Roger Shimizu 6a8adfb26f Make build_deb.sh script to build libraries and binaries separately
Also add usage help and a few code cleanup
2017-03-01 07:20:29 +08:00
Roger Shimizu fc2031f03b Cleanup build_deb.sh script
- Use "lsb_release -cs" command to get distro info.
- Limit xz memory usage to 128MiB.
- Other minor fixes.
2017-02-27 20:59:51 +08:00
Roger Shimizu e9c1116f0f Add simple-obfs support to build_deb.sh script 2017-02-27 07:40:42 +08:00
Roger Shimizu 12c4344a42 Update build_deb.sh to add libbloom support
Also includes fixes for yakkety.
2017-02-25 07:04:28 +08:00
Roger Shimizu 9185afb142 Update build script to enable jessie/stretch etc
Also include a few cleanup that simplified pkg installation from
backports repository.
2017-02-20 07:28:58 +08:00
Roger Shimizu 67661fb9dd Update deb build script
Now build script is able to auto detect system and choose libraries
necessary to build.

Also update the README accordingly.
2017-02-19 18:35:11 +08:00
Roger Shimizu 97ac602dbf Add xenial-backports repository
Because user may upgrade from previous LTS version, xenial-backports
is better to be added by us for safety.

And use debhelper 10 for shadowsocks-libev only.
2017-02-17 08:33:35 +08:00
Roger Shimizu d7888abbf1 Update trusty build script
- Move Build-Depends dh-autoreconf dh-systemd to debian/control
- Also change debian/compat to 9 (debhelper 9)
2017-02-17 08:33:25 +08:00
Neal Feng 0437e05aa8 iperf.sh: wait one second before killing processes 2017-02-16 12:33:40 +08:00
Roger Shimizu d12a7b911e Add more cleanup pkg to trusty script
For xenial script, it's clean enough so far.
2017-02-15 08:00:43 +08:00
Roger Shimizu 0553da0692 dh-systemd dependency should be removed for debhelper >=10
For trusty, debhelper is 9, so need to add the Build-Depends
for the build script.

With a few other fixes for trusty script.
2017-02-14 09:37:24 +08:00
Roger Shimizu e7e4291f03 Add deb build script for ubuntu xenial 16.04 2017-02-13 22:31:16 +08:00
Roger Shimizu 14a79b5500 Add deb build script for ubuntu trusty 14.04 2017-02-13 20:55:37 +08:00
Max Lv 95ef3d5635 Add iperf.sh 2017-02-03 18:47:29 +08:00