From c22991f7d98195009e613f1abdf7ea6d4b321a47 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 4 Aug 2026 16:01:52 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D0=B5=D0=BA=D1=86=D0=B8=D1=8F=20[chatserv?= =?UTF-8?q?er]=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=20=E2=80=94?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=B4=D0=B8=D0=BD=D1=8F=D0=B5=D1=82?= =?UTF-8?q?=20=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=B0=D1=86=D0=B8=D1=8E=20?= =?UTF-8?q?=D1=87=D0=B0=D1=82=D0=B0=20=D0=B8=20=D0=BD=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B9=D0=BA=D0=B8=20=D0=B2=20=D0=BE=D0=B4=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=81=D0=B5=D0=BA=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config_parser.c | 25 ++++++++++++------------- src/config_parser.h | 2 +- src/utun_instance.c | 14 +++++++++++++- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/config_parser.c b/src/config_parser.c index 2da949aa..59aeaa56 100644 --- a/src/config_parser.c +++ b/src/config_parser.c @@ -48,11 +48,10 @@ typedef enum { SECTION_NAT, SECTION_TCP_PROXY_CLIENT, SECTION_TCP_PROXY_SERVER, + SECTION_CHATSERVER, SECTION_NETWORK, SECTION_GUI, - SECTION_CHAT, SECTION_NTP, - SECTION_CHATSERVER, SECTION_LOG_UDP } section_type_t; @@ -760,7 +759,7 @@ static int parse_chatserver(const char *key, const char *value, struct global_co global->chatserver_storage_unit_size = sz; return 0; } - DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "%s:%d: Unknown chatserver option '%s'. Valid: join_policy, join_password, allowed_groups, storage_total_size, storage_unit_size", filename, line_num, key); + DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "%s:%d: Unknown chatserver option '%s'. Valid: db_path, join_password, allowed_groups, storage_total_size, storage_unit_size, storage_autoload, storage_autoload_maxsize_mb, storage_maxsize_gb, opus_codec_preset, compressor_enabled, compressor_max_gain_db, compressor_rise_rate, media_download_max_peers", filename, line_num, key); return -1; } @@ -801,10 +800,12 @@ static section_type_t parse_section_header(const char *line, char *name, size_t if (strcasecmp(section, "nat") == 0) return SECTION_NAT; if (strcasecmp(section, "tcp_proxy_client") == 0) return SECTION_TCP_PROXY_CLIENT; if (strcasecmp(section, "tcp_proxy_server") == 0) return SECTION_TCP_PROXY_SERVER; + if (strcasecmp(section, "chatserver") == 0) return SECTION_CHATSERVER; if (strcasecmp(section, "ntp") == 0) return SECTION_NTP; if (strcasecmp(section, "gui") == 0) return SECTION_GUI; - if (strcasecmp(section, "chat") == 0) return SECTION_CHAT; if (strcasecmp(section, "chatserver") == 0) return SECTION_CHATSERVER; + if (strcasecmp(section, "ntp") == 0) return SECTION_NTP; + if (strcasecmp(section, "gui") == 0) return SECTION_GUI; if (strcasecmp(section, "log_udp") == 0) return SECTION_LOG_UDP; char *colon = strchr(section, ':'); @@ -1040,15 +1041,14 @@ static struct utun_config* parse_config_internal(FILE *fp, const char *filename) DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "%s:%d: Unknown ntp option '%s'. Valid: enabled, server, interval", filename, line_num, key); } break; - case SECTION_CHAT: - if (chat_setting_set(key, value) < 0) { - /* chat_setting_set уже напечатал ошибку */ - } - break; case SECTION_CHATSERVER: cfg->global.chatserver_enabled = 1; - if (parse_chatserver(key, value, &cfg->global, filename, line_num) < 0) { - /* parse_chatserver already printed the error */ + cfg->global.db_sync_enabled = 1; + if (strcmp(key, "db_path") == 0) { + assign_string(cfg->global.db_path, sizeof(cfg->global.db_path), value); + } else if (parse_chatserver(key, value, &cfg->global, filename, line_num) < 0 && + chat_setting_set(key, value) < 0) { + /* both failed — errors already printed */ } break; case SECTION_GUI: @@ -1179,8 +1179,7 @@ struct utun_config* parse_config_from_buf(const char *buf, size_t len, const cha case SECTION_TCP_PROXY_SERVER: cfg->global.tcp_proxy_server_enabled = 1; if (strcmp(key, "tcp_recv_buf") == 0) cfg->global.tcp_recv_buf = atoi(value); break; case SECTION_NETWORK: if (cur_network) parse_network(key, value, cur_network, filename, line_num); break; case SECTION_NTP: if (strcmp(key, "enabled") == 0) cfg->global.ntp_enabled = strcasecmp(value, "yes") == 0 || strcasecmp(value, "1") == 0 || strcasecmp(value, "true") == 0; else if (strcmp(key, "server") == 0) { struct CFG_NTP_SERVER *ns = u_calloc(1, sizeof(struct CFG_NTP_SERVER)); if (ns) { strncpy(ns->name, value, sizeof(ns->name) - 1); ns->name[sizeof(ns->name) - 1] = '\0'; ns->next = cfg->global.ntp_servers; cfg->global.ntp_servers = ns; cfg->global.ntp_server_count++; } } else if (strcmp(key, "interval") == 0) { cfg->global.ntp_resync_interval = atoi(value); if (cfg->global.ntp_resync_interval < 60) cfg->global.ntp_resync_interval = 60; } else DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "%s:%d: Unknown ntp option '%s'", filename, line_num, key); break; - case SECTION_CHAT: chat_setting_set(key, value); break; - case SECTION_CHATSERVER: cfg->global.chatserver_enabled = 1; parse_chatserver(key, value, &cfg->global, filename, line_num); break; + case SECTION_CHATSERVER: cfg->global.chatserver_enabled = 1; cfg->global.db_sync_enabled = 1; if (strcmp(key, "db_path") == 0) assign_string(cfg->global.db_path, sizeof(cfg->global.db_path), value); else if (parse_chatserver(key, value, &cfg->global, filename, line_num) < 0) chat_setting_set(key, value); break; case SECTION_GUI: break; case SECTION_LOG_UDP: if (strcmp(key, "ip") == 0) strncpy(cfg->global.log_udp_ip, value, sizeof(cfg->global.log_udp_ip) - 1); diff --git a/src/config_parser.h b/src/config_parser.h index 8efe9f20..9196e589 100644 --- a/src/config_parser.h +++ b/src/config_parser.h @@ -119,6 +119,7 @@ struct global_config { char log_file[256]; // Path to log file (empty = stdout) char db_path[256]; // Path to SQLite database (empty = disabled) int db_sync_enabled; // 1 = enable distributed DB sync (default: 0) + int chatserver_enabled; // 1 = chat server mode (set by [chatserver] section presence) uint32_t db_sync_ttl; // TTL for unsent records in seconds (default: 86400) // UDP log target char log_udp_ip[64]; @@ -196,7 +197,6 @@ struct global_config { int ntp_resync_interval; // seconds, default 3600 // Chatserver configuration ([chatserver] section) - int chatserver_enabled; // 1 = section present char chatserver_join_password[128]; // пароль для входа в группу char chatserver_allowed_groups[1024]; // "all" или hex-ID через запятую uint64_t chatserver_storage_total_size; // bytes, общий лимит хранилища (0 = безлимит) diff --git a/src/utun_instance.c b/src/utun_instance.c index 6cf7bc99..411abf40 100644 --- a/src/utun_instance.c +++ b/src/utun_instance.c @@ -635,6 +635,15 @@ void utun_instance_stop(struct UTUN_INSTANCE *instance) { } +static int mkdir_recursive(const char *path) { + char tmp[512]; int len = snprintf(tmp, sizeof(tmp), "%s", path); + if (len <= 0 || (size_t)len >= sizeof(tmp)) return -1; + for (char *p = tmp + 1; *p; p++) { + if (*p == '/') { *p = '\0'; utun_mkdir(tmp, 0755); *p = '/'; } + } + return utun_mkdir(tmp, 0755); +} + int utun_instance_init(struct UTUN_INSTANCE *instance) { if (!instance) return -1; @@ -642,7 +651,10 @@ int utun_instance_init(struct UTUN_INSTANCE *instance) { db_sync_init(instance); // chat — сообщения, каналы, P2P-синхронизация - if (instance->config->global.db_path[0] && instance->config->global.db_sync_enabled) { + if (instance->config->global.chatserver_enabled) { + if (!instance->config->global.db_path[0]) + snprintf(instance->config->global.db_path, sizeof(instance->config->global.db_path), "/var/lib/utun"); + mkdir_recursive(instance->config->global.db_path); char db_file[512]; snprintf(db_file, sizeof(db_file), "%s/chats.db", instance->config->global.db_path); if (chat_core_init(instance, db_file) == 0)