Asterisk - The Open Source Telephony Project GIT-master-fe341c2
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
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)
 
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 400 of file res_websocket_client.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 617 of file res_websocket_client.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 617 of file res_websocket_client.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 617 of file res_websocket_client.c.

◆ 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 240 of file res_websocket_client.c.

242{
243 int reconnect_counter = wc->reconnect_attempts;
244
245 if (ast_strlen_zero(display_name)) {
246 display_name = ast_sorcery_object_get_id(wc);
247 }
248
249 while (1) {
250 struct ast_websocket *astws = NULL;
252 .uri = wc->uri,
253 .protocols = wc->protocols,
254 .username = wc->username,
255 .password = wc->password,
256 .timeout = wc->connect_timeout,
257 .suppress_connection_msgs = 1,
258 .tls_cfg = NULL,
259 };
260
261 if (lock_obj) {
262 ao2_lock(lock_obj);
263 }
264
265 if (wc->tls_enabled) {
266 /*
267 * tls_cfg and its contents are freed automatically
268 * by res_http_websocket when the connection ends.
269 * We create it even if tls is not enabled to we can
270 * suppress connection error messages and print our own.
271 */
272 options.tls_cfg = ast_calloc(1, sizeof(*options.tls_cfg));
273 if (!options.tls_cfg) {
274 if (lock_obj) {
275 ao2_unlock(lock_obj);
276 }
277 return NULL;
278 }
279 /* TLS options */
280 options.tls_cfg->enabled = wc->tls_enabled;
281 options.tls_cfg->cafile = ast_strdup(wc->ca_list_file);
282 options.tls_cfg->capath = ast_strdup(wc->ca_list_path);
283 options.tls_cfg->certfile = ast_strdup(wc->cert_file);
284 options.tls_cfg->pvtfile = ast_strdup(wc->priv_key_file);
287 }
288
290 if (astws && *result == WS_OK) {
291 if (lock_obj) {
292 ao2_unlock(lock_obj);
293 }
294 return astws;
295 }
296
297 reconnect_counter--;
298 if (reconnect_counter <= 0) {
301 "%s: Websocket connection to %s failed after %d tries: %s%s%s%s. Retrying in %d ms.\n",
302 display_name,
303 wc->uri,
306 errno ? " (" : "",
307 errno ? strerror(errno) : "",
308 errno ? ")" : "",
310 );
311 } else {
313 "%s: Websocket connection to %s failed after %d tries: %s%s%s%s. Hanging up after exhausting retries.\n",
314 display_name,
315 wc->uri,
318 errno ? " (" : "",
319 errno ? strerror(errno) : "",
320 errno ? ")" : ""
321 );
322 }
323 break;
324 }
325
326 if (lock_obj) {
327 ao2_lock(lock_obj);
328 }
329 usleep(wc->reconnect_interval * 1000);
330 }
331
332 return NULL;
333}
#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:2317
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_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, ast_websocket_client::tls_enabled, 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().

◆ 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 451 of file res_websocket_client.c.

454{
456 const char *new_id = ast_sorcery_object_get_id(new_wc);
457 RAII_VAR(struct ast_variable *, changes, NULL, ast_variables_destroy);
458 struct ast_variable *v = NULL;
459 int res = 0;
460 int changes_found = 0;
461
462 ast_debug(2, "%s: Detecting changes\n", new_id);
463
464 res = ast_sorcery_diff(sorcery, old_wc, new_wc, &changes);
465 if (res != 0) {
466 ast_log(LOG_WARNING, "%s: Failed to create changeset\n", new_id);
468 }
469
470 for (v = changes; v; v = v->next) {
471 changes_found = 1;
472 ast_debug(2, "%s: %s changed to %s\n", new_id, v->name, v->value);
473 if (ast_strings_equal(v->name, "connection_type")) {
475 } else if (ast_strings_equal(v->name, "uri")) {
476 changed |= AST_WS_CLIENT_FIELD_URI;
477 } else if (ast_strings_equal(v->name, "protocols")) {
479 } else if (ast_strings_equal(v->name, "username")) {
481 } else if (ast_strings_equal(v->name, "password")) {
483 } else if (ast_strings_equal(v->name, "tls_enabled")) {
485 } else if (ast_strings_equal(v->name, "ca_list_file")) {
487 } else if (ast_strings_equal(v->name, "ca_list_path")) {
489 } else if (ast_strings_equal(v->name, "cert_file")) {
491 } else if (ast_strings_equal(v->name, "priv_key_file")) {
493 } else if (ast_strings_equal(v->name, "reconnect_interval")) {
495 } else if (ast_strings_equal(v->name, "reconnect_attempts")) {
497 } else if (ast_strings_equal(v->name, "connection_timeout")) {
499 } else if (ast_strings_equal(v->name, "verify_server_cert")) {
501 } else if (ast_strings_equal(v->name, "verify_server_hostname")) {
503 } else {
504 ast_debug(2, "%s: Unknown change %s\n", new_id, v->name);
505 }
506 }
507
508 if (!changes_found) {
509 ast_debug(2, "%s: No changes found %p %p\n", new_id,
510 old_wc,new_wc);
511 }
512 return changed;
513
514}
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:1805
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:941
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 516 of file res_websocket_client.c.

517{
518 if (!sorcery || !callbacks) {
519 return -1;
520 }
521
522 if (ast_sorcery_observer_add(sorcery, "websocket_client", callbacks)) {
523 ast_log(LOG_ERROR, "Failed to register websocket client observers\n");
524 return -1;
525 }
526
527 return 0;
528}
#define LOG_ERROR
struct @471 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:2391

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 530 of file res_websocket_client.c.

531{
532 if (!sorcery || !callbacks) {
533 return;
534 }
535
536 ast_sorcery_observer_remove(sorcery, "websocket_client", callbacks);
537}
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:2423

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 590 of file res_websocket_client.c.

591{
592 ast_debug(2, "Reloading Websocket Client Configuration\n");
593 if (sorcery) {
595 }
596
597 return 0;
598}
void ast_sorcery_reload(const struct ast_sorcery *sorcery)
Inform any wizards to reload persistent objects.
Definition: sorcery.c:1408

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 432 of file res_websocket_client.c.

433{
434 if (!sorcery) {
435 return NULL;
436 }
437
438 return ast_sorcery_retrieve_by_fields(sorcery, "websocket_client",
440}
@ 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:1897

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 442 of file res_websocket_client.c.

443{
444 if (!sorcery) {
445 return NULL;
446 }
447
448 return ast_sorcery_retrieve_by_id(sorcery, "websocket_client", id);
449}
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:1853

References ast_sorcery_retrieve_by_id(), NULL, and sorcery.

Referenced by outbound_websocket_websocket_client_id_from_str().

◆ load_module()

static int load_module ( void  )
static

Definition at line 540 of file res_websocket_client.c.

541{
542 ast_debug(2, "Initializing Websocket Client Configuration\n");
544 if (!sorcery) {
545 ast_log(LOG_ERROR, "Failed to open sorcery\n");
546 return -1;
547 }
548
549 ast_sorcery_apply_default(sorcery, "websocket_client", "config",
550 "websocket_client.conf,criteria=type=websocket_client");
551
552 if (ast_sorcery_object_register(sorcery, "websocket_client", wc_alloc,
553 NULL, wc_apply)) {
554 ast_log(LOG_ERROR, "Failed to register websocket_client object with sorcery\n");
556 sorcery = NULL;
557 return -1;
558 }
559
560 ast_sorcery_object_field_register(sorcery, "websocket_client", "type", "", OPT_NOOP_T, 0, 0);
561 ast_sorcery_register_cust(websocket_client, connection_type, "");
566 ast_sorcery_register_sf(websocket_client, ast_websocket_client, ca_list_file, ca_list_file, "");
567 ast_sorcery_register_sf(websocket_client, ast_websocket_client, ca_list_path, ca_list_path, "");
569 ast_sorcery_register_sf(websocket_client, ast_websocket_client, priv_key_file, priv_key_file, "");
570 ast_sorcery_register_bool(websocket_client, ast_websocket_client, tls_enabled, tls_enabled, "no");
571 ast_sorcery_register_bool(websocket_client, ast_websocket_client, verify_server_cert, verify_server_cert, "yes");
572 ast_sorcery_register_bool(websocket_client, ast_websocket_client, verify_server_hostname, verify_server_hostname, "yes");
573 ast_sorcery_register_int(websocket_client, ast_websocket_client, connection_timeout, connect_timeout, 500);
574 ast_sorcery_register_int(websocket_client, ast_websocket_client, reconnect_attempts, reconnect_attempts, 4);
575 ast_sorcery_register_int(websocket_client, ast_websocket_client, reconnect_interval, reconnect_interval, 500);
576
578
579 return 0;
580}
@ 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:1749
void ast_sorcery_load(const struct ast_sorcery *sorcery)
Inform any wizards to load persistent objects.
Definition: sorcery.c:1377
#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:1692
#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:1666
#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:1728

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 582 of file res_websocket_client.c.

583{
584 ast_debug(2, "Reloading Websocket Client Configuration\n");
586
587 return 0;
588}

References ast_debug, ast_sorcery_reload(), and sorcery.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 600 of file res_websocket_client.c.

601{
602 ast_debug(2, "Unloading Websocket Client Configuration\n");
603 if (sorcery) {
605 sorcery = NULL;
606 }
607 return 0;
608}

References ast_debug, ast_sorcery_unref, NULL, and sorcery.

◆ wc_alloc()

static void * wc_alloc ( const char *  id)
static

Definition at line 346 of file res_websocket_client.c.

347{
348 struct ast_websocket_client *wc = NULL;
349
350 wc = ast_sorcery_generic_alloc(sizeof(*wc), wc_dtor);
351 if (!wc) {
352 return NULL;
353 }
354
355 if (ast_string_field_init(wc, 1024) != 0) {
356 ao2_cleanup(wc);
357 return NULL;
358 }
359
360 ast_debug(2, "%s: Allocated websocket client config\n", id);
361 return wc;
362}
#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:1728
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
Definition: stringfields.h:359

References ao2_cleanup, ast_debug, ast_sorcery_generic_alloc(), ast_string_field_init, 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 402 of file res_websocket_client.c.

403{
404 struct ast_websocket_client *wc = obj;
405 const char *id = ast_sorcery_object_get_id(wc);
406 int res = 0;
407
408 ast_debug(3, "%s: Applying config\n", id);
409
410 if (ast_strlen_zero(wc->uri)) {
411 ast_log(LOG_WARNING, "%s: Websocket client missing uri\n", id);
412 res = -1;
413 }
414
415 if (res != 0) {
416 ast_log(LOG_WARNING, "%s: Websocket client configuration failed\n", id);
417 } else {
418 ast_debug(3, "%s: Websocket client configuration succeeded\n", id);
419
422 wc->reconnect_attempts = INT_MAX;
423 } else {
424 wc->reconnect_attempts = 4;
425 }
426 }
427 }
428
429 return res;
430}
#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 337 of file res_websocket_client.c.

338{
339 struct ast_websocket_client *wc = obj;
340
341 ast_debug(3, "%s: Disposing of websocket client config\n",
344}
#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 364 of file res_websocket_client.c.

366{
367 struct ast_websocket_client *ws = obj;
368
369 if (strcasecmp(var->value, "persistent") == 0) {
371 } else if (strcasecmp(var->value, "per_call_config") == 0) {
373 } else {
374 return -1;
375 }
376
377 return 0;
378}
#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 380 of file res_websocket_client.c.

381{
382 const struct ast_websocket_client *wc = obj;
383
385 *buf = ast_strdup("persistent");
387 *buf = ast_strdup("per_call_config");
388 } else {
389 return -1;
390 }
391
392 return 0;
393}
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 617 of file res_websocket_client.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 617 of file res_websocket_client.c.

◆ sorcery

struct ast_sorcery* sorcery = NULL
static