1 #include "osrf_config.h"
3 void config_reader_init( char* name, char* config_file ) {
5 if( name == NULL || config_file == NULL || strlen(config_file) == 0 ) {
6 fatal_handler( "config_reader_init(): No config file specified" );
10 config_reader* reader =
11 (config_reader*) safe_malloc(sizeof(config_reader));
13 reader->config_doc = xmlParseFile( config_file );
14 reader->xpathCx = xmlXPathNewContext( reader->config_doc );
15 reader->name = strdup(name);
18 if( reader->xpathCx == NULL ) {
19 fprintf( stderr, "config_reader_init(): Unable to create xpath context\n");
23 if( conf_reader == NULL ) {
26 config_reader* tmp = conf_reader;
33 char* config_value( const char* config_name, const char* xp_query, ... ) {
35 if( conf_reader == NULL || xp_query == NULL ) {
36 fatal_handler( "config_value(): NULL conf_reader or NULL param(s)" );
40 config_reader* reader = conf_reader;
41 while( reader != NULL ) {
42 if( !strcmp(reader->name, config_name))
44 reader = reader->next;
47 if( reader == NULL ) {
48 fprintf(stderr, "No Config file with name %s\n", config_name );
52 int slen = strlen(xp_query) + 512;/* this is unsafe ... */
53 char xpath_query[ slen ];
54 memset( xpath_query, 0, slen );
56 va_start(va_args, xp_query);
57 vsprintf(xpath_query, xp_query, va_args);
62 int len = strlen(xpath_query) + 100;
63 char alert_buffer[len];
64 memset( alert_buffer, 0, len );
66 // build the xpath object
67 xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression( BAD_CAST xpath_query, reader->xpathCx );
69 if( xpathObj == NULL ) {
70 sprintf( alert_buffer, "Could not build xpath object: %s", xpath_query );
71 fatal_handler( alert_buffer );
76 if( xpathObj->type == XPATH_NODESET ) {
78 // ----------------------------------------------------------------------------
79 // Grab nodeset from xpath query, then first node, then first text node and
80 // finaly the text node's value
81 // ----------------------------------------------------------------------------
82 xmlNodeSet* node_list = xpathObj->nodesetval;
83 if( node_list == NULL ) {
84 sprintf( alert_buffer, "Could not build xpath object: %s", xpath_query );
85 warning_handler(alert_buffer);
89 if( node_list->nodeNr == 0 ) {
90 sprintf( alert_buffer, "Config XPATH query returned 0 results: %s", xpath_query );
91 warning_handler(alert_buffer);
96 xmlNodePtr element_node = *(node_list)->nodeTab;
97 if( element_node == NULL ) {
98 sprintf( alert_buffer, "Config XPATH query returned 0 results: %s", xpath_query );
99 warning_handler(alert_buffer);
103 xmlNodePtr text_node = element_node->children;
104 if( text_node == NULL ) {
105 sprintf( alert_buffer, "Config variable has no value: %s", xpath_query );
106 warning_handler(alert_buffer);
110 val = text_node->content;
112 sprintf( alert_buffer, "Config variable has no value: %s", xpath_query );
113 warning_handler(alert_buffer);
119 sprintf( alert_buffer, "Xpath evaluation failed: %s", xpath_query );
120 warning_handler(alert_buffer);
124 char* value = strdup(val);
125 if( value == NULL ) { warning_handler( "config_value(): Empty config value or Out of Memory!" ); }
127 // Free XPATH structures
128 if( xpathObj != NULL ) xmlXPathFreeObject( xpathObj );
134 void config_reader_free() {
135 while( conf_reader != NULL ) {
136 xmlXPathFreeContext( conf_reader->xpathCx );
137 xmlFreeDoc( conf_reader->config_doc );
138 free(conf_reader->name );
139 config_reader* tmp = conf_reader->next;