Asterisk - The Open Source Telephony Project GIT-master-67613d1
Functions
event.h File Reference
#include "asterisk/event_defs.h"
Include dependency graph for event.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

int ast_event_append_eid (struct ast_event **event)
 Append the global EID IE. More...
 
int ast_event_append_ie_bitflags (struct ast_event **event, enum ast_event_ie_type ie_type, uint32_t bitflags)
 Append an information element that has a bitflags payload. More...
 
int ast_event_append_ie_raw (struct ast_event **event, enum ast_event_ie_type ie_type, const void *data, size_t data_len)
 Append an information element that has a raw payload. More...
 
int ast_event_append_ie_str (struct ast_event **event, enum ast_event_ie_type ie_type, const char *str)
 Append an information element that has a string payload. More...
 
int ast_event_append_ie_uint (struct ast_event **event, enum ast_event_ie_type ie_type, uint32_t data)
 Append an information element that has an integer payload. More...
 
void ast_event_destroy (struct ast_event *event)
 Destroy an event. More...
 
enum ast_event_ie_pltype ast_event_get_ie_pltype (enum ast_event_ie_type ie_type)
 Get the payload type for a given information element type. More...
 
const void * ast_event_get_ie_raw (const struct ast_event *event, enum ast_event_ie_type ie_type)
 Get the value of an information element that has a raw payload. More...
 
uint16_t ast_event_get_ie_raw_payload_len (const struct ast_event *event, enum ast_event_ie_type ie_type)
 Get the length of the raw payload for a particular IE. More...
 
const char * ast_event_get_ie_str (const struct ast_event *event, enum ast_event_ie_type ie_type)
 Get the value of an information element that has a string payload. More...
 
const char * ast_event_get_ie_type_name (enum ast_event_ie_type ie_type)
 Get the string representation of an information element type. More...
 
uint32_t ast_event_get_ie_uint (const struct ast_event *event, enum ast_event_ie_type ie_type)
 Get the value of an information element that has an integer payload. More...
 
size_t ast_event_get_size (const struct ast_event *event)
 Get the size of an event. More...
 
enum ast_event_type ast_event_get_type (const struct ast_event *event)
 Get the type for an event. More...
 
const char * ast_event_get_type_name (const struct ast_event *event)
 Get the string representation of the type of the given event. More...
 
const char * ast_event_iterator_get_ie_str (struct ast_event_iterator *iterator)
 Get the value of the current IE in the iterator as a string payload. More...
 
enum ast_event_ie_type ast_event_iterator_get_ie_type (struct ast_event_iterator *iterator)
 Get the type of the current IE in the iterator instance. More...
 
uint32_t ast_event_iterator_get_ie_uint (struct ast_event_iterator *iterator)
 Get the value of the current IE in the iterator as an integer payload. More...
 
int ast_event_iterator_init (struct ast_event_iterator *iterator, const struct ast_event *event)
 Initialize an event iterator instance. More...
 
int ast_event_iterator_next (struct ast_event_iterator *iterator)
 Move iterator instance to next IE. More...
 
size_t ast_event_minimum_length (void)
 Get the minimum length of an ast_event. More...
 
struct ast_eventast_event_new (enum ast_event_type event_type,...)
 Create a new event. More...
 
int ast_event_str_to_ie_type (const char *str, enum ast_event_ie_type *ie_type)
 Convert a string to an IE type. More...
 

Detailed Description

Author
Russell Bryant russe.nosp@m.ll@d.nosp@m.igium.nosp@m..com Generic event system

Definition in file event.h.

Function Documentation

◆ ast_event_append_eid()

int ast_event_append_eid ( struct ast_event **  event)

Append the global EID IE.

Parameters
eventthe event to append IE to
Note
For ast_event_new() that includes IEs, this is done automatically for you.
Return values
0success
-1failure

Definition at line 518 of file event.c.

519{
522}
int ast_event_append_ie_raw(struct ast_event **event, enum ast_event_ie_type ie_type, const void *data, size_t data_len)
Append an information element that has a raw payload.
Definition: event.c:374
@ AST_EVENT_IE_EID
Entity ID Used by All events Payload type: RAW This IE indicates which server the event originated fr...
Definition: event_defs.h:272
Definition: astman.c:222
struct ast_eid ast_eid_default
Global EID.
Definition: options.c:93

References ast_eid_default, ast_event_append_ie_raw(), and AST_EVENT_IE_EID.

Referenced by ast_event_new().

◆ ast_event_append_ie_bitflags()

int ast_event_append_ie_bitflags ( struct ast_event **  event,
enum ast_event_ie_type  ie_type,
uint32_t  bitflags 
)

Append an information element that has a bitflags payload.

Parameters
eventthe event that the IE will be appended to
ie_typethe type of IE to append
bitflagsthe flags that are the payload of the IE
Return values
0success
-1failure
Since
1.8

The pointer to the event will get updated with the new location for the event that now contains the appended information element. If the re-allocation of the memory for this event fails, it will be set to NULL.

Definition at line 367 of file event.c.

369{
370 flags = htonl(flags);
371 return ast_event_append_ie_raw(event, ie_type, &flags, sizeof(flags));
372}

References ast_event_append_ie_raw().

Referenced by ast_event_new().

◆ ast_event_append_ie_raw()

int ast_event_append_ie_raw ( struct ast_event **  event,
enum ast_event_ie_type  ie_type,
const void *  data,
size_t  data_len 
)

Append an information element that has a raw payload.

Parameters
eventthe event that the IE will be appended to
ie_typethe type of IE to append
dataA pointer to the raw data for the payload of the IE
data_lenThe amount of data to copy into the payload
Return values
0success
-1failure

The pointer to the event will get updated with the new location for the event that now contains the appended information element. If the re-allocation of the memory for this event fails, it will be set to NULL.

Definition at line 374 of file event.c.

376{
377 struct ast_event_ie *ie;
378 struct ast_event *old_event;
379 unsigned int extra_len;
380 uint16_t event_len;
381
382 event_len = ntohs((*event)->event_len);
383 extra_len = sizeof(*ie) + data_len;
384
385 old_event = *event;
386 *event = ast_realloc(*event, event_len + extra_len);
387 if (!*event) {
388 ast_free(old_event);
389 return -1;
390 }
391
392 ie = (struct ast_event_ie *) ( ((char *) *event) + event_len );
393 ie->ie_type = htons(ie_type);
394 ie->ie_payload_len = htons(data_len);
395 memcpy(ie->ie_payload, data, data_len);
396
397 (*event)->event_len = htons(event_len + extra_len);
398
399 return 0;
400}
#define ast_free(a)
Definition: astmm.h:180
#define ast_realloc(p, len)
A wrapper for realloc()
Definition: astmm.h:226
An event information element.
Definition: event.c:53
unsigned char ie_payload[0]
Definition: event.c:57
uint16_t ie_payload_len
Definition: event.c:56
enum ast_event_ie_type ie_type
Definition: event.c:54
An event.
Definition: event.c:81
uint16_t event_len
Definition: event.c:85

References ast_free, ast_realloc, ast_event::event_len, ast_event_ie::ie_payload, ast_event_ie::ie_payload_len, and ast_event_ie::ie_type.

Referenced by ast_event_append_eid(), ast_event_append_ie_bitflags(), ast_event_append_ie_str(), ast_event_append_ie_uint(), and ast_event_new().

◆ ast_event_append_ie_str()

int ast_event_append_ie_str ( struct ast_event **  event,
enum ast_event_ie_type  ie_type,
const char *  str 
)

Append an information element that has a string payload.

Parameters
eventthe event that the IE will be appended to
ie_typethe type of IE to append
strThe string for the payload of the IE
Return values
0success
-1failure

The pointer to the event will get updated with the new location for the event that now contains the appended information element. If the re-allocation of the memory for this event fails, it will be set to NULL.

Definition at line 345 of file event.c.

347{
348 struct ast_event_ie_str_payload *str_payload;
349 size_t payload_len;
350
351 payload_len = sizeof(*str_payload) + strlen(str);
352 str_payload = ast_alloca(payload_len);
353
354 strcpy(str_payload->str, str);
355 str_payload->hash = ast_str_hash(str);
356
357 return ast_event_append_ie_raw(event, ie_type, str_payload, payload_len);
358}
const char * str
Definition: app_jack.c:147
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: astmm.h:288
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
Definition: strings.h:1259
The payload for a string information element.
Definition: event.c:63
char str[1]
The actual string, null terminated.
Definition: event.c:67
uint32_t hash
A hash calculated with ast_str_hash(), to speed up comparisons.
Definition: event.c:65

References ast_alloca, ast_event_append_ie_raw(), ast_str_hash(), ast_event_ie_str_payload::hash, str, and ast_event_ie_str_payload::str.

Referenced by ast_event_new(), and AST_TEST_DEFINE().

◆ ast_event_append_ie_uint()

int ast_event_append_ie_uint ( struct ast_event **  event,
enum ast_event_ie_type  ie_type,
uint32_t  data 
)

Append an information element that has an integer payload.

Parameters
eventthe event that the IE will be appended to
ie_typethe type of IE to append
dataThe integer for the payload of the IE
Return values
0success
-1failure

The pointer to the event will get updated with the new location for the event that now contains the appended information element. If the re-allocation of the memory for this event fails, it will be set to NULL.

Definition at line 360 of file event.c.

362{
363 data = htonl(data);
364 return ast_event_append_ie_raw(event, ie_type, &data, sizeof(data));
365}

References ast_event_append_ie_raw().

Referenced by ast_event_new(), and AST_TEST_DEFINE().

◆ ast_event_destroy()

void ast_event_destroy ( struct ast_event event)

Destroy an event.

Parameters
eventthe event to destroy

Definition at line 524 of file event.c.

525{
527}

References ast_free.

Referenced by AST_TEST_DEFINE(), cel_report_event(), corosync_ping(), publish_to_corosync(), and send_cluster_notify().

◆ ast_event_get_ie_pltype()

enum ast_event_ie_pltype ast_event_get_ie_pltype ( enum ast_event_ie_type  ie_type)

Get the payload type for a given information element type.

Parameters
ie_typethe information element type to get the payload type of
Returns
the payload type for the provided IE type
Since
1.6.1

Definition at line 218 of file event.c.

219{
220 if (ie_type <= 0 || ie_type >= ARRAY_LEN(ie_maps)) {
221 ast_log(LOG_ERROR, "Invalid IE type - '%d'\n", ie_type);
223 }
224
225 return ie_maps[ie_type].ie_pltype;
226}
#define ast_log
Definition: astobj2.c:42
static const struct ie_map ie_maps[AST_EVENT_IE_TOTAL]
@ AST_EVENT_IE_PLTYPE_UNKNOWN
Definition: event_defs.h:322
#define LOG_ERROR
enum ast_event_ie_pltype ie_pltype
Definition: event.c:129
#define ARRAY_LEN(a)
Definition: utils.h:666

References ARRAY_LEN, AST_EVENT_IE_PLTYPE_UNKNOWN, ast_log, ie_maps, ie_map::ie_pltype, and LOG_ERROR.

Referenced by dump_event(), and match_ie_val().

◆ ast_event_get_ie_raw()

const void * ast_event_get_ie_raw ( const struct ast_event event,
enum ast_event_ie_type  ie_type 
)

Get the value of an information element that has a raw payload.

Parameters
eventThe event to get the IE from
ie_typethe type of information element to retrieve
Returns
This returns the payload of the information element with the given type. If the information element isn't found, NULL will be returned.

Definition at line 311 of file event.c.

312{
313 struct ast_event_iterator iterator;
314 int res;
315
316 for (res = ast_event_iterator_init(&iterator, event); !res; res = ast_event_iterator_next(&iterator)) {
317 if (ast_event_iterator_get_ie_type(&iterator) == ie_type) {
318 return event_iterator_get_ie_raw(&iterator);
319 }
320 }
321
322 return NULL;
323}
static void * event_iterator_get_ie_raw(struct ast_event_iterator *iterator)
Definition: event.c:283
enum ast_event_ie_type ast_event_iterator_get_ie_type(struct ast_event_iterator *iterator)
Get the type of the current IE in the iterator instance.
Definition: event.c:264
int ast_event_iterator_next(struct ast_event_iterator *iterator)
Move iterator instance to next IE.
Definition: event.c:258
int ast_event_iterator_init(struct ast_event_iterator *iterator, const struct ast_event *event)
Initialize an event iterator instance.
Definition: event.c:242
#define NULL
Definition: resample.c:96
supposed to be an opaque type
Definition: event_defs.h:352

References ast_event_iterator_get_ie_type(), ast_event_iterator_init(), ast_event_iterator_next(), event_iterator_get_ie_raw(), and NULL.

Referenced by ast_event_get_ie_str(), ast_event_get_ie_uint(), ast_event_new(), corosync_node_alloc(), corosync_ping_to_event(), cpg_deliver_cb(), publish_cluster_discovery_to_stasis(), publish_corosync_ping_to_stasis(), publish_device_state_to_stasis(), publish_mwi_to_stasis(), and publish_to_corosync().

◆ ast_event_get_ie_raw_payload_len()

uint16_t ast_event_get_ie_raw_payload_len ( const struct ast_event event,
enum ast_event_ie_type  ie_type 
)

Get the length of the raw payload for a particular IE.

Parameters
eventThe event to get the IE payload length from
ie_typethe type of information element to get the length of
Returns
If an IE of type ie_type is found, its payload length is returned. Otherwise, 0 is returned.

Definition at line 330 of file event.c.

331{
332 struct ast_event_iterator iterator;
333 int res;
334
335 for (res = ast_event_iterator_init(&iterator, event); !res; res = ast_event_iterator_next(&iterator)) {
336 if (ast_event_iterator_get_ie_type(&iterator) == ie_type) {
338 }
339 }
340
341 return 0;
342}
static uint16_t event_iterator_get_ie_raw_payload_len(struct ast_event_iterator *iterator)
Definition: event.c:325

References ast_event_iterator_get_ie_type(), ast_event_iterator_init(), ast_event_iterator_next(), and event_iterator_get_ie_raw_payload_len().

◆ ast_event_get_ie_str()

const char * ast_event_get_ie_str ( const struct ast_event event,
enum ast_event_ie_type  ie_type 
)

Get the value of an information element that has a string payload.

Parameters
eventThe event to get the IE from
ie_typethe type of information element to retrieve
Returns
This returns the payload of the information element with the given type. If the information element isn't found, NULL will be returned.

Definition at line 302 of file event.c.

303{
304 const struct ast_event_ie_str_payload *str_payload;
305
306 str_payload = ast_event_get_ie_raw(event, ie_type);
307
308 return str_payload ? str_payload->str : NULL;
309}
const void * ast_event_get_ie_raw(const struct ast_event *event, enum ast_event_ie_type ie_type)
Get the value of an information element that has a raw payload.
Definition: event.c:311

References ast_event_get_ie_raw(), NULL, and ast_event_ie_str_payload::str.

Referenced by ast_cel_fill_record(), check_event(), corosync_node_alloc(), match_ie_val(), publish_device_state_to_stasis(), publish_mwi_to_stasis(), and test_sub().

◆ ast_event_get_ie_type_name()

const char * ast_event_get_ie_type_name ( enum ast_event_ie_type  ie_type)

Get the string representation of an information element type.

Parameters
ie_typethe information element type to get the string representation of
Returns
the string representation of the information element type
Since
1.6.1

Definition at line 208 of file event.c.

209{
210 if (ie_type <= 0 || ie_type >= ARRAY_LEN(ie_maps)) {
211 ast_log(LOG_ERROR, "Invalid IE type - '%d'\n", ie_type);
212 return "";
213 }
214
215 return ie_maps[ie_type].name;
216}
const char * name
Definition: event.c:130

References ARRAY_LEN, ast_log, ie_maps, LOG_ERROR, and ie_map::name.

Referenced by add_ip_json_object(), add_json_object(), alloc_security_event_json_object(), append_event_str_single(), append_json_single(), dump_event(), and events_are_equal().

◆ ast_event_get_ie_uint()

uint32_t ast_event_get_ie_uint ( const struct ast_event event,
enum ast_event_ie_type  ie_type 
)

Get the value of an information element that has an integer payload.

Parameters
eventThe event to get the IE from
ie_typethe type of information element to retrieve
Returns
This returns the payload of the information element with the given type. However, an IE with a payload of 0, and the case where no IE is found yield the same return value.

Definition at line 293 of file event.c.

294{
295 const uint32_t *ie_val;
296
297 ie_val = ast_event_get_ie_raw(event, ie_type);
298
299 return ie_val ? ntohl(get_unaligned_uint32(ie_val)) : 0;
300}
static unsigned int get_unaligned_uint32(const void *p)
Definition: unaligned.h:38

References ast_event_get_ie_raw(), and get_unaligned_uint32().

Referenced by ast_cel_fill_record(), check_event(), corosync_node_alloc(), dump_event(), match_ie_val(), publish_cluster_discovery_to_stasis(), publish_device_state_to_stasis(), and publish_mwi_to_stasis().

◆ ast_event_get_size()

size_t ast_event_get_size ( const struct ast_event event)

Get the size of an event.

Parameters
eventthe event to get the size of
Returns
the number of bytes contained in the event
Since
1.6.1

Definition at line 228 of file event.c.

229{
230 size_t res;
231
232 res = ntohs(event->event_len);
233
234 return res;
235}

Referenced by ao2_dup_event(), ast_event_iterator_init(), AST_TEST_DEFINE(), and publish_event_to_corosync().

◆ ast_event_get_type()

enum ast_event_type ast_event_get_type ( const struct ast_event event)

Get the type for an event.

Parameters
eventthe event to get the type for
Returns
the event type as represented by one of the values in the ast_event_type enum

Definition at line 288 of file event.c.

289{
290 return ntohs(event->type);
291}

Referenced by ast_event_get_type_name(), check_event(), check_events(), cpg_deliver_cb(), events_are_equal(), publish_cluster_discovery_to_stasis(), publish_corosync_ping_to_stasis(), publish_device_state_to_stasis(), publish_event_to_corosync(), publish_mwi_to_stasis(), and publish_to_corosync().

◆ ast_event_get_type_name()

const char * ast_event_get_type_name ( const struct ast_event event)

Get the string representation of the type of the given event.

  • event the event to get the type of
Returns
the string representation of the event type of the provided event
Since
1.6.1

Definition at line 194 of file event.c.

195{
196 enum ast_event_type type;
197
199
200 if ((unsigned int)type >= ARRAY_LEN(event_names)) {
201 ast_log(LOG_ERROR, "Invalid event type - '%u'\n", type);
202 return "";
203 }
204
205 return event_names[type];
206}
static const char type[]
Definition: chan_ooh323.c:109
static const char *const event_names[AST_EVENT_TOTAL]
Event Names.
Definition: event.c:109
enum ast_event_type ast_event_get_type(const struct ast_event *event)
Get the type for an event.
Definition: event.c:288
ast_event_type
Definition: event_defs.h:28

References ARRAY_LEN, ast_event_get_type(), ast_log, event_names, LOG_ERROR, and type.

Referenced by cpg_deliver_cb(), and publish_event_to_corosync().

◆ ast_event_iterator_get_ie_str()

const char * ast_event_iterator_get_ie_str ( struct ast_event_iterator iterator)

Get the value of the current IE in the iterator as a string payload.

Parameters
iteratorThe iterator instance
Returns
This returns the payload of the information element as a string.

Definition at line 274 of file event.c.

275{
276 const struct ast_event_ie_str_payload *str_payload;
277
278 str_payload = (struct ast_event_ie_str_payload *) iterator->ie->ie_payload;
279
280 return str_payload ? str_payload->str : NULL;
281}
struct ast_event_ie * ie
Definition: event_defs.h:355

References ast_event_iterator::ie, ast_event_ie::ie_payload, NULL, and ast_event_ie_str_payload::str.

Referenced by dump_event().

◆ ast_event_iterator_get_ie_type()

enum ast_event_ie_type ast_event_iterator_get_ie_type ( struct ast_event_iterator iterator)

Get the type of the current IE in the iterator instance.

Parameters
iteratorThe iterator instance
Returns
the ie type as represented by one of the value sin the ast_event_ie_type enum

Definition at line 264 of file event.c.

265{
266 return ntohs(iterator->ie->ie_type);
267}

References ast_event_iterator::ie, and ast_event_ie::ie_type.

Referenced by ast_event_get_ie_raw(), ast_event_get_ie_raw_payload_len(), dump_event(), and events_are_equal().

◆ ast_event_iterator_get_ie_uint()

uint32_t ast_event_iterator_get_ie_uint ( struct ast_event_iterator iterator)

Get the value of the current IE in the iterator as an integer payload.

Parameters
iteratorThe iterator instance
Returns
This returns the payload of the information element as a uint.

Definition at line 269 of file event.c.

270{
271 return ntohl(get_unaligned_uint32(iterator->ie->ie_payload));
272}

References get_unaligned_uint32(), ast_event_iterator::ie, and ast_event_ie::ie_payload.

Referenced by dump_event().

◆ ast_event_iterator_init()

int ast_event_iterator_init ( struct ast_event_iterator iterator,
const struct ast_event event 
)

Initialize an event iterator instance.

Parameters
iteratorThe iterator instance to initialize
eventThe event that will be iterated through
Return values
0Success, there are IEs available to iterate
-1Failure, there are no IEs in the event to iterate

Definition at line 242 of file event.c.

243{
244 int res = 0;
245
247 iterator->event = event;
248 if (iterator->event_len >= sizeof(*event) + sizeof(struct ast_event_ie)) {
249 iterator->ie = (struct ast_event_ie *) ( ((char *) event) + sizeof(*event) );
250 } else {
251 iterator->ie = NULL;
252 res = -1;
253 }
254
255 return res;
256}
size_t ast_event_get_size(const struct ast_event *event)
Get the size of an event.
Definition: event.c:228
const struct ast_event * event
Definition: event_defs.h:354
uint16_t event_len
Definition: event_defs.h:353

References ast_event_get_size(), ast_event_iterator::event, ast_event_iterator::event_len, ast_event_iterator::ie, and NULL.

Referenced by ast_event_get_ie_raw(), ast_event_get_ie_raw_payload_len(), dump_event(), and events_are_equal().

◆ ast_event_iterator_next()

int ast_event_iterator_next ( struct ast_event_iterator iterator)

Move iterator instance to next IE.

Parameters
iteratorThe iterator instance
Return values
0on success
-1if end is reached

Definition at line 258 of file event.c.

259{
260 iterator->ie = (struct ast_event_ie *) ( ((char *) iterator->ie) + sizeof(*iterator->ie) + ntohs(iterator->ie->ie_payload_len));
261 return ((iterator->event_len <= (((char *) iterator->ie) - ((char *) iterator->event))) ? -1 : 0);
262}

References ast_event_iterator::event, ast_event_iterator::event_len, ast_event_iterator::ie, and ast_event_ie::ie_payload_len.

Referenced by ast_event_get_ie_raw(), ast_event_get_ie_raw_payload_len(), dump_event(), and events_are_equal().

◆ ast_event_minimum_length()

size_t ast_event_minimum_length ( void  )

Get the minimum length of an ast_event.

Returns
minimum amount of memory that will be consumed by any ast_event.

Definition at line 529 of file event.c.

530{
531 return sizeof(struct ast_event);
532}

Referenced by cpg_deliver_cb().

◆ ast_event_new()

struct ast_event * ast_event_new ( enum ast_event_type  event_type,
  ... 
)

Create a new event.

Parameters
event_typeThe type of event to create

The rest of the arguments to this function specify information elements to add to the event. They are specified in the form:

<enum ast_event_ie_type>, [enum ast_event_ie_pltype, [payload] ]
ast_event_ie_type
Event Information Element types.
Definition: event_defs.h:68
ast_event_ie_pltype
Payload types for event information elements.
Definition: event_defs.h:321

and must end with AST_EVENT_IE_END.

If the ie_type specified is not AST_EVENT_IE_END, then it must be followed by a valid IE payload type. A payload must also be specified after the IE payload type.

Note
The EID IE will be appended automatically when this function is used with at least one IE specified.
Returns
This returns the event that has been created. If there is an error creating the event, NULL will be returned.

Example usage:

return;
}
struct ast_event * ast_event_new(enum ast_event_type event_type,...)
Create a new event.
Definition: event.c:402
@ AST_EVENT_IE_END
Definition: event_defs.h:70
@ AST_EVENT_IE_MAILBOX
Mailbox name.
Definition: event_defs.h:89
@ AST_EVENT_IE_OLDMSGS
Number of Used by: AST_EVENT_MWI Payload type: UINT.
Definition: event_defs.h:83
@ AST_EVENT_IE_NEWMSGS
Number of new messages Used by: AST_EVENT_MWI Payload type: UINT.
Definition: event_defs.h:77
@ AST_EVENT_MWI
Definition: event_defs.h:38
@ AST_EVENT_IE_PLTYPE_UINT
Definition: event_defs.h:326
@ AST_EVENT_IE_PLTYPE_STR
Definition: event_defs.h:328

This creates a MWI event with 3 information elements, a mailbox which is a string, and the number of new and old messages, specified as integers.

Definition at line 402 of file event.c.

403{
404 va_list ap;
405 struct ast_event *event;
406 enum ast_event_ie_type ie_type;
407 struct ast_event_ie_val *ie_val;
409
410 /* Invalid type */
411 if (type >= AST_EVENT_TOTAL) {
412 ast_log(LOG_WARNING, "Someone tried to create an event of invalid "
413 "type '%u'!\n", type);
414 return NULL;
415 }
416
417 va_start(ap, type);
418 for (ie_type = va_arg(ap, enum ast_event_ie_type);
420 ie_type = va_arg(ap, enum ast_event_ie_type))
421 {
422 struct ast_event_ie_val *ie_value = ast_malloc(sizeof(*ie_value));
423 int insert = 0;
424
425 memset(ie_value, 0, sizeof(*ie_value));
426 ie_value->ie_type = ie_type;
427 ie_value->ie_pltype = va_arg(ap, enum ast_event_ie_pltype);
428
429 switch (ie_value->ie_pltype) {
431 ie_value->payload.uint = va_arg(ap, uint32_t);
432 insert = 1;
433 break;
435 ie_value->payload.uint = va_arg(ap, uint32_t);
436 insert = 1;
437 break;
439 ie_value->payload.str = va_arg(ap, const char *);
440 insert = 1;
441 break;
443 {
444 void *data = va_arg(ap, void *);
445 size_t datalen = va_arg(ap, size_t);
446 ie_value->payload.raw = ast_malloc(datalen);
447 memcpy(ie_value->payload.raw, data, datalen);
448 ie_value->raw_datalen = datalen;
449 insert = 1;
450 break;
451 }
454 break;
455 }
456
457 if (insert) {
458 AST_LIST_INSERT_TAIL(&ie_vals, ie_value, entry);
459 } else {
460 ast_log(LOG_WARNING, "Unsupported PLTYPE(%d)\n", ie_value->ie_pltype);
461 }
462 }
463 va_end(ap);
464
465 if (!(event = ast_calloc(1, sizeof(*event)))) {
466 return NULL;
467 }
468
469 event->type = htons(type);
470 event->event_len = htons(sizeof(*event));
471
472 AST_LIST_TRAVERSE(&ie_vals, ie_val, entry) {
473 switch (ie_val->ie_pltype) {
475 ast_event_append_ie_str(&event, ie_val->ie_type, ie_val->payload.str);
476 break;
479 break;
482 break;
485 ie_val->payload.raw, ie_val->raw_datalen);
486 break;
489 break;
490 }
491
492 /* realloc inside one of the append functions failed */
493 if (!event) {
494 goto cleanup;
495 }
496 }
497
499 /* If the event is originating on this server, add the server's
500 * entity ID to the event. */
502 }
503
504cleanup:
505 AST_LIST_TRAVERSE_SAFE_BEGIN(&ie_vals, ie_val, entry) {
507
508 if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_RAW) {
509 ast_free(ie_val->payload.raw);
510 }
511 ast_free(ie_val);
512 }
514
515 return event;
516}
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:191
int ast_event_append_ie_bitflags(struct ast_event **event, enum ast_event_ie_type ie_type, uint32_t flags)
Append an information element that has a bitflags payload.
Definition: event.c:367
int ast_event_append_ie_str(struct ast_event **event, enum ast_event_ie_type ie_type, const char *str)
Append an information element that has a string payload.
Definition: event.c:345
int ast_event_append_ie_uint(struct ast_event **event, enum ast_event_ie_type ie_type, uint32_t data)
Append an information element that has an integer payload.
Definition: event.c:360
int ast_event_append_eid(struct ast_event **event)
Append the global EID IE.
Definition: event.c:518
@ AST_EVENT_TOTAL
Definition: event_defs.h:64
@ AST_EVENT_IE_PLTYPE_RAW
Definition: event_defs.h:330
@ AST_EVENT_IE_PLTYPE_BITFLAGS
Definition: event_defs.h:332
@ AST_EVENT_IE_PLTYPE_EXISTS
Definition: event_defs.h:324
#define LOG_WARNING
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:491
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:731
#define AST_LIST_HEAD_NOLOCK_STATIC(name, type)
Defines a structure to be used to hold a list of specified type, statically initialized.
Definition: linkedlists.h:346
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:615
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:529
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:557
static void * cleanup(void *unused)
Definition: pbx_realtime.c:124
enum ast_event_ie_pltype ie_pltype
Definition: event.c:94
union ast_event_ie_val::@347 payload
size_t raw_datalen
Definition: event.c:103
void * raw
Definition: event.c:101
uint32_t uint
Definition: event.c:96
enum ast_event_ie_type ie_type
Definition: event.c:93
const char * str
Definition: event.c:99
Definition: search.h:40

References ast_calloc, ast_event_append_eid(), ast_event_append_ie_bitflags(), ast_event_append_ie_raw(), ast_event_append_ie_str(), ast_event_append_ie_uint(), ast_event_get_ie_raw(), AST_EVENT_IE_EID, AST_EVENT_IE_END, AST_EVENT_IE_PLTYPE_BITFLAGS, AST_EVENT_IE_PLTYPE_EXISTS, AST_EVENT_IE_PLTYPE_RAW, AST_EVENT_IE_PLTYPE_STR, AST_EVENT_IE_PLTYPE_UINT, AST_EVENT_IE_PLTYPE_UNKNOWN, AST_EVENT_TOTAL, ast_free, AST_LIST_HEAD_NOLOCK_STATIC, AST_LIST_INSERT_TAIL, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_log, ast_malloc, cleanup(), ast_event_ie_val::ie_pltype, ast_event_ie_val::ie_type, LOG_WARNING, NULL, ast_event_ie_val::payload, ast_event_ie_val::raw, ast_event_ie_val::raw_datalen, ast_event_ie_val::str, type, and ast_event_ie_val::uint.

Referenced by ast_cel_create_event_with_time(), AST_TEST_DEFINE(), corosync_ping(), corosync_ping_to_event(), devstate_to_event(), fake_event(), mwi_to_event(), publish_corosync_ping_to_stasis(), and send_cluster_notify().

◆ ast_event_str_to_ie_type()

int ast_event_str_to_ie_type ( const char *  str,
enum ast_event_ie_type ie_type 
)

Convert a string to an IE type.

Parameters
strthe string to convert
ie_typean output parameter for the IE type
Return values
0success
non-zerofailure
Since
1.6.1