Asterisk - The Open Source Telephony Project GIT-master-0a46be9
Macros | Functions | Variables
res_websocket_client.c File Reference
#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/astobj2.h"
#include "asterisk/strings.h"
#include "asterisk/vector.h"
#include "asterisk/websocket_client.h"
Include dependency graph for res_websocket_client.c:

Go to the source code of this file.

Macros

#define DEFAULT_RECONNECT_ATTEMPTS   -2147483648
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
void ast_websocket_client_add_uri_params (struct ast_websocket_client *wc, const char *uri_params)
 Add additional parameters to the URI. More...
 
struct ast_websocketast_websocket_client_connect (struct ast_websocket_client *wc, void *lock_obj, const char *display_name, enum ast_websocket_result *result)
 Connect to a websocket server using the configured authentication, retry and TLS options. More...
 
enum ast_ws_client_fields ast_websocket_client_get_field_diff (struct ast_websocket_client *old_wc, struct ast_websocket_client *new_wc)
 Detect changes between two websocket client configurations. More...
 
int ast_websocket_client_observer_add (const struct ast_sorcery_observer *callbacks)
 Add sorcery observers for websocket client events. More...
 
void ast_websocket_client_observer_remove (const struct ast_sorcery_observer *callbacks)
 Remove sorcery observers for websocket client events. More...
 
int ast_websocket_client_reload (void)
 Force res_websocket_client to reload its configuration. More...
 
struct ao2_containerast_websocket_client_retrieve_all (void)
 Retrieve a container of all websocket client objects. More...
 
struct ast_websocket_clientast_websocket_client_retrieve_by_id (const char *id)
 Retrieve a websocket client object by ID. More...
 
static int load_module (void)
 
static int reload_module (void)
 
static int unload_module (void)
 
static void * wc_alloc (const char *id)
 
static int wc_apply (const struct ast_sorcery *sorcery, void *obj)
 
static void wc_dtor (void *obj)
 
static int websocket_client_connection_type_from_str (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int websocket_client_connection_type_to_str (const void *obj, const intptr_t *args, char **buf)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER , .description = "WebSocket Client Support" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_CHANNEL_DEPEND, .requires = "res_http_websocket", }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct ast_sorcerysorcery = NULL
 

Macro Definition Documentation

◆ DEFAULT_RECONNECT_ATTEMPTS

#define DEFAULT_RECONNECT_ATTEMPTS   -2147483648

Definition at line 426 of file res_websocket_client.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 643 of file res_websocket_client.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 643 of file res_websocket_client.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 643 of file res_websocket_client.c.

◆ ast_websocket_client_add_uri_params()

void ast_websocket_client_add_uri_params ( struct ast_websocket_client wc,
const char *  uri_params 
)

Add additional parameters to the URI.

Parameters
wcA pointer to the ast_websocket_structure
uri_paramsA string containing URLENCODED parameters to append to the URI.

Definition at line 240 of file res_websocket_client.c.

242{
243 ast_string_field_set(wc, uri_params, uri_params);
244}
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:521

References ast_string_field_set.

Referenced by webchan_call().

◆ ast_websocket_client_connect()

struct ast_websocket * ast_websocket_client_connect ( struct ast_websocket_client wc,
void *  lock_obj,
const char *  display_name,
enum ast_websocket_result result 
)

Connect to a websocket server using the configured authentication, retry and TLS options.

Parameters
wcA pointer to the ast_websocket_structure
lock_objA pointer to an ao2 object to lock while the connection is being attempted or NULL if no locking is needed.
display_nameAn id string to use for logging messages. If NULL or empty the connection's ID will be used.
resultA pointer to an enum ast_websocket_result to store the result of the connection attempt.
Returns
A pointer to the ast_websocket structure on success, or NULL on failure.

Definition at line 246 of file res_websocket_client.c.

248{
249 int reconnect_counter = wc->reconnect_attempts;
250 char *uri = NULL;
251
252 if (ast_strlen_zero(display_name)) {
253 display_name = ast_sorcery_object_get_id(wc);
254 }
255
256 if (!ast_strlen_zero(wc->uri_params)) {
257 /*
258 * If the configured URI doesn't already contain parameters, we append the
259 * new ones to the URI path component with '?'. If it does, we append the
260 * new ones to the existing ones with a '&'.
261 */
262 char sep = '?';
263 uri = ast_alloca(strlen(wc->uri) + strlen(wc->uri_params) + 2);
264 if (strchr(wc->uri, '?')) {
265 sep = '&';
266 }
267 sprintf(uri, "%s%c%s", wc->uri, sep, wc->uri_params); /*Safe */
268 }
269
270 while (1) {
271 struct ast_websocket *astws = NULL;
273 .uri = S_OR(uri, wc->uri),
274 .protocols = wc->protocols,
275 .username = wc->username,
276 .password = wc->password,
277 .timeout = wc->connect_timeout,
278 .suppress_connection_msgs = 1,
279 .tls_cfg = NULL,
280 };
281
282 if (lock_obj) {
283 ao2_lock(lock_obj);
284 }
285
286 if (wc->tls_enabled) {
287 /*
288 * tls_cfg and its contents are freed automatically
289 * by res_http_websocket when the connection ends.
290 * We create it even if tls is not enabled to we can
291 * suppress connection error messages and print our own.
292 */
293 options.tls_cfg = ast_calloc(1, sizeof(*options.tls_cfg));
294 if (!options.tls_cfg) {
295 if (lock_obj) {
296 ao2_unlock(lock_obj);
297 }
298 return NULL;
299 }
300 /* TLS options */
301 options.tls_cfg->enabled = wc->tls_enabled;
302 options.tls_cfg->cafile = ast_strdup(wc->ca_list_file);
303 options.tls_cfg->capath = ast_strdup(wc->ca_list_path);
304 options.tls_cfg->certfile = ast_strdup(wc->cert_file);
305 options.tls_cfg->pvtfile = ast_strdup(wc->priv_key_file);
308 }
309
311 if (astws && *result == WS_OK) {
312 if (lock_obj) {
313 ao2_unlock(lock_obj);
314 }
315 return astws;
316 }
317
318 reconnect_counter--;
319 if (reconnect_counter <= 0) {
322 "%s: Websocket connection to %s failed after %d tries: %s%s%s%s. Retrying in %d ms.\n",
323 display_name,
324 wc->uri,
327 errno ? " (" : "",
328 errno ? strerror(errno) : "",
329 errno ? ")" : "",
331 );
332 } else {
334 "%s: Websocket connection to %s failed after %d tries: %s%s%s%s. Hanging up after exhausting retries.\n",
335 display_name,
336 wc->uri,
339 errno ? " (" : "",
340 errno ? strerror(errno) : "",
341 errno ? ")" : ""
342 );
343 }
344 break;
345 }
346
347 if (lock_obj) {
348 ao2_lock(lock_obj);
349 }
350 usleep(wc->reconnect_interval * 1000);
351 }
352
353 return NULL;
354}
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: astmm.h:288
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
#define ast_log
Definition: astobj2.c:42
#define ao2_unlock(a)
Definition: astobj2.h:729
#define ao2_lock(a)
Definition: astobj2.h:717
static PGresult * result
Definition: cel_pgsql.c:84
struct ast_websocket * ast_websocket_client_create_with_options(struct ast_websocket_client_options *options, enum ast_websocket_result *result)
Create, and connect, a websocket client using given options.
const char * ast_websocket_result_to_str(enum ast_websocket_result result)
Convert a websocket result code to a string.
@ WS_OK
@ AST_WS_TYPE_CLIENT_PERSISTENT
#define LOG_WARNING
int errno
#define NULL
Definition: resample.c:96
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
Definition: sorcery.c:2380
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition: strings.h:80
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
Options used for a websocket client.
unsigned int reconnect_interval
const ast_string_field uri
enum ast_websocket_type connection_type
const ast_string_field ca_list_path
const ast_string_field cert_file
const ast_string_field password
const ast_string_field username
const ast_string_field ca_list_file
const ast_string_field protocols
const ast_string_field priv_key_file
unsigned int reconnect_attempts
Structure definition for session.
@ AST_SSL_DONT_VERIFY_SERVER
Definition: tcptls.h:69
@ AST_SSL_IGNORE_COMMON_NAME
Definition: tcptls.h:71
static struct test_options options
#define ast_set2_flag(p, value, flag)
Definition: utils.h:94

References ao2_lock, ao2_unlock, ast_alloca, ast_calloc, ast_log, ast_set2_flag, ast_sorcery_object_get_id(), AST_SSL_DONT_VERIFY_SERVER, AST_SSL_IGNORE_COMMON_NAME, ast_strdup, ast_strlen_zero(), ast_websocket_client_create_with_options(), ast_websocket_result_to_str(), AST_WS_TYPE_CLIENT_PERSISTENT, ast_websocket_client::ca_list_file, ast_websocket_client::ca_list_path, ast_websocket_client::cert_file, ast_websocket_client::connect_timeout, ast_websocket_client::connection_type, errno, LOG_WARNING, NULL, options, ast_websocket_client::password, ast_websocket_client::priv_key_file, ast_websocket_client::protocols, ast_websocket_client::reconnect_attempts, ast_websocket_client::reconnect_interval, result, S_OR, ast_websocket_client::tls_enabled, ast_websocket_client_options::uri, ast_websocket_client::uri, ast_websocket_client::username, ast_websocket_client::verify_server_cert, ast_websocket_client::verify_server_hostname, and WS_OK.

Referenced by outbound_session_handler_thread(), and webchan_call().

◆ ast_websocket_client_get_field_diff()

enum ast_ws_client_fields ast_websocket_client_get_field_diff ( struct ast_websocket_client old_wc,
struct ast_websocket_client new_wc 
)

Detect changes between two websocket client configurations.

Parameters
old_owThe old websocket configuration.
new_owThe new websocket configuration.
Returns
A bitmask of changed fields.

Definition at line 477 of file res_websocket_client.c.

480{
482 const char *new_id = ast_sorcery_object_get_id(new_wc);
483 RAII_VAR(struct ast_variable *, changes, NULL, ast_variables_destroy);
484 struct ast_variable *v = NULL;
485 int res = 0;
486 int changes_found = 0;
487
488 ast_debug(2, "%s: Detecting changes\n", new_id);
489
490 res = ast_sorcery_diff(sorcery, old_wc, new_wc, &changes);
491 if (res != 0) {
492 ast_log(LOG_WARNING, "%s: Failed to create changeset\n", new_id);
494 }
495
496 for (v = changes; v; v = v->next) {
497 changes_found = 1;
498 ast_debug(2, "%s: %s changed to %s\n", new_id, v->name, v->value);
499 if (ast_strings_equal(v->name, "connection_type")) {
501 } else if (ast_strings_equal(v->name, "uri")) {
502 changed |= AST_WS_CLIENT_FIELD_URI;
503 } else if (ast_strings_equal(v->name, "protocols")) {
505 } else if (ast_strings_equal(v->name, "username")) {
507 } else if (ast_strings_equal(v->name, "password")) {
509 } else if (ast_strings_equal(v->name, "tls_enabled")) {
511 } else if (ast_strings_equal(v->name, "ca_list_file")) {
513 } else if (ast_strings_equal(v->name, "ca_list_path")) {
515 } else if (ast_strings_equal(v->name, "cert_file")) {
517 } else if (ast_strings_equal(v->name, "priv_key_file")) {
519 } else if (ast_strings_equal(v->name, "reconnect_interval")) {
521 } else if (ast_strings_equal(v->name, "reconnect_attempts")) {
523 } else if (ast_strings_equal(v->name, "connection_timeout")) {
525 } else if (ast_strings_equal(v->name, "verify_server_cert")) {
527 } else if (ast_strings_equal(v->name, "verify_server_hostname")) {
529 } else {
530 ast_debug(2, "%s: Unknown change %s\n", new_id, v->name);
531 }
532 }
533
534 if (!changes_found) {
535 ast_debug(2, "%s: No changes found %p %p\n", new_id,
536 old_wc,new_wc);
537 }
538 return changed;
539
540}
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
Definition: extconf.c:1262
#define ast_debug(level,...)
Log a DEBUG message.
static struct ast_sorcery * sorcery
int ast_sorcery_diff(const struct ast_sorcery *sorcery, const void *original, const void *modified, struct ast_variable **changes)
Create a changeset of two objects.
Definition: sorcery.c:1868
int ast_strings_equal(const char *str1, const char *str2)
Compare strings for equality checking for NULL.
Definition: strings.c:238
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next
#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:978
ast_ws_client_fields
@ AST_WS_CLIENT_FIELD_RECONNECT_INTERVAL
@ AST_WS_CLIENT_FIELD_NONE
@ AST_WS_CLIENT_FIELD_URI
@ AST_WS_CLIENT_FIELD_PROTOCOLS
@ AST_WS_CLIENT_FIELD_CA_LIST_PATH
@ AST_WS_CLIENT_FIELD_TLS_ENABLED
@ AST_WS_CLIENT_FIELD_CA_LIST_FILE
@ AST_WS_CLIENT_FIELD_USERNAME
@ AST_WS_CLIENT_FIELD_VERIFY_SERVER_CERT
@ AST_WS_CLIENT_FIELD_PASSWORD
@ AST_WS_CLIENT_FIELD_CONNECTION_TIMEOUT
@ AST_WS_CLIENT_FIELD_RECONNECT_ATTEMPTS
@ AST_WS_CLIENT_FIELD_CONNECTION_TYPE
@ AST_WS_CLIENT_FIELD_VERIFY_SERVER_HOSTNAME
@ AST_WS_CLIENT_FIELD_CERT_FILE
@ AST_WS_CLIENT_FIELD_PRIV_KEY_FILE

References ast_debug, ast_log, ast_sorcery_diff(), ast_sorcery_object_get_id(), ast_strings_equal(), ast_variables_destroy(), AST_WS_CLIENT_FIELD_CA_LIST_FILE, AST_WS_CLIENT_FIELD_CA_LIST_PATH, AST_WS_CLIENT_FIELD_CERT_FILE, AST_WS_CLIENT_FIELD_CONNECTION_TIMEOUT, AST_WS_CLIENT_FIELD_CONNECTION_TYPE, AST_WS_CLIENT_FIELD_NONE, AST_WS_CLIENT_FIELD_PASSWORD, AST_WS_CLIENT_FIELD_PRIV_KEY_FILE, AST_WS_CLIENT_FIELD_PROTOCOLS, AST_WS_CLIENT_FIELD_RECONNECT_ATTEMPTS, AST_WS_CLIENT_FIELD_RECONNECT_INTERVAL, AST_WS_CLIENT_FIELD_TLS_ENABLED, AST_WS_CLIENT_FIELD_URI, AST_WS_CLIENT_FIELD_USERNAME, AST_WS_CLIENT_FIELD_VERIFY_SERVER_CERT, AST_WS_CLIENT_FIELD_VERIFY_SERVER_HOSTNAME, LOG_WARNING, ast_variable::name, ast_variable::next, NULL, RAII_VAR, sorcery, and ast_variable::value.

Referenced by ari_conf_owc_detect_changes().

◆ ast_websocket_client_observer_add()

int ast_websocket_client_observer_add ( const struct ast_sorcery_observer callbacks)

Add sorcery observers for websocket client events.

Parameters
callbacksThe observer callbacks to add.
Returns
0 on success, -1 on failure.

Definition at line 542 of file res_websocket_client.c.

543{
544 if (!sorcery || !callbacks) {
545 return -1;
546 }
547
548 if (ast_sorcery_observer_add(sorcery, "websocket_client", callbacks)) {
549 ast_log(LOG_ERROR, "Failed to register websocket client observers\n");
550 return -1;
551 }
552
553 return 0;
554}
#define LOG_ERROR
struct @474 callbacks
int ast_sorcery_observer_add(const struct ast_sorcery *sorcery, const char *type, const struct ast_sorcery_observer *callbacks)
Add an observer to a specific object type.
Definition: sorcery.c:2454

References ast_log, ast_sorcery_observer_add(), callbacks, LOG_ERROR, and sorcery.

Referenced by ari_conf_init().

◆ ast_websocket_client_observer_remove()

void ast_websocket_client_observer_remove ( const struct ast_sorcery_observer callbacks)

Remove sorcery observers for websocket client events.

Parameters
callbacksThe observer callbacks to remove.

Definition at line 556 of file res_websocket_client.c.

557{
558 if (!sorcery || !callbacks) {
559 return;
560 }
561
562 ast_sorcery_observer_remove(sorcery, "websocket_client", callbacks);
563}
void ast_sorcery_observer_remove(const struct ast_sorcery *sorcery, const char *type, const struct ast_sorcery_observer *callbacks)
Remove an observer from a specific object type.
Definition: sorcery.c:2486

References ast_sorcery_observer_remove(), callbacks, and sorcery.

Referenced by ari_conf_destroy().

◆ ast_websocket_client_reload()

int ast_websocket_client_reload ( void  )

Force res_websocket_client to reload its configuration.

Returns
0 on success, -1 on failure.

Definition at line 616 of file res_websocket_client.c.

617{
618 ast_debug(2, "Reloading Websocket Client Configuration\n");
619 if (sorcery) {
621 }
622
623 return 0;
624}
void ast_sorcery_reload(const struct ast_sorcery *sorcery)
Inform any wizards to reload persistent objects.
Definition: sorcery.c:1471

References ast_debug, ast_sorcery_reload(), and sorcery.

Referenced by ari_conf_load().

◆ ast_websocket_client_retrieve_all()

struct ao2_container * ast_websocket_client_retrieve_all ( void  )

Retrieve a container of all websocket client objects.

Returns
The container. It may be empty but must always be cleaned up by the caller.

Definition at line 458 of file res_websocket_client.c.

459{
460 if (!sorcery) {
461 return NULL;
462 }
463
464 return ast_sorcery_retrieve_by_fields(sorcery, "websocket_client",
466}
@ AST_RETRIEVE_FLAG_MULTIPLE
Return all matching objects.
Definition: sorcery.h:120
@ AST_RETRIEVE_FLAG_ALL
Perform no matching, return all objects.
Definition: sorcery.h:123
void * ast_sorcery_retrieve_by_fields(const struct ast_sorcery *sorcery, const char *type, unsigned int flags, struct ast_variable *fields)
Retrieve an object or multiple objects using specific fields.
Definition: sorcery.c:1960

References AST_RETRIEVE_FLAG_ALL, AST_RETRIEVE_FLAG_MULTIPLE, ast_sorcery_retrieve_by_fields(), NULL, and sorcery.

◆ ast_websocket_client_retrieve_by_id()

struct ast_websocket_client * ast_websocket_client_retrieve_by_id ( const char *  id)

Retrieve a websocket client object by ID.

Parameters
idThe ID of the websocket client object.
Returns
The websocket client ao2 object or NULL if not found. The reference must be cleaned up by the caller.

Definition at line 468 of file res_websocket_client.c.

469{
470 if (!sorcery) {
471 return NULL;
472 }
473
474 return ast_sorcery_retrieve_by_id(sorcery, "websocket_client", id);
475}
void * ast_sorcery_retrieve_by_id(const struct ast_sorcery *sorcery, const char *type, const char *id)
Retrieve an object using its unique identifier.
Definition: sorcery.c:1916

References ast_sorcery_retrieve_by_id(), NULL, and sorcery.

Referenced by ast_ari_channels_external_media(), outbound_websocket_websocket_client_id_from_str(), and websocket_new().

◆ load_module()

static int load_module ( void  )
static

Definition at line 566 of file res_websocket_client.c.

567{
568 ast_debug(2, "Initializing Websocket Client Configuration\n");
570 if (!sorcery) {
571 ast_log(LOG_ERROR, "Failed to open sorcery\n");
572 return -1;
573 }
574
575 ast_sorcery_apply_default(sorcery, "websocket_client", "config",
576 "websocket_client.conf,criteria=type=websocket_client");
577
578 if (ast_sorcery_object_register(sorcery, "websocket_client", wc_alloc,
579 NULL, wc_apply)) {
580 ast_log(LOG_ERROR, "Failed to register websocket_client object with sorcery\n");
582 sorcery = NULL;
583 return -1;
584 }
585
586 ast_sorcery_object_field_register(sorcery, "websocket_client", "type", "", OPT_NOOP_T, 0, 0);
587 ast_sorcery_register_cust(websocket_client, connection_type, "");
592 ast_sorcery_register_sf(websocket_client, ast_websocket_client, ca_list_file, ca_list_file, "");
593 ast_sorcery_register_sf(websocket_client, ast_websocket_client, ca_list_path, ca_list_path, "");
595 ast_sorcery_register_sf(websocket_client, ast_websocket_client, priv_key_file, priv_key_file, "");
596 ast_sorcery_register_bool(websocket_client, ast_websocket_client, tls_enabled, tls_enabled, "no");
597 ast_sorcery_register_bool(websocket_client, ast_websocket_client, verify_server_cert, verify_server_cert, "yes");
598 ast_sorcery_register_bool(websocket_client, ast_websocket_client, verify_server_hostname, verify_server_hostname, "yes");
599 ast_sorcery_register_int(websocket_client, ast_websocket_client, connection_timeout, connect_timeout, 500);
600 ast_sorcery_register_int(websocket_client, ast_websocket_client, reconnect_attempts, reconnect_attempts, 4);
601 ast_sorcery_register_int(websocket_client, ast_websocket_client, reconnect_interval, reconnect_interval, 500);
602
604
605 return 0;
606}
@ OPT_NOOP_T
Type for a default handler that should do nothing.
static void * wc_alloc(const char *id)
static int wc_apply(const struct ast_sorcery *sorcery, void *obj)
#define ast_sorcery_unref(sorcery)
Decrease the reference count of a sorcery structure.
Definition: sorcery.h:1500
#define ast_sorcery_register_cust(object, option, def_value)
Register a custom field within an object.
Definition: sorcery.h:1767
void ast_sorcery_load(const struct ast_sorcery *sorcery)
Inform any wizards to load persistent objects.
Definition: sorcery.c:1440
#define ast_sorcery_object_register(sorcery, type, alloc, transform, apply)
Register an object type.
Definition: sorcery.h:837
#define ast_sorcery_register_int(object, structure, option, field, def_value)
Register an int field as type OPT_INT_T within an object.
Definition: sorcery.h:1710
#define ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, flags,...)
Register a field within an object.
Definition: sorcery.h:955
#define ast_sorcery_apply_default(sorcery, type, name, data)
Definition: sorcery.h:476
#define ast_sorcery_register_bool(object, structure, option, field, def_value)
Register a boolean field as type OPT_YESNO_T within an object.
Definition: sorcery.h:1684
#define ast_sorcery_open()
Open a new sorcery structure.
Definition: sorcery.h:406
#define ast_sorcery_register_sf(object, structure, option, field, def_value)
Register a stringfield field as type OPT_STRINGFIELD_T within an object.
Definition: sorcery.h:1746

References ast_debug, ast_log, ast_sorcery_apply_default, ast_sorcery_load(), ast_sorcery_object_field_register, ast_sorcery_object_register, ast_sorcery_open, ast_sorcery_register_bool, ast_sorcery_register_cust, ast_sorcery_register_int, ast_sorcery_register_sf, ast_sorcery_unref, LOG_ERROR, NULL, OPT_NOOP_T, sorcery, wc_alloc(), and wc_apply().

◆ reload_module()

static int reload_module ( void  )
static

Definition at line 608 of file res_websocket_client.c.

609{
610 ast_debug(2, "Reloading Websocket Client Configuration\n");
612
613 return 0;
614}

References ast_debug, ast_sorcery_reload(), and sorcery.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 626 of file res_websocket_client.c.

627{
628 ast_debug(2, "Unloading Websocket Client Configuration\n");
629 if (sorcery) {
631 sorcery = NULL;
632 }
633 return 0;
634}

References ast_debug, ast_sorcery_unref, NULL, and sorcery.

◆ wc_alloc()

static void * wc_alloc ( const char *  id)
static

Definition at line 367 of file res_websocket_client.c.

368{
369 struct ast_websocket_client *wc = NULL;
370
371 wc = ast_sorcery_generic_alloc(sizeof(*wc), wc_dtor);
372 if (!wc) {
373 return NULL;
374 }
375
376 if (ast_string_field_init(wc, 1024) != 0) {
377 ao2_cleanup(wc);
378 return NULL;
379 }
380
381 if (ast_string_field_init_extended(wc, uri_params) != 0) {
382 ao2_cleanup(wc);
383 return NULL;
384 }
385
386 ast_debug(2, "%s: Allocated websocket client config\n", id);
387 return wc;
388}
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
static void wc_dtor(void *obj)
void * ast_sorcery_generic_alloc(size_t size, ao2_destructor_fn destructor)
Allocate a generic sorcery capable object.
Definition: sorcery.c:1791
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
Definition: stringfields.h:359
#define ast_string_field_init_extended(x, field)
Initialize an extended string field.
Definition: stringfields.h:401

References ao2_cleanup, ast_debug, ast_sorcery_generic_alloc(), ast_string_field_init, ast_string_field_init_extended, NULL, and wc_dtor().

Referenced by load_module().

◆ wc_apply()

static int wc_apply ( const struct ast_sorcery sorcery,
void *  obj 
)
static

Definition at line 428 of file res_websocket_client.c.

429{
430 struct ast_websocket_client *wc = obj;
431 const char *id = ast_sorcery_object_get_id(wc);
432 int res = 0;
433
434 ast_debug(3, "%s: Applying config\n", id);
435
436 if (ast_strlen_zero(wc->uri)) {
437 ast_log(LOG_WARNING, "%s: Websocket client missing uri\n", id);
438 res = -1;
439 }
440
441 if (res != 0) {
442 ast_log(LOG_WARNING, "%s: Websocket client configuration failed\n", id);
443 } else {
444 ast_debug(3, "%s: Websocket client configuration succeeded\n", id);
445
448 wc->reconnect_attempts = INT_MAX;
449 } else {
450 wc->reconnect_attempts = 4;
451 }
452 }
453 }
454
455 return res;
456}
#define DEFAULT_RECONNECT_ATTEMPTS

References ast_debug, ast_log, ast_sorcery_object_get_id(), ast_strlen_zero(), AST_WS_TYPE_CLIENT_PERSISTENT, ast_websocket_client::connection_type, DEFAULT_RECONNECT_ATTEMPTS, LOG_WARNING, ast_websocket_client::reconnect_attempts, and ast_websocket_client::uri.

Referenced by load_module().

◆ wc_dtor()

static void wc_dtor ( void *  obj)
static

Definition at line 358 of file res_websocket_client.c.

359{
360 struct ast_websocket_client *wc = obj;
361
362 ast_debug(3, "%s: Disposing of websocket client config\n",
365}
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
Definition: stringfields.h:374

References ast_debug, ast_sorcery_object_get_id(), and ast_string_field_free_memory.

Referenced by wc_alloc().

◆ websocket_client_connection_type_from_str()

static int websocket_client_connection_type_from_str ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 390 of file res_websocket_client.c.

392{
393 struct ast_websocket_client *ws = obj;
394
395 if (strcasecmp(var->value, "persistent") == 0) {
397 } else if (strcasecmp(var->value, "per_call_config") == 0) {
399 } else {
400 return -1;
401 }
402
403 return 0;
404}
#define var
Definition: ast_expr2f.c:605
@ AST_WS_TYPE_CLIENT_PER_CALL_CONFIG

References AST_WS_TYPE_CLIENT_PER_CALL_CONFIG, AST_WS_TYPE_CLIENT_PERSISTENT, ast_websocket_client::connection_type, and var.

◆ websocket_client_connection_type_to_str()

static int websocket_client_connection_type_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 406 of file res_websocket_client.c.

407{
408 const struct ast_websocket_client *wc = obj;
409
411 *buf = ast_strdup("persistent");
413 *buf = ast_strdup("per_call_config");
414 } else {
415 return -1;
416 }
417
418 return 0;
419}
char buf[BUFSIZE]
Definition: eagi_proxy.c:66

References ast_strdup, AST_WS_TYPE_CLIENT_PER_CALL_CONFIG, AST_WS_TYPE_CLIENT_PERSISTENT, buf, and ast_websocket_client::connection_type.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER , .description = "WebSocket Client Support" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_CHANNEL_DEPEND, .requires = "res_http_websocket", }
static

Definition at line 643 of file res_websocket_client.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 643 of file res_websocket_client.c.

◆ sorcery

struct ast_sorcery* sorcery = NULL
static