mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-22 06:53:46 +00:00
Replace legacy PCRE (libpcre3) with PCRE2 (libpcre2-8). PCRE1 has been end-of-life since 2021. - src/rule.h: use pcre2_code and pcre2_match_data types - src/rule.c: pcre_compile -> pcre2_compile, pcre_exec -> pcre2_match, pcre_free -> pcre2_code_free, with proper error message retrieval - cmake/FindPCRE.cmake -> cmake/FindPCRE2.cmake: find libpcre2-8 via pkg-config, pcre2-config, or manual search - Update all CMakeLists.txt, config.h.cmake, configure.cmake, README.md Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
127 lines
2.7 KiB
C
127 lines
2.7 KiB
C
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include <assert.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
int verbose = 0;
|
|
|
|
#include "rule.h"
|
|
#include "utils.h"
|
|
|
|
static void
|
|
test_new_rule(void)
|
|
{
|
|
rule_t *rule = new_rule();
|
|
assert(rule != NULL);
|
|
assert(rule->pattern == NULL);
|
|
assert(rule->pattern_re == NULL);
|
|
free(rule);
|
|
}
|
|
|
|
static void
|
|
test_accept_rule_arg(void)
|
|
{
|
|
rule_t *rule = new_rule();
|
|
assert(rule != NULL);
|
|
|
|
int ret = accept_rule_arg(rule, "^example\\.com$");
|
|
assert(ret == 1);
|
|
assert(rule->pattern != NULL);
|
|
assert(strcmp(rule->pattern, "^example\\.com$") == 0);
|
|
|
|
/* Second call should fail - pattern already set */
|
|
ret = accept_rule_arg(rule, "another");
|
|
assert(ret == -1);
|
|
(void)ret;
|
|
|
|
free(rule->pattern);
|
|
free(rule);
|
|
}
|
|
|
|
static void
|
|
test_init_rule(void)
|
|
{
|
|
rule_t *rule = new_rule();
|
|
accept_rule_arg(rule, "^test.*$");
|
|
|
|
int ret = init_rule(rule);
|
|
assert(ret == 1);
|
|
(void)ret;
|
|
assert(rule->pattern_re != NULL);
|
|
|
|
if (rule->match_data)
|
|
pcre2_match_data_free(rule->match_data);
|
|
if (rule->pattern_re)
|
|
pcre2_code_free(rule->pattern_re);
|
|
free(rule->pattern);
|
|
free(rule);
|
|
}
|
|
|
|
static void
|
|
test_init_rule_invalid(void)
|
|
{
|
|
rule_t *rule = new_rule();
|
|
accept_rule_arg(rule, "[invalid"); /* Unclosed bracket */
|
|
|
|
int ret = init_rule(rule);
|
|
assert(ret == 0); /* Should fail */
|
|
(void)ret;
|
|
|
|
free(rule->pattern);
|
|
free(rule);
|
|
}
|
|
|
|
static void
|
|
test_lookup_rule(void)
|
|
{
|
|
struct cork_dllist rules;
|
|
cork_dllist_init(&rules);
|
|
|
|
rule_t *rule1 = new_rule();
|
|
accept_rule_arg(rule1, "^google\\.com$");
|
|
init_rule(rule1);
|
|
add_rule(&rules, rule1);
|
|
|
|
rule_t *rule2 = new_rule();
|
|
accept_rule_arg(rule2, ".*\\.example\\.com$");
|
|
init_rule(rule2);
|
|
add_rule(&rules, rule2);
|
|
|
|
/* Should match rule1 */
|
|
rule_t *found = lookup_rule(&rules, "google.com", 10);
|
|
assert(found == rule1);
|
|
|
|
/* Should match rule2 */
|
|
found = lookup_rule(&rules, "sub.example.com", 15);
|
|
assert(found == rule2);
|
|
|
|
/* Should not match */
|
|
found = lookup_rule(&rules, "other.net", 9);
|
|
assert(found == NULL);
|
|
(void)found;
|
|
|
|
/* Clean up */
|
|
if (rule1->match_data) pcre2_match_data_free(rule1->match_data);
|
|
if (rule1->pattern_re) pcre2_code_free(rule1->pattern_re);
|
|
free(rule1->pattern);
|
|
free(rule1);
|
|
if (rule2->match_data) pcre2_match_data_free(rule2->match_data);
|
|
if (rule2->pattern_re) pcre2_code_free(rule2->pattern_re);
|
|
free(rule2->pattern);
|
|
free(rule2);
|
|
}
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
test_new_rule();
|
|
test_accept_rule_arg();
|
|
test_init_rule();
|
|
test_init_rule_invalid();
|
|
test_lookup_rule();
|
|
return 0;
|
|
}
|