/* * data specific functions */ static int data_compare(const idmef_value_type_t *t1, const idmef_value_type_t *t2, size_t len, idmef_criterion_operator_t op) { int ret; size_t s1_len, s2_len; const void *s1 = NULL, *s2 = NULL; if ( t1->data.data_val ) s1 = idmef_data_get_data(t1->data.data_val); if ( t2->data.string_val ) s2 = idmef_data_get_data(t2->data.data_val); if ( ! s1 || ! s2 ) return (s1) ? 1 : -1; if ( op & IDMEF_CRITERION_OPERATOR_SUBSTR ) { s1_len = idmef_data_get_len(t1->data.data_val); s2_len = idmef_data_get_len(t2->data.data_val); return ( memmem(s1, s1_len, s2, s2_len) ) ? 0 : -1; } ret = idmef_data_compare(t1->data.data_val, t2->data.data_val); if ( ret == 0 && op & IDMEF_CRITERION_OPERATOR_EQUAL ) return 0; else if ( ret < 0 && op & IDMEF_CRITERION_OPERATOR_LESSER ) return 0; else if ( ret > 0 && op & IDMEF_CRITERION_OPERATOR_GREATER ) return 0; return -1; }
int idmef_message_get_data(idmef_message_t *message, const char *path, unsigned char **data, size_t *size) { int ret; idmef_data_t *dp; idmef_value_t *iv; ret = idmef_message_get_value(message, path, &iv); if ( ret <= 0 ) return ret; if ( idmef_value_get_type(iv) != IDMEF_VALUE_TYPE_DATA || ! (dp = idmef_value_get_data(iv)) ) { ret = -1; goto err; } *size = idmef_data_get_len(dp); *data = malloc(*size); if ( ! *data ) { ret = -1; goto err; } memcpy(*data, idmef_data_get_data(dp), *size); err: idmef_value_destroy(iv); return ret; }
static void cast_string(void) { idmef_data_t *data; idmef_value_t *value; requiem_string_t *str; assert(requiem_string_new_ref(&str, "abcdefgh") == 0); assert(idmef_value_new_string(&value, str) == 0); idmef_value_dont_have_own_data(value); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_INT8, -1) < 0); // assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_UINT8, -1) < 0); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_INT16, -1) < 0); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_UINT16, -1) < 0); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_INT32, -1) < 0); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_UINT32, -1) < 0); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_INT64, -1) < 0); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_UINT64, -1) < 0); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_FLOAT, -1) < 0); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_DOUBLE, -1) < 0); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_TIME, -1) < 0); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_ENUM, -1) < 0); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_LIST, -1) < 0); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_CLASS, -1) < 0); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_DATA, -1) == 0); assert(idmef_value_get_type(value) == IDMEF_VALUE_TYPE_DATA); assert(data = idmef_value_get_data(value)); assert(idmef_data_get_len(data) == (requiem_string_get_len(str) + 1)); assert(memcmp(requiem_string_get_string(str), idmef_data_get_data(data), idmef_data_get_len(data)) == 0); requiem_string_destroy(str); cast_data(value); idmef_value_destroy(value); assert(requiem_string_new_ref(&str, "2008-01-01 20:42:31") == 0); assert(idmef_value_new_string(&value, str) == 0); assert(_idmef_value_cast(value, IDMEF_VALUE_TYPE_TIME, -1) == 0); idmef_value_destroy(value); }