From c30522573489579e72119a3c2b6f275002667333 Mon Sep 17 00:00:00 2001 From: dnomd343 Date: Sun, 4 Sep 2022 15:14:45 +0800 Subject: [PATCH] update: sip003 arguments --- include/common.h | 5 ++- include/load.h | 4 +- include/sip003.h | 15 ++++++- src/CMakeLists.txt | 4 +- src/common.c | 10 +++++ src/load.c | 39 +++++++++-------- src/local.c | 6 ++- src/server.c | 5 ++- src/sip003.c | 102 +++++++++++++++++++++++--------------------- src/utils/process.c | 19 +-------- 10 files changed, 113 insertions(+), 96 deletions(-) diff --git a/include/common.h b/include/common.h index 9a69dcd..c0d77af 100644 --- a/include/common.h +++ b/include/common.h @@ -6,11 +6,12 @@ #define RANDOM_PORT_START 41952 #define RANDOM_PORT_END 65535 +void init(int argc, char **argv, char *help_msg); + char* new_string(char *str); char* int_to_string(int num); char* read_file(char *file_name); +char* string_list_join(char **string_list); char** string_list_append(char **string_list, char *data); -void init(int argc, char **argv, char *help_msg); - #endif diff --git a/include/load.h b/include/load.h index b17f7ec..3800b67 100644 --- a/include/load.h +++ b/include/load.h @@ -13,8 +13,8 @@ typedef struct { char *plugin_opts; char *shadowsocks; char **shadowsocks_opts; -} boot_info; +} bootstrap; -boot_info* load_info(int argc, char **argv); +bootstrap* load_info(int argc, char **argv); #endif diff --git a/include/sip003.h b/include/sip003.h index 7f88d21..46aa2b5 100644 --- a/include/sip003.h +++ b/include/sip003.h @@ -1,7 +1,18 @@ #ifndef _SIP003_H_ #define _SIP003_H_ -//void params_load(char *ss_default, bootstrap_info *info); -//void args_decode(int argc, char **argv, bootstrap_info *info); +#include "load.h" + +typedef struct { + char *SS_REMOTE_HOST; + char *SS_REMOTE_PORT; + char *SS_LOCAL_HOST; + char *SS_LOCAL_PORT; + char *SS_PLUGIN_OPTIONS; + char *plugin_file; + char **shadowsocks_cmd; +} sip003; + +sip003* load_sip003(char *ss_default, bootstrap *info); #endif diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0e6c4ef..5aa80c3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -5,8 +5,8 @@ include_directories(${PROJECT_SOURCE_DIR}/include/utils) add_subdirectory(utils) -add_executable(ss-bootstrap-local local.c common.c load.c) +add_executable(ss-bootstrap-local local.c common.c load.c sip003.c) target_link_libraries(ss-bootstrap-local utils pthread) -add_executable(ss-bootstrap-server local.c common.c load.c) +add_executable(ss-bootstrap-server local.c common.c load.c sip003.c) target_link_libraries(ss-bootstrap-server utils pthread) diff --git a/src/common.c b/src/common.c index 87f53d9..fbda24d 100644 --- a/src/common.c +++ b/src/common.c @@ -31,6 +31,16 @@ char** string_list_append(char **string_list, char *data) { return string_list; } +char* string_list_join(char **string_list) { // combine string list -> `str_1` `str_2` `str_3` ... + char *join_str = (char*)malloc(0); + for (char **str = string_list; *str != NULL; ++str) { + join_str = (char*)realloc(join_str, strlen(join_str) + strlen(*str) + 4); + join_str = strcat(strcat(join_str, "`"), *str); + join_str = strcat(join_str, "` "); + } + return join_str; +} + char* read_file(char *file_name) { // read file content log_debug("Start read file -> %s", file_name); FILE *pfile = fopen(file_name, "rb"); diff --git a/src/load.c b/src/load.c index 93ee564..ab69b24 100644 --- a/src/load.c +++ b/src/load.c @@ -5,13 +5,13 @@ #include "cJSON.h" #include "load.h" -void init_info(boot_info *info); -void dump_info(boot_info *info); +void init_info(bootstrap *info); +void dump_info(bootstrap *info); char** add_extra_opts(char **opts, char *extra_opts_str); -void json_decode(char *json_content, boot_info *info); +void json_decode(char *json_content, bootstrap *info); int add_field(char *field, char **target, char ***arg, char ***arg_limit); -void init_info(boot_info *info) { +void init_info(bootstrap *info) { info->is_udp_proxy = 1; // enabled udp proxy info->server_addr = info->client_addr = NULL; info->server_port = info->client_port = NULL; @@ -24,11 +24,10 @@ void init_info(boot_info *info) { info->shadowsocks = NULL; info->shadowsocks_opts = (char**)malloc(sizeof(char*) * 2); // two arguments info->shadowsocks_opts[0] = ""; // reserved for program name - // TODO: add reserved field after load info->shadowsocks_opts[1] = NULL; } -void dump_info(boot_info *info) { +void dump_info(bootstrap *info) { if (info->is_udp_proxy) { log_debug("is_udp_proxy = true"); } else { @@ -49,12 +48,10 @@ void dump_info(boot_info *info) { log_debug("plugin = %s", info->plugin); log_debug("plugin_opts = %s", info->plugin_opts); log_debug("shadowsocks = %s", info->shadowsocks); - log_debug("shadowsocks_opts:"); // TODO: combine as one line output - char **option = info->shadowsocks_opts; - while(*option != NULL) { - printf(" '%s'\n", *option); - ++option; - } + + char *opts_str = string_list_join(info->shadowsocks_opts + 1); + log_debug("shadowsocks_opts: %s", opts_str); // combine output + free(opts_str); } char** add_extra_opts(char **opts, char *extra_opts_str) { // split shadowsocks extra options @@ -80,7 +77,7 @@ char** add_extra_opts(char **opts, char *extra_opts_str) { // split shadowsocks return opts; } -void json_decode(char *json_content, boot_info *info) { // decode JSON content +void json_decode(char *json_content, bootstrap *info) { // decode JSON content cJSON* json = cJSON_Parse(json_content); if (json == NULL) { log_fatal("JSON format error"); @@ -217,12 +214,19 @@ int add_field(char *field, char **target, char ***arg, char ***arg_limit) { return 1; } -boot_info* load_info(int argc, char **argv) { // load info from input parameters - boot_info *info = (boot_info*)malloc(sizeof(boot_info)); +bootstrap* load_info(int argc, char **argv) { // load info from input parameters + bootstrap *info = (bootstrap*)malloc(sizeof(bootstrap)); + char **arg_limit = argv + argc; + log_debug("Start to load input arguments"); - // TODO: output input args + char *arg_str = (char*)malloc(0); + for (char **arg = argv + 1; arg < arg_limit; ++arg) { + arg_str = (char*)realloc(arg_str, strlen(arg_str) + strlen(*arg) + 4); + arg_str = strcat(strcat(strcat(arg_str, "`"), *arg), "` "); + } + log_debug("Input arguments -> %s", arg_str); + init_info(info); - char **arg_limit = argv + argc; for (char **arg = argv + 1; arg < arg_limit; ++arg) { if (!strcmp(*arg, "--debug")) { // skip debug flag continue; @@ -249,7 +253,6 @@ boot_info* load_info(int argc, char **argv) { // load info from input parameters !add_field("--plugin-opts", &info->plugin_opts, &arg, &arg_limit) && !add_field("--shadowsocks", &info->shadowsocks, &arg, &arg_limit) ) { // archive unknown options - log_info("Extra field -> %s", *arg); info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, *arg); } } diff --git a/src/local.c b/src/local.c index d0f5deb..4f0fe6f 100644 --- a/src/local.c +++ b/src/local.c @@ -1,4 +1,5 @@ #include "load.h" +#include "sip003.h" #include "logger.h" #include "common.h" #include "process.h" @@ -22,6 +23,7 @@ ss-bootstrap-local\n\ --plugin-opts Set SIP003 plugin options.\n\ --shadowsocks Set shadowsocks local program.\n\ --no-udp Do not use UDP proxy.\n\ + --debug Enable debug mode.\n\ -h, --help Print this message.\n\ \n\ "; @@ -29,9 +31,9 @@ ss-bootstrap-local\n\ int main(int argc, char *argv[]) { init(argc, argv, help_msg); log_info("Shadowsocks bootstrap local (%s)", VERSION); - boot_info *info = load_info(argc, argv); + bootstrap *info = load_info(argc, argv); + load_sip003("sslocal", info); -// params_load("sslocal"); // default file name // start_bootstrap("sslocal", is_udp_proxy); // local or server mode return 0; diff --git a/src/server.c b/src/server.c index b56217e..3de1181 100644 --- a/src/server.c +++ b/src/server.c @@ -22,6 +22,7 @@ ss-bootstrap-server\n\ --plugin-opts Set SIP003 plugin options.\n\ --shadowsocks Set shadowsocks server program.\n\ --no-udp Do not use UDP proxy.\n\ + --debug Enable debug mode.\n\ -h, --help Print this message.\n\ \n\ "; @@ -29,9 +30,9 @@ ss-bootstrap-server\n\ int main(int argc, char *argv[]) { init(argc, argv, help_msg); log_info("Shadowsocks bootstrap server (%s)", VERSION); - boot_info *info = load_info(argc, argv); + bootstrap *info = load_info(argc, argv); + load_sip003("ssserver", info); -// params_load("ssserver"); // default file name // start_bootstrap("ssserver", is_udp_proxy); // local or server mode return 0; } diff --git a/src/sip003.c b/src/sip003.c index 0c74c5d..eac6469 100644 --- a/src/sip003.c +++ b/src/sip003.c @@ -1,60 +1,66 @@ +#include #include "sip003.h" -#include "load.h" +#include "logger.h" +#include "common.h" +#include "network.h" -void params_load(char *ss_default, boot_info *info) { // load shadowsocks and plugin params - if (info->shadowsocks == NULL) { - info->shadowsocks = ss_default; - } - info->shadowsocks_opts[0] = info->shadowsocks; // fill with file name - if (info->plugin != NULL) { // with plugin - char *rand_port = int_to_string(get_available_port(RANDOM_PORT_START, RANDOM_PORT_END)); - SS_REMOTE_HOST = info->server_addr; - SS_REMOTE_PORT = info->server_port; - SS_LOCAL_HOST = "127.0.0.1"; - SS_LOCAL_PORT = rand_port; - info->server_addr = SS_LOCAL_HOST; - info->server_port = SS_LOCAL_PORT; - SS_PLUGIN_OPTIONS = info->plugin_opts; - } - pack_shadowsocks_params(info); - shadowsocks_args = info->shadowsocks_opts; - if (info->plugin == NULL) { - plugin_file = NULL; +void dump_sip003(sip003 *service); +void add_sip003_arg(bootstrap *info, char *key, char *value); + +void dump_sip003(sip003 *service) { // show shadowsocks and plugin params + char *cmd_str = string_list_join(service->shadowsocks_cmd); + log_info("Shadowsocks -> %s", cmd_str); + free(cmd_str); + if (service->plugin_file == NULL) { + log_info("Plugin no need"); } else { - plugin_file = info->plugin; + log_info("Plugin -> `%s`", service->plugin_file); + log_info("SS_REMOTE_HOST -> `%s`", service->SS_REMOTE_HOST); + log_info("SS_REMOTE_PORT -> `%s`", service->SS_REMOTE_PORT); + log_info("SS_LOCAL_HOST -> `%s`", service->SS_LOCAL_HOST); + log_info("SS_LOCAL_PORT -> `%s`", service->SS_LOCAL_PORT); + log_info("SS_PLUGIN_OPTIONS -> `%s`", service->SS_PLUGIN_OPTIONS); } } -void pack_shadowsocks_params(boot_info *info) { // packaging shadowsocks parameters - if (info->server_addr != NULL) { - info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, "-s"); - info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, info->server_addr); - } - if (info->client_addr != NULL) { - info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, "-b"); - info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, info->client_addr); - } - if (info->server_port != NULL) { - info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, "-p"); - info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, info->server_port); - } - if (info->client_port != NULL) { - info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, "-l"); - info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, info->client_port); +void add_sip003_arg(bootstrap *info, char *key, char *value) { + if (value != NULL) { + info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, key); + info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, value); } - if (info->password != NULL) { - info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, "-k"); - info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, info->password); - } - if (info->method != NULL) { - info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, "-m"); - info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, info->method); +} + +sip003* load_sip003(char *ss_default, bootstrap *info) { // load shadowsocks and plugin params + sip003 *service = (sip003*)malloc(sizeof(sip003)); + if (info->shadowsocks == NULL) { + info->shadowsocks = ss_default; // load default shadowsocks name } - if (info->timeout != NULL) { - info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, "-t"); - info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, info->timeout); + info->shadowsocks_opts[0] = info->shadowsocks; // fill with file name + + service->plugin_file = NULL; + if (info->plugin != NULL) { // with sip003 plugin + char *rand_port = int_to_string(get_available_port(RANDOM_PORT_START, RANDOM_PORT_END)); + service->SS_REMOTE_HOST = info->server_addr; + service->SS_REMOTE_PORT = info->server_port; + service->SS_LOCAL_HOST = "127.0.0.1"; + service->SS_LOCAL_PORT = rand_port; + service->SS_PLUGIN_OPTIONS = info->plugin_opts; + info->server_addr = service->SS_LOCAL_HOST; + info->server_port = service->SS_LOCAL_PORT; + service->plugin_file = info->plugin; } + + add_sip003_arg(info, "-s", info->server_addr); + add_sip003_arg(info, "-b", info->client_addr); + add_sip003_arg(info, "-p", info->server_port); + add_sip003_arg(info, "-l", info->client_port); + add_sip003_arg(info, "-k", info->password); + add_sip003_arg(info, "-m", info->method); + add_sip003_arg(info, "-t", info->timeout); if (info->fastopen) { info->shadowsocks_opts = string_list_append(info->shadowsocks_opts, "--fast-open"); } -} \ No newline at end of file + service->shadowsocks_cmd = info->shadowsocks_opts; + dump_sip003(service); + return service; +} diff --git a/src/utils/process.c b/src/utils/process.c index 55f60bb..dda5775 100644 --- a/src/utils/process.c +++ b/src/utils/process.c @@ -176,24 +176,7 @@ void exit_with_child() { // exit and kill his child process exit(1); } -void show_params() { // show shadowsocks and plugin params - int num = 0; - printf("[Shadowsocks Bootstrap]"); - while(shadowsocks_args[num] != NULL) { - printf(" %s", shadowsocks_args[num++]); - } - printf("\n"); - if (plugin_file == NULL) { - printf("[Shadowsocks Bootstrap] Plugin no need.\n"); - return; - } - printf("[Shadowsocks Bootstrap] Plugin -> %s\n", plugin_file); - printf("[Shadowsocks Bootstrap] SS_REMOTE_HOST -> %s\n", SS_REMOTE_HOST); - printf("[Shadowsocks Bootstrap] SS_REMOTE_PORT -> %s\n", SS_REMOTE_PORT); - printf("[Shadowsocks Bootstrap] SS_LOCAL_HOST -> %s\n", SS_LOCAL_HOST); - printf("[Shadowsocks Bootstrap] SS_LOCAL_PORT -> %s\n", SS_LOCAL_PORT); - printf("[Shadowsocks Bootstrap] SS_PLUGIN_OPTIONS -> %s\n", SS_PLUGIN_OPTIONS); -} + void start_bootstrap(char *ss_type, int is_udp_proxy) { // start shadowsocks and plugin (optional) show_params();