FreeBSD Manual Pages
R_CONFIG(3) Library Functions Manual R_CONFIG(3) NAME r_config -- Configuration management library for radare2 SYNOPSIS #include <r_config.h> DESCRIPTION The r_config API implements the configuration registry used by radare2 and its subcommands. It stores named configuration keys (strings, integers and booleans), metadata (description, options and read-only flags), and sup- ports setters/getters so components can react to configuration changes. Common uses include global defaults (architecture, bits), binding config keys to internal variables, temporary overrides for an operation and seri- alizing configuration into project files. The primary container is struct r_config_t, which keeps a list and hash ta- ble of struct r_config_node_t, each node holding the key name, value, type flags, optional callbacks and a human-readable description. INITIALIZATION Create and destroy configuration objects. An `RConfig` is typically at- tached to a higher-level context (for example a `RCore` instance keeps one `RConfig`). Cloning produces a shallow copy of nodes suitable for tempo- rary manipulation. /* prototypes */ RConfig *r_config_new(void *user); RConfig *r_config_clone(RConfig *cfg); void r_config_free(RConfig *cfg); RConfig *cfg = r_config_new (core); /* ... use cfg ... */ r_config_free (cfg); SETTING VALUES Setters update or create nodes and may call a node setter callback. Use the `_cb` variants or `r_config_set_setter*` helpers to bind a setter to propagate the change to internal state (see `libr/config/callback.c`). /* prototypes */ RConfigNode *r_config_set(RConfig *cfg, const char *name, const char *value); RConfigNode *r_config_set_i(RConfig *cfg, const char *name, const ut64 i); RConfigNode *r_config_set_b(RConfig *cfg, const char *name, bool b); RConfigNode *r_config_set_cb(RConfig *cfg, const char *name, const char *value, RConfigCallback cb); RConfigNode *r_config_set_i_cb(RConfig *cfg, const char *name, int ivalue, RConfigCallback cb); RConfigNode *r_config_set_b_cb(RConfig *cfg, const char *name, bool bvalue, RConfigCallback cb); bool r_config_set_setter(RConfig *cfg, const char *key, RConfigCallback cb); Notes: - When a node has a setter, it is invoked after the new value is parsed. If the setter returns false the previous value is restored. - The `r_config_set*` helpers create nodes if they do not exist; use `r_config_node_new` for manual node construction when you need to populate options or a long description first. /* example: CLI-style configuration used in many binaries */ r_config_set (cfg, "asm.arch", "x86"); r_config_set_i (cfg, "asm.bits", 64); r_config_set_b (cfg, "scr.interactive", false); GETTING VALUES Accessors return the current effective value for a key. If a node has an attached getter callback it may compute values on demand. /* prototypes */ const char *r_config_get(RConfig *cfg, const char *name); ut64 r_config_get_i(RConfig *cfg, const char *name); bool r_config_get_b(RConfig *cfg, const char *name); bool r_config_toggle(RConfig *cfg, const char *name); bool r_config_rm(RConfig *cfg, const char *name); const char *arch = r_config_get (cfg, "asm.arch"); ut64 bits = r_config_get_i (cfg, "asm.bits"); bool pseudo = r_config_get_b (cfg, "asm.pseudo"); r_config_toggle (cfg, "asm.pseudo"); ADVANCED FEATURES This section covers higher-level utilities used in real radare2 code: locks, short expression evaluation (used by CLI option parsers), bulk list- ing and the hold/restore pattern which captures values to restore them later. /* prototypes */ void r_config_lock(RConfig *cfg, bool lock); char *r_config_eval(RConfig *cfg, const char *str, bool many, bool *error); RConfigHold *r_config_hold_new(RConfig *cfg); bool r_config_hold(RConfigHold *h, ...); void r_config_hold_restore(RConfigHold *h); void r_config_hold_free(RConfigHold *h); void r_config_bump(RConfig *cfg, const char *key); char *r_config_list(RConfig *cfg, const char *str, int rad); Behavior and tips: - `r_config_lock` sorts nodes and flips a lock flag (useful before serializing a stable snapshot). - `r_config_eval` understands `key=value` to set keys, `key.` to list matching keys, and colon-separated lists when `many` is true; this mirrors how CLI handlers parse compact config expressions. - `r_con- fig_hold_new` + `r_config_hold` capture current values for a list of keys; `r_config_hold_restore` restores them. This mirrors patterns used when temporarily switching architectures or analysis depth. /* hold/restore example (used in several core components) */ RConfigHold *hold = r_config_hold_new (cfg); r_config_hold (hold, "asm.arch", "asm.bits", NULL); /* temporarily override */ r_config_set (cfg, "asm.arch", "arm"); r_config_set_i (cfg, "asm.bits", 32); /* restore original */ r_config_hold_restore (hold); r_config_hold_free (hold); NODE MANAGEMENT Direct node manipulation is useful when registering a config key with a long description, a collection of valid options or custom setter/getter callbacks. Most callers use the `r_config_set*` helpers which create nodes implicitly; use the node API for more control. /* prototypes */ RConfigNode *r_config_node_new(const char *name, const char *value); RConfigNode *r_config_node_get(RConfig *cfg, const char *name); RConfigNode *r_config_node_desc(RConfigNode *node, const char *desc); void r_config_node_add_option(RConfigNode *node, const char *option); void r_config_node_purge_options(RConfigNode *node); char *r_config_node_tostring(RConfigNode *node); void r_config_node_free(void *n); /* create a node with options and description */ RConfigNode *node = r_config_node_new ("custom.var", "default"); r_config_node_desc (node, "Description for UI and help output"); r_config_node_add_option (node, "opt1"); r_config_node_add_option (node, "opt2"); /* attach node into cfg (internal helpers in libr/config do this) */ r_config_node_free (node); SERIALIZATION Serialize and unserialize configuration into an `Sdb` database. These rou- tines are used when saving/loading projects so configuration survives be- tween sessions. /* prototypes */ void r_config_serialize(RConfig * R_NONNULL config, Sdb * R_NONNULL db); bool r_config_unserialize(RConfig * R_NONNULL config, Sdb * R_NONNULL db, char ** R_NULLABLE err); Sdb *db = sdb_new0 (); r_config_serialize (cfg, db); /* write sdb to disk via sdb API */ sdb_free (db); EXAMPLES Examples below demonstrate patterns taken from real radare2 code: binding config keys to variables, temporary overrides, and evaluating compact con- fig expressions. #include <r_config.h> int main(void) { RConfig *cfg = r_config_new (NULL); /* common set/get pattern used in many binaries */ r_config_set (cfg, "asm.arch", "x86"); r_config_set_i (cfg, "asm.bits", 64); printf ("Arch: %s0, r_config_get (cfg, "asm.arch")); /* bind a config key to a C variable using setter helpers (see * libr/config/callback.c for the implementation used in the tree): */ int term_color = 0; r_config_set_setter_i (cfg, "scr.color", &term_color); r_config_set_i (cfg, "scr.color", 2); /* updates term_color */ /* temporarily override and restore: */ RConfigHold *hold = r_config_hold_new (cfg); r_config_hold (hold, "asm.arch", "asm.bits", NULL); r_config_set (cfg, "asm.arch", "arm"); r_config_set_i (cfg, "asm.bits", 32); r_config_hold_restore (hold); r_config_hold_free (hold); /* evaluate a compact CLI expression (used in CLI parsing code): */ char *res = r_config_eval (cfg, "asm.arch=arm:asm.bits=32", true, NULL); free (res); r_config_free (cfg); return 0; } SEE ALSO r_core(3), r_util(3) FreeBSD ports 15.quarterly September 21, 2025 R_CONFIG(3)
NAME | SYNOPSIS | DESCRIPTION | INITIALIZATION | SETTING VALUES | GETTING VALUES | ADVANCED FEATURES | NODE MANAGEMENT | SERIALIZATION | EXAMPLES | SEE ALSO
Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=r_config&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>
