From 68eb836e527bdead1eea7fc281c95c86eab3164d Mon Sep 17 00:00:00 2001 From: Ton Voon Date: Fri, 18 Jun 2010 14:45:02 +0100 Subject: More tests diff --git a/lib/tests/test_utils.c b/lib/tests/test_utils.c index aae358f..d7cdc33 100644 --- a/lib/tests/test_utils.c +++ b/lib/tests/test_utils.c @@ -34,6 +34,7 @@ main (int argc, char **argv) time_t current_time; char *temp_filename; nagios_plugin *temp_nagios_plugin; + FILE *temp_fp; plan_tests(81+23); @@ -288,14 +289,14 @@ main (int argc, char **argv) ok(temp_state_key==NULL, "temp_state_key initially empty"); - np_state_init(NULL, 51); + np_enable_state(NULL, 51); temp_state_key = temp_nagios_plugin->state; ok( !strcmp(temp_state_key->plugin_name, "check_test"), "Got plugin name" ); ok( !strcmp(temp_state_key->name, "Ahash"), "Got key name" ); printf("Filename=%s\n", temp_state_key->_filename); - np_state_init("funnykeyname", 54); + np_enable_state("funnykeyname", 54); temp_state_key = temp_nagios_plugin->state; ok( !strcmp(temp_state_key->plugin_name, "check_test"), "Got plugin name" ); ok( !strcmp(temp_state_key->name, "funnykeyname"), "Got key name" ); @@ -309,11 +310,29 @@ main (int argc, char **argv) temp_state_data = np_state_read(temp_state_key); ok( temp_state_data==NULL, "Got no state data as file does not exist" ); + +/* + temp_fp = fopen("var/statefile", "r"); + if (temp_fp==NULL) + printf("Error opening. errno=%d\n", errno); + printf("temp_fp=%s\n", temp_fp); + ok( _np_state_read_file(temp_fp) == TRUE, "Can read state file" ); + fclose(temp_fp); +*/ + temp_state_key->_filename="var/statefile"; temp_state_data = np_state_read(temp_state_key); - ok( temp_state_data!=NULL, "Got state data now" ); + ok( temp_nagios_plugin->state->state_data!=NULL, "Got state data now" ); + ok( temp_nagios_plugin->state->state_data->time==1234567890, "Got time" ); + ok( !strcmp((char *)temp_nagios_plugin->state->state_data->data, "String to read"), "Data as expected" ); + printf("state_data=%s|\n", temp_nagios_plugin->state->state_data->data); + temp_state_key->_filename="var/nonexistant"; + temp_state_data = np_state_read(temp_state_key); + ok( temp_state_data==NULL, "Missing file gives NULL" ); + ok( temp_nagios_plugin->state->state_data==NULL, "No state information" ); + time(¤t_time); np_state_write_string(NULL, "New data"); diff --git a/lib/utils_base.c b/lib/utils_base.c index fba383f..8550577 100644 --- a/lib/utils_base.c +++ b/lib/utils_base.c @@ -354,6 +354,14 @@ char *_np_state_generate_key() { return "Ahash"; } +void _cleanup_state_data() { + if (this_nagios_plugin->state->state_data!=NULL) { + np_free(this_nagios_plugin->state->state_data->data); + printf("***Setting\n"); + np_free(this_nagios_plugin->state->state_data); + } +} + /* * Internal function. Returns either: * envvar NAGIOS_PLUGIN_STATE_DIRECTORY @@ -373,7 +381,7 @@ char* _np_state_calculate_location_prefix(){ * Sets variables. Generates filename. Returns np_state_key. die with * UNKNOWN if exception */ -void np_state_init(char *keyname, int expected_data_version) { +void np_enable_state(char *keyname, int expected_data_version) { state_key *this_state = NULL; char *temp_filename = NULL; @@ -409,18 +417,105 @@ void np_state_init(char *keyname, int expected_data_version) { state_data *np_state_read() { state_key *my_state_key; state_data *this_state_data=NULL; - int statefile=0; + FILE *statefile; + int c; + int rc = FALSE; - my_state_key = this_nagios_plugin->state; - my_state_key->state_data = this_state_data; + if(this_nagios_plugin==NULL) + die(STATE_UNKNOWN, _("This requires np_init to be called")); /* Open file. If this fails, no previous state found */ - statefile = open( my_state_key->_filename, O_RDONLY ); - if(statefile<0) { - return NULL; + statefile = fopen( this_nagios_plugin->state->_filename, "r" ); + if(statefile!=NULL) { + + this_state_data = (state_data *) malloc(sizeof(state_data)); + + if(this_state_data==NULL) + die(STATE_UNKNOWN, _("Cannot allocate memory for state data")); + + this_nagios_plugin->state->state_data = this_state_data; + + rc = _np_state_read_file(statefile); + + fclose(statefile); + } + + if(rc==FALSE) { + printf("Called\n"); + _cleanup_state_data(); + } + + return this_nagios_plugin->state->state_data; +} + +/* + * Read the state file + */ +int _np_state_read_file(FILE *f) { + int c, status=FALSE; + size_t pos; + char *line; + int i; + int failure=0; + time_t current_time, data_time; + enum { STATE_FILE_VERSION, STATE_DATA_VERSION, STATE_DATA_TIME, STATE_DATA_TEXT, STATE_DATA_END } expected=STATE_FILE_VERSION; + + time(¤t_time); + + /* Note: This introduces a limit of 1024 bytes in the string data */ + line = (char *) malloc(1024); + + printf("Here\n"); + while(!failure && (fgets(line,1024,f))!=NULL){ + pos=strlen(line); + if(line[pos-1]=='\n') { + line[pos-1]='\0'; + } + printf("Reading line |%s|\n", line); + + if(line[0] == '#') continue; + + switch(expected) { + case STATE_FILE_VERSION: + i=atoi(line); + //printf("line=|%d|, exp=|%d|\n", i, NP_STATE_FORMAT_VERSION); + //if(!strcmp(NP_STATE_FORMAT_VERSION, line)) { + if(i!=NP_STATE_FORMAT_VERSION) + failure++; + else + expected=STATE_DATA_VERSION; + break; + case STATE_DATA_VERSION: + i=atoi(line); + printf("i=%d, exp=%d\n", i, this_nagios_plugin->state->data_version); + if(i != this_nagios_plugin->state->data_version) + failure++; + else + expected=STATE_DATA_TIME; + break; + case STATE_DATA_TIME: + /* If time > now, error */ + data_time=strtoul(line,NULL,10); + if(data_time > current_time) + failure++; + else { + this_nagios_plugin->state->state_data->time = data_time; + expected=STATE_DATA_TEXT; + } + break; + case STATE_DATA_TEXT: + this_nagios_plugin->state->state_data->data = strdup(line); + expected=STATE_DATA_END; + status=TRUE; + break; + case STATE_DATA_END: + ; + } } - return this_state_data; + np_free(line); + printf("Returning status=%d\n", status); + return status; } /* diff --git a/lib/utils_base.h b/lib/utils_base.h index 6a8af19..12576d7 100644 --- a/lib/utils_base.h +++ b/lib/utils_base.h @@ -30,7 +30,7 @@ typedef struct thresholds_struct { } thresholds; #define NP_SHAREDSTATE_DIR "/tmp" -#define STATE_FORMAT_VERSION "1" +#define NP_STATE_FORMAT_VERSION 1 typedef struct state_data_struct { time_t time; @@ -93,7 +93,7 @@ char *np_extract_value(const char*, const char*, char); #define np_extract_ntpvar(l, n) np_extract_value(l, n, ',') -void np_state_init(char *, int); +void np_enable_state(char *, int); state_data *np_state_read(); void np_state_write_string(time_t *, char *); -- cgit v0.10-9-g596f