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.