1 #include "osrf_config.h"
3 //object* config_object = NULL;
6 char* osrf_config_value(char* path) {
10 void _osrf_config_grab_config() {
11 if(config_object) return;
16 void config_reader_init( char* name, char* config_file ) {
18 if( name == NULL || config_file == NULL || strlen(config_file) == 0 ) {
19 fatal_handler( "config_reader_init(): No config file specified" );
23 config_reader* reader =
24 (config_reader*) safe_malloc(sizeof(config_reader));
26 reader->config_doc = xmlParseFile( config_file );
27 reader->xpathCx = xmlXPathNewContext( reader->config_doc );
28 reader->name = strdup(name);
31 if( reader->xpathCx == NULL ) {
32 fprintf( stderr, "config_reader_init(): Unable to create xpath context\n");
36 if( conf_reader == NULL ) {
39 config_reader* tmp = conf_reader;
46 char* config_value( const char* config_name, const char* xp_query, ... ) {
48 if( conf_reader == NULL || xp_query == NULL ) {
49 fatal_handler( "config_value(): NULL conf_reader or NULL param(s)" );
53 config_reader* reader = conf_reader;
54 while( reader != NULL ) {
55 if( !strcmp(reader->name, config_name))
57 reader = reader->next;
60 if( reader == NULL ) {
61 fprintf(stderr, "No Config file with name %s\n", config_name );
65 int slen = strlen(xp_query) + 512;/* this is unsafe ... */
66 char xpath_query[ slen ];
67 memset( xpath_query, 0, slen );
69 va_start(va_args, xp_query);
70 vsprintf(xpath_query, xp_query, va_args);
75 int len = strlen(xpath_query) + 100;
76 char alert_buffer[len];
77 memset( alert_buffer, 0, len );
79 // build the xpath object
80 xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression( BAD_CAST xpath_query, reader->xpathCx );
82 if( xpathObj == NULL ) {
83 sprintf( alert_buffer, "Could not build xpath object: %s", xpath_query );
84 fatal_handler( alert_buffer );
89 if( xpathObj->type == XPATH_NODESET ) {
91 // ----------------------------------------------------------------------------
92 // Grab nodeset from xpath query, then first node, then first text node and
93 // finaly the text node's value
94 // ----------------------------------------------------------------------------
95 xmlNodeSet* node_list = xpathObj->nodesetval;
96 if( node_list == NULL ) {
97 sprintf( alert_buffer, "Could not build xpath object: %s", xpath_query );
98 warning_handler(alert_buffer);
102 if( node_list->nodeNr == 0 ) {
103 sprintf( alert_buffer, "Config XPATH query returned 0 results: %s", xpath_query );
104 warning_handler(alert_buffer);
109 xmlNodePtr element_node = *(node_list)->nodeTab;
110 if( element_node == NULL ) {
111 sprintf( alert_buffer, "Config XPATH query returned 0 results: %s", xpath_query );
112 warning_handler(alert_buffer);
116 xmlNodePtr text_node = element_node->children;
117 if( text_node == NULL ) {
118 sprintf( alert_buffer, "Config variable has no value: %s", xpath_query );
119 warning_handler(alert_buffer);
123 val = text_node->content;
125 sprintf( alert_buffer, "Config variable has no value: %s", xpath_query );
126 warning_handler(alert_buffer);
132 sprintf( alert_buffer, "Xpath evaluation failed: %s", xpath_query );
133 warning_handler(alert_buffer);
137 char* value = strdup(val);
138 if( value == NULL ) { warning_handler( "config_value(): Empty config value or Out of Memory!" ); }
140 // Free XPATH structures
141 if( xpathObj != NULL ) xmlXPathFreeObject( xpathObj );
147 void config_reader_free() {
148 while( conf_reader != NULL ) {
149 xmlXPathFreeContext( conf_reader->xpathCx );
150 xmlFreeDoc( conf_reader->config_doc );
151 free(conf_reader->name );
152 config_reader* tmp = conf_reader->next;