Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
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)

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>

home | help