summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/asterisk/sorcery.h21
-rw-r--r--main/sorcery.c20
-rw-r--r--res/res_pjsip.c2
-rw-r--r--res/res_pjsip/config_transport.c2
-rw-r--r--res/res_pjsip_outbound_registration.c2
5 files changed, 42 insertions, 5 deletions
diff --git a/include/asterisk/sorcery.h b/include/asterisk/sorcery.h
index 84a537937..dad0c439c 100644
--- a/include/asterisk/sorcery.h
+++ b/include/asterisk/sorcery.h
@@ -356,7 +356,7 @@ int __ast_sorcery_apply_default(struct ast_sorcery *sorcery, const char *type, c
* \retval 0 success
* \retval -1 failure
*/
-int __ast_sorcery_object_register(struct ast_sorcery *sorcery, const char *type, unsigned int hidden, aco_type_item_alloc alloc, sorcery_transform_handler transform, sorcery_apply_handler apply);
+int __ast_sorcery_object_register(struct ast_sorcery *sorcery, const char *type, unsigned int hidden, unsigned int reloadable, aco_type_item_alloc alloc, sorcery_transform_handler transform, sorcery_apply_handler apply);
/*!
* \brief Register an object type
@@ -371,7 +371,22 @@ int __ast_sorcery_object_register(struct ast_sorcery *sorcery, const char *type,
* \retval -1 failure
*/
#define ast_sorcery_object_register(sorcery, type, alloc, transform, apply) \
- __ast_sorcery_object_register((sorcery), (type), 0, (alloc), (transform), (apply))
+ __ast_sorcery_object_register((sorcery), (type), 0, 1, (alloc), (transform), (apply))
+
+/*!
+ * \brief Register an object type that is not reloadable
+ *
+ * \param sorcery Pointer to a sorcery structure
+ * \param type Type of object
+ * \param alloc Required object allocation callback
+ * \param transform Optional transformation callback
+ * \param apply Optional object set apply callback
+ *
+ * \retval 0 success
+ * \retval -1 failure
+ */
+#define ast_sorcery_object_register_no_reload(sorcery, type, alloc, transform, apply) \
+ __ast_sorcery_object_register((sorcery), (type), 0, 0, (alloc), (transform), (apply))
/*!
* \brief Register an internal, hidden object type
@@ -386,7 +401,7 @@ int __ast_sorcery_object_register(struct ast_sorcery *sorcery, const char *type,
* \retval -1 failure
*/
#define ast_sorcery_internal_object_register(sorcery, type, alloc, transform, apply) \
- __ast_sorcery_object_register((sorcery), (type), 1, (alloc), (transform), (apply))
+ __ast_sorcery_object_register((sorcery), (type), 1, 1, (alloc), (transform), (apply))
/*!
* \brief Set the copy handler for an object type
diff --git a/main/sorcery.c b/main/sorcery.c
index 1bd55d453..3f2346dfe 100644
--- a/main/sorcery.c
+++ b/main/sorcery.c
@@ -110,6 +110,9 @@ struct ast_sorcery_object_type {
/*! \brief Serializer for observers */
struct ast_taskprocessor *serializer;
+
+ /*! \brief Specifies if object type is reloadable or not */
+ unsigned int reloadable:1;
};
/*! \brief Structure for registered object type observer */
@@ -575,7 +578,7 @@ static int sorcery_extended_fields_handler(const void *obj, struct ast_variable
return 0;
}
-int __ast_sorcery_object_register(struct ast_sorcery *sorcery, const char *type, unsigned int hidden, aco_type_item_alloc alloc, sorcery_transform_handler transform, sorcery_apply_handler apply)
+int __ast_sorcery_object_register(struct ast_sorcery *sorcery, const char *type, unsigned int hidden, unsigned int reloadable, aco_type_item_alloc alloc, sorcery_transform_handler transform, sorcery_apply_handler apply)
{
RAII_VAR(struct ast_sorcery_object_type *, object_type, ao2_find(sorcery->types, type, OBJ_KEY), ao2_cleanup);
@@ -589,6 +592,7 @@ int __ast_sorcery_object_register(struct ast_sorcery *sorcery, const char *type,
object_type->type.item_alloc = alloc;
object_type->type.hidden = hidden;
+ object_type->reloadable = reloadable;
object_type->transform = transform;
object_type->apply = apply;
object_type->file->types[0] = &object_type->type;
@@ -695,12 +699,26 @@ int __ast_sorcery_object_field_register(struct ast_sorcery *sorcery, const char
return 0;
}
+/*! \brief Retrieves whether or not the type is reloadable */
+static int sorcery_reloadable(const struct ast_sorcery *sorcery, const char *type)
+{
+ RAII_VAR(struct ast_sorcery_object_type *, object_type,
+ ao2_find(sorcery->types, type, OBJ_KEY), ao2_cleanup);
+ return object_type && object_type->reloadable;
+}
+
static int sorcery_wizard_load(void *obj, void *arg, int flags)
{
struct ast_sorcery_object_wizard *wizard = obj;
struct sorcery_load_details *details = arg;
void (*load)(void *data, const struct ast_sorcery *sorcery, const char *type);
+ if (details->reload && !sorcery_reloadable(details->sorcery, details->type)) {
+ ast_log(LOG_NOTICE, "Type '%s' is not reloadable, "
+ "maintaining previous values\n", details->type);
+ return 0;
+ }
+
load = !details->reload ? wizard->wizard->load : wizard->wizard->reload;
if (load) {
diff --git a/res/res_pjsip.c b/res/res_pjsip.c
index e7c83d9d1..d9d841472 100644
--- a/res/res_pjsip.c
+++ b/res/res_pjsip.c
@@ -1290,6 +1290,8 @@ static int sip_get_tpselector_from_endpoint(const struct ast_sip_endpoint *endpo
transport = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "transport", transport_name);
if (!transport || !transport->state) {
+ ast_log(LOG_ERROR, "Unable to retrieve PJSIP transport '%s' for endpoint '%s'\n",
+ transport_name, ast_sorcery_object_get_id(endpoint));
return -1;
}
diff --git a/res/res_pjsip/config_transport.c b/res/res_pjsip/config_transport.c
index 82a995cb6..cf0b5e878 100644
--- a/res/res_pjsip/config_transport.c
+++ b/res/res_pjsip/config_transport.c
@@ -309,7 +309,7 @@ int ast_sip_initialize_sorcery_transport(struct ast_sorcery *sorcery)
{
ast_sorcery_apply_default(sorcery, "transport", "config", "pjsip.conf,criteria=type=transport");
- if (ast_sorcery_object_register(sorcery, "transport", transport_alloc, NULL, transport_apply)) {
+ if (ast_sorcery_object_register_no_reload(sorcery, "transport", transport_alloc, NULL, transport_apply)) {
return -1;
}
diff --git a/res/res_pjsip_outbound_registration.c b/res/res_pjsip_outbound_registration.c
index 67e0ead33..166b55777 100644
--- a/res/res_pjsip_outbound_registration.c
+++ b/res/res_pjsip_outbound_registration.c
@@ -602,6 +602,8 @@ static int sip_outbound_registration_regc_alloc(void *data)
RAII_VAR(struct ast_sip_transport *, transport, ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "transport", registration->transport), ao2_cleanup);
if (!transport || !transport->state) {
+ ast_log(LOG_ERROR, "Unable to retrieve PJSIP transport '%s' "
+ " for outbound registration", registration->transport);
return -1;
}