/* * 模块名称:FTP 配置([ftp] 段) * 模块功能:RAM 副本 + 工厂默认 + cfg_file 引擎注册(键表 user/pwd_hash/write) * 适用平台:STM32F407ZGTx / PC 模拟器(两端共用) * 作者:王建锋 * 创建日期:2026-10-11 * 修改记录: * v1.0 2026-10-11 王建锋 创建初始版本(N-19 FTP 鉴权) */ /* 头文件包含区 */ #include #include #include "ftp_cfg.h" #include "cfg_file.h" /* 私有变量定义区 */ /* 工厂默认(单一来源宏见 ftp_cfg.h;s_cfg 初值与其一致 = load 前也 fail-closed 可用) */ static const ftp_cfg_t s_defaults = { FTP_CFG_DEF_USER, FTP_CFG_DEF_HASH, FTP_CFG_DEF_WRITE, }; /* RAM 副本(引擎原地更新;注册于 net_cfg_load 内 cfg_file_load 之前) */ static ftp_cfg_t s_cfg = { FTP_CFG_DEF_USER, FTP_CFG_DEF_HASH, FTP_CFG_DEF_WRITE, }; /* [ftp] 段键表(ftp_cfg_t 布局内偏移) */ static const cfg_key_def_t s_ftp_keys[] = { { "user", CFG_VAL_STR, offsetof(ftp_cfg_t, user), FTP_CFG_USER_MAX }, { "pwd_hash", CFG_VAL_STR, offsetof(ftp_cfg_t, pwd_hash), FTP_CFG_HASH_MAX }, { "write", CFG_VAL_UINT, offsetof(ftp_cfg_t, write_en), 1u }, }; /* 函数定义区 */ /* * 函数功能:大小写不敏感字符串相等判断 * 入口参数:p_a - 串 A p_b - 串 B(均可 NULL) * 返回值:1 - 相等;0 - 不等或任一为 NULL int * 限定条件:无 */ static int s_str_ci_eq(const char *p_a, const char *p_b) { if ((p_a == NULL) || (p_b == NULL)) { return 0; } for (size_t i = 0u; ; i++) { char a = p_a[i]; char b = p_b[i]; if ((a >= 'A') && (a <= 'Z')) { a = (char)(a + 32); } if ((b >= 'A') && (b <= 'Z')) { b = (char)(b + 32); } if (a != b) { return 0; } if (a == '\0') { return 1; } } } /* * 函数功能:注册 [ftp] 段到 cfg_file 引擎(须在 cfg_file_load 之前调用) * 入口参数:无 * 返回值:无 * 限定条件:幂等(重复调用只注册一次);由 net_cfg_load 统一触发 */ void ftp_cfg_register(void) { static uint8_t s_done; cfg_section_reg_t reg; if (s_done != 0u) { return; } (void)memset(®, 0, sizeof(reg)); reg.name = "ftp"; reg.p_data = &s_cfg; reg.p_defaults = &s_defaults; reg.data_size = sizeof(ftp_cfg_t); reg.p_keys = s_ftp_keys; reg.key_count = 3u; reg.p_cb = NULL; /* 无"立即应用"需求:口令在下次 PASS 时生效 */ (void)cfg_file_register(®); s_done = 1u; } /* * 函数功能:取 [ftp] 段 RAM 副本(load 前后均有效,load 前 = 工厂默认) * 入口参数:无 * 返回值:配置指针(恒非 NULL,指向静态存储) * 限定条件:调用方只读 */ const ftp_cfg_t *ftp_cfg_get(void) { return &s_cfg; } /* * 函数功能:判断当前口令哈希是否仍为出厂默认(启动告警依据) * 入口参数:无 * 返回值:1 - 仍是默认;0 - 已改 int * 限定条件:大小写不敏感比较 */ int ftp_cfg_is_default_pwd(void) { return s_str_ci_eq(s_cfg.pwd_hash, FTP_CFG_DEF_HASH); }