* 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.
- 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
This change includes:
1. Move shared library `shadowsocks-libev.so.*` to an package `libshadowsocks-libev`
and rename package `shadowsocks-libev-devel` to `libshadowsocks-libev-devel`
to reconcile with the deb packages.
2. Add a new package `shadowsocks-libev-zsh-completion`.
3. Run `setcap` after installation (similar to #1119).
4. Remove ss-nat because it is designed for OpenWrt/LEDE.
5. Auto restart instantiated services after update and stop/disable instantiated
services after uninstallation.
As discussed with @librehat in #1604, maintaining a separate set of systemd
files for RPM distributions will be convenient to build on Copr.
This patch will also change some lines in rpm/genrpm.sh to archive the
source code using `git archive` because the old logic doesn't respect
`.gitignore`.
This patch is going to replace the group name 'nogroup' with 'nobody' in
debian/shadowsocks-libev.service, and move file
'/etc/default/shadowsocks-libev' to '/etc/sysconfig/shadowsocks-libev'.
This is implemented by creating a text patch file. Not sure whether
there is a better approach.
1. add missing build and runtime dependencies
2. change minimal version requirement for libsodium to 1.0.4, which
should work fine with ss-libev and EPEL7 users will not have to compile a
later version.
3. add more entries to .gitignore
Here are the problems existing in the old RPM packaging scripts:
1. The old `genrpm.sh` is designed to build RPMs for all versions of
shadowsocks-libev with an option '-v'.
This increases the complexity because we need to keep it compatible
with old versions.
2. I have to modify the script manually in order to build RPMs from
non-release commit or dirty workspace.
The new script will only build RPMs and SRPMs from current workspace,
not commit.
The version-release number will be determined automatically from the
`git describe` command.
* auto select latest version
* bash-completion comes with version 2.6.0
* version greater than 2.6.2 need submodules packed
* adjust version check order
Add experimental HTTP/TLS obfuscating as an **optional extension** of shadowsocks protocol.
More discussions can be found here: https://github.com/shadowsocks/shadowsocks-org/issues/26
As this feature is still a SIP (Shadowsocks Improvement Proposal), it's very unstable and experimental. So,
1. Don't enable it unless you know what it is.
2. Be very careful when using it in production environment.
Tests show that EL6 is too old to support `%elif` statement (which is very stupid).
And revert dependency `openssl-libs` to `openssl` because of
inconsistent names in EL6.
1. Remove function `get_att_val`:
That function uses `eval` to set default values for bash variables.
Because it is very dangerous to use `eval` (someone call it the plague of shell scripting), I'd like to use the bash builtin to do that.
2. Double quote all variables to avoid unexpected expansion when using it.
it's not conflicted with shadowsocks-python now. users can install both python and libev
ports of shaowsocks now. but they should migrate their old configuration file from
/etc/shadowsocks/config.json to /etc/shadowsocks-libev/config.json