Asterisk - The Open Source Telephony Project  18.5.0
Data Structures | Macros | Typedefs | Enumerations | Functions
cel.h File Reference

Call Event Logging API. More...

#include "asterisk/event.h"
Include dependency graph for cel.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ast_cel_event_record
 Helper struct for getting the fields out of a CEL event. More...
 
struct  ast_cel_general_config
 A structure to hold CEL global configuration options. More...
 

Macros

#define AST_CEL_EVENT_RECORD_VERSION   2
 struct ABI version More...
 

Typedefs

typedef void(* ast_cel_backend_cb) (struct ast_event *event)
 CEL backend callback. More...
 

Enumerations

enum  ast_cel_event_type {
  AST_CEL_INVALID_VALUE = -1, AST_CEL_ALL = 0, AST_CEL_CHANNEL_START = 1, AST_CEL_CHANNEL_END = 2,
  AST_CEL_HANGUP = 3, AST_CEL_ANSWER = 4, AST_CEL_APP_START = 5, AST_CEL_APP_END = 6,
  AST_CEL_BRIDGE_ENTER = 7, AST_CEL_BRIDGE_EXIT = 8, AST_CEL_PARK_START = 9, AST_CEL_PARK_END = 10,
  AST_CEL_BLINDTRANSFER = 11, AST_CEL_ATTENDEDTRANSFER = 12, AST_CEL_USER_DEFINED = 13, AST_CEL_LINKEDID_END = 14,
  AST_CEL_PICKUP = 15, AST_CEL_FORWARD = 16, AST_CEL_LOCAL_OPTIMIZE = 17
}
 CEL event types. More...
 

Functions

int ast_cel_backend_register (const char *name, ast_cel_backend_cb backend_callback)
 Register a CEL backend. More...
 
int ast_cel_backend_unregister (const char *name)
 Unregister a CEL backend. More...
 
unsigned int ast_cel_check_enabled (void)
 Check to see if CEL is enabled. More...
 
struct ast_eventast_cel_create_event (struct ast_channel_snapshot *snapshot, enum ast_cel_event_type event_type, const char *userdefevname, struct ast_json *extra, const char *peer_str)
 Allocate and populate a CEL event structure. More...
 
struct ast_eventast_cel_create_event_with_time (struct ast_channel_snapshot *snapshot, enum ast_cel_event_type event_type, const struct timeval *event_time, const char *userdefevname, struct ast_json *extra, const char *peer_str)
 Allocate and populate a CEL event structure. More...
 
struct ast_channelast_cel_fabricate_channel_from_event (const struct ast_event *event)
 Create a fake channel from data in a CEL event. More...
 
int ast_cel_fill_record (const struct ast_event *event, struct ast_cel_event_record *r)
 Fill in an ast_cel_event_record from a CEL event. More...
 
void * ast_cel_general_config_alloc (void)
 Allocate a CEL configuration object. More...
 
struct ast_cel_general_configast_cel_get_config (void)
 Obtain the current CEL configuration. More...
 
const char * ast_cel_get_type_name (enum ast_cel_event_type type)
 Get the name of a CEL event type. More...
 
void ast_cel_publish_event (struct ast_channel *chan, enum ast_cel_event_type event_type, struct ast_json *blob)
 Publish a CEL event. More...
 
void ast_cel_set_config (struct ast_cel_general_config *config)
 Set the current CEL configuration. More...
 
enum ast_cel_event_type ast_cel_str_to_event_type (const char *name)
 Get the event type from a string. More...
 
struct stasis_topicast_cel_topic (void)
 Get the CEL topic. More...
 

Detailed Description

Call Event Logging API.

Todo:
TODO: There some event types that have been defined here, but are not yet used anywhere in the code. It would be really awesome if someone went through and had Asterisk generate these events where it is appropriate to do so. The defined, but unused events are: CONF_ENTER, CONF_EXIT, CONF_START, CONF_END, 3WAY_START, 3WAY_END, TRANSFER, and HOOKFLASH.

Definition in file cel.h.

Macro Definition Documentation

◆ AST_CEL_EVENT_RECORD_VERSION

#define AST_CEL_EVENT_RECORD_VERSION   2

struct ABI version

Note
This must be incremented when the struct changes.

Definition at line 141 of file cel.h.

Referenced by ast_cel_fabricate_channel_from_event(), ast_cel_fill_record(), cel_bs_put(), manager_log(), odbc_log(), pgsql_log(), radius_log(), and tds_log().

Typedef Documentation

◆ ast_cel_backend_cb

typedef void(* ast_cel_backend_cb) (struct ast_event *event)

CEL backend callback.

Definition at line 292 of file cel.h.

Enumeration Type Documentation

◆ ast_cel_event_type

CEL event types.

Enumerator
AST_CEL_INVALID_VALUE 
AST_CEL_ALL 
AST_CEL_CHANNEL_START 

channel birth

AST_CEL_CHANNEL_END 

channel end

AST_CEL_HANGUP 

hangup terminates connection

AST_CEL_ANSWER 

A ringing phone is answered.

AST_CEL_APP_START 

an app starts

AST_CEL_APP_END 

an app ends

AST_CEL_BRIDGE_ENTER 

channel enters a bridge

AST_CEL_BRIDGE_EXIT 

channel exits a bridge

AST_CEL_PARK_START 

a channel is parked

AST_CEL_PARK_END 

channel out of the park

AST_CEL_BLINDTRANSFER 

a transfer occurs

AST_CEL_ATTENDEDTRANSFER 

a transfer occurs

AST_CEL_USER_DEFINED 

a user-defined event, the event name field should be set

AST_CEL_LINKEDID_END 

the last channel with the given linkedid is retired

AST_CEL_PICKUP 

a directed pickup was performed on this channel

AST_CEL_FORWARD 

this call was forwarded somewhere else

AST_CEL_LOCAL_OPTIMIZE 

A local channel optimization occurred.

Definition at line 41 of file cel.h.

41  {
43  AST_CEL_ALL = 0,
44  /*! \brief channel birth */
46  /*! \brief channel end */
48  /*! \brief hangup terminates connection */
49  AST_CEL_HANGUP = 3,
50  /*! \brief A ringing phone is answered */
51  AST_CEL_ANSWER = 4,
52  /*! \brief an app starts */
54  /*! \brief an app ends */
55  AST_CEL_APP_END = 6,
56  /*! \brief channel enters a bridge */
58  /*! \brief channel exits a bridge */
60  /*! \brief a channel is parked */
62  /*! \brief channel out of the park */
63  AST_CEL_PARK_END = 10,
64  /*! \brief a transfer occurs */
66  /*! \brief a transfer occurs */
68  /*! \brief a user-defined event, the event name field should be set */
70  /*! \brief the last channel with the given linkedid is retired */
72  /*! \brief a directed pickup was performed on this channel */
73  AST_CEL_PICKUP = 15,
74  /*! \brief this call was forwarded somewhere else */
75  AST_CEL_FORWARD = 16,
76  /*! \brief A local channel optimization occurred */
78 };
the last channel with the given linkedid is retired
Definition: cel.h:71
A local channel optimization occurred.
Definition: cel.h:77
channel birth
Definition: cel.h:45
channel enters a bridge
Definition: cel.h:57
an app ends
Definition: cel.h:55
hangup terminates connection
Definition: cel.h:49
a transfer occurs
Definition: cel.h:65
a channel is parked
Definition: cel.h:61
a transfer occurs
Definition: cel.h:67
channel end
Definition: cel.h:47
A ringing phone is answered.
Definition: cel.h:51
channel out of the park
Definition: cel.h:63
a user-defined event, the event name field should be set
Definition: cel.h:69
channel exits a bridge
Definition: cel.h:59
an app starts
Definition: cel.h:53
a directed pickup was performed on this channel
Definition: cel.h:73
this call was forwarded somewhere else
Definition: cel.h:75

Function Documentation

◆ ast_cel_backend_register()

int ast_cel_backend_register ( const char *  name,
ast_cel_backend_cb  backend_callback 
)

Register a CEL backend.

Parameters
nameName of backend to register
backend_callbackCallback to register
Return values
zeroon success
non-zeroon failure
Since
12

Definition at line 1740 of file cel.c.

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_cleanup, ao2_global_obj_ref, ao2_link, ao2_ref, AST_MODFLAG_GLOBAL_SYMBOLS, AST_MODFLAG_LOAD_ORDER, AST_MODPRI_CORE, AST_MODULE_INFO(), AST_MODULE_SUPPORT_CORE, ast_strlen_zero, ASTERISK_GPL_KEY, cel_backend::callback, load_module(), cel_backend::name, NULL, RAII_VAR, reload(), reload_module(), and unload_module().

Referenced by load_config(), load_module(), my_load_module(), and test_cel_init_cb().

1741 {
1742  RAII_VAR(struct ao2_container *, backends, ao2_global_obj_ref(cel_backends), ao2_cleanup);
1743  struct cel_backend *backend;
1744 
1745  if (!backends || ast_strlen_zero(name) || !backend_callback) {
1746  return -1;
1747  }
1748 
1749  /* The backend object is immutable so it doesn't need a lock of its own. */
1750  backend = ao2_alloc_options(sizeof(*backend) + 1 + strlen(name), NULL,
1752  if (!backend) {
1753  return -1;
1754  }
1755  strcpy(backend->name, name);/* Safe */
1756  backend->callback = backend_callback;
1757 
1758  ao2_link(backends, backend);
1759  ao2_ref(backend, -1);
1760  return 0;
1761 }
#define ao2_global_obj_ref(holder)
Definition: astobj2.h:925
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition: astobj2.h:406
#define NULL
Definition: resample.c:96
the list of registered channel types
Definition: channel.c:121
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:911
#define ao2_ref(o, delta)
Definition: astobj2.h:464
static const char name[]
Definition: cdr_mysql.c:74
ast_cel_backend_cb callback
Definition: cel.c:327
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
Generic container type.
char name[0]
Definition: cel.c:328
#define ao2_link(container, obj)
Definition: astobj2.h:1549

◆ ast_cel_backend_unregister()

int ast_cel_backend_unregister ( const char *  name)

Unregister a CEL backend.

Parameters
nameName of backend to unregister
Return values
zeroon success
non-zeroon failure
Since
12

Definition at line 1728 of file cel.c.

References ao2_find, ao2_global_obj_ref, ao2_ref, OBJ_NODATA, OBJ_SEARCH_KEY, and OBJ_UNLINK.

Referenced by cel_verify_and_cleanup_cb(), load_config(), my_unload_module(), tds_unload_module(), and unload_module().

1729 {
1730  struct ao2_container *backends = ao2_global_obj_ref(cel_backends);
1731 
1732  if (backends) {
1734  ao2_ref(backends, -1);
1735  }
1736 
1737  return 0;
1738 }
The arg parameter is a search key, but is not an object.
Definition: astobj2.h:1105
#define ao2_global_obj_ref(holder)
Definition: astobj2.h:925
the list of registered channel types
Definition: channel.c:121
#define ao2_ref(o, delta)
Definition: astobj2.h:464
static const char name[]
Definition: cdr_mysql.c:74
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1756
Generic container type.

◆ ast_cel_check_enabled()

unsigned int ast_cel_check_enabled ( void  )

Check to see if CEL is enabled.

Since
1.8
Return values
zeronot enabled
non-zeroenabled

Check to see if CEL is enabled.

Comparator function for cel_backend

Hashing function for dialstatus container

Comparator function for dialstatus container

Definition at line 343 of file cel.c.

References ao2_cleanup, ao2_global_obj_ref, ast_cel_general_config::enable, enabled, and cel_config::general.

Referenced by ast_cel_set_config(), handle_cli_status(), load_module(), and reload_module().

344 {
345  unsigned int enabled;
346  struct cel_config *cfg = ao2_global_obj_ref(cel_configs);
347 
348  enabled = (!cfg || !cfg->general) ? 0 : cfg->general->enable;
349  ao2_cleanup(cfg);
350  return enabled;
351 }
A container that holds all config-related information.
Definition: cel_custom.c:56
#define ao2_global_obj_ref(holder)
Definition: astobj2.h:925
struct ast_cel_general_config * general
Definition: cel.c:210
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
static int enabled
Definition: dnsmgr.c:91

◆ ast_cel_create_event()

struct ast_event* ast_cel_create_event ( struct ast_channel_snapshot snapshot,
enum ast_cel_event_type  event_type,
const char *  userdefevname,
struct ast_json extra,
const char *  peer_str 
)

Allocate and populate a CEL event structure.

Parameters
snapshotAn ast_channel_snapshot of the primary channel associated with this channel event.
event_typeThe type of call event being reported.
userdefevnameCustom name for the call event. (optional)
extraAn event-specific opaque JSON blob to be rendered and placed in the "CEL_EXTRA" information element of the call event. (optional)
peer_strA list of comma-separated peer channel names. (optional)
Since
12
Return values
Thecreated ast_event structure
NULLon failure

Definition at line 517 of file cel.c.

References ast_cel_create_event_with_time(), and ast_tvnow().

Referenced by append_expected_event_snapshot().

520 {
521  struct timeval eventtime = ast_tvnow();
522 
523  return ast_cel_create_event_with_time(snapshot, event_type, &eventtime,
524  userdefevname, extra, peer);
525 }
struct ast_event * ast_cel_create_event_with_time(struct ast_channel_snapshot *snapshot, enum ast_cel_event_type event_type, const struct timeval *event_time, const char *userdefevname, struct ast_json *extra, const char *peer)
Allocate and populate a CEL event structure.
Definition: cel.c:527
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150

◆ ast_cel_create_event_with_time()

struct ast_event* ast_cel_create_event_with_time ( struct ast_channel_snapshot snapshot,
enum ast_cel_event_type  event_type,
const struct timeval *  event_time,
const char *  userdefevname,
struct ast_json extra,
const char *  peer_str 
)

Allocate and populate a CEL event structure.

Parameters
snapshotAn ast_channel_snapshot of the primary channel associated with this channel event.
event_typeThe type of call event being reported.
event_timeThe time at which the event occurred.
userdefevnameCustom name for the call event. (optional)
extraAn event-specific opaque JSON blob to be rendered and placed in the "CEL_EXTRA" information element of the call event. (optional)
peer_strA list of comma-separated peer channel names. (optional)
Since
13.29.0
16.6.0
Return values
Thecreated ast_event structure
NULLon failure

Definition at line 527 of file cel.c.

References ast_channel_snapshot_peer::account, ast_channel_snapshot_base::accountcode, ast_channel_snapshot::amaflags, ast_channel_snapshot_caller::ani, ast_channel_snapshot_dialplan::appl, AST_EVENT_CEL, AST_EVENT_IE_CEL_ACCTCODE, AST_EVENT_IE_CEL_AMAFLAGS, AST_EVENT_IE_CEL_APPDATA, AST_EVENT_IE_CEL_APPNAME, AST_EVENT_IE_CEL_CHANNAME, AST_EVENT_IE_CEL_CIDANI, AST_EVENT_IE_CEL_CIDDNID, AST_EVENT_IE_CEL_CIDNAME, AST_EVENT_IE_CEL_CIDNUM, AST_EVENT_IE_CEL_CIDRDNIS, AST_EVENT_IE_CEL_CONTEXT, AST_EVENT_IE_CEL_EVENT_TIME, AST_EVENT_IE_CEL_EVENT_TIME_USEC, AST_EVENT_IE_CEL_EVENT_TYPE, AST_EVENT_IE_CEL_EXTEN, AST_EVENT_IE_CEL_EXTRA, AST_EVENT_IE_CEL_LINKEDID, AST_EVENT_IE_CEL_PEER, AST_EVENT_IE_CEL_PEERACCT, AST_EVENT_IE_CEL_UNIQUEID, AST_EVENT_IE_CEL_USEREVENT_NAME, AST_EVENT_IE_CEL_USERFIELD, AST_EVENT_IE_END, AST_EVENT_IE_PLTYPE_STR, AST_EVENT_IE_PLTYPE_UINT, ast_event_new(), ast_json_dump_string, ast_json_free(), ast_channel_snapshot::base, ast_channel_snapshot::caller, ast_channel_snapshot_dialplan::context, ast_channel_snapshot_dialplan::data, ast_channel_snapshot::dialplan, ast_channel_snapshot_caller::dnid, ast_channel_snapshot_dialplan::exten, ast_channel_snapshot_peer::linkedid, ast_channel_snapshot_caller::name, ast_channel_snapshot_base::name, NULL, ast_channel_snapshot_caller::number, ast_channel_snapshot::peer, RAII_VAR, ast_channel_snapshot_caller::rdnis, S_OR, ast_channel_snapshot_base::uniqueid, and ast_channel_snapshot_base::userfield.

Referenced by ast_cel_create_event(), and cel_report_event().

530 {
531  RAII_VAR(char *, extra_txt, NULL, ast_json_free);
532  if (extra) {
533  extra_txt = ast_json_dump_string(extra);
534  }
559 }
const ast_string_field data
Channel Event CID name Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:157
Channel Event app name Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:187
struct ast_channel_snapshot_base * base
Channel Event extra data Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:259
const ast_string_field name
const ast_string_field rdnis
void ast_json_free(void *p)
Asterisk's custom JSON allocator. Exposed for use by unit tests.
Definition: json.c:52
Channel Event channel name Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:181
Channel Event UniqueID Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:211
Channel Event context name Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:175
Channel Event app args/data Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:193
Channel Event peeraccount Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:253
Channel Event Time (micro-seconds) Used by: AST_EVENT_CEL Payload type: UINT.
Definition: event_defs.h:145
Channel Event CID dnid Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:235
#define ast_json_dump_string(root)
Encode a JSON value to a compact string.
Definition: json.h:763
const ast_string_field accountcode
const ast_string_field uniqueid
#define NULL
Definition: resample.c:96
struct ast_channel_snapshot_dialplan * dialplan
Channel Event Type Used by: AST_EVENT_CEL Payload type: UINT.
Definition: event_defs.h:133
Channel Event Time (seconds) Used by: AST_EVENT_CEL Payload type: UINT.
Definition: event_defs.h:139
Channel Event CID num Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:163
const ast_string_field context
Channel Event extension name Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:169
const ast_string_field appl
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:911
const ast_string_field exten
Channel Event Userfield Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:217
Channel Event CID RDNIS field Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:229
struct ast_channel_snapshot_caller * caller
const ast_string_field dnid
Channel Event User Event Name Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:151
const ast_string_field userfield
Channel Event Peer – for Things involving multiple channels, like BRIDGE Used by: AST_EVENT_CEL Payl...
Definition: event_defs.h:241
Channel Event CID ANI field Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:223
Channel Event AMA flags Used by: AST_EVENT_CEL Payload type: UINT.
Definition: event_defs.h:199
const ast_string_field ani
Channel Event LinkedID Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:247
struct ast_event * ast_event_new(enum ast_event_type event_type,...)
Create a new event.
Definition: event.c:402
const ast_string_field number
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
struct ast_channel_snapshot_peer * peer
Channel Event AccountCode Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:205
const ast_string_field name

◆ ast_cel_fabricate_channel_from_event()

struct ast_channel* ast_cel_fabricate_channel_from_event ( const struct ast_event event)

Create a fake channel from data in a CEL event.

Note
This function creates a fake channel containing the serialized channel data in the given cel event. It should be released with ast_channel_unref() but could be released with ast_channel_release().
Parameters
eventthe CEL event
Since
1.8
Returns
a channel with the data filled in, or NULL on error
Todo:
This function is very expensive, especially given that some CEL backends use it on every CEL event. This function really needs to go away at some point.

Definition at line 660 of file cel.c.

References ast_cel_event_record::account_code, ast_cel_event_record::amaflag, ast_party_caller::ani, ao2_cleanup, ao2_global_obj_ref, ast_cel_event_record::application_data, ast_cel_event_record::application_name, AST_CEL_EVENT_RECORD_VERSION, ast_cel_fill_record(), AST_CEL_USER_DEFINED, ast_channel_amaflags_set(), ast_channel_appl_set(), ast_channel_caller(), ast_channel_context_set(), ast_channel_data_set(), ast_channel_datastore_add(), ast_channel_dialed(), ast_channel_exten_set(), ast_channel_internal_set_fake_ids(), ast_channel_name_set(), ast_channel_redirecting(), ast_channel_unref, ast_channel_varshead(), ast_datastore_alloc, ast_datastore_free(), ast_dummy_channel_alloc, AST_LIST_INSERT_HEAD, ast_localtime(), ast_malloc, ast_strdup, ast_strftime(), ast_strlen_zero, ast_var_assign, ast_cel_event_record::caller_id_ani, ast_cel_event_record::caller_id_dnid, ast_cel_event_record::caller_id_name, ast_cel_event_record::caller_id_num, ast_cel_event_record::caller_id_rdnis, ast_cel_event_record::channel_name, ast_cel_event_record::context, ast_datastore::data, ast_cel_event_record::event_name, ast_cel_event_record::event_time, ast_cel_event_record::event_type, ast_cel_event_record::extension, ast_cel_event_record::extra, ast_party_redirecting::from, ast_party_caller::id, if(), ast_cel_event_record::linked_id, ast_party_id::name, NULL, ast_party_id::number, ast_party_dialed::number, ast_cel_event_record::peer, ast_cel_event_record::peer_account, RAII_VAR, ast_party_name::str, ast_party_number::str, ast_party_dialed::str, ast_cel_event_record::unique_id, ast_cel_event_record::user_defined_name, ast_cel_event_record::user_field, ast_party_name::valid, ast_party_number::valid, and ast_cel_event_record::version.

Referenced by custom_log(), and write_cel().

661 {
662  struct varshead *headp;
663  struct ast_var_t *newvariable;
664  const char *mixed_name;
665  char timebuf[30];
666  struct ast_channel *tchan;
667  struct ast_cel_event_record record = {
669  };
670  struct ast_datastore *datastore;
671  char *app_data;
672  RAII_VAR(struct cel_config *, cfg, ao2_global_obj_ref(cel_configs), ao2_cleanup);
673 
674  if (!cfg || !cfg->general) {
675  return NULL;
676  }
677 
678  /* do not call ast_channel_alloc because this is not really a real channel */
679  if (!(tchan = ast_dummy_channel_alloc())) {
680  return NULL;
681  }
682 
683  headp = ast_channel_varshead(tchan);
684 
685  /* first, get the variables from the event */
686  if (ast_cel_fill_record(event, &record)) {
687  ast_channel_unref(tchan);
688  return NULL;
689  }
690 
691  /* next, fill the channel with their data */
692  mixed_name = (record.event_type == AST_CEL_USER_DEFINED)
693  ? record.user_defined_name : record.event_name;
694  if ((newvariable = ast_var_assign("eventtype", mixed_name))) {
695  AST_LIST_INSERT_HEAD(headp, newvariable, entries);
696  }
697 
698  if (ast_strlen_zero(cfg->general->date_format)) {
699  snprintf(timebuf, sizeof(timebuf), "%ld.%06ld", (long) record.event_time.tv_sec,
700  (long) record.event_time.tv_usec);
701  } else {
702  struct ast_tm tm;
703  ast_localtime(&record.event_time, &tm, NULL);
704  ast_strftime(timebuf, sizeof(timebuf), cfg->general->date_format, &tm);
705  }
706 
707  if ((newvariable = ast_var_assign("eventtime", timebuf))) {
708  AST_LIST_INSERT_HEAD(headp, newvariable, entries);
709  }
710 
711  if ((newvariable = ast_var_assign("eventenum", record.event_name))) {
712  AST_LIST_INSERT_HEAD(headp, newvariable, entries);
713  }
714  if ((newvariable = ast_var_assign("userdeftype", record.user_defined_name))) {
715  AST_LIST_INSERT_HEAD(headp, newvariable, entries);
716  }
717  if ((newvariable = ast_var_assign("eventextra", record.extra))) {
718  AST_LIST_INSERT_HEAD(headp, newvariable, entries);
719  }
720 
721  ast_channel_caller(tchan)->id.name.valid = 1;
723  ast_channel_caller(tchan)->id.number.valid = 1;
725  ast_channel_caller(tchan)->ani.number.valid = 1;
730 
731  ast_channel_exten_set(tchan, record.extension);
732  ast_channel_context_set(tchan, record.context);
733  ast_channel_name_set(tchan, record.channel_name);
735  ast_channel_accountcode_set(tchan, record.account_code);
736  ast_channel_peeraccount_set(tchan, record.peer_account);
737  ast_channel_userfield_set(tchan, record.user_field);
738 
739  if ((newvariable = ast_var_assign("BRIDGEPEER", record.peer))) {
740  AST_LIST_INSERT_HEAD(headp, newvariable, entries);
741  }
742 
743  ast_channel_amaflags_set(tchan, record.amaflag);
744 
745  /* We need to store an 'application name' and 'application
746  * data' on the channel for logging purposes, but the channel
747  * structure only provides a place to store pointers, and it
748  * expects these pointers to be pointing to data that does not
749  * need to be freed. This means that the channel's destructor
750  * does not attempt to free any storage that these pointers
751  * point to. However, we can't provide data in that form directly for
752  * these structure members. In order to ensure that these data
753  * elements have a lifetime that matches the channel's
754  * lifetime, we'll put them in a datastore attached to the
755  * channel, and set's the channel's pointers to point into the
756  * datastore. The datastore will then be automatically destroyed
757  * when the channel is destroyed.
758  */
759 
760  if (!(datastore = ast_datastore_alloc(&fabricated_channel_datastore, NULL))) {
761  ast_channel_unref(tchan);
762  return NULL;
763  }
764 
765  if (!(app_data = ast_malloc(strlen(record.application_name) + strlen(record.application_data) + 2))) {
766  ast_datastore_free(datastore);
767  ast_channel_unref(tchan);
768  return NULL;
769  }
770 
771  ast_channel_appl_set(tchan, strcpy(app_data, record.application_name));
772  ast_channel_data_set(tchan, strcpy(app_data + strlen(record.application_name) + 1,
773  record.application_data));
774 
775  datastore->data = app_data;
776  ast_channel_datastore_add(tchan, datastore);
777 
778  return tchan;
779 }
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
const char * account_code
Definition: cel.h:161
const char * caller_id_name
Definition: cel.h:151
Helper struct for getting the fields out of a CEL event.
Definition: cel.h:136
const char * linked_id
Definition: cel.h:164
Main Channel structure associated with a channel.
struct ast_party_dialed::@246 number
Dialed/Called number.
char * str
Subscriber phone number (Malloced)
Definition: channel.h:292
A container that holds all config-related information.
Definition: cel_custom.c:56
char * str
Subscriber phone number (Malloced)
Definition: channel.h:387
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2981
struct ast_party_name name
Subscriber name.
Definition: channel.h:341
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Definition: channel.h:528
void ast_channel_appl_set(struct ast_channel *chan, const char *value)
const char * user_defined_name
Definition: cel.h:150
const char * application_data
Definition: cel.h:160
const char * application_name
Definition: cel.h:159
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
Definition: localtime.c:1739
const char * extension
Definition: cel.h:156
if(!yyg->yy_init)
Definition: ast_expr2f.c:868
char * str
Subscriber name (Malloced)
Definition: channel.h:265
#define ao2_global_obj_ref(holder)
Definition: astobj2.h:925
const char * caller_id_num
Definition: cel.h:152
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
Structure for a data store object.
Definition: datastore.h:68
struct varshead * ast_channel_varshead(struct ast_channel *chan)
#define NULL
Definition: resample.c:96
const char * extra
Definition: cel.h:168
static const struct ast_datastore_info fabricated_channel_datastore
Definition: cel.c:655
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition: datastore.c:68
#define ast_strlen_zero(foo)
Definition: strings.h:52
struct ast_party_id id
Caller party ID.
Definition: channel.h:421
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition: channel.h:428
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:911
#define ast_dummy_channel_alloc()
Create a fake channel structure.
Definition: channel.h:1283
const char * context
Definition: cel.h:157
uint32_t version
struct ABI version
Definition: cel.h:146
void ast_channel_amaflags_set(struct ast_channel *chan, enum ama_flags value)
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:193
enum ast_cel_event_type event_type
Definition: cel.h:147
const char * caller_id_rdnis
Definition: cel.h:154
const char * peer
Definition: cel.h:167
struct ast_party_dialed * ast_channel_dialed(struct ast_channel *chan)
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
Definition: linkedlists.h:710
#define ast_var_assign(name, value)
Definition: chanvars.h:40
int ast_strftime(char *buf, size_t len, const char *format, const struct ast_tm *tm)
Special version of strftime(3) that handles fractions of a second. Takes the same arguments as strfti...
Definition: localtime.c:2524
const char * caller_id_ani
Definition: cel.h:153
const char * user_field
Definition: cel.h:166
#define AST_CEL_EVENT_RECORD_VERSION
struct ABI version
Definition: cel.h:141
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
void ast_channel_exten_set(struct ast_channel *chan, const char *value)
const char * peer_account
Definition: cel.h:162
void * data
Definition: datastore.h:70
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
void ast_channel_context_set(struct ast_channel *chan, const char *value)
const char * unique_id
Definition: cel.h:163
a user-defined event, the event name field should be set
Definition: cel.h:69
const char * caller_id_dnid
Definition: cel.h:155
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:89
const char * channel_name
Definition: cel.h:158
int ast_cel_fill_record(const struct ast_event *e, struct ast_cel_event_record *r)
Fill in an ast_cel_event_record from a CEL event.
Definition: cel.c:819
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:280
const char * event_name
Definition: cel.h:149
void ast_channel_name_set(struct ast_channel *chan, const char *name)
Set the channel name.
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition: channel.c:2390
struct timeval event_time
Definition: cel.h:148
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:298
void ast_channel_data_set(struct ast_channel *chan, const char *value)
void ast_channel_internal_set_fake_ids(struct ast_channel *chan, const char *uniqueid, const char *linkedid)
Set uniqueid and linkedid string value only (not time)
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:343

◆ ast_cel_fill_record()

int ast_cel_fill_record ( const struct ast_event event,
struct ast_cel_event_record r 
)

Fill in an ast_cel_event_record from a CEL event.

Parameters
[in]eventthe CEL event
[out]rthe ast_cel_event_record to fill in
Since
1.8
Return values
0success
non-zerofailure

Definition at line 819 of file cel.c.

References ast_cel_event_record::account_code, ast_cel_event_record::amaflag, ast_cel_event_record::application_data, ast_cel_event_record::application_name, AST_CEL_EVENT_RECORD_VERSION, ast_cel_get_type_name(), AST_CEL_USER_DEFINED, ast_event_get_ie_str(), ast_event_get_ie_uint(), AST_EVENT_IE_CEL_ACCTCODE, AST_EVENT_IE_CEL_AMAFLAGS, AST_EVENT_IE_CEL_APPDATA, AST_EVENT_IE_CEL_APPNAME, AST_EVENT_IE_CEL_CHANNAME, AST_EVENT_IE_CEL_CIDANI, AST_EVENT_IE_CEL_CIDDNID, AST_EVENT_IE_CEL_CIDNAME, AST_EVENT_IE_CEL_CIDNUM, AST_EVENT_IE_CEL_CIDRDNIS, AST_EVENT_IE_CEL_CONTEXT, AST_EVENT_IE_CEL_EVENT_TIME, AST_EVENT_IE_CEL_EVENT_TIME_USEC, AST_EVENT_IE_CEL_EVENT_TYPE, AST_EVENT_IE_CEL_EXTEN, AST_EVENT_IE_CEL_EXTRA, AST_EVENT_IE_CEL_LINKEDID, AST_EVENT_IE_CEL_PEER, AST_EVENT_IE_CEL_PEERACCT, AST_EVENT_IE_CEL_UNIQUEID, AST_EVENT_IE_CEL_USEREVENT_NAME, AST_EVENT_IE_CEL_USERFIELD, ast_log, ast_cel_event_record::caller_id_ani, ast_cel_event_record::caller_id_dnid, ast_cel_event_record::caller_id_name, ast_cel_event_record::caller_id_num, ast_cel_event_record::caller_id_rdnis, ast_cel_event_record::channel_name, ast_cel_event_record::context, ast_cel_event_record::event_name, ast_cel_event_record::event_time, ast_cel_event_record::event_type, ast_cel_event_record::extension, ast_cel_event_record::extra, ast_cel_event_record::linked_id, LOG_ERROR, ast_cel_event_record::peer, ast_cel_event_record::peer_account, S_OR, ast_cel_event_record::unique_id, ast_cel_event_record::user_defined_name, ast_cel_event_record::user_field, and ast_cel_event_record::version.

Referenced by ast_cel_fabricate_channel_from_event(), cel_bs_put(), manager_log(), odbc_log(), pgsql_log(), radius_log(), and tds_log().

820 {
822  ast_log(LOG_ERROR, "Module ABI mismatch for ast_cel_event_record. "
823  "Please ensure all modules were compiled for "
824  "this version of Asterisk.\n");
825  return -1;
826  }
827 
829 
832 
834  if (r->event_type == AST_CEL_USER_DEFINED) {
836  } else {
837  r->user_defined_name = "";
838  }
839 
858 
859  return 0;
860 }
const char * account_code
Definition: cel.h:161
const char * caller_id_name
Definition: cel.h:151
Channel Event CID name Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:157
Channel Event app name Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:187
const char * linked_id
Definition: cel.h:164
Channel Event extra data Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:259
const char * user_defined_name
Definition: cel.h:150
const char * application_data
Definition: cel.h:160
const char * application_name
Definition: cel.h:159
Channel Event channel name Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:181
Channel Event UniqueID Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:211
Channel Event context name Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:175
Channel Event app args/data Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:193
Channel Event peeraccount Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:253
Channel Event Time (micro-seconds) Used by: AST_EVENT_CEL Payload type: UINT.
Definition: event_defs.h:145
const char * extension
Definition: cel.h:156
Channel Event CID dnid Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:235
const char * caller_id_num
Definition: cel.h:152
const char * extra
Definition: cel.h:168
Channel Event Type Used by: AST_EVENT_CEL Payload type: UINT.
Definition: event_defs.h:133
Channel Event Time (seconds) Used by: AST_EVENT_CEL Payload type: UINT.
Definition: event_defs.h:139
Channel Event CID num Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:163
Channel Event extension name Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:169
#define ast_log
Definition: astobj2.c:42
const char * context
Definition: cel.h:157
uint32_t version
struct ABI version
Definition: cel.h:146
Channel Event Userfield Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:217
Channel Event CID RDNIS field Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:229
enum ast_cel_event_type event_type
Definition: cel.h:147
#define LOG_ERROR
Definition: logger.h:285
Channel Event User Event Name Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:151
const char * caller_id_rdnis
Definition: cel.h:154
const char * peer
Definition: cel.h:167
Channel Event Peer – for Things involving multiple channels, like BRIDGE Used by: AST_EVENT_CEL Payl...
Definition: event_defs.h:241
Channel Event CID ANI field Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:223
const char * caller_id_ani
Definition: cel.h:153
const char * user_field
Definition: cel.h:166
Channel Event AMA flags Used by: AST_EVENT_CEL Payload type: UINT.
Definition: event_defs.h:199
#define AST_CEL_EVENT_RECORD_VERSION
struct ABI version
Definition: cel.h:141
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.
Definition: event.c:293
const char * peer_account
Definition: cel.h:162
Channel Event LinkedID Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:247
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
const char * unique_id
Definition: cel.h:163
a user-defined event, the event name field should be set
Definition: cel.h:69
const char * caller_id_dnid
Definition: cel.h:155
const char * channel_name
Definition: cel.h:158
const char * event_name
Definition: cel.h:149
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.
Definition: event.c:302
struct timeval event_time
Definition: cel.h:148
const char * ast_cel_get_type_name(enum ast_cel_event_type type)
Get the name of a CEL event type.
Definition: cel.c:491
Channel Event AccountCode Used by: AST_EVENT_CEL Payload type: STR.
Definition: event_defs.h:205

◆ ast_cel_general_config_alloc()

void* ast_cel_general_config_alloc ( void  )

Allocate a CEL configuration object.

Return values
NULLon error
Thenew CEL configuration object

Definition at line 188 of file cel.c.

References ao2_alloc, ao2_cleanup, ao2_ref, ast_str_container_alloc, ast_string_field_init, cel_general_config_dtor(), NULL, NUM_APP_BUCKETS, and RAII_VAR.

Referenced by cel_config_alloc(), and load_module().

189 {
191 
192  if (!(cfg = ao2_alloc(sizeof(*cfg), cel_general_config_dtor))) {
193  return NULL;
194  }
195 
196  if (ast_string_field_init(cfg, 64)) {
197  return NULL;
198  }
199 
200  if (!(cfg->apps = ast_str_container_alloc(NUM_APP_BUCKETS))) {
201  return NULL;
202  }
203 
204  ao2_ref(cfg, +1);
205  return cfg;
206 }
#define NUM_APP_BUCKETS
Number of buckets for the appset container.
Definition: cel.c:155
#define ast_str_container_alloc(buckets)
Allocates a hash container for bare strings.
Definition: strings.h:1312
#define NULL
Definition: resample.c:96
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:911
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
Definition: stringfields.h:353
#define ao2_ref(o, delta)
Definition: astobj2.h:464
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:411
A structure to hold CEL global configuration options.
Definition: cel.h:205
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
static void cel_general_config_dtor(void *obj)
Destructor for cel_config.
Definition: cel.c:180

◆ ast_cel_get_config()

struct ast_cel_general_config* ast_cel_get_config ( void  )

Obtain the current CEL configuration.

Since
12 The configuration is a ref counted object. The caller of this function must decrement the ref count when finished with the configuration.
Return values
NULLon error
Thecurrent CEL configuration

Definition at line 1690 of file cel.c.

References ao2_cleanup, ao2_global_obj_ref, ao2_ref, NULL, and RAII_VAR.

Referenced by test_cel_init_cb().

1691 {
1692  RAII_VAR(struct cel_config *, mod_cfg, ao2_global_obj_ref(cel_configs), ao2_cleanup);
1693 
1694  if (!mod_cfg || !mod_cfg->general) {
1695  return NULL;
1696  }
1697 
1698  ao2_ref(mod_cfg->general, +1);
1699  return mod_cfg->general;
1700 }
A container that holds all config-related information.
Definition: cel_custom.c:56
#define ao2_global_obj_ref(holder)
Definition: astobj2.h:925
#define NULL
Definition: resample.c:96
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:911
#define ao2_ref(o, delta)
Definition: astobj2.h:464
#define ao2_cleanup(obj)
Definition: astobj2.h:1958

◆ ast_cel_get_type_name()

const char* ast_cel_get_type_name ( enum ast_cel_event_type  type)

Get the name of a CEL event type.

Parameters
typethe type to get the name of
Since
1.8
Returns
the string representation of the type

Definition at line 491 of file cel.c.

References cel_event_types, and S_OR.

Referenced by ast_cel_fill_record(), cel_generic_cb(), dump_event(), and handle_cli_status().

492 {
493  return S_OR(cel_event_types[type], "Unknown");
494 }
static const char type[]
Definition: chan_ooh323.c:109
static const char *const cel_event_types[CEL_MAX_EVENT_IDS]
Map of ast_cel_event_type to strings.
Definition: cel.c:305
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79

◆ ast_cel_publish_event()

void ast_cel_publish_event ( struct ast_channel chan,
enum ast_cel_event_type  event_type,
struct ast_json blob 
)

Publish a CEL event.

Since
12
Parameters
chanThis is the primary channel associated with this channel event.
event_typeThis is the type of call event being reported.
blobThis contains any additional parameters that need to be conveyed for this event.

Definition at line 1666 of file cel.c.

References ao2_cleanup, ast_cel_topic(), ast_channel_blob_create_from_cache(), ast_channel_uniqueid(), ast_json_pack(), ast_json_ref(), ast_json_unref(), cel_generic_type(), and stasis_publish().

Referenced by celgenuserevent_exec().

1669 {
1670  struct ast_json *cel_blob;
1671  struct stasis_message *message;
1672 
1673  cel_blob = ast_json_pack("{s: i, s: o}",
1674  "event_type", event_type,
1675  "event_details", ast_json_ref(blob));
1676 
1678  if (message) {
1679  stasis_publish(ast_cel_topic(), message);
1680  }
1681  ao2_cleanup(message);
1682  ast_json_unref(cel_blob);
1683 }
struct ast_json * ast_json_ref(struct ast_json *value)
Increase refcount on value.
Definition: json.c:67
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:591
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
struct stasis_topic * ast_cel_topic(void)
Get the CEL topic.
Definition: cel.c:1685
const char * ast_channel_uniqueid(const struct ast_channel *chan)
void stasis_publish(struct stasis_topic *topic, struct stasis_message *message)
Publish a message to a topic's subscribers.
Definition: stasis.c:1511
struct stasis_message * ast_channel_blob_create_from_cache(const char *uniqueid, struct stasis_message_type *type, struct ast_json *blob)
Create a ast_channel_blob message, pulling channel state from the cache.
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
Abstract JSON element (object, array, string, int, ...).
struct stasis_message_type * cel_generic_type(void)

◆ ast_cel_set_config()

void ast_cel_set_config ( struct ast_cel_general_config config)

Set the current CEL configuration.

Since
12
Parameters
configThe new CEL configuration

Definition at line 1702 of file cel.c.

References ao2_bump, ao2_cleanup, ao2_global_obj_ref, ao2_ref, ast_cel_check_enabled(), config, create_routes(), destroy_routes(), cel_config::general, and is_enabled().

Referenced by cel_verify_and_cleanup_cb(), and test_cel_init_cb().

1703 {
1704  int was_enabled;
1705  int is_enabled;
1706  struct ast_cel_general_config *cleanup_config;
1707  struct cel_config *mod_cfg = ao2_global_obj_ref(cel_configs);
1708 
1709  if (mod_cfg) {
1710  was_enabled = ast_cel_check_enabled();
1711 
1712  cleanup_config = mod_cfg->general;
1713  ao2_bump(config);
1714  mod_cfg->general = config;
1715  ao2_cleanup(cleanup_config);
1716 
1717  is_enabled = ast_cel_check_enabled();
1718  if (!was_enabled && is_enabled) {
1719  create_routes();
1720  } else if (was_enabled && !is_enabled) {
1721  destroy_routes();
1722  }
1723 
1724  ao2_ref(mod_cfg, -1);
1725  }
1726 }
A container that holds all config-related information.
Definition: cel_custom.c:56
char * config
Definition: conf2ael.c:66
#define ao2_global_obj_ref(holder)
Definition: astobj2.h:925
#define ao2_bump(obj)
Definition: astobj2.h:491
unsigned int ast_cel_check_enabled(void)
Hashing function for cel_backend.
Definition: cel.c:343
#define ao2_ref(o, delta)
Definition: astobj2.h:464
struct ast_cel_general_config * general
Definition: cel.c:210
static int create_routes(void)
Create the Stasis message router and routes for CEL.
Definition: cel.c:1500
static int is_enabled(void)
Helper function to check if module is enabled.
Definition: res_ari.c:159
A structure to hold CEL global configuration options.
Definition: cel.h:205
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
static void destroy_routes(void)
Definition: cel.c:1416

◆ ast_cel_str_to_event_type()

enum ast_cel_event_type ast_cel_str_to_event_type ( const char *  name)

Get the event type from a string.

Parameters
namethe event type name as a string
Since
1.8
Returns
the ast_cel_event_type given by the string

Definition at line 418 of file cel.c.

References ARRAY_LEN, AST_CEL_INVALID_VALUE, ast_log, cel_event_types, and LOG_ERROR.

Referenced by events_handler().

419 {
420  unsigned int i;
421 
422  for (i = 0; i < ARRAY_LEN(cel_event_types); i++) {
423  if (cel_event_types[i] && !strcasecmp(name, cel_event_types[i])) {
424  return i;
425  }
426  }
427 
428  ast_log(LOG_ERROR, "Unknown event name '%s'\n", name);
429  return AST_CEL_INVALID_VALUE;
430 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static const char *const cel_event_types[CEL_MAX_EVENT_IDS]
Map of ast_cel_event_type to strings.
Definition: cel.c:305
#define ast_log
Definition: astobj2.c:42
#define LOG_ERROR
Definition: logger.h:285
static const char name[]
Definition: cdr_mysql.c:74

◆ ast_cel_topic()

struct stasis_topic* ast_cel_topic ( void  )

Get the CEL topic.

Return values
TheCEL topic
NULLif not allocated

Definition at line 1685 of file cel.c.

References cel_topic.

Referenced by ast_cel_publish_event(), and create_subscriptions().

1686 {
1687  return cel_topic;
1688 }
static struct stasis_topic * cel_topic
Definition: cel.c:117