diff options
author | Dmitri Pal <dpal@redhat.com> | 2009-02-26 19:13:29 -0500 |
---|---|---|
committer | Dmitri Pal <dpal@redhat.com> | 2009-02-26 19:13:29 -0500 |
commit | 15f299ca2e6902cb4ba784f5923cf910f96173a8 (patch) | |
tree | 41de0babf5ea48137738b40057969c51be587da6 /collection | |
parent | c20626a18afc1545f1fbc58907529ba743bb0843 (diff) | |
download | elapi_draft-15f299ca2e6902cb4ba784f5923cf910f96173a8.tar.gz elapi_draft-15f299ca2e6902cb4ba784f5923cf910f96173a8.tar.xz elapi_draft-15f299ca2e6902cb4ba784f5923cf910f96173a8.zip |
Testing complete. High level API works.
Diffstat (limited to 'collection')
-rw-r--r-- | collection/elapi_collection.c | 16 | ||||
-rw-r--r-- | collection/elapi_util.c | 88 |
2 files changed, 74 insertions, 30 deletions
diff --git a/collection/elapi_collection.c b/collection/elapi_collection.c index 7045130..8d28eed 100644 --- a/collection/elapi_collection.c +++ b/collection/elapi_collection.c @@ -22,6 +22,7 @@ #include <stdlib.h> #include <errno.h> #include <ctype.h> +#include <time.h> #include "elapi_collection.h" #include "elapi_debug.h" @@ -37,7 +38,7 @@ /* Potential subjest for management with libtools */ -#define DATE_FORMAT "%+" +#define DATE_FORMAT "%c" #define TIME_ARRAY_SIZE 100 @@ -1334,20 +1335,23 @@ int set_timestamp(struct collection_item *ci,struct collection_item **timestr_re int len; struct collection_item *timestr = (struct collection_item *)(NULL); struct collection_item *timeint = (struct collection_item *)(NULL); + int error = EOK; DEBUG_STRING("set_timestamp","Entry point"); utctime = time(NULL); localtime_r(&utctime,&time_struct); - len = strftime(time_array, TIME_ARRAY_SIZE, date_format, &time_struct); + len = strftime(time_array, TIME_ARRAY_SIZE, DATE_FORMAT, &time_struct); if(len == 0) { DEBUG_STRING("add_time","CODING ERROR - INCREASE THE BUFFER"); return EMSGSIZE; } + DEBUG_STRING("Timestamp:",time_array); + /* Check if we have the timestamp item already */ - error = get_item(event, TS_NAME, ELAPI_TYPE_STRING,ELAPI_TRAVERSE_IGNORE,×tr); + error = get_item(ci, TS_NAME, ELAPI_TYPE_STRING,ELAPI_TRAVERSE_IGNORE,×tr); if(error) { DEBUG_NUMBER("search failed with error:",error); return error; @@ -1366,7 +1370,7 @@ int set_timestamp(struct collection_item *ci,struct collection_item **timestr_re } else { /* Add timestamp to the collection */ - error = add_str_property_with_ref(event,NULL, TS_NAME,time_array,len+1,timestr_ref); + error = add_str_property_with_ref(ci,NULL, TS_NAME,time_array,len+1,timestr_ref); if(error) { DEBUG_NUMBER("failed to add timestamp property:",error); return error; @@ -1374,7 +1378,7 @@ int set_timestamp(struct collection_item *ci,struct collection_item **timestr_re } /* Check if we have the time item already */ - error = get_item(event, T_NAME, ELAPI_TYPE_INTEGER,ELAPI_TRAVERSE_IGNORE,&timeint); + error = get_item(ci, T_NAME, ELAPI_TYPE_INTEGER,ELAPI_TRAVERSE_IGNORE,&timeint); if(error) { DEBUG_NUMBER("search failed with error:",error); return error; @@ -1387,7 +1391,7 @@ int set_timestamp(struct collection_item *ci,struct collection_item **timestr_re } else { /* Add time to the collection */ - error = add_int_property_with_ref(event,NULL, T_NAME,utctime,timeint_ref); + error = add_int_property_with_ref(ci,NULL, T_NAME,utctime,timeint_ref); if(error) { DEBUG_NUMBER("failed to add time property:",error); return error; diff --git a/collection/elapi_util.c b/collection/elapi_util.c index b5fbf59..09c99a6 100644 --- a/collection/elapi_util.c +++ b/collection/elapi_util.c @@ -26,6 +26,9 @@ #include "elapi_debug.h" #include "elapi_util.h" +#ifndef MAX +#define MAX(a,b) a > b ? a : b +#endif /* Internal defines used in different places */ #define UNKNOWN "<unknown:>" @@ -541,8 +544,10 @@ static int extract_item(char *start, int *index) { char *end; + int error = EOK; DEBUG_STRING("extract_item","Entry point"); + DEBUG_STRING("Start:",start); start++; end = start; @@ -550,6 +555,9 @@ static int extract_item(char *start, if(*end == '\0') return EINVAL; + DEBUG_STRING("End:",end); + DEBUG_NUMBER("Length:",end-start); + *end = '\0'; error = get_item(event,start,ELAPI_TYPE_ANY, ELAPI_TRAVERSE_DEFAULT,item); @@ -581,6 +589,7 @@ int sprintf_item(struct serial_data *data, DEBUG_NUMBER("Buffer len: ", data->length); DEBUG_NUMBER("Buffer size: ", data->size); DEBUG_STRING("Buffer: ", data->buffer); + DEBUG_STRING("Using format: ", one_format); if(one_format!=NULL) len_format = strlen(one_format); @@ -594,15 +603,15 @@ int sprintf_item(struct serial_data *data, data->length++; for(i=0;i<item->length;i++) sprintf(data->buffer+data->length+i*2,"%02X",*((unsigned char *)(item->data+i))); data->length+=item->length*2; - *(buf_data->buffer+buf_data->length) = '\''; - buf_data->length++ - *(buf_data->buffer+buf_data->length) = '\0'; + *(data->buffer+data->length) = '\''; + data->length++; + *(data->buffer+data->length) = '\0'; } else { /* For other types use a version of sprintf, but determine format first */ switch(item->type) { - case ELAPI_TYPE_STRING: if((len_format > 0) && (*(one_format+len_format-1) == 's') fmt=one_format; + case ELAPI_TYPE_STRING: if((len_format > 0) && (*(one_format+len_format-1) == 's')) fmt=one_format; else fmt = formats[FMT_STRING]; break; case ELAPI_TYPE_INTEGER: if((len_format > 0) && (*(one_format+len_format-1) != 's')) fmt=one_format; @@ -638,8 +647,8 @@ int sprintf_item(struct serial_data *data, return EOK; } - start = buf_data->buffer+buf_data->length; - block = buf_data->size-buf_data->length-1; + start = data->buffer+data->length; + block = data->size-data->length-1; while (1) { switch(item->type) { @@ -666,21 +675,24 @@ int sprintf_item(struct serial_data *data, return EOK; } + DEBUG_NUMBER("snprintf returned:",len); /* Did it fit? */ if (len > -1 && len < block) break; /* Else try again with more space. Based on printf example. */ - if (len > -1) block = MAX(n+1,BLOCK_SIZE); + if (len > -1) block = MAX(len+1,BLOCK_SIZE); else block = MAX(block *2,BLOCK_SIZE); + DEBUG_NUMBER("Need to gorw by:",block); + if((error=grow_buffer(data,block))) return error; } /* Adjust length */ - buf_data->length+=len; - *(buf_data->buffer+buf_data->length) = '\0'; + data->length+=len; + *(data->buffer+data->length) = '\0'; } - DEBUG_STRING("Data: ",buf_data->buffer); + DEBUG_STRING("Data: ",data->buffer); DEBUG_STRING("sprintf_item","Exit point"); return EOK; @@ -691,7 +703,8 @@ int sprintf_item(struct serial_data *data, static int add_time(struct serial_data *data, struct collection_item *event) { - struct collection_item *timestamp; + struct collection_item *timestamp = (struct collection_item *)(NULL); + int error = EOK; DEBUG_STRING("add_time","Entry point"); @@ -723,6 +736,7 @@ static int process_item(struct serial_data *data, char *end; int block; struct collection_item *item = (struct collection_item *)(NULL); + int error = EOK; DEBUG_STRING("process_item","Entry point"); @@ -757,7 +771,7 @@ static int process_item(struct serial_data *data, } /* Then put the piece we could not find */ - error = put_marker(data,start+1,*index-(start-format_str)-2); + error = put_marker(data,start+1,*index-(start-format_str)-1); } if(error) { DEBUG_NUMBER("put_marker/add_time returned error:",error); @@ -796,6 +810,12 @@ int serialize_with_format(struct collection_item *event, int i=0; char *one_format; int brk; + char *start; + char *end; + int block; + int error = EOK; + int len; + char *dup; DEBUG_STRING("serialize_with_format","Entry point"); @@ -810,19 +830,32 @@ int serialize_with_format(struct collection_item *event, data->size = BLOCK_SIZE; data->length = 0; + /* Create a copy so we can change it if needed */ + len = strlen(format_str); + errno = 0; + dup = malloc(len+1); + if(dup == NULL) { + DEBUG_NUMBER("Out of memory",errno); + free(data->buffer); + data->buffer=NULL; + return ENOMEM; + } + memcpy(dup,format_str,len+1); + /* Create buffer for format specifier */ errno = 0; one_format = malloc(len+1); if(one_format == NULL) { DEBUG_NUMBER("Out of memory",errno); - free(data->buffer); + free(data->buffer); + free(dup); data->buffer=NULL; return ENOMEM; } while(1) { /* Copy characters directly into output */ - start = format_str+i; + start = dup+i; end = start; block = 0; while((*end != '%') && (*end != '\0')) end++; @@ -835,6 +868,7 @@ int serialize_with_format(struct collection_item *event, free(data->buffer); data->buffer=NULL; free(one_format); + free(dup); return ENOMEM; } } @@ -845,33 +879,35 @@ int serialize_with_format(struct collection_item *event, i+=block+1; /* Here we are at the beginning of the string after % */ - DEBUG_STRING("Format after %:",format_str+i); + DEBUG_STRING("Format after %:",dup+i); /* Handle special case */ - if(*(format_str+i) == '%') { + if(*(dup+i) == '%') { error = put_marker(data,"%",1); if(error) { DEBUG_NUMBER("put_marker returned error:",error); free(data->buffer); data->buffer=NULL; free(one_format); + free(dup); return error; } i++; - DEBUG_STRING("Format after processing %%:",format_str+i); + DEBUG_STRING("Format after processing %%:",dup+i); continue; } /* We are here in case there is a real format token */ - if(*(format_str+i) == '(') { + if(*(dup+i) == '(') { /* This is our special case when we have a event item specifier () */ brk = 0; - error = process_item(data,format_str,&i,event,NULL,&brk); + error = process_item(data,dup,&i,event,NULL,&brk); if(error) { DEBUG_NUMBER("put_marker bad format returned error:",error); free(data->buffer); data->buffer=NULL; free(one_format); + free(dup); return error; } if(brk) break; @@ -879,7 +915,7 @@ int serialize_with_format(struct collection_item *event, } /* There is a format specifier ! */ - start = format_str+i; + start = dup+i-1; end = start; block = 0; while((*end != '(') && (*end != '\0')) end++; @@ -893,6 +929,7 @@ int serialize_with_format(struct collection_item *event, free(data->buffer); data->buffer=NULL; free(one_format); + free(dup); return error; } /* We are done */ @@ -900,25 +937,28 @@ int serialize_with_format(struct collection_item *event, } /* We are here becuase we have a valid (hopefully) format */ - block = end - start - 1; + block = end - start; memcpy(one_format,start,block); *(one_format+block) = '\0'; - i = end - format_str; + i = end - dup; brk = 0; - error = process_item(data,format_str,&i,event,one_format); + error = process_item(data,dup,&i,event,one_format,&brk); if(error) { DEBUG_NUMBER("put_marker bad format returned error:",error); free(data->buffer); data->buffer=NULL; free(one_format); + free(dup); return error; } if(brk) break; - DEBUG_STRING("Format after another item:",format_str+i); + DEBUG_STRING("Format after another item:",dup+i); } + free(one_format); + free(dup); /* Out of the loop */ DEBUG_STRING("serialize_with_format","Success Exit"); return EOK; |