refactor(config): single X-macro table for serialized fields
Every Config field that crosses the wire was declared in up to six places (struct member, config_set_defaults, send_*, receive_*, and the two CLI option tables) and could drift silently. Add CONFIG_WIRE_FIELDS in config.h: one ordered per-segment table where each serialized field is declared once with its C type, default and wire codec (KIND). config.h now expands the table to declare the struct members; config_set_defaults() expands it to assign the defaults; and config_send_wire_block()/config_receive() expand the per-segment lists to emit/consume the frame. The per-segment function names, call order and segment boundaries are preserved exactly. Fields with genuinely custom logic keep dedicated helpers but are still declared once in the table: the protocol-version handshake (HEADER), daemon SCRAM auth (STR_REDACTED_AUTH), the daemon module name (STR_MODULE), the repeated count+array blocks (BLOCK_SKIP_SUFFIXES/BLOCK_BASIS/BLOCK_IDMAP), --copy-as presence/ids (COPY_AS_*), and the derived --delta / use_xattrs bits (DERIVED_DELTA, BOOL_XATTR_DERIVE). The version field remains a special header (validated before any other field is parsed) and is sent by config_send_wire_block() explicitly. No public field is renamed and PROTOCOL_VERSION stays "2.20.0". Because the struct declaration order is no longer the wire order, the wire order is now enforced solely by the table and by a byte-exact golden test (follow-up commit). Add config_send_wire_block() so that test can hash the frame body without the STATUS_OK handshake.
This commit is contained in:
+369
-597
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user