Each datastore has an enumeration in the ncx_cfg_t

/* hardwire the 3 standard configs */
typedef enum ncx_cfg_t_ {
} ncx_cfg_t;

There are APIs to access the datastores in ncx/cfg.h..

Use cfg_get_root to get the root data node for the configuration datastore.

The NULL pointer is returned if the datastore is not available (e.g. --with-startup=false so no NCX_CFGID_STARTUP datastore)

* FUNCTION cfg_get_root
* Get the config root for the specified config
*    cfgid == config ID to get root from
*    config root or NULL if none or error
extern val_value_t *
    cfg_get_root (ncx_cfg_t cfgid);

There are APIs to write val_value_t structures to a file in either XML or JSON encoding.

The XML version (xml_wr_file) is shown below:

* FUNCTION xml_wr_file
* Write the specified value to a FILE in XML format
*    filespec == exact path of filename to open
*    val == value for output
*    attrs == top-level attributes to generate
*    docmode == TRUE if XML_DOC output mode should be used
*            == FALSE if XML output mode should be used
*    xmlhdr == TRUE if <?xml?> directive should be output
*            == FALSE if not
*    withns == TRUE if xmlns attributes should be used
*              FALSE to leave them out
*    expand_varexpr == TRUE if expanding variable expressions
*                   == FALSE if not expanding variable expressions
*    with_owners == TRUE to generate ywx:owner attributes as needed
*    startindent == starting indent point
*    indent == indent amount (0..9 spaces)
*    status
extern status_t
    xml_wr_file (const xmlChar *filespec, 
                 val_value_t *val,
                 xml_attrs_t *attrs,
                 boolean docmode,
                 boolean xmlhdr,
                 boolean withns,
                 boolean expand_varexpr,
                 boolean with_owners,
                 int32 startindent,
                 int32 indent);

Usage Example

The following code snippet shows how to get the running datastore and save it in XML format to the file "/tmp/my-config.xml"

#include "procdefs.h"
#include "val.h"
#include "ncxtypes.h"
#include "cfg.h"
#include "xml_wr.h"

static void dump_running (void)
    val_value_t *val = cfg_get_root(NCX_CFGID_RUNNING);
    if (val) {
        status_t res = xml_wr_file((const xmlChar *)"/tmp/my-config.xml",
                                    val,       // val node to write
                                    NULL,  // attrs for first start-tag; use val instead
                                    false,    // docmode; use plain XML
                                    true,     // xmlhdr; print the preamble
                                    true,     // withns; normal XML
                                    false,    // expand_varexpr; not used
                                    0,         // startindent
                                    2);        // indent amount
       if (res != NO_ERR) {
           // handle error