aboutsummaryrefslogtreecommitdiffstats
path: root/main/devicestate.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/devicestate.c')
-rw-r--r--main/devicestate.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/main/devicestate.c b/main/devicestate.c
index 1b9d49d87..7e0c28f68 100644
--- a/main/devicestate.c
+++ b/main/devicestate.c
@@ -294,7 +294,7 @@ static void do_state_change(const char *device)
ast_hint_state_changed(device);
}
-static int __ast_device_state_changed_literal(char *buf)
+static int __ast_device_state_changed_literal(char *buf, int norecurse)
{
char *device;
struct state_change *change;
@@ -305,10 +305,6 @@ static int __ast_device_state_changed_literal(char *buf)
device = buf;
- tmp = strrchr(device, '-');
- if (tmp)
- *tmp = '\0';
-
if (change_thread == AST_PTHREADT_NULL || !(change = ast_calloc(1, sizeof(*change) + strlen(device)))) {
/* we could not allocate a change struct, or */
/* there is no background thread, so process the change now */
@@ -324,6 +320,18 @@ static int __ast_device_state_changed_literal(char *buf)
AST_LIST_UNLOCK(&state_changes);
}
+ /* The problem with this API is that a device may be called with the unique
+ * identifier appended or not, but it's separated from the channel name
+ * with a '-', which is also a legitimate character in a channel name. So,
+ * we have to force both names to get their names checked for state changes
+ * to ensure that the right one gets notified. Not a huge performance hit,
+ * but it might could be fixed by an enterprising programmer in trunk.
+ */
+ if (!norecurse && (tmp = strrchr(device, '-'))) {
+ *tmp = '\0';
+ __ast_device_state_changed_literal(tmp, 1);
+ }
+
return 1;
}
@@ -331,7 +339,7 @@ int ast_device_state_changed_literal(const char *dev)
{
char *buf;
buf = ast_strdupa(dev);
- return __ast_device_state_changed_literal(buf);
+ return __ast_device_state_changed_literal(buf, 0);
}
/*! \brief Accept change notification, add it to change queue */
@@ -343,7 +351,7 @@ int ast_device_state_changed(const char *fmt, ...)
va_start(ap, fmt);
vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);
- return __ast_device_state_changed_literal(buf);
+ return __ast_device_state_changed_literal(buf, 0);
}
/*! \brief Go through the dev state change queue and update changes in the dev state thread */