]> git.evergreen-ils.org Git - working/Evergreen.git/blob - OpenSRF/src/libstack/osrf_config.c
cleaning up the JSON code some
[working/Evergreen.git] / OpenSRF / src / libstack / osrf_config.c
1 #include "osrf_config.h"
2
3 void config_reader_init( char* name, char* config_file ) {
4
5         if( name == NULL || config_file == NULL || strlen(config_file) == 0 ) {
6                 fatal_handler( "config_reader_init(): No config file specified" );
7                 return;
8         }
9
10         config_reader* reader = 
11                 (config_reader*) safe_malloc(sizeof(config_reader));
12
13         reader->config_doc = xmlParseFile( config_file ); 
14         reader->xpathCx = xmlXPathNewContext( reader->config_doc );
15         reader->name = strdup(name);
16         reader->next = NULL;
17
18         if( reader->xpathCx == NULL ) {
19                 fprintf( stderr, "config_reader_init(): Unable to create xpath context\n");
20                 return;
21         }
22
23         if( conf_reader == NULL ) {
24                 conf_reader = reader;
25         } else {
26                 config_reader* tmp = conf_reader;
27                 conf_reader = reader;
28                 reader->next = tmp;
29         }
30 }
31
32
33 char* config_value( const char* config_name, const char* xp_query, ... ) {
34
35         if( conf_reader == NULL || xp_query == NULL ) {
36                 fatal_handler( "config_value(): NULL conf_reader or NULL param(s)" );
37                 return NULL;
38         }
39
40         config_reader* reader = conf_reader;
41         while( reader != NULL ) {
42                 if( !strcmp(reader->name, config_name)) 
43                         break;
44                 reader = reader->next;
45         }
46
47         if( reader == NULL ) {
48                 fprintf(stderr, "No Config file with name %s\n", config_name );
49                 return NULL;
50         }
51
52         int slen = strlen(xp_query) + 512;/* this is unsafe ... */
53         char xpath_query[ slen ]; 
54         memset( xpath_query, 0, slen );
55         va_list va_args;
56         va_start(va_args, xp_query);
57         vsprintf(xpath_query, xp_query, va_args);
58         va_end(va_args);
59
60
61         char* val;
62         int len = strlen(xpath_query) + 100;
63         char alert_buffer[len];
64         memset( alert_buffer, 0, len );
65
66         // build the xpath object
67         xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression( BAD_CAST xpath_query, reader->xpathCx );
68
69         if( xpathObj == NULL ) {
70                 sprintf( alert_buffer, "Could not build xpath object: %s", xpath_query );
71                 fatal_handler( alert_buffer );
72                 return NULL;
73         }
74
75
76         if( xpathObj->type == XPATH_NODESET ) {
77
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);
86                         return NULL;
87                 }
88
89                 if( node_list->nodeNr == 0 ) {
90                         sprintf( alert_buffer, "Config XPATH query  returned 0 results: %s", xpath_query );
91                         warning_handler(alert_buffer);
92                         return NULL;
93                 }
94
95
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);
100                         return NULL;
101                 }
102
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);
107                         return NULL;
108                 }
109
110                 val = text_node->content;
111                 if( val == NULL ) {
112                         sprintf( alert_buffer, "Config variable has no value: %s", xpath_query );
113                         warning_handler(alert_buffer);
114                         return NULL;
115                 }
116
117
118         } else { 
119                 sprintf( alert_buffer, "Xpath evaluation failed: %s", xpath_query );
120                 warning_handler(alert_buffer);
121                 return NULL;
122         }
123
124         char* value = strdup(val);
125         if( value == NULL ) { warning_handler( "config_value(): Empty config value or Out of Memory!" ); }
126
127         // Free XPATH structures
128         if( xpathObj != NULL ) xmlXPathFreeObject( xpathObj );
129
130         return value;
131 }
132
133
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;
140                 free( conf_reader );
141                 conf_reader = tmp;
142         }
143 }