1 /*======================================================================*
2 * Copyright (c) 2008, Yahoo! Inc. All rights reserved. *
4 * Licensed under the New BSD License (the "License"); you may not use *
5 * this file except in compliance with the License. Unless required *
6 * by applicable law or agreed to in writing, software distributed *
7 * under the License is distributed on an "AS IS" BASIS, WITHOUT *
8 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
9 * See the License for the specific language governing permissions and *
10 * limitations under the License. See accompanying LICENSE file. *
11 *======================================================================*/
13 #include <sys/types.h>
14 #include <sys/socket.h>
15 #include <netinet/in.h>
16 #include <arpa/inet.h>
20 #include "lwes_event.h"
21 #include "lwes_hash.h"
22 #include "lwes_marshall_functions.h"
24 /*************************************************************************
25 PRIVATE API prototypes, shouldn't be called by a user of the library.
26 *************************************************************************/
28 /* Create the memory for an event attribute */
29 static struct lwes_event_attribute
*
30 lwes_event_attribute_create
36 (struct lwes_event
* event
,
37 LWES_CONST_SHORT_STRING attrNameIn
,
42 lwes_INT_64_from_hex_string
44 LWES_INT_64
* an_int64
);
47 lwes_U_INT_64_from_hex_string
49 LWES_U_INT_64
* a_uint64
);
51 /*************************************************************************
53 *************************************************************************/
55 lwes_event_create_no_name
56 (struct lwes_event_type_db
*db
)
58 struct lwes_event
*event
=
59 (struct lwes_event
*)malloc (sizeof (struct lwes_event
));
66 event
->eventName
= NULL
;
67 event
->number_of_attributes
= 0;
69 event
->attributes
= lwes_hash_create ();
70 if (event
->attributes
== NULL
)
79 /* PUBLIC : Create the memory for an event */
82 (struct lwes_event_type_db
*db
,
83 LWES_CONST_SHORT_STRING name
)
85 struct lwes_event
*event
;
92 event
= (struct lwes_event
*)malloc (sizeof (struct lwes_event
));
99 event
->eventName
= NULL
;
100 event
->number_of_attributes
= 0;
102 event
->attributes
= lwes_hash_create ();
103 if (event
->attributes
== NULL
)
109 if (lwes_event_set_name (event
,name
) < 0)
111 /* Having problems, bail and return NULL */
112 lwes_hash_destroy (event
->attributes
);
121 lwes_event_create_with_encoding
122 (struct lwes_event_type_db
*db
,
123 LWES_CONST_SHORT_STRING name
,
124 LWES_INT_16 encoding
)
126 struct lwes_event
*event
;
133 event
= (struct lwes_event
*)malloc(sizeof(struct lwes_event
));
140 event
->eventName
= NULL
;
141 event
->number_of_attributes
= 0;
143 event
->attributes
= lwes_hash_create ();
145 if (event
->attributes
== NULL
)
151 if (lwes_event_set_name(event
,name
) < 0)
153 /* Having memory problems, bail */
154 lwes_hash_destroy (event
->attributes
);
159 if (lwes_event_set_encoding (event
,encoding
) < 0)
161 /* problem setting encoding, free up memory and bail */
162 lwes_hash_destroy (event
->attributes
);
163 if (event
->eventName
!= NULL
)
165 free (event
->eventName
);
176 (struct lwes_event
*event
,
177 LWES_CONST_SHORT_STRING name
)
179 if (event
== NULL
|| name
== NULL
|| event
->eventName
!= NULL
)
185 (LWES_SHORT_STRING
) malloc (sizeof (LWES_CHAR
)*(strlen (name
)+1));
187 if (event
->eventName
== NULL
)
192 strcpy (event
->eventName
,name
);
198 lwes_event_set_encoding
199 (struct lwes_event
*event
,
200 LWES_INT_16 encoding
)
202 LWES_INT_16 tmp_encoding
;
209 if ( lwes_event_get_INT_16 (event
, LWES_ENCODING
, &tmp_encoding
) == -1 )
211 return lwes_event_set_INT_16 (event
, LWES_ENCODING
, encoding
);
219 (struct lwes_event
*event
, LWES_SHORT_STRING
*name
)
221 if (event
== NULL
|| name
== NULL
)
225 *name
= event
->eventName
;
230 lwes_event_get_number_of_attributes
231 (struct lwes_event
*event
,
232 LWES_U_INT_16
*number
)
234 if (event
== NULL
|| number
== NULL
)
238 *number
= event
->number_of_attributes
;
243 lwes_event_get_encoding
244 (struct lwes_event
*event
,
245 LWES_INT_16
*encoding
)
247 if (event
== NULL
|| encoding
== NULL
)
252 return lwes_event_get_INT_16 (event
,
253 (LWES_SHORT_STRING
)LWES_ENCODING
,
257 /* PUBLIC : Cleanup the memory for an event */
260 (struct lwes_event
*event
)
262 struct lwes_event_attribute
*tmp
= NULL
;
263 struct lwes_hash_enumeration e
;
270 /* free the parts of the event */
271 if (event
->eventName
!= NULL
)
273 free(event
->eventName
);
276 /* clear out the hash */
277 if (lwes_hash_keys (event
->attributes
, &e
))
279 while (lwes_hash_enumeration_has_more_elements (&e
))
281 LWES_SHORT_STRING tmpAttrName
=
282 lwes_hash_enumeration_next_element (&e
);
284 (struct lwes_event_attribute
*)lwes_hash_remove (event
->attributes
,
286 /* free the attribute name and value*/
287 if (tmpAttrName
!= NULL
)
291 if (tmp
->value
!= NULL
)
295 /* free the attribute itself*/
303 /* free the now empty hash */
304 lwes_hash_destroy (event
->attributes
);
306 /* finally free the event structure */
312 /* PUBLIC : serialize the event and put it into a byte array */
315 (struct lwes_event
*event
,
320 struct lwes_event_attribute
*tmp
;
321 struct lwes_event_attribute
*encodingAttr
;
322 size_t tmpOffset
= offset
;
323 struct lwes_hash_enumeration e
;
329 || offset
>= num_bytes
)
334 /* start with the event name */
335 if (marshall_SHORT_STRING (event
->eventName
,
340 /* then the number of attributes */
341 if (marshall_U_INT_16 (event
->number_of_attributes
,
346 /* handle encoding first if it is set */
348 (struct lwes_event_attribute
*)
349 lwes_hash_get (event
->attributes
,
350 (LWES_SHORT_STRING
)LWES_ENCODING
);
354 void* encodingValue
= encodingAttr
->value
;
355 LWES_BYTE encodingType
= encodingAttr
->type
;
358 if (encodingType
== LWES_INT_16_TOKEN
)
360 if (marshall_SHORT_STRING
361 ((LWES_SHORT_STRING
)LWES_ENCODING
,
373 (*((LWES_INT_16
*)encodingValue
),
392 /* now iterate over all the other values in the hash */
393 if (lwes_hash_keys (event
->attributes
, &e
))
395 while (lwes_hash_enumeration_has_more_elements (&e
) && ret
== 0)
397 LWES_SHORT_STRING tmpAttrName
=
398 lwes_hash_enumeration_next_element (&e
);
400 /* skip encoding as we've dealt with it above */
401 if (! strcmp(tmpAttrName
, LWES_ENCODING
))
407 (struct lwes_event_attribute
*)
408 lwes_hash_get (event
->attributes
, tmpAttrName
);
410 if (marshall_SHORT_STRING (tmpAttrName
,
419 if (marshall_BYTE (tmp
->type
,
428 if (tmp
->type
== LWES_U_INT_16_TOKEN
)
430 if (marshall_U_INT_16 (*((LWES_U_INT_16
*)tmp
->value
),
438 else if (tmp
->type
== LWES_INT_16_TOKEN
)
440 if (marshall_INT_16 (*((LWES_INT_16
*)tmp
->value
),
448 else if (tmp
->type
== LWES_U_INT_32_TOKEN
)
450 if (marshall_U_INT_32 (*((LWES_U_INT_32
*)tmp
->value
),
458 else if (tmp
->type
== LWES_INT_32_TOKEN
)
460 if (marshall_INT_32 (*((LWES_INT_32
*)tmp
->value
),
468 else if (tmp
->type
== LWES_U_INT_64_TOKEN
)
470 if (marshall_U_INT_64 (*((LWES_U_INT_64
*)tmp
->value
),
478 else if (tmp
->type
== LWES_INT_64_TOKEN
)
480 if (marshall_INT_64 (*((LWES_INT_64
*)tmp
->value
),
488 else if (tmp
->type
== LWES_BOOLEAN_TOKEN
)
490 if (marshall_BOOLEAN (*((LWES_BOOLEAN
*)tmp
->value
),
498 else if (tmp
->type
== LWES_IP_ADDR_TOKEN
)
500 if (marshall_IP_ADDR (*((LWES_IP_ADDR
*)tmp
->value
),
508 else if (tmp
->type
== LWES_STRING_TOKEN
)
510 if (marshall_LONG_STRING ((LWES_LONG_STRING
)tmp
->value
,
520 /* should never be reached, but if it does,
521 * there's some sort of corruption with this
522 * attribute of the event, so skip it */
539 return ((ret
< 0) ? ret
: (int)(tmpOffset
-offset
));
542 /* PUBLIC : deserialize the event from a byte array and into an event */
544 lwes_event_from_bytes
545 (struct lwes_event
*event
,
549 struct lwes_event_deserialize_tmp
*dtmp
)
552 LWES_U_INT_16 tmp_number_of_attributes
= 0;
553 size_t tmpOffset
= offset
;
556 LWES_U_INT_16 tmp_uint16
;
557 LWES_INT_16 tmp_int16
;
558 LWES_U_INT_32 tmp_uint32
;
559 LWES_INT_32 tmp_int32
;
560 LWES_U_INT_64 tmp_uint64
;
561 LWES_INT_64 tmp_int64
;
562 LWES_BOOLEAN tmp_boolean
;
563 LWES_IP_ADDR tmp_ip_addr
;
564 LWES_SHORT_STRING tmp_short_str
;
565 LWES_LONG_STRING tmp_long_str
;
570 || offset
>= num_bytes
576 tmp_short_str
= dtmp
->tmp_string
;
577 tmp_long_str
= dtmp
->tmp_string_long
;
579 /* unmarshall the event name */
580 if (unmarshall_SHORT_STRING (tmp_short_str
,
581 (SHORT_STRING_MAX
+1),
586 /* copies the data out of tmp_short_str */
587 if (lwes_event_set_name (event
, tmp_short_str
) == 0)
589 /* unmarshall the number of elements */
590 if (unmarshall_U_INT_16 (&tmp_uint16
,bytes
,num_bytes
,&tmpOffset
))
592 tmp_number_of_attributes
= tmp_uint16
;
594 for (i
= 0; i
< tmp_number_of_attributes
; i
++)
596 /* unmarshall the attribute name */
597 if (unmarshall_SHORT_STRING (tmp_short_str
,
598 (SHORT_STRING_MAX
+1),
603 /* unmarshall the type id */
604 if (unmarshall_BYTE (&tmp_byte
,
609 if (tmp_byte
== LWES_U_INT_16_TOKEN
)
611 if (unmarshall_U_INT_16 (&tmp_uint16
,
616 if (lwes_event_set_U_INT_16 (event
,
629 else if (tmp_byte
== LWES_INT_16_TOKEN
)
631 if (unmarshall_INT_16 (&tmp_int16
,
636 if (lwes_event_set_INT_16 (event
,
649 else if (tmp_byte
== LWES_U_INT_32_TOKEN
)
651 if (unmarshall_U_INT_32 (&tmp_uint32
,
656 if (lwes_event_set_U_INT_32 (event
,
669 else if (tmp_byte
== LWES_INT_32_TOKEN
)
671 if (unmarshall_INT_32 (&tmp_int32
,
676 if (lwes_event_set_INT_32 (event
,
689 else if (tmp_byte
== LWES_U_INT_64_TOKEN
)
691 if (unmarshall_U_INT_64 (&tmp_uint64
,
696 if (lwes_event_set_U_INT_64 (event
,
709 else if (tmp_byte
== LWES_INT_64_TOKEN
)
711 if (unmarshall_INT_64 (&tmp_int64
,
716 if (lwes_event_set_INT_64 (event
,
729 else if (tmp_byte
== LWES_BOOLEAN_TOKEN
)
731 if (unmarshall_BOOLEAN (&tmp_boolean
,
736 if (lwes_event_set_BOOLEAN (event
,
749 else if (tmp_byte
== LWES_IP_ADDR_TOKEN
)
751 if (unmarshall_IP_ADDR (&tmp_ip_addr
,
756 if (lwes_event_set_IP_ADDR (event
,
769 else if (tmp_byte
== LWES_STRING_TOKEN
)
771 if (unmarshall_LONG_STRING (tmp_long_str
,
777 if (lwes_event_set_STRING (event
,
821 return (int)(tmpOffset
-offset
);
824 int lwes_event_set_U_INT_16 (struct lwes_event
* event
,
825 LWES_CONST_SHORT_STRING attrName
,
829 LWES_U_INT_16
*attrValue
;
831 if (event
== NULL
|| attrName
== NULL
)
836 attrValue
= (LWES_U_INT_16
*)malloc (sizeof (LWES_U_INT_16
));
838 if (attrValue
== NULL
)
844 ret
= lwes_event_add (event
, attrName
, LWES_U_INT_16_TOKEN
, attrValue
);
852 int lwes_event_set_INT_16 (struct lwes_event
* event
,
853 LWES_CONST_SHORT_STRING attrName
,
857 LWES_INT_16
*attrValue
;
859 if (event
== NULL
|| attrName
== NULL
)
864 attrValue
= (LWES_INT_16
*)malloc (sizeof (LWES_INT_16
));
866 if (attrValue
== NULL
)
872 ret
= lwes_event_add (event
, attrName
, LWES_INT_16_TOKEN
, attrValue
);
880 int lwes_event_set_U_INT_32 (struct lwes_event
* event
,
881 LWES_CONST_SHORT_STRING attrName
,
885 LWES_U_INT_32
*attrValue
;
887 if (event
== NULL
|| attrName
== NULL
)
892 attrValue
= (LWES_U_INT_32
*)malloc(sizeof(LWES_U_INT_32
));
894 if (attrValue
== NULL
)
900 ret
= lwes_event_add (event
, attrName
, LWES_U_INT_32_TOKEN
, attrValue
);
908 int lwes_event_set_INT_32 (struct lwes_event
* event
,
909 LWES_CONST_SHORT_STRING attrName
,
913 LWES_INT_32
*attrValue
;
915 if (event
== NULL
|| attrName
== NULL
)
920 attrValue
= (LWES_INT_32
*)malloc (sizeof (LWES_INT_32
));
922 if (attrValue
== NULL
)
928 ret
= lwes_event_add (event
, attrName
, LWES_INT_32_TOKEN
, attrValue
);
936 int lwes_event_set_U_INT_64 (struct lwes_event
* event
,
937 LWES_CONST_SHORT_STRING attrName
,
941 LWES_U_INT_64
*attrValue
;
943 if (event
== NULL
|| attrName
== NULL
)
948 attrValue
= (LWES_U_INT_64
*)malloc (sizeof (LWES_U_INT_64
));
950 if (attrValue
== NULL
)
956 ret
= lwes_event_add (event
, attrName
, LWES_U_INT_64_TOKEN
, attrValue
);
964 int lwes_event_set_U_INT_64_w_string (struct lwes_event
* event
,
965 LWES_CONST_SHORT_STRING attrName
,
966 LWES_CONST_SHORT_STRING uint64_string
)
968 LWES_INT_64 u_int_64
;
969 if (event
== NULL
|| attrName
== NULL
|| uint64_string
== NULL
)
973 if (lwes_INT_64_from_hex_string (uint64_string
, &u_int_64
) < 0)
977 return lwes_event_set_U_INT_64 (event
, attrName
, u_int_64
);
980 int lwes_event_set_INT_64 (struct lwes_event
* event
,
981 LWES_CONST_SHORT_STRING attrName
,
985 LWES_INT_64
*attrValue
;
987 if (event
== NULL
|| attrName
== NULL
)
992 attrValue
= (LWES_INT_64
*)malloc (sizeof (LWES_INT_64
));
994 if (attrValue
== NULL
)
1000 ret
= lwes_event_add (event
, attrName
, LWES_INT_64_TOKEN
, attrValue
);
1008 int lwes_event_set_INT_64_w_string (struct lwes_event
*event
,
1009 LWES_CONST_SHORT_STRING attrName
,
1010 LWES_CONST_SHORT_STRING int64_string
)
1014 if (event
== NULL
|| attrName
== NULL
|| int64_string
== NULL
)
1019 if (lwes_INT_64_from_hex_string (int64_string
,&int_64
) < 0)
1023 return lwes_event_set_INT_64 (event
, attrName
, int_64
);
1026 int lwes_event_set_STRING (struct lwes_event
* event
,
1027 LWES_CONST_SHORT_STRING attrName
,
1028 LWES_CONST_LONG_STRING value
)
1031 LWES_LONG_STRING attrValue
;
1033 if (event
== NULL
|| attrName
== NULL
|| value
== NULL
)
1038 attrValue
= (LWES_LONG_STRING
)malloc (sizeof (LWES_CHAR
)*(strlen (value
)+1));
1039 if (attrValue
== NULL
)
1043 strcpy(attrValue
,value
);
1045 ret
= lwes_event_add (event
, attrName
, LWES_STRING_TOKEN
, (void*)attrValue
);
1053 int lwes_event_set_IP_ADDR (struct lwes_event
* event
,
1054 LWES_CONST_SHORT_STRING attrName
,
1058 LWES_IP_ADDR
*attrValue
;
1060 if (event
== NULL
|| attrName
== NULL
)
1065 attrValue
= (LWES_IP_ADDR
*)malloc (sizeof (LWES_IP_ADDR
));
1067 if (attrValue
== NULL
)
1073 ret
= lwes_event_add (event
, attrName
, LWES_IP_ADDR_TOKEN
, attrValue
);
1081 int lwes_event_set_IP_ADDR_w_string (struct lwes_event
* event
,
1082 LWES_CONST_SHORT_STRING attrName
,
1083 LWES_CONST_SHORT_STRING value
)
1086 struct in_addr
*attrValue
;
1088 if (event
== NULL
|| attrName
== NULL
|| value
== NULL
)
1093 attrValue
= (LWES_IP_ADDR
*)malloc (sizeof (LWES_IP_ADDR
));
1094 if (attrValue
== NULL
)
1098 attrValue
->s_addr
= inet_addr (value
);
1100 ret
= lwes_event_add (event
, attrName
, LWES_IP_ADDR_TOKEN
, attrValue
);
1108 int lwes_event_set_BOOLEAN (struct lwes_event
* event
,
1109 LWES_CONST_SHORT_STRING attrName
,
1113 LWES_BOOLEAN
*attrValue
;
1115 if (event
== NULL
|| attrName
== NULL
)
1120 attrValue
= (LWES_BOOLEAN
*)malloc (sizeof (LWES_BOOLEAN
));
1121 if (attrValue
== NULL
)
1127 ret
= lwes_event_add (event
, attrName
, LWES_BOOLEAN_TOKEN
, attrValue
);
1136 /* ACCESSOR METHODS */
1138 int lwes_event_get_U_INT_16 (struct lwes_event
*event
,
1139 LWES_CONST_SHORT_STRING name
,
1140 LWES_U_INT_16
*value
)
1142 struct lwes_event_attribute
*tmp
;
1144 if (event
== NULL
|| name
== NULL
|| value
== NULL
)
1149 tmp
= (struct lwes_event_attribute
*)lwes_hash_get (event
->attributes
, name
);
1153 *value
= (*((LWES_U_INT_16
*)tmp
->value
));
1160 int lwes_event_get_INT_16 (struct lwes_event
*event
,
1161 LWES_CONST_SHORT_STRING name
,
1164 struct lwes_event_attribute
*tmp
;
1166 if (event
== NULL
|| name
== NULL
|| value
== NULL
)
1171 tmp
= (struct lwes_event_attribute
*)lwes_hash_get (event
->attributes
, name
);
1175 *value
= (*((LWES_INT_16
*)tmp
->value
));
1181 int lwes_event_get_U_INT_32 (struct lwes_event
*event
,
1182 LWES_CONST_SHORT_STRING name
,
1183 LWES_U_INT_32
*value
)
1185 struct lwes_event_attribute
*tmp
;
1187 if (event
== NULL
|| name
== NULL
|| value
== NULL
)
1192 tmp
= (struct lwes_event_attribute
*)lwes_hash_get (event
->attributes
, name
);
1196 *value
= (*((LWES_U_INT_32
*)tmp
->value
));
1203 int lwes_event_get_INT_32 (struct lwes_event
*event
,
1204 LWES_CONST_SHORT_STRING name
,
1207 struct lwes_event_attribute
*tmp
;
1209 if (event
== NULL
|| name
== NULL
|| value
== NULL
)
1214 tmp
= (struct lwes_event_attribute
*)lwes_hash_get (event
->attributes
, name
);
1218 *value
= (*((LWES_INT_32
*)tmp
->value
));
1225 int lwes_event_get_U_INT_64 (struct lwes_event
*event
,
1226 LWES_CONST_SHORT_STRING name
,
1227 LWES_U_INT_64
*value
)
1229 struct lwes_event_attribute
*tmp
;
1231 if (event
== NULL
|| name
== NULL
|| value
== NULL
)
1236 tmp
= (struct lwes_event_attribute
*)lwes_hash_get (event
->attributes
, name
);
1240 *value
= (*((LWES_U_INT_64
*)tmp
->value
));
1247 int lwes_event_get_INT_64 (struct lwes_event
*event
,
1248 LWES_CONST_SHORT_STRING name
,
1251 struct lwes_event_attribute
*tmp
;
1253 if (event
== NULL
|| name
== NULL
|| value
== NULL
)
1258 tmp
= (struct lwes_event_attribute
*)lwes_hash_get (event
->attributes
, name
);
1262 *value
= (*((LWES_INT_64
*)tmp
->value
));
1269 int lwes_event_get_STRING (struct lwes_event
*event
,
1270 LWES_CONST_SHORT_STRING name
,
1271 LWES_LONG_STRING
*value
)
1273 struct lwes_event_attribute
*tmp
;
1275 if (event
== NULL
|| name
== NULL
|| value
== NULL
)
1280 tmp
= (struct lwes_event_attribute
*)lwes_hash_get (event
->attributes
, name
);
1284 *value
= (((LWES_LONG_STRING
)tmp
->value
));
1290 int lwes_event_get_IP_ADDR (struct lwes_event
*event
,
1291 LWES_CONST_SHORT_STRING name
,
1292 LWES_IP_ADDR
*value
)
1294 struct lwes_event_attribute
*tmp
;
1296 if (event
== NULL
|| name
== NULL
|| value
== NULL
)
1301 tmp
= (struct lwes_event_attribute
*)lwes_hash_get (event
->attributes
, name
);
1305 *value
= (*((LWES_IP_ADDR
*)tmp
->value
));
1311 int lwes_event_get_BOOLEAN (struct lwes_event
*event
,
1312 LWES_CONST_SHORT_STRING name
,
1313 LWES_BOOLEAN
*value
)
1315 struct lwes_event_attribute
*tmp
;
1317 if (event
== NULL
|| name
== NULL
|| value
== NULL
)
1322 tmp
= (struct lwes_event_attribute
*)lwes_hash_get(event
->attributes
, name
);
1326 *value
= (*((LWES_BOOLEAN
*)tmp
->value
));
1332 /*************************************************************************
1334 *************************************************************************/
1335 /* Create the memory for an attribute */
1336 static struct lwes_event_attribute
*
1337 lwes_event_attribute_create (LWES_BYTE attrType
, void *attrValue
)
1339 struct lwes_event_attribute
*attribute
=
1340 (struct lwes_event_attribute
*)
1341 malloc (sizeof (struct lwes_event_attribute
));
1343 if (attribute
== NULL
)
1348 attribute
->type
= attrType
;
1349 attribute
->value
= attrValue
;
1354 /* add an attribute to an event */
1356 lwes_event_add (struct lwes_event
* event
,
1357 LWES_CONST_SHORT_STRING attrNameIn
,
1361 struct lwes_event_attribute
* attribute
= NULL
;
1362 LWES_SHORT_STRING attrName
= NULL
;
1365 /* check against the event db */
1366 if (event
->type_db
!= NULL
1367 && lwes_event_type_db_check_for_attribute (event
->type_db
,
1369 event
->eventName
) == 0)
1373 if (event
->type_db
!= NULL
1374 && lwes_event_type_db_check_for_type (event
->type_db
,
1377 event
->eventName
) == 0)
1382 /* copy the attribute name */
1384 (LWES_SHORT_STRING
) malloc( sizeof(LWES_CHAR
)*(strlen (attrNameIn
)+1));
1385 if (attrName
== NULL
)
1390 strcat (attrName
,attrNameIn
);
1392 /* create the attribute */
1393 attribute
= lwes_event_attribute_create (attrType
, attrValue
);
1394 if (attribute
== NULL
)
1400 /* Try and put something into the hash */
1401 ret
= lwes_hash_put (event
->attributes
, attrName
, attribute
);
1403 /* return code greater than or equal to 0 is okay, so increment the
1404 * number_of_attributes, otherwise, send out the failure value
1412 event
->number_of_attributes
++;
1414 return event
->number_of_attributes
;
1418 lwes_U_INT_64_from_hex_string
1419 (const char *buffer
,
1420 LWES_U_INT_64
* a_uint64
)
1424 /* manpage for strtoull suggests setting errno to zero then checking
1425 * for error afterwards
1428 *a_uint64
= strtoull (buffer
, &endptr
, 16);
1430 /* it's considered an error if it overflows (ie, errno is ERANGE)
1431 * or if the entire string is not used (ie, in_length is greater than
1435 || ((int)strlen (buffer
) > (int)(endptr
- buffer
)))
1444 lwes_INT_64_from_hex_string
1445 (const char *buffer
,
1446 LWES_INT_64
* an_int64
)
1449 * totally bogus, but on freebsd strtoll for hex can not reach the
1450 * maximum hex value of 0xffffffffffffffff, so instead I use
1451 * strtoull which does reach the upper range, and then cast
1453 LWES_U_INT_64 a_uint64
;
1456 ret
= lwes_U_INT_64_from_hex_string (buffer
, &a_uint64
);
1463 *an_int64
= (LWES_INT_64
)a_uint64
;
1470 (struct lwes_event
* event
,
1471 struct lwes_event_enumeration
*enumeration
)
1473 return lwes_hash_keys (event
->attributes
, &(enumeration
->hash_enum
));
1477 lwes_event_enumeration_next_element
1478 (struct lwes_event_enumeration
*enumeration
,
1479 LWES_CONST_SHORT_STRING
*key
,
1482 LWES_SHORT_STRING tmpAttrName
=
1483 lwes_hash_enumeration_next_element (&(enumeration
->hash_enum
));
1485 (*type
) = LWES_TYPE_UNDEFINED
;
1487 if ( tmpAttrName
!= NULL
)
1489 struct lwes_event_attribute
*tmp
=
1490 (struct lwes_event_attribute
*)
1491 lwes_hash_get (enumeration
->hash_enum
.enum_hash
, (tmpAttrName
));
1494 (*type
) = (LWES_TYPE
) (tmp
->type
);
1495 (*key
) = tmpAttrName
;