summaryrefslogtreecommitdiffstats
path: root/collection/elapi_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'collection/elapi_util.c')
-rw-r--r--collection/elapi_util.c88
1 files changed, 64 insertions, 24 deletions
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;