The NV-Load callback function is a user callback that is invoked when the running configuration needs to be read from non-volatile storage. A configuration filespec is passed to this callback that contains the configuration that needs to be saved to non-volatile storage.


The following function template definition is used for NV-Load callback functions:


/* Typedef of the callback */ 
typedef status_t
  (*agt_nvload_fn_t) (ncx_display_mode_t *encoding,
        xmlChar **filespec);


The agt_register_local_nv_handler function is used to declare the NV-Load callback. The registration can be done during the Initialization Phase 2, after the running configuration has been loaded from the startup file.


extern status_t
    agt_register_local_nv_handler (agt_nvload_fn_t load_fn,
                                   agt_nvsave_fn_t store_fn);


Initialization function with the NV-Load callback registration may look as follows:


#define EXAMPLECONFIG_SPEC (const xmlChar *)"/tmp/example-config.xml"

/******************************************************************** 
* FUNCTION interfaces_init2
* 
* initialize the server instrumentation library.
* Initialization Phase 2
* 
*********************************************************************/ 
static status_t 
     interfaces_init2 (void) 
{ 
  ...

    /* register NV-storage handler to load/save config 
     * uncomment following to enable 
     */ 
    res = agt_register_local_nv_handler(nvload_callback, 
                                        nvsave_callback);
    if (res != NO_ERR) { 
        return res; 
    }

  ...
}


There is no cleanup function for this callback. The cleanup will be done automatically by the server.


The following example code illustrates how the NV-Load callback may look like. 


/******************************************************************** 
* FUNCTION nvload_callback 
*
* this callback is invoked when some config needs to be read 
* from non-volatile storage 
* 
* INPUTS: 
*    encoding == address of encoding for the config 
*    filespec == address of filespec containing the config that was loaded 
* 
* OUTPUTS: 
*    *encoding == set to the enum for the encoding used in the config 
*    *filespec == malloced filespec containing the config that was loaded 
* 
* RETURNS: 
*    status; error indicates NV-load failed somehow 
*    If return NO_ERR and *filespec == NULL then use the factory config 
*
*********************************************************************/ 
static status_t 
    nvload_callback (ncx_display_mode_t *encoding, 
                    xmlChar **filespec) 
{ 
    log_debug("\nEnter nvload_callback "); 

    *filespec = NULL; 
    *encoding = NCX_DISPLAY_MODE_XML; 

    status_t res = NO_ERR; 

    if (ncxmod_test_filespec(EXAMPLE_CONFIG_SPEC)) { 

        /* file exists so copy the filespec */ 
        *filespec = xml_strdup(EXAMPLE_CONFIG_SPEC); 
        if (*filespec == NULL) { 
            res = ERR_INTERNAL_MEM; 
        } 
    } 

    return res; 

}  /* nvload_callback */


Now, when some configuration needs to be read from Non-Volatile storage this callback function will try to find a file specification and copy it into the buffer.


If the callback returns NO_ERR and *filespec is empty then use the factory configuration. Only XML encoding is supported. The server will save the configuration only in XML.