diff --git a/common/utils/itti_analyzer/libbuffers/buffers.c b/common/utils/itti_analyzer/libbuffers/buffers.c
index 6656c2fa43..7d1697a10d 100644
--- a/common/utils/itti_analyzer/libbuffers/buffers.c
+++ b/common/utils/itti_analyzer/libbuffers/buffers.c
@@ -52,7 +52,7 @@ int buffer_fetch(buffer_t *buffer, uint32_t offset, int size, void *value)
return -1;
if (buffer->size_bytes < ((offset >> 3) + size)) {
- g_debug("Not enough data to fetch");
+ g_warning("Not enough data to fetch");
return -1;
}
@@ -62,6 +62,17 @@ int buffer_fetch(buffer_t *buffer, uint32_t offset, int size, void *value)
return 0;
}
+int buffer_fetch_nbytes(buffer_t *buffer, uint32_t offset, int n_bytes, uint8_t *value)
+{
+ if (buffer->size_bytes < ((offset >> 3) + n_bytes)) {
+ g_warning("Not enough data to fetch");
+ return -1;
+ }
+ memcpy(&value[0], &buffer->data[offset >> 3], n_bytes);
+
+ return 0;
+}
+
int buffer_fetch_bits(buffer_t *buffer, uint32_t offset, int nbits, uint32_t *value)
{
uint32_t temp = 0;
diff --git a/common/utils/itti_analyzer/libbuffers/buffers.h b/common/utils/itti_analyzer/libbuffers/buffers.h
index 72adb546a7..39b836dc00 100644
--- a/common/utils/itti_analyzer/libbuffers/buffers.h
+++ b/common/utils/itti_analyzer/libbuffers/buffers.h
@@ -27,6 +27,8 @@ uint32_t buffer_get_uint32_t(buffer_t *buffer, uint32_t offset);
int buffer_fetch_bits(buffer_t *buffer, uint32_t offset, int nbits, uint32_t *value);
+int buffer_fetch_nbytes(buffer_t *buffer, uint32_t offset, int n_bytes, uint8_t *value);
+
void buffer_dump(buffer_t *buffer, FILE *to);
int buffer_append_data(buffer_t *buffer, const uint8_t *data, const uint32_t length);
diff --git a/common/utils/itti_analyzer/libparser/array_type.c b/common/utils/itti_analyzer/libparser/array_type.c
index 9d46a522dd..3d713dca02 100644
--- a/common/utils/itti_analyzer/libparser/array_type.c
+++ b/common/utils/itti_analyzer/libparser/array_type.c
@@ -61,7 +61,6 @@ int array_dissect_from_buffer(
length = sprintf(cbuf, "[%d .. %d] ", i, items -1);
-// ui_interface.ui_signal_set_text(cpy, length);
ui_set_signal_text_cb(user_data, cbuf, length);
type->child->type_dissect_from_buffer (
type->child, ui_set_signal_text_cb, user_data,
diff --git a/common/utils/itti_analyzer/libparser/pointer_type.c b/common/utils/itti_analyzer/libparser/pointer_type.c
index eaeff5b4c0..9bae999ed3 100644
--- a/common/utils/itti_analyzer/libparser/pointer_type.c
+++ b/common/utils/itti_analyzer/libparser/pointer_type.c
@@ -10,34 +10,42 @@ int pointer_dissect_from_buffer(
struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent)
{
- int length = 0;
+ int length = 0, i;
char cbuf[200];
- uint32_t value;
DISPLAY_PARSE_INFO("pointer", type->name, offset, parent_offset);
memset (cbuf, 0, 200);
- value = buffer_get_uint32_t (buffer, parent_offset + offset);
+ uint8_t value[type->size / 8];
+
+ buffer_fetch_nbytes(buffer, parent_offset + offset, type->size / 8, value);
DISPLAY_TYPE("Ptr");
- if (type->child->name) {
+ if (type->child->name && type->child) {
/*
INDENTED(stdout, indent, fprintf(stdout, "<%s>0x%08x%s>\n",
type->child->name, value, type->child->name));
*/
- INDENTED_STRING(cbuf, indent, sprintf(cbuf, "(%s *) 0x%08x;\n", type->child->name, value));
+ INDENTED_STRING(cbuf, indent, sprintf(cbuf, "(%s *) 0x", type->child->name));
}
else {
/*
INDENTED(stdout, indent, fprintf(stdout, "0x%08x\n",
value));
*/
- INDENTED_STRING(cbuf, indent, sprintf(cbuf, "(void *) 0x%08x;\n", value));
+ INDENTED_STRING(cbuf, indent, sprintf(cbuf, "(void *) 0x"));
}
length = strlen (cbuf);
+ /* Append the value */
+ for (i = type->size / 8 - 1; i != 0; i--) {
+ length += sprintf(&cbuf[length], "%02x", value[i]);
+ }
+
+ length += sprintf(&cbuf[length], ";\n");
+
ui_set_signal_text_cb(user_data, cbuf, length);
return 0;
@@ -51,8 +59,15 @@ int pointer_type_file_print(struct types_s *type, int indent, FILE *file) {
INDENTED(file, indent+4, fprintf(file, "Type .......: %d\n", type->type_xml));
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
- if (type->child != NULL)
- type->child->type_file_print (type->child, indent + 4, file);
+ if (type->child != NULL) {
+ if (type->child->type == TYPE_FUNCTION) {
+ INDENTED(file, indent+4, fprintf(file, "\n"));
+ INDENTED(file, indent+8, fprintf(file, "To be done\n"));
+ INDENTED(file, indent+4, fprintf(file, "\n"));
+ } else {
+ type->child->type_file_print (type->child, indent + 4, file);
+ }
+ }
if (type->file_ref != NULL)
type->file_ref->type_file_print (type->file_ref, indent + 4, file);
INDENTED(file, indent, fprintf(file, "\n"));
@@ -61,18 +76,5 @@ int pointer_type_file_print(struct types_s *type, int indent, FILE *file) {
}
int pointer_type_hr_display(struct types_s *type, int indent) {
- if (type == NULL)
- return -1;
- INDENTED(stdout, indent, printf("\n"));
- INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
- INDENTED(stdout, indent+4, printf("Type .......: %d\n", type->type_xml));
- INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
- INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
- if (type->child != NULL)
- type->child->type_hr_display (type->child, indent + 4);
- if (type->file_ref != NULL)
- type->file_ref->type_hr_display (type->file_ref, indent + 4);
- INDENTED(stdout, indent, printf("\n"));
-
- return 0;
+ return pointer_type_file_print(type, indent, stdout);
}
diff --git a/common/utils/itti_analyzer/libparser/types.c b/common/utils/itti_analyzer/libparser/types.c
index e30bfb5161..3510a9da39 100644
--- a/common/utils/itti_analyzer/libparser/types.c
+++ b/common/utils/itti_analyzer/libparser/types.c
@@ -26,6 +26,9 @@ types_t *type_new(enum type_e type)
new_p->type = type;
switch(type) {
+ case TYPE_FUNCTION:
+ /* Nothing to do for now. Display is done by pointer type */
+ break;
case TYPE_ENUMERATION:
new_p->type_hr_display = enum_type_hr_display;
new_p->type_file_print = enum_type_file_print;
diff --git a/common/utils/itti_analyzer/libparser/xml_parse.c b/common/utils/itti_analyzer/libparser/xml_parse.c
index b048d10bc3..4e8ea4ba03 100644
--- a/common/utils/itti_analyzer/libparser/xml_parse.c
+++ b/common/utils/itti_analyzer/libparser/xml_parse.c
@@ -573,6 +573,21 @@ static int parse_pointer_type(xmlNode *node, types_t **head) {
return 0;
}
+static int parse_function_type(xmlNode *node, types_t **head) {
+ types_t *new;
+
+ if (node == NULL)
+ return -1;
+
+ new = type_new (TYPE_FUNCTION);
+
+ CHECK_FCT(parse_attribute_id(node, new));
+
+ CHECK_FCT(types_insert_tail(head, new));
+
+ return 0;
+}
+
/**
* print_element_names:
* @a_node: the initial xml node to consider.
@@ -620,12 +635,16 @@ static int parse_elements(xmlNode * a_node, types_t **head) {
}
else
if (strcmp ((char *) child_node->name, "ArrayType") == 0) {
- CHECK_FCT_DO(parse_array_type(child_node, head), return RC_FAIL);
+ CHECK_FCT_DO(parse_array_type(child_node, head), return RC_FAIL);
}
else
if (strcmp ((char *) child_node->name, "PointerType") == 0) {
- CHECK_FCT_DO(parse_pointer_type(child_node, head), return RC_FAIL);
+ CHECK_FCT_DO(parse_pointer_type(child_node, head), return RC_FAIL);
}
+ else
+ if (strcmp ((char *) child_node->name, "FunctionType") == 0) {
+ CHECK_FCT_DO(parse_function_type(child_node, head), return RC_FAIL);
+ }
}
}
}
@@ -713,6 +732,7 @@ static int xml_parse_doc(xmlDocPtr doc) {
resolve_struct (&head);
resolve_file (&head);
resolve_union (&head);
+ resolve_function (&head);
/* Locate the root element which corresponds to the MessageDef struct */
CHECK_FCT(locate_root("MessageDef", head, &root));
/* Locate the message id enumeration */
diff --git a/common/utils/itti_analyzer/libresolver/resolvers.c b/common/utils/itti_analyzer/libresolver/resolvers.c
index e707fa49ea..8f17fb2ff3 100644
--- a/common/utils/itti_analyzer/libresolver/resolvers.c
+++ b/common/utils/itti_analyzer/libresolver/resolvers.c
@@ -206,7 +206,7 @@ int resolve_pointer_type(types_t **head)
if (next_type->type != TYPE_POINTER)
continue;
-// printf("Trying to resolve pointer id %d with type %d\n",
+// g_debug("Trying to resolve pointer id %d with type %d\n",
// next_type->id, next_type->type_xml);
if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
@@ -299,6 +299,33 @@ int resolve_array(types_t **head)
return 0;
}
+int resolve_function(types_t **head)
+{
+ types_t *next_type;
+
+ if (!head) {
+ g_warning("Empty list detected");
+ return RESOLV_LIST_EMPTY;
+ }
+
+ for (next_type = *head; next_type; next_type = next_type->next)
+ {
+ /* Only resolve typedef */
+ if (next_type->type != TYPE_FUNCTION)
+ continue;
+
+// g_debug("Trying to resolve function id %d with type %d\n",
+// next_type->id, next_type->type_xml);
+
+ if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
+ /* We have to remove this reference */
+ }
+// next_type->type_hr_display(next_type, 0);
+ }
+
+ return 0;
+}
+
int resolve_file(types_t **head)
{
types_t *next_type;
diff --git a/common/utils/itti_analyzer/libresolver/resolvers.h b/common/utils/itti_analyzer/libresolver/resolvers.h
index 04d6c103ac..c73dcedee2 100644
--- a/common/utils/itti_analyzer/libresolver/resolvers.h
+++ b/common/utils/itti_analyzer/libresolver/resolvers.h
@@ -17,6 +17,8 @@ int resolve_union(types_t **head);
int resolve_file(types_t **head);
+int resolve_function(types_t **head);
+
int search_file(types_t *head, types_t **found, int id);
#endif /* RESOLVERS_H_ */
diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.c b/common/utils/itti_analyzer/libui/ui_callbacks.c
index ea8e347dbf..0998dd20c1 100644
--- a/common/utils/itti_analyzer/libui/ui_callbacks.c
+++ b/common/utils/itti_analyzer/libui/ui_callbacks.c
@@ -238,6 +238,13 @@ gboolean ui_callback_on_connect(GtkWidget *widget,
/* Disable the connect button */
ui_disable_connect_button();
+ /* Disable buttons to move in the list of signals */
+ gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_clear_button), FALSE);
+ gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_go_to_button), FALSE);
+ gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_go_to_last_button), FALSE);
+ gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_go_to_first_button), FALSE);
+ ui_tree_view_destroy_list(ui_main_data.signalslist);
+
if (socket_connect_to_remote_host(ip, port, pipe_fd[1]) != 0) {
ui_enable_connect_button();
return FALSE;