46 #include "asterisk/res_pjsip.h"
49 #include "asterisk/phoneprov.h"
50 #include "res_pjsip/include/res_pjsip_private.h"
130 SORCERY_OBJECT(details);
138 char *mac = ast_var_find(pp->vars,
"MAC");
144 ast_var_list_destroy(pp->vars);
152 if (!pp || !(pp->vars = ast_var_list_create())) {
153 ast_log(LOG_ERROR,
"Unable to allocate memory for phoneprov structure %s\n",
167 if (ast_strlen_zero(name) || !vars) {
172 if (ast_strlen_zero(value)) {
176 var = ast_var_assign(name, value);
178 ast_log(LOG_ERROR,
"Could not allocate variable memory for variable.\n");
181 AST_VAR_LIST_INSERT_TAIL(vars, var);
203 AST_VAR_LIST_TRAVERSE(pp->vars, pvar) {
204 var = ast_variable_new(pvar->name, pvar->value,
"");
223 static int load_endpoint(
const char *
id,
const char *endpoint_name,
struct varshead *vars,
229 const char *auth_name;
239 ast_log(LOG_ERROR,
"phoneprov %s contained invalid endpoint %s.\n",
id,
247 if (endpoint->id.self.number.valid && !ast_strlen_zero(endpoint->id.self.number.str)) {
249 endpoint->id.self.number.str, vars);
252 if (endpoint->id.self.name.valid && !ast_strlen_zero(endpoint->id.self.name.str)) {
255 endpoint->id.self.name.str, vars);
259 endpoint->transport);
261 ast_log(LOG_ERROR,
"Endpoint %s contained invalid transport %s.\n", endpoint_name,
262 endpoint->transport);
265 snprintf(port_string, 6,
"%d", pj_sockaddr_get_port(&transport->host));
274 ast_log(LOG_ERROR,
"phoneprov %s contained invalid auth %s.\n",
id, auth_name);
292 const char *endpoint_name;
295 if (!ast_var_find(pp->vars,
297 ast_log(LOG_ERROR,
"phoneprov %s must contain a MAC entry.\n",
id);
301 if (!ast_var_find(pp->vars,
303 ast_log(LOG_ERROR,
"phoneprov %s must contain a PROFILE entry.\n",
id);
307 endpoint_name = ast_var_find(pp->vars,
"endpoint");
309 if (load_endpoint(
id, endpoint_name, pp->vars, port_string)) {
314 if (!ast_var_find(pp->vars,
321 if (!ast_var_find(pp->vars,
327 if (!ast_var_find(pp->vars,
332 if (!ast_var_find(pp->vars,
334 ast_log(LOG_ERROR,
"phoneprov %s didn't contain a PROFILE entry.\n",
id);
358 while ((pp = ao2_iterator_next(&i))) {
368 static int load_module(
void)
370 sorcery = ast_sip_get_sorcery();
372 ast_sorcery_apply_config(sorcery,
"res_pjsip_phoneprov_provider");
373 ast_sorcery_apply_default(sorcery,
"phoneprov",
"config",
374 "pjsip.conf,criteria=type=phoneprov");
387 ast_log(LOG_ERROR,
"Unable to register pjsip phoneprov provider.\n");
394 static int unload_module(
void)
401 static int reload_module(
void)
406 ast_log(LOG_ERROR,
"Unable to register pjsip phoneprov provider.\n");
413 AST_MODULE_INFO(
ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER,
"PJSIP Phoneprov Provider",
414 .support_level = AST_MODULE_SUPPORT_EXTENDED,
416 .reload = reload_module,
417 .unload = unload_module,
419 .requires =
"res_pjsip,res_phoneprov",
struct ast_variable * next
Asterisk main include file. File version handling, generic pbx functions.
int ast_phoneprov_provider_register(char *provider_name, ast_phoneprov_load_users_cb load_users)
Registers a config provider to phoneprov.
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
Structure for variables, used for configurations and for channel variables.
Perform no matching, return all objects.
int ast_sorcery_object_fields_register(struct ast_sorcery *sorcery, const char *type, const char *regex, aco_option_handler config_handler, sorcery_fields_handler sorcery_handler)
Register a regex for multiple fields within an object.
Full structure for sorcery.
Type for a default handler that should do nothing.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
Return all matching objects.
void ast_sorcery_load_object(const struct ast_sorcery *sorcery, const char *type)
Inform any wizards of a specific object type to load persistent objects.
list of users found in the config file
void * ast_sorcery_retrieve_by_id(const struct ast_sorcery *sorcery, const char *type, const char *id)
Retrieve an object using its unique identifier.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
static void phoneprov_destroy(void *obj)
Destructor function for phoneprov.
An entity with which Asterisk communicates.
#define ast_sorcery_object_register(sorcery, type, alloc, transform, apply)
Register an object type.
static int assign_and_insert(const char *name, const char *value, struct varshead *vars)
Helper that creates an ast_var_t and inserts it into the list.
const ast_string_field auth_pass
static void users_apply_handler(struct phoneprov *pp)
Callback that validates the phoneprov object.
Module has failed to load, may be in an inconsistent state.
int ast_phoneprov_add_extension(char *provider_name, struct varshead *vars)
Adds an extension.
Structure for a phoneprov object.
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.
#define ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, flags,...)
Register a field within an object.
static void * phoneprov_alloc(const char *name)
Allocator for phoneprov.
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
void ast_phoneprov_provider_unregister(char *provider_name)
Unegisters a config provider from phoneprov and frees its resources.
static int load_users(void)
Callback that loads the users from phoneprov sections.
static int aco_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
Adds a config name/value pair to the phoneprov object.
static int fields_handler(const void *obj, struct ast_variable **fields)
Converts the phoneprov varlist to an ast_variable list.
void * ast_sorcery_generic_alloc(size_t size, ao2_destructor_fn destructor)
Allocate a generic sorcery capable object.
#define ASTERISK_GPL_KEY
The text the key() function should return.
const char * ast_phoneprov_std_variable_lookup(enum ast_phoneprov_std_variables var)
Returns the string respresentation of a phoneprov standard variable.
Asterisk module definitions.
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
const ast_string_field auth_user
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
void ast_phoneprov_delete_extension(char *provider_name, char *macaddress)
Deletes an extension.
void ast_sorcery_reload_object(const struct ast_sorcery *sorcery, const char *type)
Inform any wizards of a specific object type to reload persistent objects.
Sorcery Data Access Layer API.