/***** * * Copyright (C) 2001,2002,2003,2004,2005 PreludeIDS Technologies. All Rights Reserved. * Author: Yoann Vandoorselaere * Author: Nicolas Delon * * This file is part of the Prelude library. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * *****/ /* Auto-generated by the GenerateIDMEFTreeWrapC package */ #include "config.h" #include #include #include #include #include #include "prelude-inttypes.h" #include "prelude-list.h" #include "prelude-msg.h" #include "prelude-string.h" #define PRELUDE_ERROR_SOURCE_DEFAULT PRELUDE_ERROR_SOURCE_IDMEF_TREE_WRAP #include "prelude-error.h" #include "idmef-time.h" #include "idmef-data.h" #include "idmef-class.h" #include "idmef-value.h" #include "idmef-tree-wrap.h" #include "libmissing.h" #include "common.h" #ifdef WIN32 # undef interface #endif #define LISTED_OBJECT(name, type) prelude_list_t name #define IS_LISTED prelude_list_t list #define UNION(type, var) type var; union #define UNION_MEMBER(value, type, name) type name #define ENUM(...) typedef enum #define PRE_DECLARE(type, class) #define TYPE_ID(type, id) type #define PRIMITIVE_TYPE(type) #define PRIMITIVE_TYPE_STRUCT(type) #define HIDE(type, name) type name #define REFCOUNT int refcount #define REQUIRED(type, name) type name #define DYNAMIC_IDENT(x) uint64_t x #define OPTIONAL_INT(type, name) type name; unsigned int name ## _is_set:1 #define IDENT(name) uint64_t name #define idmef_data_copy idmef_data_copy_dup static int prelude_string_copy(const prelude_string_t *src, prelude_string_t *dst) { prelude_return_val_if_fail(src, prelude_error(PRELUDE_ERROR_ASSERTION)); prelude_return_val_if_fail(dst, prelude_error(PRELUDE_ERROR_ASSERTION)); if ( ! prelude_string_is_empty(src) ) return prelude_string_copy_dup(src, dst); return 0; } static int get_value_from_string(idmef_value_t **value, prelude_string_t *str, prelude_bool_t is_ptr) { int ret; if ( ! str ) { *value = NULL; return 0; } if ( ! is_ptr ) { ret = prelude_string_clone(str, &str); if ( ret < 0 ) return ret; } ret = idmef_value_new_string(value, str); if ( ret < 0 ) { prelude_string_destroy(str); return ret; } if ( is_ptr ) prelude_string_ref(str); return 0; } static int get_value_from_data(idmef_value_t **value, idmef_data_t *data, prelude_bool_t is_ptr) { int ret; if ( ! data ) { *value = NULL; return 0; } if ( ! is_ptr ) { ret = idmef_data_clone(data, &data); if ( ret < 0 ) return ret; } ret = idmef_value_new_data(value, data); if ( ret < 0 ) { idmef_data_destroy(data); return ret; } if ( is_ptr ) idmef_data_ref(data); return 0; } static int get_value_from_time(idmef_value_t **value, idmef_time_t *time, prelude_bool_t is_ptr) { int ret; if ( ! time ) { *value = NULL; return 0; } if ( ! is_ptr ) { ret = idmef_time_clone(time, &time); if ( ret < 0 ) return ret; } ret = idmef_value_new_time(value, time); if ( ret < 0 ) { idmef_time_destroy(time); return ret; } if ( is_ptr ) idmef_time_ref(time); return 0; } static void list_insert(prelude_list_t *head, prelude_list_t *item, int pos) { int i = 0; prelude_list_t *tmp; if ( pos == IDMEF_LIST_APPEND ) prelude_list_add_tail(head, item); else if ( pos == IDMEF_LIST_PREPEND ) prelude_list_add(head, item); else if ( pos >= 0 ) { prelude_list_for_each(head, tmp) { if ( i == pos ) break; i++; } prelude_list_add_tail(tmp, item); } else if ( pos < 0 ) { pos = -pos; pos--; prelude_list_for_each_reversed(head, tmp) { if ( i == pos ) break; i++; } prelude_list_add(tmp, item); } } /** * idmef_additional_data_type_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_additional_data_type_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_additional_data_type_t idmef_additional_data_type_to_numeric(const char *name) { int i; const struct { idmef_additional_data_type_t val; const char *name; } tbl[] = { { IDMEF_ADDITIONAL_DATA_TYPE_STRING, "string" }, { IDMEF_ADDITIONAL_DATA_TYPE_BYTE, "byte" }, { IDMEF_ADDITIONAL_DATA_TYPE_CHARACTER, "character" }, { IDMEF_ADDITIONAL_DATA_TYPE_DATE_TIME, "date-time" }, { IDMEF_ADDITIONAL_DATA_TYPE_INTEGER, "integer" }, { IDMEF_ADDITIONAL_DATA_TYPE_NTPSTAMP, "ntpstamp" }, { IDMEF_ADDITIONAL_DATA_TYPE_PORTLIST, "portlist" }, { IDMEF_ADDITIONAL_DATA_TYPE_REAL, "real" }, { IDMEF_ADDITIONAL_DATA_TYPE_BOOLEAN, "boolean" }, { IDMEF_ADDITIONAL_DATA_TYPE_BYTE_STRING, "byte-string" }, { IDMEF_ADDITIONAL_DATA_TYPE_XML, "xml" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for additional_data_type", name); } /** * idmef_additional_data_type_to_string: * @val: an enumeration value for #idmef_additional_data_type_t. * * Return the IDMEF string equivalent of @val provided #idmef_additional_data_type_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_additional_data_type_to_string(idmef_additional_data_type_t val) { const struct { idmef_additional_data_type_t val; const char *name; } tbl[] = { { IDMEF_ADDITIONAL_DATA_TYPE_STRING, "string" }, { IDMEF_ADDITIONAL_DATA_TYPE_BYTE, "byte" }, { IDMEF_ADDITIONAL_DATA_TYPE_CHARACTER, "character" }, { IDMEF_ADDITIONAL_DATA_TYPE_DATE_TIME, "date-time" }, { IDMEF_ADDITIONAL_DATA_TYPE_INTEGER, "integer" }, { IDMEF_ADDITIONAL_DATA_TYPE_NTPSTAMP, "ntpstamp" }, { IDMEF_ADDITIONAL_DATA_TYPE_PORTLIST, "portlist" }, { IDMEF_ADDITIONAL_DATA_TYPE_REAL, "real" }, { IDMEF_ADDITIONAL_DATA_TYPE_BOOLEAN, "boolean" }, { IDMEF_ADDITIONAL_DATA_TYPE_BYTE_STRING, "byte-string" }, { IDMEF_ADDITIONAL_DATA_TYPE_XML, "xml" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_additional_data { IS_LISTED; REFCOUNT; idmef_additional_data_type_t type; prelude_string_t *meaning; REQUIRED(idmef_data_t, *data); }; /** * idmef_reference_origin_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_reference_origin_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_reference_origin_t idmef_reference_origin_to_numeric(const char *name) { int i; const struct { idmef_reference_origin_t val; const char *name; } tbl[] = { { IDMEF_REFERENCE_ORIGIN_UNKNOWN, "unknown" }, { IDMEF_REFERENCE_ORIGIN_VENDOR_SPECIFIC, "vendor-specific" }, { IDMEF_REFERENCE_ORIGIN_USER_SPECIFIC, "user-specific" }, { IDMEF_REFERENCE_ORIGIN_BUGTRAQID, "bugtraqid" }, { IDMEF_REFERENCE_ORIGIN_CVE, "cve" }, { IDMEF_REFERENCE_ORIGIN_OSVDB, "osvdb" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for reference_origin", name); } /** * idmef_reference_origin_to_string: * @val: an enumeration value for #idmef_reference_origin_t. * * Return the IDMEF string equivalent of @val provided #idmef_reference_origin_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_reference_origin_to_string(idmef_reference_origin_t val) { const struct { idmef_reference_origin_t val; const char *name; } tbl[] = { { IDMEF_REFERENCE_ORIGIN_UNKNOWN, "unknown" }, { IDMEF_REFERENCE_ORIGIN_VENDOR_SPECIFIC, "vendor-specific" }, { IDMEF_REFERENCE_ORIGIN_USER_SPECIFIC, "user-specific" }, { IDMEF_REFERENCE_ORIGIN_BUGTRAQID, "bugtraqid" }, { IDMEF_REFERENCE_ORIGIN_CVE, "cve" }, { IDMEF_REFERENCE_ORIGIN_OSVDB, "osvdb" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_reference { IS_LISTED; REFCOUNT; idmef_reference_origin_t origin; REQUIRED(prelude_string_t, *name); REQUIRED(prelude_string_t, *url); prelude_string_t *meaning; }; struct idmef_classification { REFCOUNT; prelude_string_t *ident; REQUIRED(prelude_string_t, *text); LISTED_OBJECT(reference_list, idmef_reference_t); }; /** * idmef_user_id_type_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_user_id_type_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_user_id_type_t idmef_user_id_type_to_numeric(const char *name) { int i; const struct { idmef_user_id_type_t val; const char *name; } tbl[] = { { IDMEF_USER_ID_TYPE_ORIGINAL_USER, "original-user" }, { IDMEF_USER_ID_TYPE_CURRENT_USER, "current-user" }, { IDMEF_USER_ID_TYPE_TARGET_USER, "target-user" }, { IDMEF_USER_ID_TYPE_USER_PRIVS, "user-privs" }, { IDMEF_USER_ID_TYPE_CURRENT_GROUP, "current-group" }, { IDMEF_USER_ID_TYPE_GROUP_PRIVS, "group-privs" }, { IDMEF_USER_ID_TYPE_OTHER_PRIVS, "other-privs" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for user_id_type", name); } /** * idmef_user_id_type_to_string: * @val: an enumeration value for #idmef_user_id_type_t. * * Return the IDMEF string equivalent of @val provided #idmef_user_id_type_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_user_id_type_to_string(idmef_user_id_type_t val) { const struct { idmef_user_id_type_t val; const char *name; } tbl[] = { { IDMEF_USER_ID_TYPE_ORIGINAL_USER, "original-user" }, { IDMEF_USER_ID_TYPE_CURRENT_USER, "current-user" }, { IDMEF_USER_ID_TYPE_TARGET_USER, "target-user" }, { IDMEF_USER_ID_TYPE_USER_PRIVS, "user-privs" }, { IDMEF_USER_ID_TYPE_CURRENT_GROUP, "current-group" }, { IDMEF_USER_ID_TYPE_GROUP_PRIVS, "group-privs" }, { IDMEF_USER_ID_TYPE_OTHER_PRIVS, "other-privs" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_user_id { IS_LISTED; REFCOUNT; prelude_string_t *ident; idmef_user_id_type_t type; prelude_string_t *tty; prelude_string_t *name; OPTIONAL_INT(uint32_t, number); }; /** * idmef_user_category_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_user_category_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_user_category_t idmef_user_category_to_numeric(const char *name) { int i; const struct { idmef_user_category_t val; const char *name; } tbl[] = { { IDMEF_USER_CATEGORY_UNKNOWN, "unknown" }, { IDMEF_USER_CATEGORY_APPLICATION, "application" }, { IDMEF_USER_CATEGORY_OS_DEVICE, "os-device" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for user_category", name); } /** * idmef_user_category_to_string: * @val: an enumeration value for #idmef_user_category_t. * * Return the IDMEF string equivalent of @val provided #idmef_user_category_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_user_category_to_string(idmef_user_category_t val) { const struct { idmef_user_category_t val; const char *name; } tbl[] = { { IDMEF_USER_CATEGORY_UNKNOWN, "unknown" }, { IDMEF_USER_CATEGORY_APPLICATION, "application" }, { IDMEF_USER_CATEGORY_OS_DEVICE, "os-device" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_user { REFCOUNT; prelude_string_t *ident; idmef_user_category_t category; LISTED_OBJECT(user_id_list, idmef_user_id_t); }; /** * idmef_address_category_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_address_category_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_address_category_t idmef_address_category_to_numeric(const char *name) { int i; const struct { idmef_address_category_t val; const char *name; } tbl[] = { { IDMEF_ADDRESS_CATEGORY_UNKNOWN, "unknown" }, { IDMEF_ADDRESS_CATEGORY_ATM, "atm" }, { IDMEF_ADDRESS_CATEGORY_E_MAIL, "e-mail" }, { IDMEF_ADDRESS_CATEGORY_LOTUS_NOTES, "lotus-notes" }, { IDMEF_ADDRESS_CATEGORY_MAC, "mac" }, { IDMEF_ADDRESS_CATEGORY_SNA, "sna" }, { IDMEF_ADDRESS_CATEGORY_VM, "vm" }, { IDMEF_ADDRESS_CATEGORY_IPV4_ADDR, "ipv4-addr" }, { IDMEF_ADDRESS_CATEGORY_IPV4_ADDR_HEX, "ipv4-addr-hex" }, { IDMEF_ADDRESS_CATEGORY_IPV4_NET, "ipv4-net" }, { IDMEF_ADDRESS_CATEGORY_IPV4_NET_MASK, "ipv4-net-mask" }, { IDMEF_ADDRESS_CATEGORY_IPV6_ADDR, "ipv6-addr" }, { IDMEF_ADDRESS_CATEGORY_IPV6_ADDR_HEX, "ipv6-addr-hex" }, { IDMEF_ADDRESS_CATEGORY_IPV6_NET, "ipv6-net" }, { IDMEF_ADDRESS_CATEGORY_IPV6_NET_MASK, "ipv6-net-mask" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for address_category", name); } /** * idmef_address_category_to_string: * @val: an enumeration value for #idmef_address_category_t. * * Return the IDMEF string equivalent of @val provided #idmef_address_category_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_address_category_to_string(idmef_address_category_t val) { const struct { idmef_address_category_t val; const char *name; } tbl[] = { { IDMEF_ADDRESS_CATEGORY_UNKNOWN, "unknown" }, { IDMEF_ADDRESS_CATEGORY_ATM, "atm" }, { IDMEF_ADDRESS_CATEGORY_E_MAIL, "e-mail" }, { IDMEF_ADDRESS_CATEGORY_LOTUS_NOTES, "lotus-notes" }, { IDMEF_ADDRESS_CATEGORY_MAC, "mac" }, { IDMEF_ADDRESS_CATEGORY_SNA, "sna" }, { IDMEF_ADDRESS_CATEGORY_VM, "vm" }, { IDMEF_ADDRESS_CATEGORY_IPV4_ADDR, "ipv4-addr" }, { IDMEF_ADDRESS_CATEGORY_IPV4_ADDR_HEX, "ipv4-addr-hex" }, { IDMEF_ADDRESS_CATEGORY_IPV4_NET, "ipv4-net" }, { IDMEF_ADDRESS_CATEGORY_IPV4_NET_MASK, "ipv4-net-mask" }, { IDMEF_ADDRESS_CATEGORY_IPV6_ADDR, "ipv6-addr" }, { IDMEF_ADDRESS_CATEGORY_IPV6_ADDR_HEX, "ipv6-addr-hex" }, { IDMEF_ADDRESS_CATEGORY_IPV6_NET, "ipv6-net" }, { IDMEF_ADDRESS_CATEGORY_IPV6_NET_MASK, "ipv6-net-mask" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_address { IS_LISTED; REFCOUNT; prelude_string_t *ident; idmef_address_category_t category; prelude_string_t *vlan_name; OPTIONAL_INT(int32_t, vlan_num); REQUIRED(prelude_string_t, *address); prelude_string_t *netmask; }; struct idmef_process { REFCOUNT; prelude_string_t *ident; REQUIRED(prelude_string_t, *name); OPTIONAL_INT(uint32_t, pid); prelude_string_t *path; LISTED_OBJECT(arg_list, prelude_string_t); LISTED_OBJECT(env_list, prelude_string_t); }; struct idmef_web_service { REFCOUNT; REQUIRED(prelude_string_t, *url); prelude_string_t *cgi; prelude_string_t *http_method; LISTED_OBJECT(arg_list, prelude_string_t); }; struct idmef_snmp_service { REFCOUNT; prelude_string_t *oid; OPTIONAL_INT(uint32_t, message_processing_model); OPTIONAL_INT(uint32_t, security_model); prelude_string_t *security_name; OPTIONAL_INT(uint32_t, security_level); prelude_string_t *context_name; prelude_string_t *context_engine_id; prelude_string_t *command; prelude_string_t *community; }; /** * idmef_service_type_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_service_type_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_service_type_t idmef_service_type_to_numeric(const char *name) { int i; const struct { idmef_service_type_t val; const char *name; } tbl[] = { { IDMEF_SERVICE_TYPE_DEFAULT, "default" }, { IDMEF_SERVICE_TYPE_WEB, "web" }, { IDMEF_SERVICE_TYPE_SNMP, "snmp" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for service_type", name); } /** * idmef_service_type_to_string: * @val: an enumeration value for #idmef_service_type_t. * * Return the IDMEF string equivalent of @val provided #idmef_service_type_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_service_type_to_string(idmef_service_type_t val) { const struct { idmef_service_type_t val; const char *name; } tbl[] = { { IDMEF_SERVICE_TYPE_DEFAULT, "default" }, { IDMEF_SERVICE_TYPE_WEB, "web" }, { IDMEF_SERVICE_TYPE_SNMP, "snmp" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_service { REFCOUNT; prelude_string_t *ident; OPTIONAL_INT(uint8_t, ip_version); OPTIONAL_INT(uint8_t, iana_protocol_number); prelude_string_t *iana_protocol_name; prelude_string_t *name; OPTIONAL_INT(uint16_t, port); prelude_string_t *portlist; prelude_string_t *protocol; UNION(idmef_service_type_t, type) { UNION_MEMBER(IDMEF_SERVICE_TYPE_WEB, idmef_web_service_t, *web_service); UNION_MEMBER(IDMEF_SERVICE_TYPE_SNMP, idmef_snmp_service_t, *snmp_service); } specific; }; /** * idmef_node_category_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_node_category_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_node_category_t idmef_node_category_to_numeric(const char *name) { int i; const struct { idmef_node_category_t val; const char *name; } tbl[] = { { IDMEF_NODE_CATEGORY_UNKNOWN, "unknown" }, { IDMEF_NODE_CATEGORY_ADS, "ads" }, { IDMEF_NODE_CATEGORY_AFS, "afs" }, { IDMEF_NODE_CATEGORY_CODA, "coda" }, { IDMEF_NODE_CATEGORY_DFS, "dfs" }, { IDMEF_NODE_CATEGORY_DNS, "dns" }, { IDMEF_NODE_CATEGORY_HOSTS, "hosts" }, { IDMEF_NODE_CATEGORY_KERBEROS, "kerberos" }, { IDMEF_NODE_CATEGORY_NDS, "nds" }, { IDMEF_NODE_CATEGORY_NIS, "nis" }, { IDMEF_NODE_CATEGORY_NISPLUS, "nisplus" }, { IDMEF_NODE_CATEGORY_NT, "nt" }, { IDMEF_NODE_CATEGORY_WFW, "wfw" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for node_category", name); } /** * idmef_node_category_to_string: * @val: an enumeration value for #idmef_node_category_t. * * Return the IDMEF string equivalent of @val provided #idmef_node_category_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_node_category_to_string(idmef_node_category_t val) { const struct { idmef_node_category_t val; const char *name; } tbl[] = { { IDMEF_NODE_CATEGORY_UNKNOWN, "unknown" }, { IDMEF_NODE_CATEGORY_ADS, "ads" }, { IDMEF_NODE_CATEGORY_AFS, "afs" }, { IDMEF_NODE_CATEGORY_CODA, "coda" }, { IDMEF_NODE_CATEGORY_DFS, "dfs" }, { IDMEF_NODE_CATEGORY_DNS, "dns" }, { IDMEF_NODE_CATEGORY_HOSTS, "hosts" }, { IDMEF_NODE_CATEGORY_KERBEROS, "kerberos" }, { IDMEF_NODE_CATEGORY_NDS, "nds" }, { IDMEF_NODE_CATEGORY_NIS, "nis" }, { IDMEF_NODE_CATEGORY_NISPLUS, "nisplus" }, { IDMEF_NODE_CATEGORY_NT, "nt" }, { IDMEF_NODE_CATEGORY_WFW, "wfw" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_node { REFCOUNT; prelude_string_t *ident; idmef_node_category_t category; prelude_string_t *location; prelude_string_t *name; LISTED_OBJECT(address_list, idmef_address_t); }; /** * idmef_source_spoofed_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_source_spoofed_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_source_spoofed_t idmef_source_spoofed_to_numeric(const char *name) { int i; const struct { idmef_source_spoofed_t val; const char *name; } tbl[] = { { IDMEF_SOURCE_SPOOFED_UNKNOWN, "unknown" }, { IDMEF_SOURCE_SPOOFED_YES, "yes" }, { IDMEF_SOURCE_SPOOFED_NO, "no" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for source_spoofed", name); } /** * idmef_source_spoofed_to_string: * @val: an enumeration value for #idmef_source_spoofed_t. * * Return the IDMEF string equivalent of @val provided #idmef_source_spoofed_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_source_spoofed_to_string(idmef_source_spoofed_t val) { const struct { idmef_source_spoofed_t val; const char *name; } tbl[] = { { IDMEF_SOURCE_SPOOFED_UNKNOWN, "unknown" }, { IDMEF_SOURCE_SPOOFED_YES, "yes" }, { IDMEF_SOURCE_SPOOFED_NO, "no" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_source { IS_LISTED; REFCOUNT; prelude_string_t *ident; idmef_source_spoofed_t spoofed; prelude_string_t *interface; idmef_node_t *node; idmef_user_t *user; idmef_process_t *process; idmef_service_t *service; }; struct idmef_file_access { IS_LISTED; REFCOUNT; REQUIRED(idmef_user_id_t, *user_id); LISTED_OBJECT(permission_list, prelude_string_t); }; struct idmef_inode { REFCOUNT; idmef_time_t *change_time; OPTIONAL_INT(uint32_t, number); OPTIONAL_INT(uint32_t, major_device); OPTIONAL_INT(uint32_t, minor_device); OPTIONAL_INT(uint32_t, c_major_device); OPTIONAL_INT(uint32_t, c_minor_device); }; /** * idmef_checksum_algorithm_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_checksum_algorithm_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_checksum_algorithm_t idmef_checksum_algorithm_to_numeric(const char *name) { int i; const struct { idmef_checksum_algorithm_t val; const char *name; } tbl[] = { { IDMEF_CHECKSUM_ALGORITHM_MD4, "MD4" }, { IDMEF_CHECKSUM_ALGORITHM_MD5, "MD5" }, { IDMEF_CHECKSUM_ALGORITHM_SHA1, "SHA1" }, { IDMEF_CHECKSUM_ALGORITHM_SHA2_256, "SHA2-256" }, { IDMEF_CHECKSUM_ALGORITHM_SHA2_384, "SHA2-384" }, { IDMEF_CHECKSUM_ALGORITHM_SHA2_512, "SHA2-512" }, { IDMEF_CHECKSUM_ALGORITHM_CRC_32, "CRC-32" }, { IDMEF_CHECKSUM_ALGORITHM_HAVAL, "Haval" }, { IDMEF_CHECKSUM_ALGORITHM_TIGER, "Tiger" }, { IDMEF_CHECKSUM_ALGORITHM_GOST, "Gost" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for checksum_algorithm", name); } /** * idmef_checksum_algorithm_to_string: * @val: an enumeration value for #idmef_checksum_algorithm_t. * * Return the IDMEF string equivalent of @val provided #idmef_checksum_algorithm_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_checksum_algorithm_to_string(idmef_checksum_algorithm_t val) { const struct { idmef_checksum_algorithm_t val; const char *name; } tbl[] = {{ 0, NULL }, { IDMEF_CHECKSUM_ALGORITHM_MD4, "MD4" }, { IDMEF_CHECKSUM_ALGORITHM_MD5, "MD5" }, { IDMEF_CHECKSUM_ALGORITHM_SHA1, "SHA1" }, { IDMEF_CHECKSUM_ALGORITHM_SHA2_256, "SHA2-256" }, { IDMEF_CHECKSUM_ALGORITHM_SHA2_384, "SHA2-384" }, { IDMEF_CHECKSUM_ALGORITHM_SHA2_512, "SHA2-512" }, { IDMEF_CHECKSUM_ALGORITHM_CRC_32, "CRC-32" }, { IDMEF_CHECKSUM_ALGORITHM_HAVAL, "Haval" }, { IDMEF_CHECKSUM_ALGORITHM_TIGER, "Tiger" }, { IDMEF_CHECKSUM_ALGORITHM_GOST, "Gost" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_checksum { IS_LISTED; REFCOUNT; REQUIRED(prelude_string_t, *value); prelude_string_t *key; idmef_checksum_algorithm_t algorithm; }; /** * idmef_file_category_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_file_category_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_file_category_t idmef_file_category_to_numeric(const char *name) { int i; const struct { idmef_file_category_t val; const char *name; } tbl[] = { { IDMEF_FILE_CATEGORY_CURRENT, "current" }, { IDMEF_FILE_CATEGORY_ORIGINAL, "original" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for file_category", name); } /** * idmef_file_category_to_string: * @val: an enumeration value for #idmef_file_category_t. * * Return the IDMEF string equivalent of @val provided #idmef_file_category_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_file_category_to_string(idmef_file_category_t val) { const struct { idmef_file_category_t val; const char *name; } tbl[] = {{ 0, NULL }, { IDMEF_FILE_CATEGORY_CURRENT, "current" }, { IDMEF_FILE_CATEGORY_ORIGINAL, "original" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } /** * idmef_file_fstype_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_file_fstype_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_file_fstype_t idmef_file_fstype_to_numeric(const char *name) { int i; const struct { idmef_file_fstype_t val; const char *name; } tbl[] = { { IDMEF_FILE_FSTYPE_UFS, "ufs" }, { IDMEF_FILE_FSTYPE_EFS, "efs" }, { IDMEF_FILE_FSTYPE_NFS, "nfs" }, { IDMEF_FILE_FSTYPE_AFS, "afs" }, { IDMEF_FILE_FSTYPE_NTFS, "ntfs" }, { IDMEF_FILE_FSTYPE_FAT16, "fat16" }, { IDMEF_FILE_FSTYPE_FAT32, "fat32" }, { IDMEF_FILE_FSTYPE_PCFS, "pcfs" }, { IDMEF_FILE_FSTYPE_JOLIET, "joliet" }, { IDMEF_FILE_FSTYPE_ISO9660, "iso9660" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for file_fstype", name); } /** * idmef_file_fstype_to_string: * @val: an enumeration value for #idmef_file_fstype_t. * * Return the IDMEF string equivalent of @val provided #idmef_file_fstype_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_file_fstype_to_string(idmef_file_fstype_t val) { const struct { idmef_file_fstype_t val; const char *name; } tbl[] = {{ 0, NULL }, { IDMEF_FILE_FSTYPE_UFS, "ufs" }, { IDMEF_FILE_FSTYPE_EFS, "efs" }, { IDMEF_FILE_FSTYPE_NFS, "nfs" }, { IDMEF_FILE_FSTYPE_AFS, "afs" }, { IDMEF_FILE_FSTYPE_NTFS, "ntfs" }, { IDMEF_FILE_FSTYPE_FAT16, "fat16" }, { IDMEF_FILE_FSTYPE_FAT32, "fat32" }, { IDMEF_FILE_FSTYPE_PCFS, "pcfs" }, { IDMEF_FILE_FSTYPE_JOLIET, "joliet" }, { IDMEF_FILE_FSTYPE_ISO9660, "iso9660" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_file { IS_LISTED; REFCOUNT; prelude_string_t *ident; REQUIRED(prelude_string_t, *name); REQUIRED(prelude_string_t, *path); idmef_time_t *create_time; idmef_time_t *modify_time; idmef_time_t *access_time; OPTIONAL_INT(uint64_t, data_size); OPTIONAL_INT(uint64_t, disk_size); LISTED_OBJECT(file_access_list, idmef_file_access_t); LISTED_OBJECT(linkage_list, idmef_linkage_t); idmef_inode_t *inode; LISTED_OBJECT(checksum_list, idmef_checksum_t); idmef_file_category_t category; OPTIONAL_INT(idmef_file_fstype_t, fstype); prelude_string_t *file_type; }; /** * idmef_linkage_category_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_linkage_category_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_linkage_category_t idmef_linkage_category_to_numeric(const char *name) { int i; const struct { idmef_linkage_category_t val; const char *name; } tbl[] = { { IDMEF_LINKAGE_CATEGORY_HARD_LINK, "hard-link" }, { IDMEF_LINKAGE_CATEGORY_MOUNT_POINT, "mount-point" }, { IDMEF_LINKAGE_CATEGORY_REPARSE_POINT, "reparse-point" }, { IDMEF_LINKAGE_CATEGORY_SHORTCUT, "shortcut" }, { IDMEF_LINKAGE_CATEGORY_STREAM, "stream" }, { IDMEF_LINKAGE_CATEGORY_SYMBOLIC_LINK, "symbolic-link" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for linkage_category", name); } /** * idmef_linkage_category_to_string: * @val: an enumeration value for #idmef_linkage_category_t. * * Return the IDMEF string equivalent of @val provided #idmef_linkage_category_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_linkage_category_to_string(idmef_linkage_category_t val) { const struct { idmef_linkage_category_t val; const char *name; } tbl[] = {{ 0, NULL }, { IDMEF_LINKAGE_CATEGORY_HARD_LINK, "hard-link" }, { IDMEF_LINKAGE_CATEGORY_MOUNT_POINT, "mount-point" }, { IDMEF_LINKAGE_CATEGORY_REPARSE_POINT, "reparse-point" }, { IDMEF_LINKAGE_CATEGORY_SHORTCUT, "shortcut" }, { IDMEF_LINKAGE_CATEGORY_STREAM, "stream" }, { IDMEF_LINKAGE_CATEGORY_SYMBOLIC_LINK, "symbolic-link" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_linkage { IS_LISTED; REFCOUNT; idmef_linkage_category_t category; REQUIRED(prelude_string_t, *name); REQUIRED(prelude_string_t, *path); REQUIRED(idmef_file_t, *file); }; /** * idmef_target_decoy_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_target_decoy_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_target_decoy_t idmef_target_decoy_to_numeric(const char *name) { int i; const struct { idmef_target_decoy_t val; const char *name; } tbl[] = { { IDMEF_TARGET_DECOY_UNKNOWN, "unknown" }, { IDMEF_TARGET_DECOY_YES, "yes" }, { IDMEF_TARGET_DECOY_NO, "no" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for target_decoy", name); } /** * idmef_target_decoy_to_string: * @val: an enumeration value for #idmef_target_decoy_t. * * Return the IDMEF string equivalent of @val provided #idmef_target_decoy_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_target_decoy_to_string(idmef_target_decoy_t val) { const struct { idmef_target_decoy_t val; const char *name; } tbl[] = { { IDMEF_TARGET_DECOY_UNKNOWN, "unknown" }, { IDMEF_TARGET_DECOY_YES, "yes" }, { IDMEF_TARGET_DECOY_NO, "no" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_target { IS_LISTED; REFCOUNT; prelude_string_t *ident; idmef_target_decoy_t decoy; prelude_string_t *interface; idmef_node_t *node; idmef_user_t *user; idmef_process_t *process; idmef_service_t *service; LISTED_OBJECT(file_list, idmef_file_t); }; struct idmef_analyzer { IS_LISTED; REFCOUNT; prelude_string_t *analyzerid; prelude_string_t *name; prelude_string_t *manufacturer; prelude_string_t *model; prelude_string_t *version; prelude_string_t *class; prelude_string_t *ostype; prelude_string_t *osversion; idmef_node_t *node; idmef_process_t *process; }; struct idmef_alertident { IS_LISTED; REFCOUNT; REQUIRED(prelude_string_t, *alertident); prelude_string_t *analyzerid; }; /** * idmef_impact_severity_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_impact_severity_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_impact_severity_t idmef_impact_severity_to_numeric(const char *name) { int i; const struct { idmef_impact_severity_t val; const char *name; } tbl[] = { { IDMEF_IMPACT_SEVERITY_INFO, "info" }, { IDMEF_IMPACT_SEVERITY_LOW, "low" }, { IDMEF_IMPACT_SEVERITY_MEDIUM, "medium" }, { IDMEF_IMPACT_SEVERITY_HIGH, "high" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for impact_severity", name); } /** * idmef_impact_severity_to_string: * @val: an enumeration value for #idmef_impact_severity_t. * * Return the IDMEF string equivalent of @val provided #idmef_impact_severity_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_impact_severity_to_string(idmef_impact_severity_t val) { const struct { idmef_impact_severity_t val; const char *name; } tbl[] = {{ 0, NULL }, { IDMEF_IMPACT_SEVERITY_INFO, "info" }, { IDMEF_IMPACT_SEVERITY_LOW, "low" }, { IDMEF_IMPACT_SEVERITY_MEDIUM, "medium" }, { IDMEF_IMPACT_SEVERITY_HIGH, "high" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } /** * idmef_impact_completion_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_impact_completion_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_impact_completion_t idmef_impact_completion_to_numeric(const char *name) { int i; const struct { idmef_impact_completion_t val; const char *name; } tbl[] = { { IDMEF_IMPACT_COMPLETION_FAILED, "failed" }, { IDMEF_IMPACT_COMPLETION_SUCCEEDED, "succeeded" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for impact_completion", name); } /** * idmef_impact_completion_to_string: * @val: an enumeration value for #idmef_impact_completion_t. * * Return the IDMEF string equivalent of @val provided #idmef_impact_completion_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_impact_completion_to_string(idmef_impact_completion_t val) { const struct { idmef_impact_completion_t val; const char *name; } tbl[] = {{ 0, NULL }, { IDMEF_IMPACT_COMPLETION_FAILED, "failed" }, { IDMEF_IMPACT_COMPLETION_SUCCEEDED, "succeeded" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } /** * idmef_impact_type_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_impact_type_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_impact_type_t idmef_impact_type_to_numeric(const char *name) { int i; const struct { idmef_impact_type_t val; const char *name; } tbl[] = { { IDMEF_IMPACT_TYPE_OTHER, "other" }, { IDMEF_IMPACT_TYPE_ADMIN, "admin" }, { IDMEF_IMPACT_TYPE_DOS, "dos" }, { IDMEF_IMPACT_TYPE_FILE, "file" }, { IDMEF_IMPACT_TYPE_RECON, "recon" }, { IDMEF_IMPACT_TYPE_USER, "user" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for impact_type", name); } /** * idmef_impact_type_to_string: * @val: an enumeration value for #idmef_impact_type_t. * * Return the IDMEF string equivalent of @val provided #idmef_impact_type_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_impact_type_to_string(idmef_impact_type_t val) { const struct { idmef_impact_type_t val; const char *name; } tbl[] = { { IDMEF_IMPACT_TYPE_OTHER, "other" }, { IDMEF_IMPACT_TYPE_ADMIN, "admin" }, { IDMEF_IMPACT_TYPE_DOS, "dos" }, { IDMEF_IMPACT_TYPE_FILE, "file" }, { IDMEF_IMPACT_TYPE_RECON, "recon" }, { IDMEF_IMPACT_TYPE_USER, "user" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_impact { REFCOUNT; OPTIONAL_INT(idmef_impact_severity_t, severity); OPTIONAL_INT(idmef_impact_completion_t, completion); idmef_impact_type_t type; prelude_string_t *description; }; /** * idmef_action_category_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_action_category_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_action_category_t idmef_action_category_to_numeric(const char *name) { int i; const struct { idmef_action_category_t val; const char *name; } tbl[] = { { IDMEF_ACTION_CATEGORY_OTHER, "other" }, { IDMEF_ACTION_CATEGORY_BLOCK_INSTALLED, "block-installed" }, { IDMEF_ACTION_CATEGORY_NOTIFICATION_SENT, "notification-sent" }, { IDMEF_ACTION_CATEGORY_TAKEN_OFFLINE, "taken-offline" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for action_category", name); } /** * idmef_action_category_to_string: * @val: an enumeration value for #idmef_action_category_t. * * Return the IDMEF string equivalent of @val provided #idmef_action_category_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_action_category_to_string(idmef_action_category_t val) { const struct { idmef_action_category_t val; const char *name; } tbl[] = { { IDMEF_ACTION_CATEGORY_OTHER, "other" }, { IDMEF_ACTION_CATEGORY_BLOCK_INSTALLED, "block-installed" }, { IDMEF_ACTION_CATEGORY_NOTIFICATION_SENT, "notification-sent" }, { IDMEF_ACTION_CATEGORY_TAKEN_OFFLINE, "taken-offline" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_action { IS_LISTED; REFCOUNT; idmef_action_category_t category; prelude_string_t *description; }; /** * idmef_confidence_rating_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_confidence_rating_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_confidence_rating_t idmef_confidence_rating_to_numeric(const char *name) { int i; const struct { idmef_confidence_rating_t val; const char *name; } tbl[] = { { IDMEF_CONFIDENCE_RATING_NUMERIC, "numeric" }, { IDMEF_CONFIDENCE_RATING_LOW, "low" }, { IDMEF_CONFIDENCE_RATING_MEDIUM, "medium" }, { IDMEF_CONFIDENCE_RATING_HIGH, "high" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for confidence_rating", name); } /** * idmef_confidence_rating_to_string: * @val: an enumeration value for #idmef_confidence_rating_t. * * Return the IDMEF string equivalent of @val provided #idmef_confidence_rating_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_confidence_rating_to_string(idmef_confidence_rating_t val) { const struct { idmef_confidence_rating_t val; const char *name; } tbl[] = { { IDMEF_CONFIDENCE_RATING_NUMERIC, "numeric" }, { IDMEF_CONFIDENCE_RATING_LOW, "low" }, { IDMEF_CONFIDENCE_RATING_MEDIUM, "medium" }, { IDMEF_CONFIDENCE_RATING_HIGH, "high" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_confidence { REFCOUNT; idmef_confidence_rating_t rating; float confidence; }; struct idmef_assessment { REFCOUNT; idmef_impact_t *impact; LISTED_OBJECT(action_list, idmef_action_t); idmef_confidence_t *confidence; }; struct idmef_tool_alert { REFCOUNT; REQUIRED(prelude_string_t, *name); prelude_string_t *command; LISTED_OBJECT(alertident_list, idmef_alertident_t); }; struct idmef_correlation_alert { REFCOUNT; REQUIRED(prelude_string_t, *name); LISTED_OBJECT(alertident_list, idmef_alertident_t); }; struct idmef_overflow_alert { REFCOUNT; REQUIRED(prelude_string_t, *program); OPTIONAL_INT(uint32_t, size); idmef_data_t *buffer; }; /** * idmef_alert_type_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_alert_type_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_alert_type_t idmef_alert_type_to_numeric(const char *name) { int i; const struct { idmef_alert_type_t val; const char *name; } tbl[] = { { IDMEF_ALERT_TYPE_DEFAULT, "default" }, { IDMEF_ALERT_TYPE_TOOL, "tool" }, { IDMEF_ALERT_TYPE_CORRELATION, "correlation" }, { IDMEF_ALERT_TYPE_OVERFLOW, "overflow" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for alert_type", name); } /** * idmef_alert_type_to_string: * @val: an enumeration value for #idmef_alert_type_t. * * Return the IDMEF string equivalent of @val provided #idmef_alert_type_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_alert_type_to_string(idmef_alert_type_t val) { const struct { idmef_alert_type_t val; const char *name; } tbl[] = { { IDMEF_ALERT_TYPE_DEFAULT, "default" }, { IDMEF_ALERT_TYPE_TOOL, "tool" }, { IDMEF_ALERT_TYPE_CORRELATION, "correlation" }, { IDMEF_ALERT_TYPE_OVERFLOW, "overflow" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_alert { REFCOUNT; prelude_string_t *messageid; LISTED_OBJECT(analyzer_list, idmef_analyzer_t); REQUIRED(idmef_time_t, *create_time); REQUIRED(idmef_classification_t, *classification); idmef_time_t *detect_time; idmef_time_t *analyzer_time; LISTED_OBJECT(source_list, idmef_source_t); LISTED_OBJECT(target_list, idmef_target_t); idmef_assessment_t *assessment; LISTED_OBJECT(additional_data_list, idmef_additional_data_t); UNION(idmef_alert_type_t, type) { UNION_MEMBER(IDMEF_ALERT_TYPE_TOOL, idmef_tool_alert_t, *tool_alert); UNION_MEMBER(IDMEF_ALERT_TYPE_CORRELATION, idmef_correlation_alert_t, *correlation_alert); UNION_MEMBER(IDMEF_ALERT_TYPE_OVERFLOW, idmef_overflow_alert_t, *overflow_alert); } detail; }; struct idmef_heartbeat { REFCOUNT; prelude_string_t *messageid; LISTED_OBJECT(analyzer_list, idmef_analyzer_t); REQUIRED(idmef_time_t, *create_time); idmef_time_t *analyzer_time; OPTIONAL_INT(uint32_t, heartbeat_interval); LISTED_OBJECT(additional_data_list, idmef_additional_data_t); }; /** * idmef_message_type_to_numeric: * @name: pointer to an IDMEF string representation of a #idmef_message_type_t value. * * Returns: the numeric equivalent of @name, or -1 if @name is not valid. */ idmef_message_type_t idmef_message_type_to_numeric(const char *name) { int i; const struct { idmef_message_type_t val; const char *name; } tbl[] = { { IDMEF_MESSAGE_TYPE_ALERT, "alert" }, { IDMEF_MESSAGE_TYPE_HEARTBEAT, "heartbeat" }, }; prelude_return_val_if_fail(name, prelude_error(PRELUDE_ERROR_ASSERTION)); for ( i = 0; i < sizeof(tbl) / sizeof(*tbl); i++ ) { if ( strcasecmp(name, tbl[i].name) == 0 ) return tbl[i].val; } return prelude_error_verbose(PRELUDE_ERROR_IDMEF_UNKNOWN_ENUM_STRING, "Unknown enumeration value '%s' for message_type", name); } /** * idmef_message_type_to_string: * @val: an enumeration value for #idmef_message_type_t. * * Return the IDMEF string equivalent of @val provided #idmef_message_type_t value. * * Returns: a pointer to the string describing @val, or NULL if @val is invalid. */ const char *idmef_message_type_to_string(idmef_message_type_t val) { const struct { idmef_message_type_t val; const char *name; } tbl[] = {{ 0, NULL }, { IDMEF_MESSAGE_TYPE_ALERT, "alert" }, { IDMEF_MESSAGE_TYPE_HEARTBEAT, "heartbeat" }, }; if ( val < 0 || val >= (sizeof(tbl) / sizeof(*tbl)) ) return NULL; return tbl[val].name; } struct idmef_message { REFCOUNT; REQUIRED(prelude_string_t, *version); UNION(idmef_message_type_t, type) { UNION_MEMBER(IDMEF_MESSAGE_TYPE_ALERT, idmef_alert_t, *alert); UNION_MEMBER(IDMEF_MESSAGE_TYPE_HEARTBEAT, idmef_heartbeat_t, *heartbeat); } message; HIDE(prelude_msg_t *, pmsg); }; /** * idmef_additional_data_new: * @ret: Pointer where to store the created #idmef_additional_data_t object. * * Create a new #idmef_additional_data_t object. * * Returns: 0 on success, a negative value if an error occured. */ int idmef_additional_data_new(idmef_additional_data_t **ret) { *ret = calloc(1, sizeof(**ret)); if ( ! *ret ) return prelude_error_from_errno(errno); prelude_list_init(&(*ret)->list); (*ret)->refcount = 1; { int retval = idmef_data_new(&(*ret)->data); if ( retval < 0 ) { idmef_additional_data_destroy(*ret); *ret = NULL; return retval; } } return 0; } /** * idmef_additional_data_ref: * @additional_data: pointer to a #idmef_additional_data_t object. * * Increase @additional_data reference count, so that it can be referenced * multiple time. * * Returns: a pointer to @additional_data. */ idmef_additional_data_t *idmef_additional_data_ref(idmef_additional_data_t *additional_data) { prelude_return_val_if_fail(additional_data, NULL); additional_data->refcount++; return additional_data; } int _idmef_additional_data_get_child(void *p, idmef_class_child_id_t child, void **childptr) { idmef_additional_data_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); *childptr = NULL; switch ( child ) { case 0: return idmef_value_new_enum_from_numeric((idmef_value_t **) childptr, IDMEF_CLASS_ID_ADDITIONAL_DATA_TYPE, ptr->type); case 1: return get_value_from_string((idmef_value_t **) childptr, ptr->meaning, TRUE); case 2: return get_value_from_data((idmef_value_t **) childptr, ptr->data, TRUE); default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } int _idmef_additional_data_new_child(void *p, idmef_class_child_id_t child, int n, void **ret) { idmef_additional_data_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); switch ( child ) { case 0: return idmef_additional_data_new_type(ptr, (idmef_additional_data_type_t **) ret); case 1: return idmef_additional_data_new_meaning(ptr, (prelude_string_t **) ret); case 2: return idmef_additional_data_new_data(ptr, (idmef_data_t **) ret); default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } int _idmef_additional_data_destroy_child(void *p, idmef_class_child_id_t child, int n) { idmef_additional_data_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); switch ( child ) { case 0: ptr->type = 0; return 0; case 1: if ( ptr->meaning ) { prelude_string_destroy(ptr->meaning); ptr->meaning = NULL; } return 0; case 2: if ( ptr->data ) { idmef_data_destroy(ptr->data); ptr->data = NULL; } return 0; default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } static void idmef_additional_data_destroy_internal(idmef_additional_data_t *ptr) { prelude_return_if_fail(ptr); if ( ! prelude_list_is_empty(&ptr->list) ) prelude_list_del_init(&ptr->list); if ( ptr->meaning ) { prelude_string_destroy(ptr->meaning); ptr->meaning = NULL; } if ( ptr->data ) { idmef_data_destroy(ptr->data); ptr->data = NULL; } /* free() should be done by the caller */ } /** * idmef_additional_data_destroy: * @ptr: pointer to a #idmef_additional_data_t object. * * Destroy @ptr and all of it's children. * The objects are only destroyed if their reference count reach zero. */ void idmef_additional_data_destroy(idmef_additional_data_t *ptr) { prelude_return_if_fail(ptr); if ( --ptr->refcount ) return; idmef_additional_data_destroy_internal(ptr); free(ptr); } /** * idmef_additional_data_get_type: * @ptr: pointer to a #idmef_additional_data_t object. * * Get type children of the #idmef_additional_data_t object. * * Returns: a pointer to a idmef_additional_data_type_t object, or NULL if the children object is not set. */ idmef_additional_data_type_t idmef_additional_data_get_type(idmef_additional_data_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->type; } /** * idmef_additional_data_set_type: * @ptr: pointer to a #idmef_additional_data_t object. * @type: pointer to a #idmef_additional_data_type_t object. * * Set @type object as a children of @ptr. * if @ptr already contain an @type object, then it is destroyed, * and updated to point to the provided @type object. */ void idmef_additional_data_set_type(idmef_additional_data_t *ptr, idmef_additional_data_type_t type) { prelude_return_if_fail(ptr); ptr->type = type; } /** * idmef_additional_data_new_type: * @ptr: pointer to a #idmef_additional_data_t object. * @ret: pointer to an address where to store the created #idmef_additional_data_type_t object. * * Create a new type object, children of #idmef_additional_data_t. * If @ptr already contain a #idmef_additional_data_type_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_additional_data_new_type(idmef_additional_data_t *ptr, idmef_additional_data_type_t **ret) { prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); *ret = &ptr->type; return 0; } /** * *idmef_additional_data_get_meaning: * @ptr: pointer to a #idmef_additional_data_t object. * * Get meaning children of the #idmef_additional_data_t object. * * Returns: a pointer to a prelude_string_t object, or NULL if the children object is not set. */ prelude_string_t *idmef_additional_data_get_meaning(idmef_additional_data_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->meaning; } /** * idmef_additional_data_set_meaning: * @ptr: pointer to a #idmef_additional_data_t object. * @meaning: pointer to a #prelude_string_t object. * * Set @meaning object as a children of @ptr. * if @ptr already contain an @meaning object, then it is destroyed, * and updated to point to the provided @meaning object. */ void idmef_additional_data_set_meaning(idmef_additional_data_t *ptr, prelude_string_t *meaning) { prelude_return_if_fail(ptr); if ( ptr->meaning ) prelude_string_destroy(ptr->meaning); ptr->meaning = meaning; } /** * idmef_additional_data_new_meaning: * @ptr: pointer to a #idmef_additional_data_t object. * @ret: pointer to an address where to store the created #prelude_string_t object. * * Create a new meaning object, children of #idmef_additional_data_t. * If @ptr already contain a #prelude_string_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_additional_data_new_meaning(idmef_additional_data_t *ptr, prelude_string_t **ret) { int retval; prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); if ( ! ptr->meaning ) { retval = prelude_string_new(&ptr->meaning); if ( retval < 0 ) return retval; } *ret = ptr->meaning; return 0; } /** * *idmef_additional_data_get_data: * @ptr: pointer to a #idmef_additional_data_t object. * * Get data children of the #idmef_additional_data_t object. * * Returns: a pointer to a idmef_data_t object, or NULL if the children object is not set. */ idmef_data_t *idmef_additional_data_get_data(idmef_additional_data_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->data; } /** * idmef_additional_data_set_data: * @ptr: pointer to a #idmef_additional_data_t object. * @data: pointer to a #idmef_data_t object. * * Set @data object as a children of @ptr. * if @ptr already contain an @data object, then it is destroyed, * and updated to point to the provided @data object. */ void idmef_additional_data_set_data(idmef_additional_data_t *ptr, idmef_data_t *data) { prelude_return_if_fail(ptr); if ( ptr->data ) idmef_data_destroy(ptr->data); ptr->data = data; } /** * idmef_additional_data_new_data: * @ptr: pointer to a #idmef_additional_data_t object. * @ret: pointer to an address where to store the created #idmef_data_t object. * * Create a new data object, children of #idmef_additional_data_t. * If @ptr already contain a #idmef_data_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_additional_data_new_data(idmef_additional_data_t *ptr, idmef_data_t **ret) { int retval; prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); if ( ! ptr->data ) { retval = idmef_data_new(&ptr->data); if ( retval < 0 ) return retval; } *ret = ptr->data; return 0; } /** * idmef_additional_data_copy: * @src: Source of the copy. * @dst: Where to copy the object. * * Copy a new #idmef_additional_data_t object from @src to @dst. * * Returns: 0 on success, a negative value if an error occured. */ int idmef_additional_data_copy(const idmef_additional_data_t *src, idmef_additional_data_t *dst) { int ret; prelude_return_val_if_fail(src, prelude_error(PRELUDE_ERROR_ASSERTION)); prelude_return_val_if_fail(dst, prelude_error(PRELUDE_ERROR_ASSERTION)); ret = 0; dst->type = src->type; if ( src->meaning ) { ret = prelude_string_clone(src->meaning, &dst->meaning); if ( ret < 0 ) return ret; } ret = idmef_data_copy(src->data, dst->data); if ( ret < 0 ) return ret; return 0; } /** * idmef_additional_data_clone: * @src: Object to be cloned. * @dst: Address where to store the pointer to the cloned object. * * Create a copy of @src, and store it in @dst. * * Returns: 0 on success, a negative value if an error occured. */ int idmef_additional_data_clone(idmef_additional_data_t *src, idmef_additional_data_t **dst) { int ret; prelude_return_val_if_fail(src, prelude_error(PRELUDE_ERROR_ASSERTION)); ret = idmef_additional_data_new(dst); if ( ret < 0 ) return ret; return idmef_additional_data_copy(src, *dst); } /** * idmef_additional_data_compare: * @obj1: Object to compare with @obj2. * @obj2: Object to compare with @obj1. * * Compare @obj1 with @obj2. * * Returns: 0 on match, a negative value on comparison failure. */ int idmef_additional_data_compare(const idmef_additional_data_t *obj1, const idmef_additional_data_t *obj2) { int ret = 0; if ( obj1 == NULL && obj2 == NULL ) return 0; else if ( obj1 == NULL || obj2 == NULL ) return -1; if ( obj1->type != obj2->type ) return -1; ret = prelude_string_compare(obj1->meaning, obj2->meaning); if ( ret != 0 ) return ret; ret = idmef_data_compare(obj1->data, obj2->data); if ( ret != 0 ) return ret; return ret; } /** * idmef_reference_new: * @ret: Pointer where to store the created #idmef_reference_t object. * * Create a new #idmef_reference_t object. * * Returns: 0 on success, a negative value if an error occured. */ int idmef_reference_new(idmef_reference_t **ret) { *ret = calloc(1, sizeof(**ret)); if ( ! *ret ) return prelude_error_from_errno(errno); prelude_list_init(&(*ret)->list); (*ret)->refcount = 1; { int retval = prelude_string_new(&(*ret)->name); if ( retval < 0 ) { idmef_reference_destroy(*ret); *ret = NULL; return retval; } } { int retval = prelude_string_new(&(*ret)->url); if ( retval < 0 ) { idmef_reference_destroy(*ret); *ret = NULL; return retval; } } return 0; } /** * idmef_reference_ref: * @reference: pointer to a #idmef_reference_t object. * * Increase @reference reference count, so that it can be referenced * multiple time. * * Returns: a pointer to @reference. */ idmef_reference_t *idmef_reference_ref(idmef_reference_t *reference) { prelude_return_val_if_fail(reference, NULL); reference->refcount++; return reference; } int _idmef_reference_get_child(void *p, idmef_class_child_id_t child, void **childptr) { idmef_reference_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); *childptr = NULL; switch ( child ) { case 0: return idmef_value_new_enum_from_numeric((idmef_value_t **) childptr, IDMEF_CLASS_ID_REFERENCE_ORIGIN, ptr->origin); case 1: return get_value_from_string((idmef_value_t **) childptr, ptr->name, TRUE); case 2: return get_value_from_string((idmef_value_t **) childptr, ptr->url, TRUE); case 3: return get_value_from_string((idmef_value_t **) childptr, ptr->meaning, TRUE); default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } int _idmef_reference_new_child(void *p, idmef_class_child_id_t child, int n, void **ret) { idmef_reference_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); switch ( child ) { case 0: return idmef_reference_new_origin(ptr, (idmef_reference_origin_t **) ret); case 1: return idmef_reference_new_name(ptr, (prelude_string_t **) ret); case 2: return idmef_reference_new_url(ptr, (prelude_string_t **) ret); case 3: return idmef_reference_new_meaning(ptr, (prelude_string_t **) ret); default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } int _idmef_reference_destroy_child(void *p, idmef_class_child_id_t child, int n) { idmef_reference_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); switch ( child ) { case 0: ptr->origin = 0; return 0; case 1: if ( ptr->name ) { prelude_string_destroy(ptr->name); ptr->name = NULL; } return 0; case 2: if ( ptr->url ) { prelude_string_destroy(ptr->url); ptr->url = NULL; } return 0; case 3: if ( ptr->meaning ) { prelude_string_destroy(ptr->meaning); ptr->meaning = NULL; } return 0; default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } static void idmef_reference_destroy_internal(idmef_reference_t *ptr) { prelude_return_if_fail(ptr); if ( ! prelude_list_is_empty(&ptr->list) ) prelude_list_del_init(&ptr->list); if ( ptr->name ) { prelude_string_destroy(ptr->name); ptr->name = NULL; } if ( ptr->url ) { prelude_string_destroy(ptr->url); ptr->url = NULL; } if ( ptr->meaning ) { prelude_string_destroy(ptr->meaning); ptr->meaning = NULL; } /* free() should be done by the caller */ } /** * idmef_reference_destroy: * @ptr: pointer to a #idmef_reference_t object. * * Destroy @ptr and all of it's children. * The objects are only destroyed if their reference count reach zero. */ void idmef_reference_destroy(idmef_reference_t *ptr) { prelude_return_if_fail(ptr); if ( --ptr->refcount ) return; idmef_reference_destroy_internal(ptr); free(ptr); } /** * idmef_reference_get_origin: * @ptr: pointer to a #idmef_reference_t object. * * Get origin children of the #idmef_reference_t object. * * Returns: a pointer to a idmef_reference_origin_t object, or NULL if the children object is not set. */ idmef_reference_origin_t idmef_reference_get_origin(idmef_reference_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->origin; } /** * idmef_reference_set_origin: * @ptr: pointer to a #idmef_reference_t object. * @origin: pointer to a #idmef_reference_origin_t object. * * Set @origin object as a children of @ptr. * if @ptr already contain an @origin object, then it is destroyed, * and updated to point to the provided @origin object. */ void idmef_reference_set_origin(idmef_reference_t *ptr, idmef_reference_origin_t origin) { prelude_return_if_fail(ptr); ptr->origin = origin; } /** * idmef_reference_new_origin: * @ptr: pointer to a #idmef_reference_t object. * @ret: pointer to an address where to store the created #idmef_reference_origin_t object. * * Create a new origin object, children of #idmef_reference_t. * If @ptr already contain a #idmef_reference_origin_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_reference_new_origin(idmef_reference_t *ptr, idmef_reference_origin_t **ret) { prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); *ret = &ptr->origin; return 0; } /** * *idmef_reference_get_name: * @ptr: pointer to a #idmef_reference_t object. * * Get name children of the #idmef_reference_t object. * * Returns: a pointer to a prelude_string_t object, or NULL if the children object is not set. */ prelude_string_t *idmef_reference_get_name(idmef_reference_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->name; } /** * idmef_reference_set_name: * @ptr: pointer to a #idmef_reference_t object. * @name: pointer to a #prelude_string_t object. * * Set @name object as a children of @ptr. * if @ptr already contain an @name object, then it is destroyed, * and updated to point to the provided @name object. */ void idmef_reference_set_name(idmef_reference_t *ptr, prelude_string_t *name) { prelude_return_if_fail(ptr); if ( ptr->name ) prelude_string_destroy(ptr->name); ptr->name = name; } /** * idmef_reference_new_name: * @ptr: pointer to a #idmef_reference_t object. * @ret: pointer to an address where to store the created #prelude_string_t object. * * Create a new name object, children of #idmef_reference_t. * If @ptr already contain a #prelude_string_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_reference_new_name(idmef_reference_t *ptr, prelude_string_t **ret) { int retval; prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); if ( ! ptr->name ) { retval = prelude_string_new(&ptr->name); if ( retval < 0 ) return retval; } *ret = ptr->name; return 0; } /** * *idmef_reference_get_url: * @ptr: pointer to a #idmef_reference_t object. * * Get url children of the #idmef_reference_t object. * * Returns: a pointer to a prelude_string_t object, or NULL if the children object is not set. */ prelude_string_t *idmef_reference_get_url(idmef_reference_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->url; } /** * idmef_reference_set_url: * @ptr: pointer to a #idmef_reference_t object. * @url: pointer to a #prelude_string_t object. * * Set @url object as a children of @ptr. * if @ptr already contain an @url object, then it is destroyed, * and updated to point to the provided @url object. */ void idmef_reference_set_url(idmef_reference_t *ptr, prelude_string_t *url) { prelude_return_if_fail(ptr); if ( ptr->url ) prelude_string_destroy(ptr->url); ptr->url = url; } /** * idmef_reference_new_url: * @ptr: pointer to a #idmef_reference_t object. * @ret: pointer to an address where to store the created #prelude_string_t object. * * Create a new url object, children of #idmef_reference_t. * If @ptr already contain a #prelude_string_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_reference_new_url(idmef_reference_t *ptr, prelude_string_t **ret) { int retval; prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); if ( ! ptr->url ) { retval = prelude_string_new(&ptr->url); if ( retval < 0 ) return retval; } *ret = ptr->url; return 0; } /** * *idmef_reference_get_meaning: * @ptr: pointer to a #idmef_reference_t object. * * Get meaning children of the #idmef_reference_t object. * * Returns: a pointer to a prelude_string_t object, or NULL if the children object is not set. */ prelude_string_t *idmef_reference_get_meaning(idmef_reference_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->meaning; } /** * idmef_reference_set_meaning: * @ptr: pointer to a #idmef_reference_t object. * @meaning: pointer to a #prelude_string_t object. * * Set @meaning object as a children of @ptr. * if @ptr already contain an @meaning object, then it is destroyed, * and updated to point to the provided @meaning object. */ void idmef_reference_set_meaning(idmef_reference_t *ptr, prelude_string_t *meaning) { prelude_return_if_fail(ptr); if ( ptr->meaning ) prelude_string_destroy(ptr->meaning); ptr->meaning = meaning; } /** * idmef_reference_new_meaning: * @ptr: pointer to a #idmef_reference_t object. * @ret: pointer to an address where to store the created #prelude_string_t object. * * Create a new meaning object, children of #idmef_reference_t. * If @ptr already contain a #prelude_string_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_reference_new_meaning(idmef_reference_t *ptr, prelude_string_t **ret) { int retval; prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); if ( ! ptr->meaning ) { retval = prelude_string_new(&ptr->meaning); if ( retval < 0 ) return retval; } *ret = ptr->meaning; return 0; } /** * idmef_reference_copy: * @src: Source of the copy. * @dst: Where to copy the object. * * Copy a new #idmef_reference_t object from @src to @dst. * * Returns: 0 on success, a negative value if an error occured. */ int idmef_reference_copy(const idmef_reference_t *src, idmef_reference_t *dst) { int ret; prelude_return_val_if_fail(src, prelude_error(PRELUDE_ERROR_ASSERTION)); prelude_return_val_if_fail(dst, prelude_error(PRELUDE_ERROR_ASSERTION)); ret = 0; dst->origin = src->origin; ret = prelude_string_copy(src->name, dst->name); if ( ret < 0 ) return ret; ret = prelude_string_copy(src->url, dst->url); if ( ret < 0 ) return ret; if ( src->meaning ) { ret = prelude_string_clone(src->meaning, &dst->meaning); if ( ret < 0 ) return ret; } return 0; } /** * idmef_reference_clone: * @src: Object to be cloned. * @dst: Address where to store the pointer to the cloned object. * * Create a copy of @src, and store it in @dst. * * Returns: 0 on success, a negative value if an error occured. */ int idmef_reference_clone(idmef_reference_t *src, idmef_reference_t **dst) { int ret; prelude_return_val_if_fail(src, prelude_error(PRELUDE_ERROR_ASSERTION)); ret = idmef_reference_new(dst); if ( ret < 0 ) return ret; return idmef_reference_copy(src, *dst); } /** * idmef_reference_compare: * @obj1: Object to compare with @obj2. * @obj2: Object to compare with @obj1. * * Compare @obj1 with @obj2. * * Returns: 0 on match, a negative value on comparison failure. */ int idmef_reference_compare(const idmef_reference_t *obj1, const idmef_reference_t *obj2) { int ret = 0; if ( obj1 == NULL && obj2 == NULL ) return 0; else if ( obj1 == NULL || obj2 == NULL ) return -1; if ( obj1->origin != obj2->origin ) return -1; ret = prelude_string_compare(obj1->name, obj2->name); if ( ret != 0 ) return ret; ret = prelude_string_compare(obj1->url, obj2->url); if ( ret != 0 ) return ret; ret = prelude_string_compare(obj1->meaning, obj2->meaning); if ( ret != 0 ) return ret; return ret; } /** * idmef_classification_new: * @ret: Pointer where to store the created #idmef_classification_t object. * * Create a new #idmef_classification_t object. * * Returns: 0 on success, a negative value if an error occured. */ int idmef_classification_new(idmef_classification_t **ret) { *ret = calloc(1, sizeof(**ret)); if ( ! *ret ) return prelude_error_from_errno(errno); (*ret)->refcount = 1; prelude_list_init(&(*ret)->reference_list); { int retval = prelude_string_new(&(*ret)->text); if ( retval < 0 ) { idmef_classification_destroy(*ret); *ret = NULL; return retval; } } return 0; } /** * idmef_classification_ref: * @classification: pointer to a #idmef_classification_t object. * * Increase @classification reference count, so that it can be referenced * multiple time. * * Returns: a pointer to @classification. */ idmef_classification_t *idmef_classification_ref(idmef_classification_t *classification) { prelude_return_val_if_fail(classification, NULL); classification->refcount++; return classification; } int _idmef_classification_get_child(void *p, idmef_class_child_id_t child, void **childptr) { idmef_classification_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); *childptr = NULL; switch ( child ) { case 0: return get_value_from_string((idmef_value_t **) childptr, ptr->ident, TRUE); case 1: return get_value_from_string((idmef_value_t **) childptr, ptr->text, TRUE); case 2: *childptr = &ptr->reference_list; return 0; default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } int _idmef_classification_new_child(void *p, idmef_class_child_id_t child, int n, void **ret) { idmef_classification_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); switch ( child ) { case 0: return idmef_classification_new_ident(ptr, (prelude_string_t **) ret); case 1: return idmef_classification_new_text(ptr, (prelude_string_t **) ret); case 2: { int i = 0; prelude_list_t *tmp; if ( n == IDMEF_LIST_APPEND || n == IDMEF_LIST_PREPEND ) return idmef_classification_new_reference(ptr, (idmef_reference_t **) ret, n); if ( n >= 0 ) { prelude_list_for_each(&ptr->reference_list, tmp) { if ( i++ == n ) { *ret = prelude_list_entry(tmp, idmef_reference_t, list); return 0; } } if ( i != n ) return prelude_error(PRELUDE_ERROR_IDMEF_TREE_INDEX_UNDEFINED); } else { int pos = (-n) - 1; /* With negative value, -1 is the base, translate to 0 */ prelude_list_for_each_reversed(&ptr->reference_list, tmp) { if ( i++ == pos ) { *ret = prelude_list_entry(tmp, idmef_reference_t, list); return 0; } } if ( i != pos ) return prelude_error(PRELUDE_ERROR_IDMEF_TREE_INDEX_UNDEFINED); } return idmef_classification_new_reference(ptr, (idmef_reference_t **) ret, n); } default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } int _idmef_classification_destroy_child(void *p, idmef_class_child_id_t child, int n) { idmef_classification_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); switch ( child ) { case 0: if ( ptr->ident ) { prelude_string_destroy(ptr->ident); ptr->ident = NULL; } return 0; case 1: if ( ptr->text ) { prelude_string_destroy(ptr->text); ptr->text = NULL; } return 0; case 2: { int i = 0; prelude_list_t *tmp; if ( n >= 0 ) { prelude_list_for_each(&ptr->reference_list, tmp) { if ( i++ == n ) { void *b = prelude_list_entry(tmp, idmef_reference_t, list); idmef_reference_destroy(b); return 0; } } if ( i != n ) return prelude_error(PRELUDE_ERROR_IDMEF_TREE_INDEX_UNDEFINED); } else { int pos = (-n) - 1; /* With negative value, -1 is the base, translate to 0 */ prelude_list_for_each_reversed(&ptr->reference_list, tmp) { if ( i++ == pos ) { void *b = prelude_list_entry(tmp, idmef_reference_t, list); idmef_reference_destroy(b); return 0; } } if ( i != pos ) return prelude_error(PRELUDE_ERROR_IDMEF_TREE_INDEX_UNDEFINED); } } default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } static void idmef_classification_destroy_internal(idmef_classification_t *ptr) { prelude_return_if_fail(ptr); if ( ptr->ident ) { prelude_string_destroy(ptr->ident); ptr->ident = NULL; } if ( ptr->text ) { prelude_string_destroy(ptr->text); ptr->text = NULL; } { prelude_list_t *n, *tmp; idmef_reference_t *entry; prelude_list_for_each_safe(&ptr->reference_list, tmp, n) { entry = prelude_list_entry(tmp, idmef_reference_t, list); prelude_list_del_init(&entry->list); idmef_reference_destroy(entry); } } /* free() should be done by the caller */ } /** * idmef_classification_destroy: * @ptr: pointer to a #idmef_classification_t object. * * Destroy @ptr and all of it's children. * The objects are only destroyed if their reference count reach zero. */ void idmef_classification_destroy(idmef_classification_t *ptr) { prelude_return_if_fail(ptr); if ( --ptr->refcount ) return; idmef_classification_destroy_internal(ptr); free(ptr); } /** * *idmef_classification_get_ident: * @ptr: pointer to a #idmef_classification_t object. * * Get ident children of the #idmef_classification_t object. * * Returns: a pointer to a prelude_string_t object, or NULL if the children object is not set. */ prelude_string_t *idmef_classification_get_ident(idmef_classification_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->ident; } /** * idmef_classification_set_ident: * @ptr: pointer to a #idmef_classification_t object. * @ident: pointer to a #prelude_string_t object. * * Set @ident object as a children of @ptr. * if @ptr already contain an @ident object, then it is destroyed, * and updated to point to the provided @ident object. */ void idmef_classification_set_ident(idmef_classification_t *ptr, prelude_string_t *ident) { prelude_return_if_fail(ptr); if ( ptr->ident ) prelude_string_destroy(ptr->ident); ptr->ident = ident; } /** * idmef_classification_new_ident: * @ptr: pointer to a #idmef_classification_t object. * @ret: pointer to an address where to store the created #prelude_string_t object. * * Create a new ident object, children of #idmef_classification_t. * If @ptr already contain a #prelude_string_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_classification_new_ident(idmef_classification_t *ptr, prelude_string_t **ret) { int retval; prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); if ( ! ptr->ident ) { retval = prelude_string_new(&ptr->ident); if ( retval < 0 ) return retval; } *ret = ptr->ident; return 0; } /** * *idmef_classification_get_text: * @ptr: pointer to a #idmef_classification_t object. * * Get text children of the #idmef_classification_t object. * * Returns: a pointer to a prelude_string_t object, or NULL if the children object is not set. */ prelude_string_t *idmef_classification_get_text(idmef_classification_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->text; } /** * idmef_classification_set_text: * @ptr: pointer to a #idmef_classification_t object. * @text: pointer to a #prelude_string_t object. * * Set @text object as a children of @ptr. * if @ptr already contain an @text object, then it is destroyed, * and updated to point to the provided @text object. */ void idmef_classification_set_text(idmef_classification_t *ptr, prelude_string_t *text) { prelude_return_if_fail(ptr); if ( ptr->text ) prelude_string_destroy(ptr->text); ptr->text = text; } /** * idmef_classification_new_text: * @ptr: pointer to a #idmef_classification_t object. * @ret: pointer to an address where to store the created #prelude_string_t object. * * Create a new text object, children of #idmef_classification_t. * If @ptr already contain a #prelude_string_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_classification_new_text(idmef_classification_t *ptr, prelude_string_t **ret) { int retval; prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); if ( ! ptr->text ) { retval = prelude_string_new(&ptr->text); if ( retval < 0 ) return retval; } *ret = ptr->text; return 0; } /** * idmef_classification_get_next_reference: * @classification: pointer to a #idmef_classification_t object. * @reference_cur: pointer to a #idmef_reference_t object. * * Get the next #idmef_reference_t object listed in @ptr. * When iterating over the idmef_reference_t object listed in @ptr, * @object should be set to the latest returned #idmef_reference_t object. * * Returns: the next #idmef_reference_t in the list. */ idmef_reference_t *idmef_classification_get_next_reference(idmef_classification_t *classification, idmef_reference_t *reference_cur) { prelude_list_t *tmp = (reference_cur) ? &reference_cur->list : NULL; prelude_return_val_if_fail(classification, NULL); prelude_list_for_each_continue(&classification->reference_list, tmp) return prelude_list_entry(tmp, idmef_reference_t, list); return NULL; } /** * idmef_classification_set_reference: * @ptr: pointer to a #idmef_classification_t object. * @object: pointer to a #idmef_reference_t object. * @pos: Position in the list. * * Add @object to position @pos of @ptr list of #idmef_reference_t object. * * If @pos is #IDMEF_LIST_APPEND, @object will be inserted at the tail of the list. * If @pos is #IDMEF_LIST_PREPEND, @object will be inserted at the head of the list. */ void idmef_classification_set_reference(idmef_classification_t *ptr, idmef_reference_t *object, int pos) { prelude_return_if_fail(ptr); prelude_return_if_fail(object); if ( ! prelude_list_is_empty(&object->list) ) prelude_list_del_init(&object->list); list_insert(&ptr->reference_list, &object->list, pos); } /** * idmef_classification_new_reference: * @ptr: pointer to a #idmef_classification_t object. * @ret: pointer to an address where to store the created #idmef_reference_t object. * @pos: position in the list. * * Create a new #idmef_reference_t children of @ptr, and add it to position @pos of * @ptr list of #idmef_reference_t object. The created #idmef_reference_t object is * stored in @ret. * * If @pos is #IDMEF_LIST_APPEND, @object will be inserted at the tail of the list. * If @pos is #IDMEF_LIST_PREPEND, @object will be inserted at the head of the list. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_classification_new_reference(idmef_classification_t *ptr, idmef_reference_t **ret, int pos) { int retval; prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); retval = idmef_reference_new(ret); if ( retval < 0 ) return retval; list_insert(&ptr->reference_list, &(*ret)->list, pos); return 0; } /** * idmef_classification_copy: * @src: Source of the copy. * @dst: Where to copy the object. * * Copy a new #idmef_classification_t object from @src to @dst. * * Returns: 0 on success, a negative value if an error occured. */ int idmef_classification_copy(const idmef_classification_t *src, idmef_classification_t *dst) { int ret; prelude_return_val_if_fail(src, prelude_error(PRELUDE_ERROR_ASSERTION)); prelude_return_val_if_fail(dst, prelude_error(PRELUDE_ERROR_ASSERTION)); ret = 0; if ( src->ident ) { ret = prelude_string_clone(src->ident, &dst->ident); if ( ret < 0 ) return ret; } ret = prelude_string_copy(src->text, dst->text); if ( ret < 0 ) return ret; { prelude_list_t *n, *tmp; idmef_reference_t *entry, *new; prelude_list_for_each_safe(&src->reference_list, tmp, n) { entry = prelude_list_entry(tmp, idmef_reference_t, list); idmef_reference_clone(entry, &new); prelude_list_add_tail(&dst->reference_list, &new->list); } } return 0; } /** * idmef_classification_clone: * @src: Object to be cloned. * @dst: Address where to store the pointer to the cloned object. * * Create a copy of @src, and store it in @dst. * * Returns: 0 on success, a negative value if an error occured. */ int idmef_classification_clone(idmef_classification_t *src, idmef_classification_t **dst) { int ret; prelude_return_val_if_fail(src, prelude_error(PRELUDE_ERROR_ASSERTION)); ret = idmef_classification_new(dst); if ( ret < 0 ) return ret; return idmef_classification_copy(src, *dst); } /** * idmef_classification_compare: * @obj1: Object to compare with @obj2. * @obj2: Object to compare with @obj1. * * Compare @obj1 with @obj2. * * Returns: 0 on match, a negative value on comparison failure. */ int idmef_classification_compare(const idmef_classification_t *obj1, const idmef_classification_t *obj2) { int ret = 0; if ( obj1 == NULL && obj2 == NULL ) return 0; else if ( obj1 == NULL || obj2 == NULL ) return -1; ret = prelude_string_compare(obj1->ident, obj2->ident); if ( ret != 0 ) return ret; ret = prelude_string_compare(obj1->text, obj2->text); if ( ret != 0 ) return ret; { prelude_list_t *tmp1, *tmp2; idmef_reference_t *entry1, *entry2; tmp1 = tmp2 = NULL; do { entry1 = entry2 = NULL; prelude_list_for_each_continue(&obj1->reference_list, tmp1) { entry1 = prelude_list_entry(tmp1, idmef_reference_t, list); break; } prelude_list_for_each_continue(&obj2->reference_list, tmp2) { entry2 = prelude_list_entry(tmp2, idmef_reference_t, list); break; } ret = idmef_reference_compare(entry1, entry2); if ( ret != 0 ) return ret; } while ( entry1 && entry2 ); } return ret; } /** * idmef_user_id_new: * @ret: Pointer where to store the created #idmef_user_id_t object. * * Create a new #idmef_user_id_t object. * * Returns: 0 on success, a negative value if an error occured. */ int idmef_user_id_new(idmef_user_id_t **ret) { *ret = calloc(1, sizeof(**ret)); if ( ! *ret ) return prelude_error_from_errno(errno); prelude_list_init(&(*ret)->list); (*ret)->refcount = 1; return 0; } /** * idmef_user_id_ref: * @user_id: pointer to a #idmef_user_id_t object. * * Increase @user_id reference count, so that it can be referenced * multiple time. * * Returns: a pointer to @user_id. */ idmef_user_id_t *idmef_user_id_ref(idmef_user_id_t *user_id) { prelude_return_val_if_fail(user_id, NULL); user_id->refcount++; return user_id; } int _idmef_user_id_get_child(void *p, idmef_class_child_id_t child, void **childptr) { idmef_user_id_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); *childptr = NULL; switch ( child ) { case 0: return get_value_from_string((idmef_value_t **) childptr, ptr->ident, TRUE); case 1: return idmef_value_new_enum_from_numeric((idmef_value_t **) childptr, IDMEF_CLASS_ID_USER_ID_TYPE, ptr->type); case 2: return get_value_from_string((idmef_value_t **) childptr, ptr->tty, TRUE); case 3: return get_value_from_string((idmef_value_t **) childptr, ptr->name, TRUE); case 4: return (ptr->number_is_set) ? idmef_value_new_uint32((idmef_value_t **) childptr, ptr->number) : 0; default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } int _idmef_user_id_new_child(void *p, idmef_class_child_id_t child, int n, void **ret) { idmef_user_id_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); switch ( child ) { case 0: return idmef_user_id_new_ident(ptr, (prelude_string_t **) ret); case 1: return idmef_user_id_new_type(ptr, (idmef_user_id_type_t **) ret); case 2: return idmef_user_id_new_tty(ptr, (prelude_string_t **) ret); case 3: return idmef_user_id_new_name(ptr, (prelude_string_t **) ret); case 4: return idmef_user_id_new_number(ptr, (uint32_t **) ret); default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } int _idmef_user_id_destroy_child(void *p, idmef_class_child_id_t child, int n) { idmef_user_id_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); switch ( child ) { case 0: if ( ptr->ident ) { prelude_string_destroy(ptr->ident); ptr->ident = NULL; } return 0; case 1: ptr->type = 0; return 0; case 2: if ( ptr->tty ) { prelude_string_destroy(ptr->tty); ptr->tty = NULL; } return 0; case 3: if ( ptr->name ) { prelude_string_destroy(ptr->name); ptr->name = NULL; } return 0; case 4: ptr->number_is_set = 0; return 0; default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } static void idmef_user_id_destroy_internal(idmef_user_id_t *ptr) { prelude_return_if_fail(ptr); if ( ! prelude_list_is_empty(&ptr->list) ) prelude_list_del_init(&ptr->list); if ( ptr->ident ) { prelude_string_destroy(ptr->ident); ptr->ident = NULL; } if ( ptr->tty ) { prelude_string_destroy(ptr->tty); ptr->tty = NULL; } if ( ptr->name ) { prelude_string_destroy(ptr->name); ptr->name = NULL; } /* free() should be done by the caller */ } /** * idmef_user_id_destroy: * @ptr: pointer to a #idmef_user_id_t object. * * Destroy @ptr and all of it's children. * The objects are only destroyed if their reference count reach zero. */ void idmef_user_id_destroy(idmef_user_id_t *ptr) { prelude_return_if_fail(ptr); if ( --ptr->refcount ) return; idmef_user_id_destroy_internal(ptr); free(ptr); } /** * *idmef_user_id_get_ident: * @ptr: pointer to a #idmef_user_id_t object. * * Get ident children of the #idmef_user_id_t object. * * Returns: a pointer to a prelude_string_t object, or NULL if the children object is not set. */ prelude_string_t *idmef_user_id_get_ident(idmef_user_id_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->ident; } /** * idmef_user_id_set_ident: * @ptr: pointer to a #idmef_user_id_t object. * @ident: pointer to a #prelude_string_t object. * * Set @ident object as a children of @ptr. * if @ptr already contain an @ident object, then it is destroyed, * and updated to point to the provided @ident object. */ void idmef_user_id_set_ident(idmef_user_id_t *ptr, prelude_string_t *ident) { prelude_return_if_fail(ptr); if ( ptr->ident ) prelude_string_destroy(ptr->ident); ptr->ident = ident; } /** * idmef_user_id_new_ident: * @ptr: pointer to a #idmef_user_id_t object. * @ret: pointer to an address where to store the created #prelude_string_t object. * * Create a new ident object, children of #idmef_user_id_t. * If @ptr already contain a #prelude_string_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_user_id_new_ident(idmef_user_id_t *ptr, prelude_string_t **ret) { int retval; prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); if ( ! ptr->ident ) { retval = prelude_string_new(&ptr->ident); if ( retval < 0 ) return retval; } *ret = ptr->ident; return 0; } /** * idmef_user_id_get_type: * @ptr: pointer to a #idmef_user_id_t object. * * Get type children of the #idmef_user_id_t object. * * Returns: a pointer to a idmef_user_id_type_t object, or NULL if the children object is not set. */ idmef_user_id_type_t idmef_user_id_get_type(idmef_user_id_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->type; } /** * idmef_user_id_set_type: * @ptr: pointer to a #idmef_user_id_t object. * @type: pointer to a #idmef_user_id_type_t object. * * Set @type object as a children of @ptr. * if @ptr already contain an @type object, then it is destroyed, * and updated to point to the provided @type object. */ void idmef_user_id_set_type(idmef_user_id_t *ptr, idmef_user_id_type_t type) { prelude_return_if_fail(ptr); ptr->type = type; } /** * idmef_user_id_new_type: * @ptr: pointer to a #idmef_user_id_t object. * @ret: pointer to an address where to store the created #idmef_user_id_type_t object. * * Create a new type object, children of #idmef_user_id_t. * If @ptr already contain a #idmef_user_id_type_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_user_id_new_type(idmef_user_id_t *ptr, idmef_user_id_type_t **ret) { prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); *ret = &ptr->type; return 0; } /** * *idmef_user_id_get_tty: * @ptr: pointer to a #idmef_user_id_t object. * * Get tty children of the #idmef_user_id_t object. * * Returns: a pointer to a prelude_string_t object, or NULL if the children object is not set. */ prelude_string_t *idmef_user_id_get_tty(idmef_user_id_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->tty; } /** * idmef_user_id_set_tty: * @ptr: pointer to a #idmef_user_id_t object. * @tty: pointer to a #prelude_string_t object. * * Set @tty object as a children of @ptr. * if @ptr already contain an @tty object, then it is destroyed, * and updated to point to the provided @tty object. */ void idmef_user_id_set_tty(idmef_user_id_t *ptr, prelude_string_t *tty) { prelude_return_if_fail(ptr); if ( ptr->tty ) prelude_string_destroy(ptr->tty); ptr->tty = tty; } /** * idmef_user_id_new_tty: * @ptr: pointer to a #idmef_user_id_t object. * @ret: pointer to an address where to store the created #prelude_string_t object. * * Create a new tty object, children of #idmef_user_id_t. * If @ptr already contain a #prelude_string_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_user_id_new_tty(idmef_user_id_t *ptr, prelude_string_t **ret) { int retval; prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); if ( ! ptr->tty ) { retval = prelude_string_new(&ptr->tty); if ( retval < 0 ) return retval; } *ret = ptr->tty; return 0; } /** * *idmef_user_id_get_name: * @ptr: pointer to a #idmef_user_id_t object. * * Get name children of the #idmef_user_id_t object. * * Returns: a pointer to a prelude_string_t object, or NULL if the children object is not set. */ prelude_string_t *idmef_user_id_get_name(idmef_user_id_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->name; } /** * idmef_user_id_set_name: * @ptr: pointer to a #idmef_user_id_t object. * @name: pointer to a #prelude_string_t object. * * Set @name object as a children of @ptr. * if @ptr already contain an @name object, then it is destroyed, * and updated to point to the provided @name object. */ void idmef_user_id_set_name(idmef_user_id_t *ptr, prelude_string_t *name) { prelude_return_if_fail(ptr); if ( ptr->name ) prelude_string_destroy(ptr->name); ptr->name = name; } /** * idmef_user_id_new_name: * @ptr: pointer to a #idmef_user_id_t object. * @ret: pointer to an address where to store the created #prelude_string_t object. * * Create a new name object, children of #idmef_user_id_t. * If @ptr already contain a #prelude_string_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_user_id_new_name(idmef_user_id_t *ptr, prelude_string_t **ret) { int retval; prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); if ( ! ptr->name ) { retval = prelude_string_new(&ptr->name); if ( retval < 0 ) return retval; } *ret = ptr->name; return 0; } /** * *idmef_user_id_get_number: * @ptr: pointer to a #idmef_user_id_t object. * * Get number children of the #idmef_user_id_t object. * * Returns: a pointer to a uint32_t object, or NULL if the children object is not set. */ uint32_t *idmef_user_id_get_number(idmef_user_id_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->number_is_set ? &ptr->number : NULL; } /** * idmef_user_id_set_number: * @ptr: pointer to a #idmef_user_id_t object. * @number: pointer to a #uint32_t object. * * Set @number object as a children of @ptr. * if @ptr already contain an @number object, then it is destroyed, * and updated to point to the provided @number object. */ void idmef_user_id_set_number(idmef_user_id_t *ptr, uint32_t number) { prelude_return_if_fail(ptr); ptr->number = number; ptr->number_is_set = 1; } void idmef_user_id_unset_number(idmef_user_id_t *ptr) { prelude_return_if_fail(ptr); ptr->number_is_set = 0; } /** * idmef_user_id_new_number: * @ptr: pointer to a #idmef_user_id_t object. * @ret: pointer to an address where to store the created #uint32_t object. * * Create a new number object, children of #idmef_user_id_t. * If @ptr already contain a #uint32_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_user_id_new_number(idmef_user_id_t *ptr, uint32_t **ret) { prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); ptr->number_is_set = 1; *ret = &ptr->number; return 0; } /** * idmef_user_id_copy: * @src: Source of the copy. * @dst: Where to copy the object. * * Copy a new #idmef_user_id_t object from @src to @dst. * * Returns: 0 on success, a negative value if an error occured. */ int idmef_user_id_copy(const idmef_user_id_t *src, idmef_user_id_t *dst) { int ret; prelude_return_val_if_fail(src, prelude_error(PRELUDE_ERROR_ASSERTION)); prelude_return_val_if_fail(dst, prelude_error(PRELUDE_ERROR_ASSERTION)); ret = 0; if ( src->ident ) { ret = prelude_string_clone(src->ident, &dst->ident); if ( ret < 0 ) return ret; } dst->type = src->type; if ( src->tty ) { ret = prelude_string_clone(src->tty, &dst->tty); if ( ret < 0 ) return ret; } if ( src->name ) { ret = prelude_string_clone(src->name, &dst->name); if ( ret < 0 ) return ret; } dst->number_is_set = src->number_is_set; dst->number = src->number; return 0; } /** * idmef_user_id_clone: * @src: Object to be cloned. * @dst: Address where to store the pointer to the cloned object. * * Create a copy of @src, and store it in @dst. * * Returns: 0 on success, a negative value if an error occured. */ int idmef_user_id_clone(idmef_user_id_t *src, idmef_user_id_t **dst) { int ret; prelude_return_val_if_fail(src, prelude_error(PRELUDE_ERROR_ASSERTION)); ret = idmef_user_id_new(dst); if ( ret < 0 ) return ret; return idmef_user_id_copy(src, *dst); } /** * idmef_user_id_compare: * @obj1: Object to compare with @obj2. * @obj2: Object to compare with @obj1. * * Compare @obj1 with @obj2. * * Returns: 0 on match, a negative value on comparison failure. */ int idmef_user_id_compare(const idmef_user_id_t *obj1, const idmef_user_id_t *obj2) { int ret = 0; if ( obj1 == NULL && obj2 == NULL ) return 0; else if ( obj1 == NULL || obj2 == NULL ) return -1; ret = prelude_string_compare(obj1->ident, obj2->ident); if ( ret != 0 ) return ret; if ( obj1->type != obj2->type ) return -1; ret = prelude_string_compare(obj1->tty, obj2->tty); if ( ret != 0 ) return ret; ret = prelude_string_compare(obj1->name, obj2->name); if ( ret != 0 ) return ret; if ( obj1->number_is_set != obj2->number_is_set ) return -1; if ( obj1->number_is_set && obj1->number != obj2->number ) return -1; return ret; } /** * idmef_user_new: * @ret: Pointer where to store the created #idmef_user_t object. * * Create a new #idmef_user_t object. * * Returns: 0 on success, a negative value if an error occured. */ int idmef_user_new(idmef_user_t **ret) { *ret = calloc(1, sizeof(**ret)); if ( ! *ret ) return prelude_error_from_errno(errno); (*ret)->refcount = 1; prelude_list_init(&(*ret)->user_id_list); return 0; } /** * idmef_user_ref: * @user: pointer to a #idmef_user_t object. * * Increase @user reference count, so that it can be referenced * multiple time. * * Returns: a pointer to @user. */ idmef_user_t *idmef_user_ref(idmef_user_t *user) { prelude_return_val_if_fail(user, NULL); user->refcount++; return user; } int _idmef_user_get_child(void *p, idmef_class_child_id_t child, void **childptr) { idmef_user_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); *childptr = NULL; switch ( child ) { case 0: return get_value_from_string((idmef_value_t **) childptr, ptr->ident, TRUE); case 1: return idmef_value_new_enum_from_numeric((idmef_value_t **) childptr, IDMEF_CLASS_ID_USER_CATEGORY, ptr->category); case 2: *childptr = &ptr->user_id_list; return 0; default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } int _idmef_user_new_child(void *p, idmef_class_child_id_t child, int n, void **ret) { idmef_user_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); switch ( child ) { case 0: return idmef_user_new_ident(ptr, (prelude_string_t **) ret); case 1: return idmef_user_new_category(ptr, (idmef_user_category_t **) ret); case 2: { int i = 0; prelude_list_t *tmp; if ( n == IDMEF_LIST_APPEND || n == IDMEF_LIST_PREPEND ) return idmef_user_new_user_id(ptr, (idmef_user_id_t **) ret, n); if ( n >= 0 ) { prelude_list_for_each(&ptr->user_id_list, tmp) { if ( i++ == n ) { *ret = prelude_list_entry(tmp, idmef_user_id_t, list); return 0; } } if ( i != n ) return prelude_error(PRELUDE_ERROR_IDMEF_TREE_INDEX_UNDEFINED); } else { int pos = (-n) - 1; /* With negative value, -1 is the base, translate to 0 */ prelude_list_for_each_reversed(&ptr->user_id_list, tmp) { if ( i++ == pos ) { *ret = prelude_list_entry(tmp, idmef_user_id_t, list); return 0; } } if ( i != pos ) return prelude_error(PRELUDE_ERROR_IDMEF_TREE_INDEX_UNDEFINED); } return idmef_user_new_user_id(ptr, (idmef_user_id_t **) ret, n); } default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } int _idmef_user_destroy_child(void *p, idmef_class_child_id_t child, int n) { idmef_user_t *ptr = p; prelude_return_val_if_fail(p, prelude_error(PRELUDE_ERROR_ASSERTION)); switch ( child ) { case 0: if ( ptr->ident ) { prelude_string_destroy(ptr->ident); ptr->ident = NULL; } return 0; case 1: ptr->category = 0; return 0; case 2: { int i = 0; prelude_list_t *tmp; if ( n >= 0 ) { prelude_list_for_each(&ptr->user_id_list, tmp) { if ( i++ == n ) { void *b = prelude_list_entry(tmp, idmef_user_id_t, list); idmef_user_id_destroy(b); return 0; } } if ( i != n ) return prelude_error(PRELUDE_ERROR_IDMEF_TREE_INDEX_UNDEFINED); } else { int pos = (-n) - 1; /* With negative value, -1 is the base, translate to 0 */ prelude_list_for_each_reversed(&ptr->user_id_list, tmp) { if ( i++ == pos ) { void *b = prelude_list_entry(tmp, idmef_user_id_t, list); idmef_user_id_destroy(b); return 0; } } if ( i != pos ) return prelude_error(PRELUDE_ERROR_IDMEF_TREE_INDEX_UNDEFINED); } } default: return prelude_error(PRELUDE_ERROR_IDMEF_CLASS_UNKNOWN_CHILD); } } static void idmef_user_destroy_internal(idmef_user_t *ptr) { prelude_return_if_fail(ptr); if ( ptr->ident ) { prelude_string_destroy(ptr->ident); ptr->ident = NULL; } { prelude_list_t *n, *tmp; idmef_user_id_t *entry; prelude_list_for_each_safe(&ptr->user_id_list, tmp, n) { entry = prelude_list_entry(tmp, idmef_user_id_t, list); prelude_list_del_init(&entry->list); idmef_user_id_destroy(entry); } } /* free() should be done by the caller */ } /** * idmef_user_destroy: * @ptr: pointer to a #idmef_user_t object. * * Destroy @ptr and all of it's children. * The objects are only destroyed if their reference count reach zero. */ void idmef_user_destroy(idmef_user_t *ptr) { prelude_return_if_fail(ptr); if ( --ptr->refcount ) return; idmef_user_destroy_internal(ptr); free(ptr); } /** * *idmef_user_get_ident: * @ptr: pointer to a #idmef_user_t object. * * Get ident children of the #idmef_user_t object. * * Returns: a pointer to a prelude_string_t object, or NULL if the children object is not set. */ prelude_string_t *idmef_user_get_ident(idmef_user_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->ident; } /** * idmef_user_set_ident: * @ptr: pointer to a #idmef_user_t object. * @ident: pointer to a #prelude_string_t object. * * Set @ident object as a children of @ptr. * if @ptr already contain an @ident object, then it is destroyed, * and updated to point to the provided @ident object. */ void idmef_user_set_ident(idmef_user_t *ptr, prelude_string_t *ident) { prelude_return_if_fail(ptr); if ( ptr->ident ) prelude_string_destroy(ptr->ident); ptr->ident = ident; } /** * idmef_user_new_ident: * @ptr: pointer to a #idmef_user_t object. * @ret: pointer to an address where to store the created #prelude_string_t object. * * Create a new ident object, children of #idmef_user_t. * If @ptr already contain a #prelude_string_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_user_new_ident(idmef_user_t *ptr, prelude_string_t **ret) { int retval; prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); if ( ! ptr->ident ) { retval = prelude_string_new(&ptr->ident); if ( retval < 0 ) return retval; } *ret = ptr->ident; return 0; } /** * idmef_user_get_category: * @ptr: pointer to a #idmef_user_t object. * * Get category children of the #idmef_user_t object. * * Returns: a pointer to a idmef_user_category_t object, or NULL if the children object is not set. */ idmef_user_category_t idmef_user_get_category(idmef_user_t *ptr) { prelude_return_val_if_fail(ptr, 0); /* FIXME */ return ptr->category; } /** * idmef_user_set_category: * @ptr: pointer to a #idmef_user_t object. * @category: pointer to a #idmef_user_category_t object. * * Set @category object as a children of @ptr. * if @ptr already contain an @category object, then it is destroyed, * and updated to point to the provided @category object. */ void idmef_user_set_category(idmef_user_t *ptr, idmef_user_category_t category) { prelude_return_if_fail(ptr); ptr->category = category; } /** * idmef_user_new_category: * @ptr: pointer to a #idmef_user_t object. * @ret: pointer to an address where to store the created #idmef_user_category_t object. * * Create a new category object, children of #idmef_user_t. * If @ptr already contain a #idmef_user_category_t object, then it is destroyed. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_user_new_category(idmef_user_t *ptr, idmef_user_category_t **ret) { prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); *ret = &ptr->category; return 0; } /** * idmef_user_get_next_user_id: * @user: pointer to a #idmef_user_t object. * @user_id_cur: pointer to a #idmef_user_id_t object. * * Get the next #idmef_user_id_t object listed in @ptr. * When iterating over the idmef_user_id_t object listed in @ptr, * @object should be set to the latest returned #idmef_user_id_t object. * * Returns: the next #idmef_user_id_t in the list. */ idmef_user_id_t *idmef_user_get_next_user_id(idmef_user_t *user, idmef_user_id_t *user_id_cur) { prelude_list_t *tmp = (user_id_cur) ? &user_id_cur->list : NULL; prelude_return_val_if_fail(user, NULL); prelude_list_for_each_continue(&user->user_id_list, tmp) return prelude_list_entry(tmp, idmef_user_id_t, list); return NULL; } /** * idmef_user_set_user_id: * @ptr: pointer to a #idmef_user_t object. * @object: pointer to a #idmef_user_id_t object. * @pos: Position in the list. * * Add @object to position @pos of @ptr list of #idmef_user_id_t object. * * If @pos is #IDMEF_LIST_APPEND, @object will be inserted at the tail of the list. * If @pos is #IDMEF_LIST_PREPEND, @object will be inserted at the head of the list. */ void idmef_user_set_user_id(idmef_user_t *ptr, idmef_user_id_t *object, int pos) { prelude_return_if_fail(ptr); prelude_return_if_fail(object); if ( ! prelude_list_is_empty(&object->list) ) prelude_list_del_init(&object->list); list_insert(&ptr->user_id_list, &object->list, pos); } /** * idmef_user_new_user_id: * @ptr: pointer to a #idmef_user_t object. * @ret: pointer to an address where to store the created #idmef_user_id_t object. * @pos: position in the list. * * Create a new #idmef_user_id_t children of @ptr, and add it to position @pos of * @ptr list of #idmef_user_id_t object. The created #idmef_user_id_t object is * stored in @ret. * * If @pos is #IDMEF_LIST_APPEND, @object will be inserted at the tail of the list. * If @pos is #IDMEF_LIST_PREPEND, @object will be inserted at the head of the list. * * Returns: 0 on success, or a negative value if an error occured. */ int idmef_user_new_user_id(idmef_user_t *ptr, idmef_user_id_t **ret, int pos) { int retval; prelude_return_val_if_fail(ptr, prelude_error(PRELUDE_ERROR_ASSERTION)); retval = idmef_user_id_new(ret); if ( retval < 0 ) return retval; list_insert(&ptr->user_id_list, &(*ret)->list, pos); return 0; } /** * idmef_user_copy: * @src: Source of the copy. * @dst: Where to copy the object.