1 /*****
2 *
3 * Copyright (C) 2003-2015 CS-SI. All Rights Reserved.
4 * Author: Nicolas Delon <nicolas.delon@prelude-ids.com>
5 *
6 * This file is part of the Prelude library.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2, or (at your option)
11 * any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 *
22 *****/
23 
24 #ifndef _LIBPRELUDE_IDMEF_DATA_H
25 #define _LIBPRELUDE_IDMEF_DATA_H
26 
27 #include "prelude-list.h"
28 
29 #ifdef __cplusplus
30  extern "C" {
31 #endif
32 
33 typedef enum {
34         IDMEF_DATA_TYPE_UNKNOWN      = 0,
35         IDMEF_DATA_TYPE_CHAR         = 1,
36         IDMEF_DATA_TYPE_BYTE         = 2,
37         IDMEF_DATA_TYPE_UINT32       = 3,
38         IDMEF_DATA_TYPE_UINT64       = 4,
39         IDMEF_DATA_TYPE_INT          = 4,
40         IDMEF_DATA_TYPE_FLOAT        = 5,
41         IDMEF_DATA_TYPE_CHAR_STRING  = 6,
42         IDMEF_DATA_TYPE_BYTE_STRING  = 7,
43         IDMEF_DATA_TYPE_TIME         = 8
44 } idmef_data_type_t;
45 
46 
47 typedef struct {
48         int refcount;
49 
50         int flags;
51         idmef_data_type_t type;
52         size_t len;
53 
54         union {
55                 char char_data;
56                 uint8_t byte_data;
57                 int64_t int_data;
58                 float float_data;
59                 void *rw_data;
60                 const void *ro_data;
61         } data;
62 
63         prelude_list_t list;
64 } idmef_data_t;
65 
66 
67 
68 int idmef_data_new(idmef_data_t **data);
69 
70 idmef_data_t *idmef_data_ref(idmef_data_t *data);
71 
72 
73 int idmef_data_new_char(idmef_data_t **data, char c);
74 int idmef_data_new_byte(idmef_data_t **data, uint8_t i);
75 int idmef_data_new_uint32(idmef_data_t **data, uint32_t i) PRELUDE_DEPRECATED;
76 int idmef_data_new_uint64(idmef_data_t **data, uint64_t i) PRELUDE_DEPRECATED;
77 int idmef_data_new_int(idmef_data_t **data, int64_t i);
78 int idmef_data_new_float(idmef_data_t **data, float f);
79 int idmef_data_new_time(idmef_data_t **data, idmef_time_t *time);
80 
81 void idmef_data_set_char(idmef_data_t *data, char c);
82 void idmef_data_set_byte(idmef_data_t *data, uint8_t i);
83 void idmef_data_set_uint32(idmef_data_t *data, uint32_t i) PRELUDE_DEPRECATED;
84 void idmef_data_set_uint64(idmef_data_t *data, uint64_t i) PRELUDE_DEPRECATED;
85 void idmef_data_set_int(idmef_data_t *data, int64_t i);
86 void idmef_data_set_float(idmef_data_t *data, float f);
87 void idmef_data_set_time(idmef_data_t *data, idmef_time_t *time);
88 
89 int idmef_data_set_ptr_dup_fast(idmef_data_t *data, idmef_data_type_t type, const void *ptr, size_t len);
90 int idmef_data_set_ptr_ref_fast(idmef_data_t *data, idmef_data_type_t type, const void *ptr, size_t len);
91 int idmef_data_set_ptr_nodup_fast(idmef_data_t *data, idmef_data_type_t type, void *ptr, size_t len);
92 
93 int idmef_data_new_ptr_dup_fast(idmef_data_t **data, idmef_data_type_t type, const void *ptr, size_t len);
94 int idmef_data_new_ptr_ref_fast(idmef_data_t **data, idmef_data_type_t type, const void *ptr, size_t len);
95 int idmef_data_new_ptr_nodup_fast(idmef_data_t **data, idmef_data_type_t type, void *ptr, size_t len);
96 
97 
98 /*
99  * String functions
100  */
101 int idmef_data_set_char_string_dup_fast(idmef_data_t *data, const char *str, size_t len);
102 int idmef_data_new_char_string_dup_fast(idmef_data_t **data, const char *str, size_t len);
103 int idmef_data_new_char_string_ref_fast(idmef_data_t **data, const char *ptr, size_t len);
104 int idmef_data_new_char_string_nodup_fast(idmef_data_t **data, char *ptr, size_t len);
105 int idmef_data_set_char_string_ref_fast(idmef_data_t *data, const char *ptr, size_t len);
106 int idmef_data_set_char_string_nodup_fast(idmef_data_t *data, char *ptr, size_t len);
107 int idmef_data_new_char_string_ref(idmef_data_t **data, const char *ptr);
108 int idmef_data_new_char_string_dup(idmef_data_t **data, const char *ptr);
109 int idmef_data_new_char_string_nodup(idmef_data_t **data, char *ptr);
110 int idmef_data_set_char_string_ref(idmef_data_t *data, const char *ptr);
111 int idmef_data_set_char_string_dup(idmef_data_t *data, const char *ptr);
112 int idmef_data_set_char_string_nodup(idmef_data_t *data, char *ptr);
113 
114 #define idmef_data_set_char_string_constant(string, str)                \
115         idmef_data_set_char_string_ref_fast((string), (str), sizeof((str)) - 1)
116 
117 
118 /*
119  * Byte functions
120  */
121 int idmef_data_new_byte_string_ref(idmef_data_t **data, const unsigned char *ptr, size_t len);
122 int idmef_data_new_byte_string_dup(idmef_data_t **data, const unsigned char *ptr, size_t len);
123 int idmef_data_new_byte_string_nodup(idmef_data_t **data, unsigned char *ptr, size_t len);
124 int idmef_data_set_byte_string_ref(idmef_data_t *data, const unsigned char *ptr, size_t len);
125 int idmef_data_set_byte_string_dup(idmef_data_t *data, const unsigned char *ptr, size_t len);
126 int idmef_data_set_byte_string_nodup(idmef_data_t *data, unsigned char *ptr, size_t len);
127 
128 
129 
130 /*
131  *
132  */
133 
134 void idmef_data_destroy(idmef_data_t *data);
135 
136 int idmef_data_copy_ref(const idmef_data_t *src, idmef_data_t *dst);
137 
138 int idmef_data_copy_dup(const idmef_data_t *src, idmef_data_t *dst);
139 
140 int idmef_data_clone(const idmef_data_t *src, idmef_data_t **dst);
141 
142 idmef_data_type_t idmef_data_get_type(const idmef_data_t *data);
143 
144 size_t idmef_data_get_len(const idmef_data_t *data);
145 
146 const void *idmef_data_get_data(const idmef_data_t *data);
147 
148 char idmef_data_get_char(const idmef_data_t *data);
149 
150 uint8_t idmef_data_get_byte(const idmef_data_t *data);
151 
152 uint32_t idmef_data_get_uint32(const idmef_data_t *data) PRELUDE_DEPRECATED;
153 
154 uint64_t idmef_data_get_uint64(const idmef_data_t *data) PRELUDE_DEPRECATED;
155 
156 int64_t idmef_data_get_int(const idmef_data_t *data);
157 
158 float idmef_data_get_float(const idmef_data_t *data);
159 
160 const char *idmef_data_get_char_string(const idmef_data_t *data);
161 
162 const unsigned char *idmef_data_get_byte_string(const idmef_data_t *data);
163 
164 prelude_bool_t idmef_data_is_empty(const idmef_data_t *data);
165 
166 int idmef_data_to_string(const idmef_data_t *data, prelude_string_t *out);
167 
168 void idmef_data_destroy_internal(idmef_data_t *data);
169 
170 int idmef_data_compare(const idmef_data_t *data1, const idmef_data_t *data2);
171 
172 #ifdef __cplusplus
173  }
174 #endif
175 
176 #endif /* _LIBPRELUDE_IDMEF_DATA_H */
177