1 /*======================================================================*
2 * Copyright (C) 2008 Light Weight Event System *
3 * All rights reserved. *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the Free Software *
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
18 * Boston, MA 02110-1301 USA. *
19 *======================================================================*/
20 #include "lwes_listener.h"
21 #include "lwes_event.h"
22 #include "lwes_time_functions.h"
23 #include "lwes_marshall_functions.h"
25 struct lwes_listener
*
27 (LWES_SHORT_STRING address
,
28 LWES_SHORT_STRING iface
,
31 struct lwes_listener
*listener
=
32 (struct lwes_listener
*) malloc (sizeof (struct lwes_listener
));
34 if ( listener
== NULL
)
39 /* I originally was allocating on the stack, but that fails on freebsd,
40 so I'll malloc and free this here */
41 listener
->buffer
= (LWES_BYTE_P
) malloc (sizeof (LWES_BYTE
)*MAX_MSG_SIZE
);
43 if ( listener
->buffer
== NULL
)
45 if ( listener
!= NULL
)
51 (struct lwes_event_deserialize_tmp
*)
52 malloc (sizeof (struct lwes_event_deserialize_tmp
));
53 if ( listener
->dtmp
== NULL
)
55 if ( listener
->buffer
!= NULL
)
56 free (listener
->buffer
);
57 if ( listener
!= NULL
)
62 if ( (lwes_net_open (&(listener
->connection
),address
,iface
,port
) != 0) ||
63 (lwes_net_recv_bind (&(listener
->connection
)) != 0) )
65 if ( listener
->dtmp
!= NULL
)
66 free (listener
->dtmp
);
67 if ( listener
->buffer
!= NULL
)
68 free (listener
->buffer
);
69 if ( listener
!= NULL
)
78 lwes_listener_add_header_fields
79 (struct lwes_listener
*listener
,
85 size_t offset_to_num_attrs
;
87 LWES_U_INT_16 num_attrs
;
88 LWES_INT_64 receipt_time
;
89 LWES_IP_ADDR sender_ip
;
90 LWES_U_INT_16 sender_port
;
92 /* grab some information from the packet and add it to the event */
93 receipt_time
= currentTimeMillisLongLong();
94 sender_ip
= listener
->connection
.sender_ip_addr
.sin_addr
;
95 sender_port
= ntohs (listener
->connection
.sender_ip_addr
.sin_port
);
97 /* deserialize the event name */
98 offset_to_num_attrs
= 0;
99 if (unmarshall_SHORT_STRING (listener
->dtmp
->tmp_string
,
100 (SHORT_STRING_MAX
+1),
103 &offset_to_num_attrs
) == 0)
108 /* keep track of offset of the number of attributes since
110 tmp_offset
= offset_to_num_attrs
;
111 if (unmarshall_U_INT_16 (&num_attrs
,
119 /* add receipt time to the event */
120 if ( marshall_SHORT_STRING ((LWES_SHORT_STRING
)"ReceiptTime",
124 || marshall_BYTE (LWES_INT_64_TOKEN
,
128 || marshall_INT_64 (receipt_time
,
137 /* add sender ip to the event */
138 if ( marshall_SHORT_STRING ((LWES_SHORT_STRING
)"SenderIP",
142 || marshall_BYTE (LWES_IP_ADDR_TOKEN
,
146 || marshall_IP_ADDR (sender_ip
,
155 /* add sender port to the event */
156 if ( marshall_SHORT_STRING ((LWES_SHORT_STRING
)"SenderPort",
160 || marshall_BYTE (LWES_U_INT_16_TOKEN
,
164 || marshall_U_INT_16 (sender_port
,
173 /* finally put the new number of attributes into the appropriate place */
174 if (marshall_U_INT_16 (num_attrs
,
177 &offset_to_num_attrs
) == 0)
187 lwes_listener_event_has_name
190 LWES_CONST_SHORT_STRING name
)
192 size_t serialized_name_len
;
194 /* NULL bytes is an error */
200 /* minimum length is 1 byte of length and one character, so length
201 should be at least 2 */
207 /* event name must be non null */
213 /* first byte is the length */
214 serialized_name_len
= (LWES_BYTE
)bytes
[0];
216 /* compare the lengths of the serialized and passed in names */
217 if (serialized_name_len
!= strlen (name
))
222 /* finally compare the names themselves */
224 /* name is offset by one byte */
225 return memcmp ((const unsigned char *)&(bytes
[1]), name
, strlen (name
));
229 /* FIXME: Make private in next major release of lwes */
231 lwes_listener_recv_process_event
232 (struct lwes_listener
*listener
,
233 struct lwes_event
*event
,
238 if ((ret
= lwes_listener_add_header_fields (listener
,
246 return lwes_event_from_bytes
247 (event
, listener
->buffer
, n
, 0, listener
->dtmp
);
252 (struct lwes_listener
*listener
,
253 struct lwes_event
*event
)
257 if ( (n
= lwes_listener_recv_bytes (listener
,
264 return lwes_listener_recv_process_event (listener
, event
, n
);
268 lwes_listener_recv_by
269 (struct lwes_listener
*listener
,
270 struct lwes_event
*event
,
271 unsigned int timeout_ms
)
275 if ( (n
= lwes_listener_recv_bytes_by (listener
,
283 return lwes_listener_recv_process_event (listener
, event
, n
);
288 lwes_listener_recv_bytes
289 (struct lwes_listener
*listener
,
295 if ((n
= lwes_net_recv_bytes (&(listener
->connection
),
306 lwes_listener_recv_bytes_by
307 (struct lwes_listener
*listener
,
310 unsigned int timeout_ms
)
314 if ((n
= lwes_net_recv_bytes_by (&(listener
->connection
),
327 lwes_listener_destroy
328 (struct lwes_listener
*listener
)
332 ret
= lwes_net_close (&(listener
->connection
));
334 if ( listener
->buffer
!= NULL
)
335 free (listener
->buffer
);
336 if ( listener
->dtmp
!= NULL
)
337 free (listener
->dtmp
);
338 if ( listener
!= NULL
)