add license to distribution file
[lwes.git] / src / lwes_event.c
blobf70b7e096da50b5b75da2833a90dc3a8ad7aec07
1 /*======================================================================*
2 * Copyright (c) 2008, Yahoo! Inc. All rights reserved. *
3 * *
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>
17 #include <limits.h>
18 #include <errno.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
31 (LWES_BYTE attrType,
32 void * attrValue);
34 static int
35 lwes_event_add
36 (struct lwes_event* event,
37 LWES_CONST_SHORT_STRING attrNameIn,
38 LWES_BYTE attrType,
39 void* attrValue);
41 int
42 lwes_INT_64_from_hex_string
43 (const char *buffer,
44 LWES_INT_64* an_int64);
46 int
47 lwes_U_INT_64_from_hex_string
48 (const char *buffer,
49 LWES_U_INT_64* a_uint64);
51 /*************************************************************************
52 PUBLIC API
53 *************************************************************************/
54 struct lwes_event *
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));
61 if (event == NULL)
63 return NULL;
66 event->eventName = NULL;
67 event->number_of_attributes = 0;
68 event->type_db = db;
69 event->attributes = lwes_hash_create ();
70 if (event->attributes == NULL)
72 free(event);
73 return NULL;
76 return event;
79 /* PUBLIC : Create the memory for an event */
80 struct lwes_event *
81 lwes_event_create
82 (struct lwes_event_type_db *db,
83 LWES_CONST_SHORT_STRING name)
85 struct lwes_event *event;
87 if (name == NULL)
89 return NULL;
92 event = (struct lwes_event *)malloc (sizeof (struct lwes_event));
94 if (event == NULL)
96 return NULL;
99 event->eventName = NULL;
100 event->number_of_attributes = 0;
101 event->type_db = db;
102 event->attributes = lwes_hash_create ();
103 if (event->attributes == NULL)
105 free(event);
106 return NULL;
109 if (lwes_event_set_name (event,name) < 0)
111 /* Having problems, bail and return NULL */
112 lwes_hash_destroy (event->attributes);
113 free (event);
114 return NULL;
117 return event;
120 struct lwes_event *
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;
128 if (name == NULL)
130 return NULL;
133 event = (struct lwes_event *)malloc(sizeof(struct lwes_event));
135 if (event == NULL)
137 return NULL;
140 event->eventName = NULL;
141 event->number_of_attributes = 0;
142 event->type_db = db;
143 event->attributes = lwes_hash_create ();
145 if (event->attributes == NULL)
147 free (event);
148 return NULL;
151 if (lwes_event_set_name(event,name) < 0)
153 /* Having memory problems, bail */
154 lwes_hash_destroy (event->attributes);
155 free (event);
156 return NULL;
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);
167 free (event);
168 return NULL;
171 return event;
175 lwes_event_set_name
176 (struct lwes_event *event,
177 LWES_CONST_SHORT_STRING name)
179 if (event == NULL || name == NULL || event->eventName != NULL)
181 return -1;
184 event->eventName =
185 (LWES_SHORT_STRING) malloc (sizeof (LWES_CHAR)*(strlen (name)+1));
187 if (event->eventName == NULL)
189 return -3;
192 strcpy (event->eventName,name);
194 return 0;
198 lwes_event_set_encoding
199 (struct lwes_event *event,
200 LWES_INT_16 encoding)
202 LWES_INT_16 tmp_encoding;
204 if (event == NULL)
206 return -1;
209 if ( lwes_event_get_INT_16 (event, LWES_ENCODING, &tmp_encoding) == -1 )
211 return lwes_event_set_INT_16 (event, LWES_ENCODING, encoding);
213 return -1;
218 lwes_event_get_name
219 (struct lwes_event *event, LWES_SHORT_STRING *name)
221 if (event == NULL || name == NULL)
223 return -1;
225 *name = event->eventName;
226 return 0;
230 lwes_event_get_number_of_attributes
231 (struct lwes_event *event,
232 LWES_U_INT_16 *number)
234 if (event == NULL || number == NULL)
236 return -1;
238 *number = event->number_of_attributes;
239 return 0;
243 lwes_event_get_encoding
244 (struct lwes_event *event,
245 LWES_INT_16 *encoding)
247 if (event == NULL || encoding == NULL)
249 return -1;
252 return lwes_event_get_INT_16 (event,
253 (LWES_SHORT_STRING)LWES_ENCODING,
254 encoding);
257 /* PUBLIC : Cleanup the memory for an event */
259 lwes_event_destroy
260 (struct lwes_event *event)
262 struct lwes_event_attribute *tmp = NULL;
263 struct lwes_hash_enumeration e;
265 if (event == NULL)
267 return 0;
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);
283 tmp =
284 (struct lwes_event_attribute *)lwes_hash_remove (event->attributes,
285 tmpAttrName);
286 /* free the attribute name and value*/
287 if (tmpAttrName != NULL)
289 free(tmpAttrName);
291 if (tmp->value != NULL)
293 free(tmp->value);
295 /* free the attribute itself*/
296 if (tmp != NULL)
298 free(tmp);
303 /* free the now empty hash */
304 lwes_hash_destroy (event->attributes);
306 /* finally free the event structure */
307 free (event);
309 return 0;
312 /* PUBLIC : serialize the event and put it into a byte array */
314 lwes_event_to_bytes
315 (struct lwes_event *event,
316 LWES_BYTE_P bytes,
317 size_t num_bytes,
318 size_t offset)
320 struct lwes_event_attribute *tmp;
321 struct lwes_event_attribute *encodingAttr;
322 size_t tmpOffset = offset;
323 struct lwes_hash_enumeration e;
324 int ret = 0;
326 if ( event == NULL
327 || bytes == NULL
328 || num_bytes == 0
329 || offset >= num_bytes)
331 return -1;
334 /* start with the event name */
335 if (marshall_SHORT_STRING (event->eventName,
336 bytes,
337 num_bytes,
338 &tmpOffset))
340 /* then the number of attributes */
341 if (marshall_U_INT_16 (event->number_of_attributes,
342 bytes,
343 num_bytes,
344 &tmpOffset))
346 /* handle encoding first if it is set */
347 encodingAttr =
348 (struct lwes_event_attribute *)
349 lwes_hash_get (event->attributes,
350 (LWES_SHORT_STRING)LWES_ENCODING);
352 if (encodingAttr)
354 void* encodingValue = encodingAttr->value;
355 LWES_BYTE encodingType = encodingAttr->type;
356 if (encodingValue)
358 if (encodingType == LWES_INT_16_TOKEN)
360 if (marshall_SHORT_STRING
361 ((LWES_SHORT_STRING)LWES_ENCODING,
362 bytes,
363 num_bytes,
364 &tmpOffset) == 0
366 marshall_BYTE
367 (encodingType,
368 bytes,
369 num_bytes,
370 &tmpOffset) == 0
372 marshall_INT_16
373 (*((LWES_INT_16 *)encodingValue),
374 bytes,
375 num_bytes,
376 &tmpOffset) == 0)
378 return -2;
381 else
383 return -3;
386 else
388 return -4;
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))
403 continue;
406 tmp =
407 (struct lwes_event_attribute *)
408 lwes_hash_get (event->attributes, tmpAttrName);
410 if (marshall_SHORT_STRING (tmpAttrName,
411 bytes,
412 num_bytes,
413 &tmpOffset) == 0)
415 ret = -5;
417 else
419 if (marshall_BYTE (tmp->type,
420 bytes,
421 num_bytes,
422 &tmpOffset) == 0)
424 ret = -6;
426 else
428 if (tmp->type == LWES_U_INT_16_TOKEN)
430 if (marshall_U_INT_16 (*((LWES_U_INT_16 *)tmp->value),
431 bytes,
432 num_bytes,
433 &tmpOffset) == 0)
435 ret = -7;
438 else if (tmp->type == LWES_INT_16_TOKEN)
440 if (marshall_INT_16 (*((LWES_INT_16 *)tmp->value),
441 bytes,
442 num_bytes,
443 &tmpOffset) == 0)
445 ret = -8;
448 else if (tmp->type == LWES_U_INT_32_TOKEN)
450 if (marshall_U_INT_32 (*((LWES_U_INT_32 *)tmp->value),
451 bytes,
452 num_bytes,
453 &tmpOffset) == 0)
455 ret = -9;
458 else if (tmp->type == LWES_INT_32_TOKEN)
460 if (marshall_INT_32 (*((LWES_INT_32 *)tmp->value),
461 bytes,
462 num_bytes,
463 &tmpOffset) == 0)
465 ret = -10;
468 else if (tmp->type == LWES_U_INT_64_TOKEN)
470 if (marshall_U_INT_64 (*((LWES_U_INT_64 *)tmp->value),
471 bytes,
472 num_bytes,
473 &tmpOffset) == 0)
475 ret = -11;
478 else if (tmp->type == LWES_INT_64_TOKEN)
480 if (marshall_INT_64 (*((LWES_INT_64 *)tmp->value),
481 bytes,
482 num_bytes,
483 &tmpOffset) == 0)
485 ret = -12;
488 else if (tmp->type == LWES_BOOLEAN_TOKEN)
490 if (marshall_BOOLEAN (*((LWES_BOOLEAN *)tmp->value),
491 bytes,
492 num_bytes,
493 &tmpOffset) == 0)
495 ret = -13;
498 else if (tmp->type == LWES_IP_ADDR_TOKEN)
500 if (marshall_IP_ADDR (*((LWES_IP_ADDR *)tmp->value),
501 bytes,
502 num_bytes,
503 &tmpOffset) == 0)
505 ret = -14;
508 else if (tmp->type == LWES_STRING_TOKEN)
510 if (marshall_LONG_STRING ((LWES_LONG_STRING)tmp->value,
511 bytes,
512 num_bytes,
513 &tmpOffset) == 0)
515 ret = -15;
518 else
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 */
529 else
531 ret = -16;
534 else
536 ret = -17;
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,
546 LWES_BYTE_P bytes,
547 size_t num_bytes,
548 size_t offset,
549 struct lwes_event_deserialize_tmp *dtmp)
551 int i;
552 LWES_U_INT_16 tmp_number_of_attributes = 0;
553 size_t tmpOffset = offset;
555 LWES_BYTE tmp_byte;
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;
567 if ( event == NULL
568 || bytes == NULL
569 || num_bytes == 0
570 || offset >= num_bytes
571 || dtmp == NULL)
573 return -1;
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),
582 bytes,
583 num_bytes,
584 &tmpOffset))
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),
599 bytes,
600 num_bytes,
601 &tmpOffset))
603 /* unmarshall the type id */
604 if (unmarshall_BYTE (&tmp_byte,
605 bytes,
606 num_bytes,
607 &tmpOffset))
609 if (tmp_byte == LWES_U_INT_16_TOKEN)
611 if (unmarshall_U_INT_16 (&tmp_uint16,
612 bytes,
613 num_bytes,
614 &tmpOffset))
616 if (lwes_event_set_U_INT_16 (event,
617 tmp_short_str,
618 tmp_uint16)
619 < 0)
621 return -2;
624 else
626 return -3;
629 else if (tmp_byte == LWES_INT_16_TOKEN)
631 if (unmarshall_INT_16 (&tmp_int16,
632 bytes,
633 num_bytes,
634 &tmpOffset))
636 if (lwes_event_set_INT_16 (event,
637 tmp_short_str,
638 tmp_int16)
639 < 0)
641 return -4;
644 else
646 return -5;
649 else if (tmp_byte == LWES_U_INT_32_TOKEN)
651 if (unmarshall_U_INT_32 (&tmp_uint32,
652 bytes,
653 num_bytes,
654 &tmpOffset))
656 if (lwes_event_set_U_INT_32 (event,
657 tmp_short_str,
658 tmp_uint32)
659 < 0)
661 return -6;
664 else
666 return -7;
669 else if (tmp_byte == LWES_INT_32_TOKEN)
671 if (unmarshall_INT_32 (&tmp_int32,
672 bytes,
673 num_bytes,
674 &tmpOffset))
676 if (lwes_event_set_INT_32 (event,
677 tmp_short_str,
678 tmp_int32)
679 < 0)
681 return -8;
684 else
686 return -9;
689 else if (tmp_byte == LWES_U_INT_64_TOKEN)
691 if (unmarshall_U_INT_64 (&tmp_uint64,
692 bytes,
693 num_bytes,
694 &tmpOffset))
696 if (lwes_event_set_U_INT_64 (event,
697 tmp_short_str,
698 tmp_uint64)
699 < 0)
701 return -10;
704 else
706 return -11;
709 else if (tmp_byte == LWES_INT_64_TOKEN)
711 if (unmarshall_INT_64 (&tmp_int64,
712 bytes,
713 num_bytes,
714 &tmpOffset))
716 if (lwes_event_set_INT_64 (event,
717 tmp_short_str,
718 tmp_int64)
719 < 0)
721 return -12;
724 else
726 return -13;
729 else if (tmp_byte == LWES_BOOLEAN_TOKEN)
731 if (unmarshall_BOOLEAN (&tmp_boolean,
732 bytes,
733 num_bytes,
734 &tmpOffset))
736 if (lwes_event_set_BOOLEAN (event,
737 tmp_short_str,
738 tmp_boolean)
739 < 0)
741 return -14;
744 else
746 return -15;
749 else if (tmp_byte == LWES_IP_ADDR_TOKEN)
751 if (unmarshall_IP_ADDR (&tmp_ip_addr,
752 bytes,
753 num_bytes,
754 &tmpOffset))
756 if (lwes_event_set_IP_ADDR (event,
757 tmp_short_str,
758 tmp_ip_addr)
759 < 0)
761 return -16;
764 else
766 return -17;
769 else if (tmp_byte == LWES_STRING_TOKEN)
771 if (unmarshall_LONG_STRING (tmp_long_str,
772 (LONG_STRING_MAX+1),
773 bytes,
774 num_bytes,
775 &tmpOffset))
777 if (lwes_event_set_STRING (event,
778 tmp_short_str,
779 tmp_long_str)
780 < 0)
782 return -18;
785 else
787 return -19;
790 else
792 return -20;
795 else
797 return -21;
800 else
802 return -22;
806 else
808 return -23;
811 else
813 return -24;
816 else
818 return -25;
821 return (int)(tmpOffset-offset);
824 int lwes_event_set_U_INT_16 (struct lwes_event * event,
825 LWES_CONST_SHORT_STRING attrName,
826 LWES_U_INT_16 value)
828 int ret = 0;
829 LWES_U_INT_16 *attrValue;
831 if (event == NULL || attrName == NULL)
833 return -1;
836 attrValue = (LWES_U_INT_16 *)malloc (sizeof (LWES_U_INT_16));
838 if (attrValue == NULL)
840 return -3;
842 *attrValue = value;
844 ret = lwes_event_add (event, attrName, LWES_U_INT_16_TOKEN, attrValue);
845 if (ret < 0)
847 free (attrValue);
849 return ret;
852 int lwes_event_set_INT_16 (struct lwes_event * event,
853 LWES_CONST_SHORT_STRING attrName,
854 LWES_INT_16 value)
856 int ret = 0;
857 LWES_INT_16 *attrValue;
859 if (event == NULL || attrName == NULL)
861 return -1;
864 attrValue = (LWES_INT_16 *)malloc (sizeof (LWES_INT_16));
866 if (attrValue == NULL)
868 return -3;
870 *attrValue = value;
872 ret = lwes_event_add (event, attrName, LWES_INT_16_TOKEN, attrValue);
873 if (ret < 0)
875 free(attrValue);
877 return ret;
880 int lwes_event_set_U_INT_32 (struct lwes_event * event,
881 LWES_CONST_SHORT_STRING attrName,
882 LWES_U_INT_32 value)
884 int ret = 0;
885 LWES_U_INT_32 *attrValue;
887 if (event == NULL || attrName == NULL)
889 return -1;
892 attrValue = (LWES_U_INT_32 *)malloc(sizeof(LWES_U_INT_32));
894 if (attrValue == NULL)
896 return -3;
898 *attrValue = value;
900 ret = lwes_event_add (event, attrName, LWES_U_INT_32_TOKEN, attrValue);
901 if (ret < 0)
903 free (attrValue);
905 return ret;
908 int lwes_event_set_INT_32 (struct lwes_event * event,
909 LWES_CONST_SHORT_STRING attrName,
910 LWES_INT_32 value)
912 int ret = 0;
913 LWES_INT_32 *attrValue;
915 if (event == NULL || attrName == NULL)
917 return -1;
920 attrValue = (LWES_INT_32 *)malloc (sizeof (LWES_INT_32));
922 if (attrValue == NULL)
924 return -3;
926 *attrValue = value;
928 ret = lwes_event_add (event, attrName, LWES_INT_32_TOKEN, attrValue);
929 if (ret < 0)
931 free(attrValue);
933 return ret;
936 int lwes_event_set_U_INT_64 (struct lwes_event * event,
937 LWES_CONST_SHORT_STRING attrName,
938 LWES_U_INT_64 value)
940 int ret = 0;
941 LWES_U_INT_64 *attrValue;
943 if (event == NULL || attrName == NULL)
945 return -1;
948 attrValue = (LWES_U_INT_64 *)malloc (sizeof (LWES_U_INT_64));
950 if (attrValue == NULL)
952 return -3;
954 *attrValue = value;
956 ret = lwes_event_add (event, attrName, LWES_U_INT_64_TOKEN, attrValue);
957 if (ret < 0)
959 free (attrValue);
961 return ret;
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)
971 return -1;
973 if (lwes_INT_64_from_hex_string (uint64_string, &u_int_64) < 0)
975 return -2;
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,
982 LWES_INT_64 value)
984 int ret = 0;
985 LWES_INT_64 *attrValue;
987 if (event == NULL || attrName == NULL)
989 return -1;
992 attrValue = (LWES_INT_64 *)malloc (sizeof (LWES_INT_64));
994 if (attrValue == NULL)
996 return -3;
998 *attrValue = value;
1000 ret = lwes_event_add (event, attrName, LWES_INT_64_TOKEN, attrValue);
1001 if (ret < 0)
1003 free (attrValue);
1005 return ret;
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)
1012 LWES_INT_64 int_64;
1014 if (event == NULL || attrName == NULL || int64_string == NULL)
1016 return -1;
1019 if (lwes_INT_64_from_hex_string (int64_string,&int_64) < 0)
1021 return -2;
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)
1030 int ret = 0;
1031 LWES_LONG_STRING attrValue;
1033 if (event == NULL || attrName == NULL || value == NULL)
1035 return -1;
1038 attrValue = (LWES_LONG_STRING)malloc (sizeof (LWES_CHAR)*(strlen (value)+1));
1039 if (attrValue == NULL)
1041 return -3;
1043 strcpy(attrValue,value);
1045 ret = lwes_event_add (event, attrName, LWES_STRING_TOKEN, (void*)attrValue);
1046 if (ret < 0)
1048 free (attrValue);
1050 return ret;
1053 int lwes_event_set_IP_ADDR (struct lwes_event * event,
1054 LWES_CONST_SHORT_STRING attrName,
1055 LWES_IP_ADDR value)
1057 int ret = 0;
1058 LWES_IP_ADDR *attrValue;
1060 if (event == NULL || attrName == NULL)
1062 return -1;
1065 attrValue = (LWES_IP_ADDR *)malloc (sizeof (LWES_IP_ADDR));
1067 if (attrValue == NULL)
1069 return -3;
1071 *attrValue = value;
1073 ret = lwes_event_add (event, attrName, LWES_IP_ADDR_TOKEN, attrValue);
1074 if (ret < 0)
1076 free (attrValue);
1078 return ret;
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)
1085 int ret = 0;
1086 struct in_addr *attrValue;
1088 if (event == NULL || attrName == NULL || value == NULL)
1090 return -1;
1093 attrValue = (LWES_IP_ADDR *)malloc (sizeof (LWES_IP_ADDR));
1094 if (attrValue == NULL)
1096 return -3;
1098 attrValue->s_addr = inet_addr (value);
1100 ret = lwes_event_add (event, attrName, LWES_IP_ADDR_TOKEN, attrValue);
1101 if (ret < 0)
1103 free (attrValue);
1105 return ret;
1108 int lwes_event_set_BOOLEAN (struct lwes_event * event,
1109 LWES_CONST_SHORT_STRING attrName,
1110 LWES_BOOLEAN value)
1112 int ret = 0;
1113 LWES_BOOLEAN *attrValue;
1115 if (event == NULL || attrName == NULL)
1117 return -1;
1120 attrValue = (LWES_BOOLEAN *)malloc (sizeof (LWES_BOOLEAN));
1121 if (attrValue == NULL)
1123 return -3;
1125 *attrValue = value;
1127 ret = lwes_event_add (event, attrName, LWES_BOOLEAN_TOKEN, attrValue);
1128 if (ret < 0)
1130 free (attrValue);
1132 return ret;
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)
1146 return -1;
1149 tmp = (struct lwes_event_attribute *)lwes_hash_get (event->attributes, name);
1151 if (tmp)
1153 *value = (*((LWES_U_INT_16 *)tmp->value));
1154 return 0;
1157 return -1;
1160 int lwes_event_get_INT_16 (struct lwes_event *event,
1161 LWES_CONST_SHORT_STRING name,
1162 LWES_INT_16 *value)
1164 struct lwes_event_attribute *tmp;
1166 if (event == NULL || name == NULL || value == NULL)
1168 return -1;
1171 tmp = (struct lwes_event_attribute *)lwes_hash_get (event->attributes, name);
1173 if (tmp)
1175 *value = (*((LWES_INT_16 *)tmp->value));
1176 return 0;
1178 return -1;
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)
1189 return -1;
1192 tmp = (struct lwes_event_attribute *)lwes_hash_get (event->attributes, name);
1194 if (tmp)
1196 *value = (*((LWES_U_INT_32 *)tmp->value));
1197 return 0;
1200 return -1;
1203 int lwes_event_get_INT_32 (struct lwes_event *event,
1204 LWES_CONST_SHORT_STRING name,
1205 LWES_INT_32 *value)
1207 struct lwes_event_attribute *tmp;
1209 if (event == NULL || name == NULL || value == NULL)
1211 return -1;
1214 tmp = (struct lwes_event_attribute *)lwes_hash_get (event->attributes, name);
1216 if (tmp)
1218 *value = (*((LWES_INT_32 *)tmp->value));
1219 return 0;
1222 return -1;
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)
1233 return -1;
1236 tmp = (struct lwes_event_attribute *)lwes_hash_get (event->attributes, name);
1238 if (tmp)
1240 *value = (*((LWES_U_INT_64 *)tmp->value));
1241 return 0;
1244 return -1;
1247 int lwes_event_get_INT_64 (struct lwes_event *event,
1248 LWES_CONST_SHORT_STRING name,
1249 LWES_INT_64 *value)
1251 struct lwes_event_attribute *tmp;
1253 if (event == NULL || name == NULL || value == NULL)
1255 return -1;
1258 tmp = (struct lwes_event_attribute *)lwes_hash_get (event->attributes, name);
1260 if (tmp)
1262 *value = (*((LWES_INT_64 *)tmp->value));
1263 return 0;
1266 return -1;
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)
1277 return -1;
1280 tmp = (struct lwes_event_attribute *)lwes_hash_get (event->attributes, name);
1282 if (tmp)
1284 *value = (((LWES_LONG_STRING)tmp->value));
1285 return 0;
1288 return -1;
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)
1298 return -1;
1301 tmp = (struct lwes_event_attribute *)lwes_hash_get (event->attributes, name);
1303 if (tmp)
1305 *value = (*((LWES_IP_ADDR *)tmp->value));
1306 return 0;
1308 return -1;
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)
1319 return -1;
1322 tmp = (struct lwes_event_attribute *)lwes_hash_get(event->attributes, name);
1324 if (tmp)
1326 *value = (*((LWES_BOOLEAN *)tmp->value));
1327 return 0;
1329 return -1;
1332 /*************************************************************************
1333 PRIVATE API
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)
1345 return NULL;
1348 attribute->type = attrType;
1349 attribute->value = attrValue;
1351 return attribute;
1354 /* add an attribute to an event */
1355 static int
1356 lwes_event_add (struct lwes_event* event,
1357 LWES_CONST_SHORT_STRING attrNameIn,
1358 LWES_BYTE attrType,
1359 void* attrValue)
1361 struct lwes_event_attribute* attribute = NULL;
1362 LWES_SHORT_STRING attrName = NULL;
1363 int ret = 0;
1365 /* check against the event db */
1366 if (event->type_db != NULL
1367 && lwes_event_type_db_check_for_attribute (event->type_db,
1368 attrNameIn,
1369 event->eventName) == 0)
1371 return -1;
1373 if (event->type_db != NULL
1374 && lwes_event_type_db_check_for_type (event->type_db,
1375 attrType,
1376 attrNameIn,
1377 event->eventName) == 0)
1379 return -2;
1382 /* copy the attribute name */
1383 attrName =
1384 (LWES_SHORT_STRING) malloc( sizeof(LWES_CHAR)*(strlen (attrNameIn)+1));
1385 if (attrName == NULL)
1387 return -3;
1389 attrName[0] = '\0';
1390 strcat (attrName,attrNameIn);
1392 /* create the attribute */
1393 attribute = lwes_event_attribute_create (attrType, attrValue);
1394 if (attribute == NULL)
1396 free (attrName);
1397 return -3;
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
1406 if (ret < 0)
1408 free (attribute);
1409 free (attrName);
1410 return ret;
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)
1422 char *endptr;
1424 /* manpage for strtoull suggests setting errno to zero then checking
1425 * for error afterwards
1427 errno = 0;
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
1432 * out_length)
1434 if (errno == ERANGE
1435 || ((int)strlen (buffer) > (int)(endptr - buffer)))
1437 return -1;
1440 return 0;
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;
1454 int ret;
1456 ret = lwes_U_INT_64_from_hex_string (buffer, &a_uint64);
1458 if (ret < 0)
1460 return ret;
1463 *an_int64 = (LWES_INT_64)a_uint64;
1465 return 0;
1469 lwes_event_keys
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,
1480 LWES_TYPE *type)
1482 LWES_SHORT_STRING tmpAttrName =
1483 lwes_hash_enumeration_next_element (&(enumeration->hash_enum));
1484 (*key) = NULL;
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));
1492 if (tmp != NULL)
1494 (*type) = (LWES_TYPE) (tmp->type);
1495 (*key) = tmpAttrName;
1496 return 1;
1499 return 0;