Asterisk - The Open Source Telephony Project  18.5.0
Data Structures | Functions | Variables
res_pjsip_phoneprov_provider.c File Reference

PJSIP Phoneprov Configuration Provider. More...

#include "asterisk.h"
#include <pjsip.h>
#include "asterisk/res_pjsip.h"
#include "asterisk/module.h"
#include "asterisk/sorcery.h"
#include "asterisk/phoneprov.h"
#include "res_pjsip/include/res_pjsip_private.h"
Include dependency graph for res_pjsip_phoneprov_provider.c:

Go to the source code of this file.

Data Structures

struct  phoneprov
 Structure for a phoneprov object. More...
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
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. More...
 
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. More...
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int fields_handler (const void *obj, struct ast_variable **fields)
 Converts the phoneprov varlist to an ast_variable list. More...
 
static int load_endpoint (const char *id, const char *endpoint_name, struct varshead *vars, char *port_string)
 
static int load_module (void)
 
static int load_users (void)
 Callback that loads the users from phoneprov sections. More...
 
static void * phoneprov_alloc (const char *name)
 Allocator for phoneprov. More...
 
static void phoneprov_destroy (void *obj)
 Destructor function for phoneprov. More...
 
static int reload_module (void)
 
static int unload_module (void)
 
static void users_apply_handler (struct phoneprov *pp)
 Callback that validates the phoneprov object. More...
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "PJSIP Phoneprov Provider" , .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 = "30ef0c93b36035ec78c9cfd712d36d9b" , .support_level = AST_MODULE_SUPPORT_EXTENDED, .load = load_module, .reload = reload_module, .unload = unload_module, .load_pri = AST_MODPRI_APP_DEPEND, .requires = "res_pjsip,res_phoneprov", }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct ast_sorcerysorcery
 

Detailed Description

PJSIP Phoneprov Configuration Provider.

Author
George Joseph georg.nosp@m.e.jo.nosp@m.seph@.nosp@m.fair.nosp@m.view5.nosp@m..com

Definition in file res_pjsip_phoneprov_provider.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 420 of file res_pjsip_phoneprov_provider.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 420 of file res_pjsip_phoneprov_provider.c.

◆ aco_handler()

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

Adds a config name/value pair to the phoneprov object.

Definition at line 187 of file res_pjsip_phoneprov_provider.c.

References assign_and_insert(), ast_variable::name, ast_variable::value, and phoneprov::vars.

Referenced by load_module().

188 {
189  struct phoneprov *pp = obj;
190 
191  return assign_and_insert(var->name, var->value, pp->vars);
192 }
struct varshead * vars
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.
Structure for a phoneprov object.

◆ assign_and_insert()

static int assign_and_insert ( const char *  name,
const char *  value,
struct varshead vars 
)
static

Helper that creates an ast_var_t and inserts it into the list.

Definition at line 163 of file res_pjsip_phoneprov_provider.c.

References ast_log, ast_strlen_zero, ast_var_assign, AST_VAR_LIST_INSERT_TAIL(), LOG_ERROR, and var.

Referenced by aco_handler(), load_endpoint(), and users_apply_handler().

164 {
165  struct ast_var_t *var;
166 
167  if (ast_strlen_zero(name) || !vars) {
168  return -1;
169  }
170 
171  /* Just ignore if the value is NULL or empty */
172  if (ast_strlen_zero(value)) {
173  return 0;
174  }
175 
176  var = ast_var_assign(name, value);
177  if (!var) {
178  ast_log(LOG_ERROR, "Could not allocate variable memory for variable.\n");
179  return -1;
180  }
181  AST_VAR_LIST_INSERT_TAIL(vars, var);
182 
183  return 0;
184 }
#define var
Definition: ast_expr2f.c:614
int value
Definition: syslog.c:37
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_log
Definition: astobj2.c:42
#define LOG_ERROR
Definition: logger.h:285
static const char name[]
Definition: cdr_mysql.c:74
#define ast_var_assign(name, value)
Definition: chanvars.h:40
static void AST_VAR_LIST_INSERT_TAIL(struct varshead *head, struct ast_var_t *var)
Definition: chanvars.h:51

◆ AST_MODULE_SELF_SYM()

struct ast_module* AST_MODULE_SELF_SYM ( void  )

Definition at line 420 of file res_pjsip_phoneprov_provider.c.

◆ fields_handler()

static int fields_handler ( const void *  obj,
struct ast_variable **  fields 
)
static

Converts the phoneprov varlist to an ast_variable list.

Definition at line 195 of file res_pjsip_phoneprov_provider.c.

References AST_VAR_LIST_TRAVERSE, ast_variable_new, ast_variables_destroy(), ast_var_t::name, ast_variable::next, NULL, ast_var_t::value, var, and phoneprov::vars.

Referenced by load_module().

196 {
197  const struct phoneprov *pp = obj;
198  struct ast_var_t *pvar;
199  struct ast_variable *head = NULL;
200  struct ast_variable *tail = NULL;
201  struct ast_variable *var;
202 
203  AST_VAR_LIST_TRAVERSE(pp->vars, pvar) {
204  var = ast_variable_new(pvar->name, pvar->value, "");
205  if (!var) {
206  ast_variables_destroy(head);
207  return -1;
208  }
209  if (!head) {
210  head = var;
211  tail = var;
212  continue;
213  }
214  tail->next = var;
215  tail = var;
216  }
217 
218  *fields = head;
219 
220  return 0;
221 }
struct ast_variable * next
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
Definition: extconf.c:1263
struct varshead * vars
Structure for variables, used for configurations and for channel variables.
#define var
Definition: ast_expr2f.c:614
#define NULL
Definition: resample.c:96
#define ast_variable_new(name, value, filename)
char name[0]
Definition: chanvars.h:31
char * value
Definition: chanvars.h:30
Structure for a phoneprov object.
#define AST_VAR_LIST_TRAVERSE(head, var)
Definition: chanvars.h:49

◆ load_endpoint()

static int load_endpoint ( const char *  id,
const char *  endpoint_name,
struct varshead vars,
char *  port_string 
)
static

Definition at line 223 of file res_pjsip_phoneprov_provider.c.

References ao2_cleanup, ao2_ref, assign_and_insert(), ast_log, AST_PHONEPROV_STD_CALLERID, AST_PHONEPROV_STD_DISPLAY_NAME, AST_PHONEPROV_STD_SECRET, AST_PHONEPROV_STD_USERNAME, ast_phoneprov_std_variable_lookup(), ast_sorcery_retrieve_by_id(), ast_strlen_zero, AST_VECTOR_GET, AST_VECTOR_SIZE, ast_sip_auth::auth_pass, ast_sip_auth::auth_user, LOG_ERROR, NULL, and RAII_VAR.

Referenced by users_apply_handler().

225 {
226  struct ast_sip_auth *auth;
227  RAII_VAR(struct ast_sip_endpoint *, endpoint, NULL, ao2_cleanup);
228  RAII_VAR(struct ast_sip_transport *, transport, NULL, ao2_cleanup);
229  const char *auth_name;
230 
231  *port_string = '\0';
232 
233  /* We need to use res_pjsip's sorcery instance instead of our own to
234  * get endpoint and auth.
235  */
236  endpoint = ast_sorcery_retrieve_by_id(sorcery, "endpoint",
237  endpoint_name);
238  if (!endpoint) {
239  ast_log(LOG_ERROR, "phoneprov %s contained invalid endpoint %s.\n", id,
240  endpoint_name);
241  return -1;
242  }
243 
244  assign_and_insert("ENDPOINT_ID", endpoint_name, vars);
245  assign_and_insert("TRANSPORT_ID", endpoint->transport, vars);
246 
247  if (endpoint->id.self.number.valid && !ast_strlen_zero(endpoint->id.self.number.str)) {
249  endpoint->id.self.number.str, vars);
250  }
251 
252  if (endpoint->id.self.name.valid && !ast_strlen_zero(endpoint->id.self.name.str)) {
255  endpoint->id.self.name.str, vars);
256  }
257 
258  transport = ast_sorcery_retrieve_by_id(sorcery, "transport",
259  endpoint->transport);
260  if (!transport) {
261  ast_log(LOG_ERROR, "Endpoint %s contained invalid transport %s.\n", endpoint_name,
262  endpoint->transport);
263  return -1;
264  }
265  snprintf(port_string, 6, "%d", pj_sockaddr_get_port(&transport->host));
266 
267  if (!AST_VECTOR_SIZE(&endpoint->inbound_auths)) {
268  return 0;
269  }
270  auth_name = AST_VECTOR_GET(&endpoint->inbound_auths, 0);
271 
272  auth = ast_sorcery_retrieve_by_id(sorcery, "auth", auth_name);
273  if (!auth) {
274  ast_log(LOG_ERROR, "phoneprov %s contained invalid auth %s.\n", id, auth_name);
275  return -1;
276  }
277 
278  assign_and_insert("AUTH_ID", auth_name, vars);
280  auth->auth_user, vars);
282  auth->auth_pass, vars);
283  ao2_ref(auth, -1);
284 
285  return 0;
286 }
#define NULL
Definition: resample.c:96
#define ast_strlen_zero(foo)
Definition: strings.h:52
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
#define ast_log
Definition: astobj2.c:42
#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
An entity with which Asterisk communicates.
Definition: res_pjsip.h:812
#define LOG_ERROR
Definition: logger.h:285
Transport to bind to.
Definition: res_pjsip.h:171
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
Definition: res_pjsip.h:452
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:682
static struct ast_sorcery * sorcery
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
const char * ast_phoneprov_std_variable_lookup(enum ast_phoneprov_std_variables var)
Returns the string respresentation of a phoneprov standard variable.
const ast_string_field auth_user
Definition: res_pjsip.h:450
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:611

◆ load_module()

static int load_module ( void  )
static

Definition at line 368 of file res_pjsip_phoneprov_provider.c.

References aco_handler(), ast_log, AST_MODULE, AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, ast_phoneprov_provider_register(), ast_sip_get_sorcery(), ast_sorcery_apply_config, ast_sorcery_apply_default, ast_sorcery_load_object(), ast_sorcery_object_field_register, ast_sorcery_object_fields_register(), ast_sorcery_object_register, fields_handler(), load_users(), LOG_ERROR, NULL, OPT_NOOP_T, and phoneprov_alloc().

Referenced by reload_module().

369 {
371 
372  ast_sorcery_apply_config(sorcery, "res_pjsip_phoneprov_provider");
373  ast_sorcery_apply_default(sorcery, "phoneprov", "config",
374  "pjsip.conf,criteria=type=phoneprov");
375 
377  NULL);
378 
379  ast_sorcery_object_field_register(sorcery, "phoneprov", "type", "", OPT_NOOP_T, 0,
380  0);
383 
384  ast_sorcery_load_object(sorcery, "phoneprov");
385 
387  ast_log(LOG_ERROR, "Unable to register pjsip phoneprov provider.\n");
389  }
390 
392 }
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.
Definition: sorcery.c:1160
Type for a default handler that should do nothing.
#define ast_sorcery_apply_config(sorcery, name)
Definition: sorcery.h:456
#define NULL
Definition: resample.c:96
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.
Definition: sorcery.c:1393
int ast_phoneprov_provider_register(char *provider_name, ast_phoneprov_load_users_cb load_users)
Registers a config provider to phoneprov.
#define ast_log
Definition: astobj2.c:42
#define ast_sorcery_object_register(sorcery, type, alloc, transform, apply)
Register an object type.
Definition: sorcery.h:838
#define LOG_ERROR
Definition: logger.h:285
#define ast_sorcery_apply_default(sorcery, type, name, data)
Definition: sorcery.h:477
Module has failed to load, may be in an inconsistent state.
Definition: module.h:78
#define ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, flags,...)
Register a field within an object.
Definition: sorcery.h:955
static void * phoneprov_alloc(const char *name)
Allocator for phoneprov.
static struct ast_sorcery * sorcery
struct ast_sorcery * ast_sip_get_sorcery(void)
Get a pointer to the SIP sorcery structure.
#define AST_MODULE
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.

◆ load_users()

static int load_users ( void  )
static

Callback that loads the users from phoneprov sections.

Definition at line 343 of file res_pjsip_phoneprov_provider.c.

References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, AST_RETRIEVE_FLAG_ALL, AST_RETRIEVE_FLAG_MULTIPLE, ast_sorcery_reload_object(), ast_sorcery_retrieve_by_fields(), NULL, users, and users_apply_handler().

Referenced by load_module(), and reload_module().

344 {
345  struct ao2_container *users;
346  struct ao2_iterator i;
347  struct phoneprov *pp;
348 
349  ast_sorcery_reload_object(sorcery, "phoneprov");
350 
351  users = ast_sorcery_retrieve_by_fields(sorcery, "phoneprov",
353  if (!users) {
354  return 0;
355  }
356 
357  i = ao2_iterator_init(users, 0);
358  while ((pp = ao2_iterator_next(&i))) {
360  ao2_ref(pp, -1);
361  }
363  ao2_ref(users, -1);
364 
365  return 0;
366 }
Perform no matching, return all objects.
Definition: sorcery.h:123
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
Return all matching objects.
Definition: sorcery.h:120
#define NULL
Definition: resample.c:96
#define ao2_ref(o, delta)
Definition: astobj2.h:464
#define ao2_iterator_next(iter)
Definition: astobj2.h:1933
struct ao2_container * users
static void users_apply_handler(struct phoneprov *pp)
Callback that validates the phoneprov object.
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.
Definition: sorcery.c:1897
static struct ast_sorcery * sorcery
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1841
Generic container type.
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
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.
Definition: sorcery.c:1442

◆ phoneprov_alloc()

static void* phoneprov_alloc ( const char *  name)
static

Allocator for phoneprov.

Definition at line 148 of file res_pjsip_phoneprov_provider.c.

References ao2_cleanup, ast_log, ast_sorcery_generic_alloc(), ast_var_list_create(), LOG_ERROR, NULL, phoneprov_destroy(), and phoneprov::vars.

Referenced by load_module().

149 {
150  struct phoneprov *pp = ast_sorcery_generic_alloc(sizeof(*pp), phoneprov_destroy);
151 
152  if (!pp || !(pp->vars = ast_var_list_create())) {
153  ast_log(LOG_ERROR, "Unable to allocate memory for phoneprov structure %s\n",
154  name);
155  ao2_cleanup(pp);
156  return NULL;
157  }
158 
159  return pp;
160 }
struct varshead * vars
#define NULL
Definition: resample.c:96
#define ast_log
Definition: astobj2.c:42
static void phoneprov_destroy(void *obj)
Destructor function for phoneprov.
#define LOG_ERROR
Definition: logger.h:285
static const char name[]
Definition: cdr_mysql.c:74
Structure for a phoneprov object.
struct varshead * ast_var_list_create(void)
Definition: chanvars.c:97
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
void * ast_sorcery_generic_alloc(size_t size, ao2_destructor_fn destructor)
Allocate a generic sorcery capable object.
Definition: sorcery.c:1728

◆ phoneprov_destroy()

static void phoneprov_destroy ( void *  obj)
static

Destructor function for phoneprov.

Definition at line 135 of file res_pjsip_phoneprov_provider.c.

References AST_MODULE, ast_phoneprov_delete_extension(), ast_var_find(), ast_var_list_destroy(), and phoneprov::vars.

Referenced by phoneprov_alloc().

136 {
137  struct phoneprov *pp = obj;
138  char *mac = ast_var_find(pp->vars, "MAC");
139 
140  if (mac) {
142  }
143 
145 }
struct varshead * vars
char * ast_var_find(const struct varshead *head, const char *name)
Definition: chanvars.c:85
Structure for a phoneprov object.
#define AST_MODULE
void ast_phoneprov_delete_extension(char *provider_name, char *macaddress)
Deletes an extension.
void ast_var_list_destroy(struct varshead *head)
Definition: chanvars.c:109

◆ reload_module()

static int reload_module ( void  )
static

Definition at line 401 of file res_pjsip_phoneprov_provider.c.

References ast_log, AST_MODFLAG_LOAD_ORDER, AST_MODPRI_APP_DEPEND, AST_MODULE, AST_MODULE_INFO(), AST_MODULE_LOAD_DECLINE, AST_MODULE_SUPPORT_EXTENDED, ast_phoneprov_provider_register(), ast_phoneprov_provider_unregister(), ASTERISK_GPL_KEY, load_module(), load_users(), LOG_ERROR, reload(), and unload_module().

402 {
404 
406  ast_log(LOG_ERROR, "Unable to register pjsip phoneprov provider.\n");
408  }
409 
410  return 0;
411 }
int ast_phoneprov_provider_register(char *provider_name, ast_phoneprov_load_users_cb load_users)
Registers a config provider to phoneprov.
#define ast_log
Definition: astobj2.c:42
void ast_phoneprov_provider_unregister(char *provider_name)
Unegisters a config provider from phoneprov and frees its resources.
#define LOG_ERROR
Definition: logger.h:285
Module has failed to load, may be in an inconsistent state.
Definition: module.h:78
#define AST_MODULE
static int load_users(void)
Callback that loads the users from phoneprov sections.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 394 of file res_pjsip_phoneprov_provider.c.

References AST_MODULE, and ast_phoneprov_provider_unregister().

Referenced by reload_module().

395 {
397 
398  return 0;
399 }
void ast_phoneprov_provider_unregister(char *provider_name)
Unegisters a config provider from phoneprov and frees its resources.
#define AST_MODULE

◆ users_apply_handler()

static void users_apply_handler ( struct phoneprov pp)
static

Callback that validates the phoneprov object.

Definition at line 289 of file res_pjsip_phoneprov_provider.c.

References assign_and_insert(), ast_log, AST_MODULE, ast_phoneprov_add_extension(), AST_PHONEPROV_STD_LABEL, AST_PHONEPROV_STD_MAC, AST_PHONEPROV_STD_PROFILE, AST_PHONEPROV_STD_SERVER_PORT, AST_PHONEPROV_STD_USERNAME, ast_phoneprov_std_variable_lookup(), ast_sorcery_object_get_id(), ast_var_find(), load_endpoint(), LOG_ERROR, S_OR, and phoneprov::vars.

Referenced by load_users().

290 {
291  const char *id = ast_sorcery_object_get_id(pp);
292  const char *endpoint_name;
293  char port_string[6];
294 
295  if (!ast_var_find(pp->vars,
297  ast_log(LOG_ERROR, "phoneprov %s must contain a MAC entry.\n", id);
298  return;
299  }
300 
301  if (!ast_var_find(pp->vars,
303  ast_log(LOG_ERROR, "phoneprov %s must contain a PROFILE entry.\n", id);
304  return;
305  }
306 
307  endpoint_name = ast_var_find(pp->vars, "endpoint");
308  if (endpoint_name) {
309  if (load_endpoint(id, endpoint_name, pp->vars, port_string)) {
310  return;
311  }
312  }
313 
314  if (!ast_var_find(pp->vars,
318  pp->vars);
319  }
320 
321  if (!ast_var_find(pp->vars,
324  id, pp->vars);
325  }
326 
327  if (!ast_var_find(pp->vars,
329  assign_and_insert("SERVER_PORT", S_OR(port_string, "5060"), pp->vars);
330  }
331 
332  if (!ast_var_find(pp->vars,
334  ast_log(LOG_ERROR, "phoneprov %s didn't contain a PROFILE entry.\n", id);
335  }
336 
338 
339  return;
340 }
struct varshead * vars
static int load_endpoint(const char *id, const char *endpoint_name, struct varshead *vars, char *port_string)
#define ast_log
Definition: astobj2.c:42
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
Definition: sorcery.c:2312
#define LOG_ERROR
Definition: logger.h:285
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.
char * ast_var_find(const struct varshead *head, const char *name)
Definition: chanvars.c:85
int ast_phoneprov_add_extension(char *provider_name, struct varshead *vars)
Adds an extension.
#define AST_MODULE
#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 * ast_phoneprov_std_variable_lookup(enum ast_phoneprov_std_variables var)
Returns the string respresentation of a phoneprov standard variable.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "PJSIP Phoneprov Provider" , .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 = "30ef0c93b36035ec78c9cfd712d36d9b" , .support_level = AST_MODULE_SUPPORT_EXTENDED, .load = load_module, .reload = reload_module, .unload = unload_module, .load_pri = AST_MODPRI_APP_DEPEND, .requires = "res_pjsip,res_phoneprov", }
static

Definition at line 420 of file res_pjsip_phoneprov_provider.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 420 of file res_pjsip_phoneprov_provider.c.

◆ sorcery

struct ast_sorcery* sorcery
static