Compile the event loop, UDP relay and programs as C++

Rename utils, ss_event, udprelay, winsock, local, server, tunnel, redir
and manager from .c to .cpp. Inside the moved files only the
\snippet{doc} file references and header comments change; snippet
references in doc/*.md, tests/test_cli_docs.py, the build files and
CONTRIBUTION.md follow the new names.

Also cast the Windows-only string literal returned by
get_default_conf(), found by the zig x86_64-windows-gnu build.

Every module of src/ except the unbuilt android.c and the vendored
blake3 is now compiled as C++20. The new .cpp files join the no-heap
ratchet baseline.
This commit is contained in:
Max Lv
2026-10-14 22:51:17 +08:00
parent 1f259d0fa0
commit 227ad1bb9c
23 changed files with 327 additions and 319 deletions
+3 -3
View File
@@ -102,12 +102,12 @@ A library `libshadowsocks-c` (legacy names `libshadowsocks-libev.*` are kept) is
### Source Organization (`src/`)
**Shared by all binaries:**
- `utils.c` - logging, system utilities, `ss_malloc`/`ss_free`
- `utils.cpp` - logging, system utilities, `ss_malloc`/`ss_free`
- `jconf.cpp` / `json.cpp` - JSON config file parsing
- `netutils.cpp` - network address utilities
- `cache.cpp` - uthash-based connection cache (UDP relay, AEAD-2022 tables)
- `udprelay.c` - UDP relay implementation (shared, but uses `#ifdef MODULE_*` for per-binary behavior)
- `ss_event.c` / `ss_event.h` - event loop API over libuv
- `udprelay.cpp` - UDP relay implementation (shared, but uses `#ifdef MODULE_*` for per-binary behavior)
- `ss_event.cpp` / `ss_event.h` - event loop API over libuv
- `resolv.cpp` - asynchronous DNS via c-ares
**Crypto layer** (behind a common `crypto_t` function-pointer interface):
+1 -1
View File
@@ -78,7 +78,7 @@ notices.
Doxygen 1.9.4 or newer renders HTML and man pages directly from native source
snippets. Each CLI parser has a `cli-options` snippet containing Doxygen
`\snippet{doc}` references to its option descriptions. Shared descriptions live
in `src/utils.c`; command-specific descriptions live beside the parser. The
in `src/utils.cpp`; command-specific descriptions live beside the parser. The
`ss-nat` script keeps its snippets in a quoted no-op heredoc so documentation
cannot execute shell substitutions. Cipher tables are included directly with
Doxygen code snippets.
+1 -1
View File
@@ -1,4 +1,4 @@
add_library(ss_ev STATIC ${PROJECT_SOURCE_DIR}/src/ss_event.c)
add_library(ss_ev STATIC ${PROJECT_SOURCE_DIR}/src/ss_event.cpp)
target_include_directories(ss_ev PUBLIC ${PROJECT_SOURCE_DIR}/src)
target_link_libraries(ss_ev PUBLIC ss_uv Threads::Threads ${SS_MATH_LIBRARY} ${CMAKE_DL_LIBS})
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+1 -1
View File
@@ -21,7 +21,7 @@ For more information, check out shadowsocks-libev(8).
Options include all supported platform variants; restrictions are noted below.
\snippet{doc} local.c cli-options
\snippet{doc} local.cpp cli-options
\section ss_local_example EXAMPLE
+1 -1
View File
@@ -24,7 +24,7 @@ section.
Options include all supported platform variants; restrictions are noted below.
\snippet{doc} manager.c cli-options
\snippet{doc} manager.cpp cli-options
\section ss_manager_protocol PROTOCOL
+1 -1
View File
@@ -23,7 +23,7 @@ For more information, check out shadowsocks-libev(8) and the following
Options include all supported platform variants; restrictions are noted below.
\snippet{doc} redir.c cli-options
\snippet{doc} redir.cpp cli-options
\section ss_redir_example EXAMPLE
+1 -1
View File
@@ -21,7 +21,7 @@ For more information, check out shadowsocks-libev(8).
Options include all supported platform variants; restrictions are noted below.
\snippet{doc} server.c cli-options
\snippet{doc} server.cpp cli-options
\section ss_server_example EXAMPLE
+1 -1
View File
@@ -22,7 +22,7 @@ For more information, check out shadowsocks-libev(8).
Options include all supported platform variants; restrictions are noted below.
\snippet{doc} tunnel.c cli-options
\snippet{doc} tunnel.cpp cli-options
\section ss_tunnel_example EXAMPLE
+8
View File
@@ -10,9 +10,17 @@ src/crypto.cpp 4
src/ipset.cpp 3
src/jconf.cpp 16
src/json.cpp 2
src/local.cpp 16
src/manager.cpp 14
src/plugin.cpp 3
src/process.cpp 26
src/redir.cpp 15
src/resolv.cpp 6
src/rule.cpp 2
src/server.cpp 17
src/ss_event.cpp 5
src/ssurl.cpp 3
src/stream.cpp 3
src/tunnel.cpp 14
src/udprelay.cpp 7
src/utils.cpp 10
+11 -11
View File
@@ -50,20 +50,20 @@ endif()
set(SS_SHARED_SOURCES
ppbloom.cpp
utils.c
utils.cpp
jconf.cpp
json.cpp
netutils.cpp
)
if (MINGW)
set(SS_SHARED_SOURCES ${SS_SHARED_SOURCES} winsock.c)
set(SS_SHARED_SOURCES ${SS_SHARED_SOURCES} winsock.cpp)
endif ()
set(LIBSHADOWSOCKS_LIBEV_SOURCE
${SS_SHARED_SOURCES}
udprelay.c
udprelay.cpp
cache.cpp
local.c
local.cpp
resolv.cpp
ssurl.cpp
${SS_CRYPTO_SOURCE}
@@ -78,19 +78,19 @@ set(SS_LOCAL_SOURCE
set(SS_TUNNEL_SOURCE
${SS_SHARED_SOURCES}
udprelay.c
udprelay.cpp
cache.cpp
tunnel.c
tunnel.cpp
${SS_CRYPTO_SOURCE}
${SS_PLUGIN_SOURCE}
)
set(SS_SERVER_SOURCE
${SS_SHARED_SOURCES}
udprelay.c
udprelay.cpp
cache.cpp
resolv.cpp
server.c
server.cpp
${SS_CRYPTO_SOURCE}
${SS_PLUGIN_SOURCE}
${SS_ACL_SOURCE}
@@ -98,14 +98,14 @@ set(SS_SERVER_SOURCE
set(SS_MANAGER_SOURCE
${SS_SHARED_SOURCES}
manager.c
manager.cpp
)
set(SS_REDIR_SOURCE
${SS_SHARED_SOURCES}
udprelay.c
udprelay.cpp
cache.cpp
redir.c
redir.cpp
${SS_CRYPTO_SOURCE}
${SS_PLUGIN_SOURCE}
)
+1 -1
View File
@@ -3,7 +3,7 @@
#define SS_CORE_FIXED_MAP_HPP
// Fixed-capacity associative containers. Replace uthash (cache.cpp,
// ss_event.c, manager.c) without any per-entry allocation.
// ss_event.cpp, manager.cpp) without any per-entry allocation.
//
// FixedHashMap<K, V>
// Open addressing with linear probing and backward-shift deletion (no
+58 -58
View File
@@ -1,5 +1,5 @@
/*
* local.c - Setup a socks5 proxy through remote shadowsocks server
* local.cpp - Setup a socks5 proxy through remote shadowsocks server
*
* Copyright (C) 2013 - 2019, Max Lv <max.c.lv@gmail.com>
*
@@ -1600,63 +1600,63 @@ Same behavior as `-S`; see that option for details. Short alias: `-S`.
[cli_long_stat_path] */
/* [cli-options]
\snippet{doc} utils.c cli_short_f
\snippet{doc} utils.c cli_short_s
\snippet{doc} utils.c cli_short_p
\snippet{doc} utils.c cli_short_l
\snippet{doc} utils.c cli_short_k
\snippet{doc} utils.c cli_short_t
\snippet{doc} utils.c cli_short_m
\snippet{doc} utils.c cli_short_i
\snippet{doc} utils.c cli_short_c
\snippet{doc} utils.c cli_short_b
\snippet{doc} utils.c cli_short_a
\snippet{doc} utils.c cli_short_n
\snippet{doc} utils.c cli_short_S
\snippet{doc} utils.c cli_short_h
\snippet{doc} utils.c cli_short_u
\snippet{doc} utils.c cli_short_U
\snippet{doc} utils.c cli_short_v
\snippet{doc} utils.c cli_short_V
\snippet{doc} utils.c cli_short_6
\snippet{doc} utils.c cli_short_A
\snippet{doc} local.c cli_long_config
\snippet{doc} local.c cli_long_cipher
\snippet{doc} local.c cli_long_timeout
\snippet{doc} local.c cli_long_user
\snippet{doc} local.c cli_long_pid_file
\snippet{doc} local.c cli_long_nofile
\snippet{doc} local.c cli_long_udp
\snippet{doc} local.c cli_long_udp_only
\snippet{doc} local.c cli_long_ipv6_first
\snippet{doc} local.c cli_long_verbose
\snippet{doc} local.c cli_long_server
\snippet{doc} local.c cli_long_server_port
\snippet{doc} local.c cli_long_listen_address
\snippet{doc} local.c cli_long_listen_port
\snippet{doc} local.c cli_long_interface
\snippet{doc} utils.c cli_long_version
\snippet{doc} utils.c cli_long_tcp_only
\snippet{doc} utils.c cli_long_ipv4_first
\snippet{doc} local.c cli_long_vpn
\snippet{doc} local.c cli_long_stat_path
\snippet{doc} utils.c cli_long_reuse_port
\snippet{doc} utils.c cli_long_tcp_incoming_sndbuf
\snippet{doc} utils.c cli_long_tcp_incoming_rcvbuf
\snippet{doc} utils.c cli_long_tcp_outgoing_sndbuf
\snippet{doc} utils.c cli_long_tcp_outgoing_rcvbuf
\snippet{doc} utils.c cli_long_fast_open
\snippet{doc} utils.c cli_long_no_delay
\snippet{doc} utils.c cli_long_acl
\snippet{doc} utils.c cli_long_mtu
\snippet{doc} utils.c cli_long_mptcp
\snippet{doc} utils.c cli_long_plugin
\snippet{doc} utils.c cli_long_plugin_opts
\snippet{doc} utils.c cli_long_password
\snippet{doc} utils.c cli_long_key
\snippet{doc} utils.c cli_long_server_url
\snippet{doc} utils.c cli_long_printable_salt
\snippet{doc} utils.c cli_long_help
\snippet{doc} utils.cpp cli_short_f
\snippet{doc} utils.cpp cli_short_s
\snippet{doc} utils.cpp cli_short_p
\snippet{doc} utils.cpp cli_short_l
\snippet{doc} utils.cpp cli_short_k
\snippet{doc} utils.cpp cli_short_t
\snippet{doc} utils.cpp cli_short_m
\snippet{doc} utils.cpp cli_short_i
\snippet{doc} utils.cpp cli_short_c
\snippet{doc} utils.cpp cli_short_b
\snippet{doc} utils.cpp cli_short_a
\snippet{doc} utils.cpp cli_short_n
\snippet{doc} utils.cpp cli_short_S
\snippet{doc} utils.cpp cli_short_h
\snippet{doc} utils.cpp cli_short_u
\snippet{doc} utils.cpp cli_short_U
\snippet{doc} utils.cpp cli_short_v
\snippet{doc} utils.cpp cli_short_V
\snippet{doc} utils.cpp cli_short_6
\snippet{doc} utils.cpp cli_short_A
\snippet{doc} local.cpp cli_long_config
\snippet{doc} local.cpp cli_long_cipher
\snippet{doc} local.cpp cli_long_timeout
\snippet{doc} local.cpp cli_long_user
\snippet{doc} local.cpp cli_long_pid_file
\snippet{doc} local.cpp cli_long_nofile
\snippet{doc} local.cpp cli_long_udp
\snippet{doc} local.cpp cli_long_udp_only
\snippet{doc} local.cpp cli_long_ipv6_first
\snippet{doc} local.cpp cli_long_verbose
\snippet{doc} local.cpp cli_long_server
\snippet{doc} local.cpp cli_long_server_port
\snippet{doc} local.cpp cli_long_listen_address
\snippet{doc} local.cpp cli_long_listen_port
\snippet{doc} local.cpp cli_long_interface
\snippet{doc} utils.cpp cli_long_version
\snippet{doc} utils.cpp cli_long_tcp_only
\snippet{doc} utils.cpp cli_long_ipv4_first
\snippet{doc} local.cpp cli_long_vpn
\snippet{doc} local.cpp cli_long_stat_path
\snippet{doc} utils.cpp cli_long_reuse_port
\snippet{doc} utils.cpp cli_long_tcp_incoming_sndbuf
\snippet{doc} utils.cpp cli_long_tcp_incoming_rcvbuf
\snippet{doc} utils.cpp cli_long_tcp_outgoing_sndbuf
\snippet{doc} utils.cpp cli_long_tcp_outgoing_rcvbuf
\snippet{doc} utils.cpp cli_long_fast_open
\snippet{doc} utils.cpp cli_long_no_delay
\snippet{doc} utils.cpp cli_long_acl
\snippet{doc} utils.cpp cli_long_mtu
\snippet{doc} utils.cpp cli_long_mptcp
\snippet{doc} utils.cpp cli_long_plugin
\snippet{doc} utils.cpp cli_long_plugin_opts
\snippet{doc} utils.cpp cli_long_password
\snippet{doc} utils.cpp cli_long_key
\snippet{doc} utils.cpp cli_long_server_url
\snippet{doc} utils.cpp cli_long_printable_salt
\snippet{doc} utils.cpp cli_long_help
[cli-options] */
static struct option long_options[] = {
{ "config", required_argument, NULL, 'c' },
+46 -46
View File
@@ -1,5 +1,5 @@
/*
* server.c - Provide shadowsocks service
* server.cpp - Provide shadowsocks service
*
* Copyright (C) 2013 - 2019, Max Lv <max.c.lv@gmail.com>
*
@@ -1348,51 +1348,51 @@ Same behavior as `-d`; see that option for details. Short alias: `-d`.
[cli_long_nameserver] */
/* [cli-options]
\snippet{doc} utils.c cli_short_f
\snippet{doc} manager.c cli_short_s
\snippet{doc} utils.c cli_short_k
\snippet{doc} utils.c cli_short_t
\snippet{doc} utils.c cli_short_m
\snippet{doc} manager.c cli_short_c
\snippet{doc} utils.c cli_short_i
\snippet{doc} utils.c cli_short_d
\snippet{doc} utils.c cli_short_a
\snippet{doc} utils.c cli_short_n
\snippet{doc} utils.c cli_short_D
\snippet{doc} utils.c cli_short_6
\snippet{doc} utils.c cli_short_h
\snippet{doc} utils.c cli_short_u
\snippet{doc} utils.c cli_short_U
\snippet{doc} utils.c cli_short_v
\snippet{doc} utils.c cli_short_A
\snippet{doc} manager.c cli_long_config
\snippet{doc} manager.c cli_long_cipher
\snippet{doc} manager.c cli_long_timeout
\snippet{doc} manager.c cli_long_user
\snippet{doc} manager.c cli_long_pid_file
\snippet{doc} manager.c cli_long_nofile
\snippet{doc} manager.c cli_long_udp
\snippet{doc} manager.c cli_long_udp_only
\snippet{doc} manager.c cli_long_ipv6_first
\snippet{doc} manager.c cli_long_verbose
\snippet{doc} manager.c cli_long_listen_address
\snippet{doc} manager.c cli_long_interface
\snippet{doc} manager.c cli_long_nameserver
\snippet{doc} utils.c cli_long_version
\snippet{doc} utils.c cli_long_tcp_only
\snippet{doc} utils.c cli_long_ipv4_first
\snippet{doc} utils.c cli_long_fast_open
\snippet{doc} utils.c cli_long_no_delay
\snippet{doc} utils.c cli_long_reuse_port
\snippet{doc} utils.c cli_long_acl
\snippet{doc} utils.c cli_long_manager_address
\snippet{doc} utils.c cli_long_executable
\snippet{doc} utils.c cli_long_mtu
\snippet{doc} utils.c cli_long_plugin
\snippet{doc} utils.c cli_long_plugin_opts
\snippet{doc} utils.c cli_long_password
\snippet{doc} utils.c cli_long_workdir
\snippet{doc} utils.c cli_long_help
\snippet{doc} utils.cpp cli_short_f
\snippet{doc} manager.cpp cli_short_s
\snippet{doc} utils.cpp cli_short_k
\snippet{doc} utils.cpp cli_short_t
\snippet{doc} utils.cpp cli_short_m
\snippet{doc} manager.cpp cli_short_c
\snippet{doc} utils.cpp cli_short_i
\snippet{doc} utils.cpp cli_short_d
\snippet{doc} utils.cpp cli_short_a
\snippet{doc} utils.cpp cli_short_n
\snippet{doc} utils.cpp cli_short_D
\snippet{doc} utils.cpp cli_short_6
\snippet{doc} utils.cpp cli_short_h
\snippet{doc} utils.cpp cli_short_u
\snippet{doc} utils.cpp cli_short_U
\snippet{doc} utils.cpp cli_short_v
\snippet{doc} utils.cpp cli_short_A
\snippet{doc} manager.cpp cli_long_config
\snippet{doc} manager.cpp cli_long_cipher
\snippet{doc} manager.cpp cli_long_timeout
\snippet{doc} manager.cpp cli_long_user
\snippet{doc} manager.cpp cli_long_pid_file
\snippet{doc} manager.cpp cli_long_nofile
\snippet{doc} manager.cpp cli_long_udp
\snippet{doc} manager.cpp cli_long_udp_only
\snippet{doc} manager.cpp cli_long_ipv6_first
\snippet{doc} manager.cpp cli_long_verbose
\snippet{doc} manager.cpp cli_long_listen_address
\snippet{doc} manager.cpp cli_long_interface
\snippet{doc} manager.cpp cli_long_nameserver
\snippet{doc} utils.cpp cli_long_version
\snippet{doc} utils.cpp cli_long_tcp_only
\snippet{doc} utils.cpp cli_long_ipv4_first
\snippet{doc} utils.cpp cli_long_fast_open
\snippet{doc} utils.cpp cli_long_no_delay
\snippet{doc} utils.cpp cli_long_reuse_port
\snippet{doc} utils.cpp cli_long_acl
\snippet{doc} utils.cpp cli_long_manager_address
\snippet{doc} utils.cpp cli_long_executable
\snippet{doc} utils.cpp cli_long_mtu
\snippet{doc} utils.cpp cli_long_plugin
\snippet{doc} utils.cpp cli_long_plugin_opts
\snippet{doc} utils.cpp cli_long_password
\snippet{doc} utils.cpp cli_long_workdir
\snippet{doc} utils.cpp cli_long_help
[cli-options] */
static struct option long_options[] = {
{ "config", required_argument, NULL, 'c' },
+51 -51
View File
@@ -1,5 +1,5 @@
/*
* redir.c - Provide a transparent TCP proxy through remote shadowsocks
* redir.cpp - Provide a transparent TCP proxy through remote shadowsocks
* server
*
* Copyright (C) 2013 - 2019, Max Lv <max.c.lv@gmail.com>
@@ -1003,56 +1003,56 @@ Same behavior as `-T`; see that option for details. Short alias: `-T`.
[cli_long_tproxy] */
/* [cli-options]
\snippet{doc} utils.c cli_short_f
\snippet{doc} utils.c cli_short_s
\snippet{doc} utils.c cli_short_p
\snippet{doc} utils.c cli_short_l
\snippet{doc} utils.c cli_short_k
\snippet{doc} utils.c cli_short_t
\snippet{doc} utils.c cli_short_m
\snippet{doc} utils.c cli_short_c
\snippet{doc} utils.c cli_short_b
\snippet{doc} utils.c cli_short_a
\snippet{doc} utils.c cli_short_n
\snippet{doc} utils.c cli_short_h
\snippet{doc} redir.c cli_short_u
\snippet{doc} utils.c cli_short_U
\snippet{doc} utils.c cli_short_T
\snippet{doc} utils.c cli_short_v
\snippet{doc} utils.c cli_short_6
\snippet{doc} utils.c cli_short_A
\snippet{doc} redir.c cli_long_config
\snippet{doc} redir.c cli_long_cipher
\snippet{doc} redir.c cli_long_timeout
\snippet{doc} redir.c cli_long_user
\snippet{doc} redir.c cli_long_pid_file
\snippet{doc} redir.c cli_long_nofile
\snippet{doc} redir.c cli_long_udp
\snippet{doc} redir.c cli_long_udp_only
\snippet{doc} redir.c cli_long_ipv6_first
\snippet{doc} redir.c cli_long_verbose
\snippet{doc} redir.c cli_long_server
\snippet{doc} redir.c cli_long_server_port
\snippet{doc} redir.c cli_long_listen_address
\snippet{doc} redir.c cli_long_listen_port
\snippet{doc} redir.c cli_long_tproxy
\snippet{doc} utils.c cli_long_version
\snippet{doc} utils.c cli_long_tcp_only
\snippet{doc} utils.c cli_long_ipv4_first
\snippet{doc} utils.c cli_long_fast_open
\snippet{doc} utils.c cli_long_mtu
\snippet{doc} utils.c cli_long_mptcp
\snippet{doc} utils.c cli_long_plugin
\snippet{doc} utils.c cli_long_plugin_opts
\snippet{doc} utils.c cli_long_reuse_port
\snippet{doc} utils.c cli_long_tcp_incoming_sndbuf
\snippet{doc} utils.c cli_long_tcp_incoming_rcvbuf
\snippet{doc} utils.c cli_long_tcp_outgoing_sndbuf
\snippet{doc} utils.c cli_long_tcp_outgoing_rcvbuf
\snippet{doc} utils.c cli_long_no_delay
\snippet{doc} utils.c cli_long_password
\snippet{doc} utils.c cli_long_key
\snippet{doc} utils.c cli_long_help
\snippet{doc} utils.cpp cli_short_f
\snippet{doc} utils.cpp cli_short_s
\snippet{doc} utils.cpp cli_short_p
\snippet{doc} utils.cpp cli_short_l
\snippet{doc} utils.cpp cli_short_k
\snippet{doc} utils.cpp cli_short_t
\snippet{doc} utils.cpp cli_short_m
\snippet{doc} utils.cpp cli_short_c
\snippet{doc} utils.cpp cli_short_b
\snippet{doc} utils.cpp cli_short_a
\snippet{doc} utils.cpp cli_short_n
\snippet{doc} utils.cpp cli_short_h
\snippet{doc} redir.cpp cli_short_u
\snippet{doc} utils.cpp cli_short_U
\snippet{doc} utils.cpp cli_short_T
\snippet{doc} utils.cpp cli_short_v
\snippet{doc} utils.cpp cli_short_6
\snippet{doc} utils.cpp cli_short_A
\snippet{doc} redir.cpp cli_long_config
\snippet{doc} redir.cpp cli_long_cipher
\snippet{doc} redir.cpp cli_long_timeout
\snippet{doc} redir.cpp cli_long_user
\snippet{doc} redir.cpp cli_long_pid_file
\snippet{doc} redir.cpp cli_long_nofile
\snippet{doc} redir.cpp cli_long_udp
\snippet{doc} redir.cpp cli_long_udp_only
\snippet{doc} redir.cpp cli_long_ipv6_first
\snippet{doc} redir.cpp cli_long_verbose
\snippet{doc} redir.cpp cli_long_server
\snippet{doc} redir.cpp cli_long_server_port
\snippet{doc} redir.cpp cli_long_listen_address
\snippet{doc} redir.cpp cli_long_listen_port
\snippet{doc} redir.cpp cli_long_tproxy
\snippet{doc} utils.cpp cli_long_version
\snippet{doc} utils.cpp cli_long_tcp_only
\snippet{doc} utils.cpp cli_long_ipv4_first
\snippet{doc} utils.cpp cli_long_fast_open
\snippet{doc} utils.cpp cli_long_mtu
\snippet{doc} utils.cpp cli_long_mptcp
\snippet{doc} utils.cpp cli_long_plugin
\snippet{doc} utils.cpp cli_long_plugin_opts
\snippet{doc} utils.cpp cli_long_reuse_port
\snippet{doc} utils.cpp cli_long_tcp_incoming_sndbuf
\snippet{doc} utils.cpp cli_long_tcp_incoming_rcvbuf
\snippet{doc} utils.cpp cli_long_tcp_outgoing_sndbuf
\snippet{doc} utils.cpp cli_long_tcp_outgoing_rcvbuf
\snippet{doc} utils.cpp cli_long_no_delay
\snippet{doc} utils.cpp cli_long_password
\snippet{doc} utils.cpp cli_long_key
\snippet{doc} utils.cpp cli_long_help
[cli-options] */
static struct option long_options[] = {
{ "config", required_argument, NULL, 'c' },
+54 -54
View File
@@ -1,5 +1,5 @@
/*
* server.c - Provide shadowsocks service
* server.cpp - Provide shadowsocks service
*
* Copyright (C) 2013 - 2019, Max Lv <max.c.lv@gmail.com>
*
@@ -1929,59 +1929,59 @@ Same behavior as `-d`; see that option for details. Short alias: `-d`.
[cli_long_nameserver] */
/* [cli-options]
\snippet{doc} utils.c cli_short_f
\snippet{doc} server.c cli_short_s
\snippet{doc} server.c cli_short_p
\snippet{doc} utils.c cli_short_k
\snippet{doc} utils.c cli_short_t
\snippet{doc} utils.c cli_short_m
\snippet{doc} server.c cli_short_b
\snippet{doc} utils.c cli_short_c
\snippet{doc} utils.c cli_short_i
\snippet{doc} utils.c cli_short_d
\snippet{doc} utils.c cli_short_a
\snippet{doc} utils.c cli_short_n
\snippet{doc} utils.c cli_short_h
\snippet{doc} utils.c cli_short_u
\snippet{doc} utils.c cli_short_U
\snippet{doc} utils.c cli_short_v
\snippet{doc} utils.c cli_short_6
\snippet{doc} utils.c cli_short_A
\snippet{doc} server.c cli_long_config
\snippet{doc} server.c cli_long_cipher
\snippet{doc} server.c cli_long_timeout
\snippet{doc} server.c cli_long_user
\snippet{doc} server.c cli_long_pid_file
\snippet{doc} server.c cli_long_nofile
\snippet{doc} server.c cli_long_udp
\snippet{doc} server.c cli_long_udp_only
\snippet{doc} server.c cli_long_ipv6_first
\snippet{doc} server.c cli_long_verbose
\snippet{doc} server.c cli_long_listen_address
\snippet{doc} server.c cli_long_listen_port
\snippet{doc} server.c cli_long_outbound_address
\snippet{doc} server.c cli_long_interface
\snippet{doc} server.c cli_long_nameserver
\snippet{doc} utils.c cli_long_version
\snippet{doc} utils.c cli_long_tcp_only
\snippet{doc} utils.c cli_long_ipv4_first
\snippet{doc} utils.c cli_long_fast_open
\snippet{doc} utils.c cli_long_reuse_port
\snippet{doc} utils.c cli_long_tcp_incoming_sndbuf
\snippet{doc} utils.c cli_long_tcp_incoming_rcvbuf
\snippet{doc} utils.c cli_long_tcp_outgoing_sndbuf
\snippet{doc} utils.c cli_long_tcp_outgoing_rcvbuf
\snippet{doc} utils.c cli_long_no_delay
\snippet{doc} utils.c cli_long_acl
\snippet{doc} utils.c cli_long_manager_address
\snippet{doc} utils.c cli_long_mtu
\snippet{doc} utils.c cli_long_help
\snippet{doc} utils.c cli_long_plugin
\snippet{doc} utils.c cli_long_plugin_opts
\snippet{doc} utils.c cli_long_password
\snippet{doc} utils.c cli_long_key
\snippet{doc} utils.c cli_long_mptcp
\snippet{doc} utils.c cli_long_nftables_sets
\snippet{doc} utils.cpp cli_short_f
\snippet{doc} server.cpp cli_short_s
\snippet{doc} server.cpp cli_short_p
\snippet{doc} utils.cpp cli_short_k
\snippet{doc} utils.cpp cli_short_t
\snippet{doc} utils.cpp cli_short_m
\snippet{doc} server.cpp cli_short_b
\snippet{doc} utils.cpp cli_short_c
\snippet{doc} utils.cpp cli_short_i
\snippet{doc} utils.cpp cli_short_d
\snippet{doc} utils.cpp cli_short_a
\snippet{doc} utils.cpp cli_short_n
\snippet{doc} utils.cpp cli_short_h
\snippet{doc} utils.cpp cli_short_u
\snippet{doc} utils.cpp cli_short_U
\snippet{doc} utils.cpp cli_short_v
\snippet{doc} utils.cpp cli_short_6
\snippet{doc} utils.cpp cli_short_A
\snippet{doc} server.cpp cli_long_config
\snippet{doc} server.cpp cli_long_cipher
\snippet{doc} server.cpp cli_long_timeout
\snippet{doc} server.cpp cli_long_user
\snippet{doc} server.cpp cli_long_pid_file
\snippet{doc} server.cpp cli_long_nofile
\snippet{doc} server.cpp cli_long_udp
\snippet{doc} server.cpp cli_long_udp_only
\snippet{doc} server.cpp cli_long_ipv6_first
\snippet{doc} server.cpp cli_long_verbose
\snippet{doc} server.cpp cli_long_listen_address
\snippet{doc} server.cpp cli_long_listen_port
\snippet{doc} server.cpp cli_long_outbound_address
\snippet{doc} server.cpp cli_long_interface
\snippet{doc} server.cpp cli_long_nameserver
\snippet{doc} utils.cpp cli_long_version
\snippet{doc} utils.cpp cli_long_tcp_only
\snippet{doc} utils.cpp cli_long_ipv4_first
\snippet{doc} utils.cpp cli_long_fast_open
\snippet{doc} utils.cpp cli_long_reuse_port
\snippet{doc} utils.cpp cli_long_tcp_incoming_sndbuf
\snippet{doc} utils.cpp cli_long_tcp_incoming_rcvbuf
\snippet{doc} utils.cpp cli_long_tcp_outgoing_sndbuf
\snippet{doc} utils.cpp cli_long_tcp_outgoing_rcvbuf
\snippet{doc} utils.cpp cli_long_no_delay
\snippet{doc} utils.cpp cli_long_acl
\snippet{doc} utils.cpp cli_long_manager_address
\snippet{doc} utils.cpp cli_long_mtu
\snippet{doc} utils.cpp cli_long_help
\snippet{doc} utils.cpp cli_long_plugin
\snippet{doc} utils.cpp cli_long_plugin_opts
\snippet{doc} utils.cpp cli_long_password
\snippet{doc} utils.cpp cli_long_key
\snippet{doc} utils.cpp cli_long_mptcp
\snippet{doc} utils.cpp cli_long_nftables_sets
[cli-options] */
static struct option long_options[] = {
{ "config", required_argument, NULL, 'c' },
View File
+55 -55
View File
@@ -1,5 +1,5 @@
/*
* tunnel.c - Setup a local port forwarding through remote shadowsocks server
* tunnel.cpp - Setup a local port forwarding through remote shadowsocks server
*
* Copyright (C) 2013 - 2019, Max Lv <max.c.lv@gmail.com>
*
@@ -1043,60 +1043,60 @@ Same behavior as `-V`; see that option for details. Short alias: `-V`.
[cli_long_vpn] */
/* [cli-options]
\snippet{doc} utils.c cli_short_f
\snippet{doc} utils.c cli_short_s
\snippet{doc} utils.c cli_short_p
\snippet{doc} utils.c cli_short_l
\snippet{doc} utils.c cli_short_k
\snippet{doc} utils.c cli_short_t
\snippet{doc} utils.c cli_short_m
\snippet{doc} utils.c cli_short_i
\snippet{doc} utils.c cli_short_c
\snippet{doc} utils.c cli_short_b
\snippet{doc} utils.c cli_short_L
\snippet{doc} utils.c cli_short_a
\snippet{doc} utils.c cli_short_n
\snippet{doc} utils.c cli_short_h
\snippet{doc} utils.c cli_short_u
\snippet{doc} utils.c cli_short_U
\snippet{doc} utils.c cli_short_v
\snippet{doc} utils.c cli_short_V
\snippet{doc} utils.c cli_short_6
\snippet{doc} utils.c cli_short_A
\snippet{doc} tunnel.c cli_long_config
\snippet{doc} tunnel.c cli_long_cipher
\snippet{doc} tunnel.c cli_long_timeout
\snippet{doc} tunnel.c cli_long_user
\snippet{doc} tunnel.c cli_long_pid_file
\snippet{doc} tunnel.c cli_long_nofile
\snippet{doc} tunnel.c cli_long_udp
\snippet{doc} tunnel.c cli_long_udp_only
\snippet{doc} tunnel.c cli_long_ipv6_first
\snippet{doc} tunnel.c cli_long_verbose
\snippet{doc} tunnel.c cli_long_server
\snippet{doc} tunnel.c cli_long_server_port
\snippet{doc} tunnel.c cli_long_listen_address
\snippet{doc} tunnel.c cli_long_listen_port
\snippet{doc} tunnel.c cli_long_interface
\snippet{doc} tunnel.c cli_long_destination
\snippet{doc} utils.c cli_long_version
\snippet{doc} utils.c cli_long_tcp_only
\snippet{doc} utils.c cli_long_ipv4_first
\snippet{doc} tunnel.c cli_long_vpn
\snippet{doc} utils.c cli_long_fast_open
\snippet{doc} utils.c cli_long_mtu
\snippet{doc} utils.c cli_long_no_delay
\snippet{doc} utils.c cli_long_mptcp
\snippet{doc} utils.c cli_long_plugin
\snippet{doc} utils.c cli_long_plugin_opts
\snippet{doc} utils.c cli_long_reuse_port
\snippet{doc} utils.c cli_long_tcp_incoming_sndbuf
\snippet{doc} utils.c cli_long_tcp_incoming_rcvbuf
\snippet{doc} utils.c cli_long_tcp_outgoing_sndbuf
\snippet{doc} utils.c cli_long_tcp_outgoing_rcvbuf
\snippet{doc} utils.c cli_long_password
\snippet{doc} utils.c cli_long_key
\snippet{doc} utils.c cli_long_help
\snippet{doc} utils.cpp cli_short_f
\snippet{doc} utils.cpp cli_short_s
\snippet{doc} utils.cpp cli_short_p
\snippet{doc} utils.cpp cli_short_l
\snippet{doc} utils.cpp cli_short_k
\snippet{doc} utils.cpp cli_short_t
\snippet{doc} utils.cpp cli_short_m
\snippet{doc} utils.cpp cli_short_i
\snippet{doc} utils.cpp cli_short_c
\snippet{doc} utils.cpp cli_short_b
\snippet{doc} utils.cpp cli_short_L
\snippet{doc} utils.cpp cli_short_a
\snippet{doc} utils.cpp cli_short_n
\snippet{doc} utils.cpp cli_short_h
\snippet{doc} utils.cpp cli_short_u
\snippet{doc} utils.cpp cli_short_U
\snippet{doc} utils.cpp cli_short_v
\snippet{doc} utils.cpp cli_short_V
\snippet{doc} utils.cpp cli_short_6
\snippet{doc} utils.cpp cli_short_A
\snippet{doc} tunnel.cpp cli_long_config
\snippet{doc} tunnel.cpp cli_long_cipher
\snippet{doc} tunnel.cpp cli_long_timeout
\snippet{doc} tunnel.cpp cli_long_user
\snippet{doc} tunnel.cpp cli_long_pid_file
\snippet{doc} tunnel.cpp cli_long_nofile
\snippet{doc} tunnel.cpp cli_long_udp
\snippet{doc} tunnel.cpp cli_long_udp_only
\snippet{doc} tunnel.cpp cli_long_ipv6_first
\snippet{doc} tunnel.cpp cli_long_verbose
\snippet{doc} tunnel.cpp cli_long_server
\snippet{doc} tunnel.cpp cli_long_server_port
\snippet{doc} tunnel.cpp cli_long_listen_address
\snippet{doc} tunnel.cpp cli_long_listen_port
\snippet{doc} tunnel.cpp cli_long_interface
\snippet{doc} tunnel.cpp cli_long_destination
\snippet{doc} utils.cpp cli_long_version
\snippet{doc} utils.cpp cli_long_tcp_only
\snippet{doc} utils.cpp cli_long_ipv4_first
\snippet{doc} tunnel.cpp cli_long_vpn
\snippet{doc} utils.cpp cli_long_fast_open
\snippet{doc} utils.cpp cli_long_mtu
\snippet{doc} utils.cpp cli_long_no_delay
\snippet{doc} utils.cpp cli_long_mptcp
\snippet{doc} utils.cpp cli_long_plugin
\snippet{doc} utils.cpp cli_long_plugin_opts
\snippet{doc} utils.cpp cli_long_reuse_port
\snippet{doc} utils.cpp cli_long_tcp_incoming_sndbuf
\snippet{doc} utils.cpp cli_long_tcp_incoming_rcvbuf
\snippet{doc} utils.cpp cli_long_tcp_outgoing_sndbuf
\snippet{doc} utils.cpp cli_long_tcp_outgoing_rcvbuf
\snippet{doc} utils.cpp cli_long_password
\snippet{doc} utils.cpp cli_long_key
\snippet{doc} utils.cpp cli_long_help
[cli-options] */
static struct option long_options[] = {
{ "config", required_argument, NULL, 'c' },
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* udprelay.c - Setup UDP relay for both client and server
* udprelay.cpp - Setup UDP relay for both client and server
*
* Copyright (C) 2013 - 2019, Max Lv <max.c.lv@gmail.com>
*
+2 -2
View File
@@ -1,5 +1,5 @@
/*
* utils.c - Misc utilities
* utils.cpp - Misc utilities
*
* Copyright (C) 2013 - 2019, Max Lv <max.c.lv@gmail.com>
*
@@ -860,7 +860,7 @@ get_default_conf(void)
// If not, fall back to the system-wide config.
return sysconf;
#else
return "config.json";
return (char *)"config.json";
#endif
}
+1 -1
View File
@@ -207,7 +207,7 @@ extern int use_syslog;
#endif
#define ERROR(s) ss_error(s)
// Implemented in winsock.c
// Implemented in winsock.cpp
void ss_error(const char *s);
void ss_color_info(void);
void ss_color_error(void);
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* winsock.c - Windows socket compatibility layer
* winsock.cpp - Windows socket compatibility layer
*
* Copyright (C) 2013 - 2019, Max Lv <max.c.lv@gmail.com>
*
+17 -17
View File
@@ -20,8 +20,8 @@ endif()
# Helper function to add a unit test
function(ss_add_test name sources libs)
if(WIN32 AND "${sources}" MATCHES "utils.c")
list(APPEND sources ${PROJECT_SOURCE_DIR}/src/winsock.c)
if(WIN32 AND "${sources}" MATCHES "utils.cpp")
list(APPEND sources ${PROJECT_SOURCE_DIR}/src/winsock.cpp)
endif()
add_executable(${name} ${sources})
target_compile_definitions(${name} PRIVATE -DHAVE_CONFIG_H)
@@ -95,9 +95,9 @@ ss_add_test(test_base64
"test_base64.c;${PROJECT_SOURCE_DIR}/src/base64.cpp"
"")
# test_utils - needs sodium (for ss_malloc -> uses sodium in utils.c)
# test_utils - needs sodium (for ss_malloc -> uses sodium in utils.cpp)
ss_add_test(test_utils
"test_utils.c;${PROJECT_SOURCE_DIR}/src/utils.c"
"test_utils.c;${PROJECT_SOURCE_DIR}/src/utils.cpp"
"ss_sodium")
# test_json - standalone json parser
@@ -107,7 +107,7 @@ ss_add_test(test_json
# test_ssurl - ss:// URI parsing (SIP002 and legacy)
ss_add_test(test_ssurl
"test_ssurl.c;${PROJECT_SOURCE_DIR}/src/ssurl.cpp;${PROJECT_SOURCE_DIR}/src/base64.cpp;${PROJECT_SOURCE_DIR}/src/utils.c"
"test_ssurl.c;${PROJECT_SOURCE_DIR}/src/ssurl.cpp;${PROJECT_SOURCE_DIR}/src/base64.cpp;${PROJECT_SOURCE_DIR}/src/utils.cpp"
"ss_sodium")
# test_netutils - address parsing and resolver integration
@@ -117,19 +117,19 @@ set(TEST_NETUTILS_LIBS
ss_cares
)
ss_add_test(test_netutils
"test_netutils.c;${PROJECT_SOURCE_DIR}/src/netutils.cpp;${PROJECT_SOURCE_DIR}/src/utils.c"
"test_netutils.c;${PROJECT_SOURCE_DIR}/src/netutils.cpp;${PROJECT_SOURCE_DIR}/src/utils.cpp"
"${TEST_NETUTILS_LIBS}")
# test_cache - expiration uses a platform monotonic clock
ss_add_test(test_cache
"test_cache.c;${PROJECT_SOURCE_DIR}/src/cache.cpp;${PROJECT_SOURCE_DIR}/src/utils.c"
"test_cache.c;${PROJECT_SOURCE_DIR}/src/cache.cpp;${PROJECT_SOURCE_DIR}/src/utils.cpp"
"ss_sodium")
# test_ppbloom - needs bloom
set(TEST_PPBLOOM_LIBS "")
list(APPEND TEST_PPBLOOM_LIBS bloom)
ss_add_test(test_ppbloom
"test_ppbloom.c;${PROJECT_SOURCE_DIR}/src/ppbloom.cpp;${PROJECT_SOURCE_DIR}/src/utils.c"
"test_ppbloom.c;${PROJECT_SOURCE_DIR}/src/ppbloom.cpp;${PROJECT_SOURCE_DIR}/src/utils.cpp"
"${TEST_PPBLOOM_LIBS};ss_sodium;${SS_MATH_LIBRARY}")
if(SS_ENABLE_REGEX)
@@ -139,13 +139,13 @@ set(TEST_RULE_LIBS
ss_sodium
)
ss_add_test(test_rule
"test_rule.c;${PROJECT_SOURCE_DIR}/src/rule.cpp;${PROJECT_SOURCE_DIR}/src/utils.c"
"test_rule.c;${PROJECT_SOURCE_DIR}/src/rule.cpp;${PROJECT_SOURCE_DIR}/src/utils.cpp"
"${TEST_RULE_LIBS}")
# test_acl - ACL precedence and prefix matching
set(TEST_ACL_LIBS ${TEST_RULE_LIBS})
ss_add_test(test_acl
"test_acl.c;${PROJECT_SOURCE_DIR}/src/acl.cpp;${PROJECT_SOURCE_DIR}/src/ipset.cpp;${PROJECT_SOURCE_DIR}/src/rule.cpp;${PROJECT_SOURCE_DIR}/src/utils.c"
"test_acl.c;${PROJECT_SOURCE_DIR}/src/acl.cpp;${PROJECT_SOURCE_DIR}/src/ipset.cpp;${PROJECT_SOURCE_DIR}/src/rule.cpp;${PROJECT_SOURCE_DIR}/src/utils.cpp"
"${TEST_ACL_LIBS}")
endif()
@@ -157,7 +157,7 @@ set(TEST_JCONF_LIBS
ss_cares
)
ss_add_test(test_jconf
"test_jconf.c;${PROJECT_SOURCE_DIR}/src/jconf.cpp;${PROJECT_SOURCE_DIR}/src/json.cpp;${PROJECT_SOURCE_DIR}/src/utils.c;${PROJECT_SOURCE_DIR}/src/netutils.cpp"
"test_jconf.c;${PROJECT_SOURCE_DIR}/src/jconf.cpp;${PROJECT_SOURCE_DIR}/src/json.cpp;${PROJECT_SOURCE_DIR}/src/utils.cpp;${PROJECT_SOURCE_DIR}/src/netutils.cpp"
"${TEST_JCONF_LIBS};${SS_MATH_LIBRARY}")
# Crypto sources shared by the tests that link the crypto layer. The AEAD-2022
@@ -171,7 +171,7 @@ set(SS_CRYPTO_TEST_SOURCES
${PROJECT_SOURCE_DIR}/src/ppbloom.cpp
${PROJECT_SOURCE_DIR}/src/cache.cpp
${PROJECT_SOURCE_DIR}/src/base64.cpp
${PROJECT_SOURCE_DIR}/src/utils.c
${PROJECT_SOURCE_DIR}/src/utils.cpp
)
if(SS_ENABLE_LEGACY)
@@ -220,16 +220,16 @@ add_test(NAME test_ss_setup
set_tests_properties(test_ss_setup PROPERTIES LABELS "integration")
ss_add_test(test_ipset
"test_ipset.c;${PROJECT_SOURCE_DIR}/src/ipset.cpp;${PROJECT_SOURCE_DIR}/src/utils.c"
"test_ipset.c;${PROJECT_SOURCE_DIR}/src/ipset.cpp;${PROJECT_SOURCE_DIR}/src/utils.cpp"
"ss_sodium")
ss_add_test(test_process
"test_process.c;${PROJECT_SOURCE_DIR}/src/process.cpp;${PROJECT_SOURCE_DIR}/src/utils.c"
"test_process.c;${PROJECT_SOURCE_DIR}/src/process.cpp;${PROJECT_SOURCE_DIR}/src/utils.cpp"
"ss_sodium")
set_tests_properties(test_process PROPERTIES TIMEOUT 20)
ss_add_test(test_resolv
"test_resolv.c;${PROJECT_SOURCE_DIR}/src/resolv.cpp;${PROJECT_SOURCE_DIR}/src/utils.c"
"test_resolv.c;${PROJECT_SOURCE_DIR}/src/resolv.cpp;${PROJECT_SOURCE_DIR}/src/utils.cpp"
"ss_ev;ss_cares;ss_sodium")
set_tests_properties(test_resolv PROPERTIES TIMEOUT 20)
@@ -238,13 +238,13 @@ if(SS_ENABLE_REGEX)
list(APPEND TEST_LITERAL_LIBS ss_pcre2)
endif()
ss_add_test(test_acl_literal
"test_acl_literal.c;${PROJECT_SOURCE_DIR}/src/acl.cpp;${PROJECT_SOURCE_DIR}/src/ipset.cpp;${PROJECT_SOURCE_DIR}/src/rule.cpp;${PROJECT_SOURCE_DIR}/src/utils.c"
"test_acl_literal.c;${PROJECT_SOURCE_DIR}/src/acl.cpp;${PROJECT_SOURCE_DIR}/src/ipset.cpp;${PROJECT_SOURCE_DIR}/src/rule.cpp;${PROJECT_SOURCE_DIR}/src/utils.cpp"
"${TEST_LITERAL_LIBS}")
ss_add_test(test_event "test_event.c" "ss_ev")
set_tests_properties(test_event PROPERTIES TIMEOUT 30)
ss_add_test(test_resolv_async
"test_resolv_async.c;${PROJECT_SOURCE_DIR}/src/resolv.cpp;${PROJECT_SOURCE_DIR}/src/utils.c"
"test_resolv_async.c;${PROJECT_SOURCE_DIR}/src/resolv.cpp;${PROJECT_SOURCE_DIR}/src/utils.cpp"
"ss_ev;ss_cares;ss_sodium")
set_tests_properties(test_resolv_async PROPERTIES TIMEOUT 30)
+11 -11
View File
@@ -19,7 +19,7 @@ class CliDocsTests(unittest.TestCase):
self.root = Path(self.temp.name)
(self.root / 'src').mkdir()
(self.root / 'doc').mkdir()
for name in ('local.c', 'server.c', 'tunnel.c', 'redir.c', 'manager.c', 'utils.c', 'ss-nat'):
for name in ('local.cpp', 'server.cpp', 'tunnel.cpp', 'redir.cpp', 'manager.cpp', 'utils.cpp', 'ss-nat'):
shutil.copyfile(ROOT / 'src' / name, self.root / 'src' / name)
for path in (ROOT / 'doc').glob('*.md'):
shutil.copyfile(path, self.root / 'doc' / path.name)
@@ -33,32 +33,32 @@ class CliDocsTests(unittest.TestCase):
def test_current_documentation_matches_all_variants(self):
DOCS.check(self.root)
sources = {p.name: p.read_text(encoding='utf-8') for p in (self.root / 'src').iterdir()}
local = DOCS.documented_options('local.c', sources)
local = DOCS.documented_options('local.cpp', sources)
self.assertIn('-S', local)
self.assertIn('-V', local)
self.assertIn('--nftables-sets', DOCS.documented_options('server.c', sources))
self.assertIn('--nftables-sets', DOCS.documented_options('server.cpp', sources))
self.assertIn('-I', DOCS.documented_options('ss-nat', sources))
self.assertNotIn('-p', DOCS.documented_options('manager.c', sources))
self.assertNotIn('-p', DOCS.documented_options('manager.cpp', sources))
def test_new_option_requires_documentation(self):
self.change('src/local.c', '"reuse-port",', '"new-option",')
self.change('src/local.cpp', '"reuse-port",', '"new-option",')
with self.assertRaisesRegex(ValueError, 'missing documentation.*new-option'):
DOCS.check(self.root)
def test_argument_arity_is_checked(self):
self.change('src/local.c', '"reuse-port", no_argument',
self.change('src/local.cpp', '"reuse-port", no_argument',
'"reuse-port", required_argument')
with self.assertRaisesRegex(ValueError, 'argument mismatch.*reuse-port'):
DOCS.check(self.root)
def test_unknown_parser_syntax_fails_closed(self):
self.change('src/local.c', '"reuse-port", no_argument',
self.change('src/local.cpp', '"reuse-port", no_argument',
'"reuse-port", optional_argument')
with self.assertRaisesRegex(ValueError, 'Unsupported long_options'):
DOCS.check(self.root)
def test_nonliteral_short_options_fail_closed(self):
self.change('src/local.c', '":f:s:p:l:k:t:m:i:c:b:a:n:huUv6A"', 'SHORT_OPTIONS')
self.change('src/local.cpp', '":f:s:p:l:k:t:m:i:c:b:a:n:huUv6A"', 'SHORT_OPTIONS')
with self.assertRaisesRegex(ValueError, 'literal getopt_long'):
DOCS.check(self.root)
@@ -68,17 +68,17 @@ class CliDocsTests(unittest.TestCase):
DOCS.check(self.root)
def test_missing_snippet_is_rejected(self):
self.change('src/local.c', 'utils.c cli_long_reuse_port', 'utils.c missing_snippet')
self.change('src/local.cpp', 'utils.cpp cli_long_reuse_port', 'utils.cpp missing_snippet')
with self.assertRaisesRegex(ValueError, 'Missing snippet'):
DOCS.check(self.root)
def test_duplicate_option_is_rejected(self):
self.change('src/local.c', 'utils.c cli_long_reuse_port', 'utils.c cli_short_f')
self.change('src/local.cpp', 'utils.cpp cli_long_reuse_port', 'utils.cpp cli_short_f')
with self.assertRaisesRegex(ValueError, 'Duplicate documented option'):
DOCS.check(self.root)
def test_manual_must_include_parser_options(self):
self.change('doc/ss-local.md', 'local.c cli-options', 'local.c missing-options')
self.change('doc/ss-local.md', 'local.cpp cli-options', 'local.cpp missing-options')
with self.assertRaisesRegex(ValueError, 'manual must include'):
DOCS.check(self.root)