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